同步操作将从 北京赛曙科技有限公司/(2023年)智能汽车竞赛-完全模型组-学习资料 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
智能汽车竞赛-智控板(也称下位机控制板/CarDo),由 北京赛曙科技有限公司主导研发,是一款针对智能汽车、全面软硬件生态开源的控制主板(MCB)。
此外,为推动AI无人驾驶教育事业快速普及,降低该类高新赛事技术门槛,倡导公平、公正与合作共赢的比赛精神,赛曙科技联合诸位研发工程师历经数月开发与测试验证,开源以下技术方案(供交流学习):
[01] CarDo智控板PCB工程;
[02] CarDo智控板嵌入式软件工程;
[03] CarDo智控板使用说明文档;
[04] 智能汽车自检助手(.exe);
[05] 上下位机通信协议;
[06] 百度Edgeboard-FZ3B AI软件工程(C++版本);
[07] 百度飞桨 EasyData AI 数据标注教程;
[09] 百度飞桨 Edgeboard 板卡AI模型终端部署教程(C++版本);
[11] 智能汽车制作演示视频(Demo);
大学生智能汽车竞赛开源智控板(CarDo),其核心功能包括阿克曼转向模型(舵机)控制、直流电机闭环(PID)控制、上下位机串口通信(UART)、电池电量监控(SOC)、以及声光电等形式的人机交互(HMI)功能。
图2.1 智控板核心功能拓扑
智控板外型尺寸如图2.2所示,电路板以4个3mm固定孔与智能汽车底板连接,车模出厂均开孔,参赛队伍自行安装测试。
图2.2 智控板PCB尺寸
智控板的电气接口如图2.3所示,PCB丝印层已标注信号标识,电源输入端已设计防反接和常规EMC保护措施,各调试接口均按最佳人机友好方式设计,确保比赛调试高效可靠。
图2.3 智控板(CarDo)外设接口
智控板在智能汽车上的装配示意图如图2.4所示,其人机交互接口(开关、按键、程序下载口)均对应车壳开孔位置,此外参赛队伍需要额外制作线材:EB电源线x1、电机电源线x1、编码器信号线x1、双头USB-A(公头)x1。
图2.4 智控板装配示意图
智控板采用GD32F103C8T6-ARM-Cortex-M3单片机作为核心控制器,其最大主频为108MHz(实际使用72MHz), 软硬件均保持与STM32F103C8x单片机一致。源码工程基于Keil-5创建,程序下载及调试可通过J-Link-OB调试器完成。
图3.1 J-Link OB 调试器
注意在使用相关模块功能时,添加相关的线程计数函数在timer.c当中,并在main.c添加相关的初始化函数和处理函数。
如图3.2所示,智控板嵌入式软件基于模块化(Blocks)规则搭建,分别针对硬件底层驱动(BSP)、应用级算法逻辑(Logic)和伪线程逻辑分配(Thread)三部分代码模块化设计。
图3.2 智控板模块化(Blocks)软件架构
源码工程依据模块初始化(Init)→逻辑控制(Handle)→线程控制(Timer)的流程搭建,每类功能块(Block)代码的架构清晰且高效运行。参赛者可按此规则自定义功能块,并协同调度相关资源。
代码初始化部分代码均在程序主入口“main.c”中:
图3.3 智控板程序初始化位置
各功能块逻辑控制部分在程序主入口“main.c”的循环部分(While),这部分代码包含各个模块的核心控制逻辑与数据交互内容。例如蜂鸣器音效的控制逻辑控制,需要根据不同频率和名叫次数产生各项音效(确认/报警/完成等),通过各个标志位和计数器实现。
功能块的逻辑控制代码将封装在一个_Handle()函数中,并且在While循环里持续运行,请注意这部分代码禁止产生任何延时(Delay)或堵塞(Stop)效果,通常认为_Handle()代码中执行的内容零延迟(No Delay!)。程序中所有时序效果都由线程(Timer)控制。
图3.4 智控板功能块逻辑控制代码位置
智控板线程控制代码位于“Timer.c”文件的定时器中断里,终端周期为1ms,所有功能块控制逻辑所需的时序均在此统一控制。
图3.5 智控板线程控制代码位置
【表1】智控板上下位机USB/UART通信协议
数据解析:上表数据涉及Byte(Char),Float,Uint16,Short(Int16)四种类型,智控板与FZ3B数据编码和解码均通过共用体(Union)实现,例如:
typedef union
{
uint8_t U8_Buff[2];
uint16_t U16;
int16_t S16;
}UNION_BIT16;
typedef union
{
uint8_t U8_Buff[4];
float Float;
}UNION_BIT32;
USB/UART通信帧中,校验和(Check)为包括帧头(Head)开始的10字节数据和,其具体在驱动板中的计算方式为:
uint8_t check = 0;
for(int i=0;i<10;i++)
check += UsbStructure.ReceiveBuff[i];
舵机的相关驱动代码在“Servo.c”文件中
图3.6 舵机驱动功能块代码
智控板舵机(Servo)的核心函数(API)及使用说明如下表:
【表2】SERVO对应API说明
API(可使用的程序接口) | Function(功能) |
---|---|
SERVO_Init(void) | 初始化舵机控制底层,并打舵至车辆居中位置 |
SERVO_AngleControl(float angle) | 舵机角度(Angle)控制,左右最大角度值为±38°(最大角度限制可修改) |
SERVO_SetPwmValue(signed int pwm) | 舵机输出的PWM控制,值域:500~2500 |
SERVO_SetPwmValueCorrect(signed int pwm) | 舵机PWM控制,根据用户设定的舵机PWM阈值矫正后输出PWM |
在程序中,舵机的设定控制量的范围在500~2500(0°~180°),根据实际小车的结构,前向转角限制需要设定限制,比如:设定为1150~1850,目的是防止舵机卡死在限定的角度,舵机在堵转时电流会增大,经过一段时间的发热之后,舵机最后会烧毁。设定切换舵机角度的时间不应该小于舵机本身的响应时间,在不合适的切换周期内快速切换,电流同样逐步增大,最后导致舵机烧毁。
在头文件(Servo.h)中修改配置参数。(注意:舵机在使用时请先进行中值校准)。
图 3.7 舵机阈值设定
智控板针对智能汽车的行驶速度控制任务,涉及到编码器速度采样(Encoder)、闭环速控模型计算(PID)、直流电机全桥驱动电路控制(Motor)三部分内容。其代码构成如下图:
图3.8 车辆速度控制代码文件
编码器采样的程序及API说明如下表:
【表3】ENCODER对应API说明
API(可使用的程序接口) | Function(功能) |
---|---|
ENCODER_Init(void); | 编码器初始化 |
ENCODER_RevSample(void); | 编码器转速采样 |
智控板针对智能汽车竞赛的车模(I车模)深度开发调试,给定一版PID模型参数供各位参赛选手学习研究。通常需要根据每辆智能汽车的硬件条件深度调试,匹配最佳的PID参数,参赛选手可在“Pid.h”文件的宏定义部分修改该参数:
图 3.9 PID参数修改
PID闭环速控模型的API功能及说明如下表:
【表4】PID对应API说明
API(可使用的程序接口) | Function(功能) |
---|---|
PID_Init(void) | PID参数初始化 |
PID_MoveCalculate(PID_Struct *pp) | PID速控模型计算输出的pwm(注意:需要编码器转速采样之后,进行处理) |
据实测,智控板针对智能汽车竞赛车模(I车模)的实际驱动速度为:空载最高14.7m/s,负载最高11.7m/s。在驱动代码的头文件(Motor.h)中限制了车辆的最高速,以保障各项安全。同时参赛队伍可以修改控制周期等参数调试。
图3.10 MOTOR控制头文件
智控板对直流电机全桥驱动器的功能函数说明如下表:
【表5】MOTOR对应API说明
API(可使用的程序接口) | Function(功能) |
---|---|
MOTOR_Init(void) | 电机控制初始化 |
MOTOR_SetPwmValue(signed int pwm) | 电机输出pwm设置,-2000~2000,绝对值越大,转速越大 |
MOTOR_ControlLoop(float speed) | 电机闭环速度控制,函数输入为速度m/s(需要编码器采样转速后使用) |
MOTOR_Timer(void) | 电机控制线程,10ms对电机进行一次控制 |
电池在长时间使用过程中,过充亦或者使用电压持续过低容易对电池造成损坏,电量计用于采集电池的电压和电量,可有效协助参赛队伍合理利用电池。
电量计的相关驱动代码在“soc.c”文件中,其功能API说明如下表:
【表6】SOC对应API说明
API(主要的程序接口) | Function(功能) |
---|---|
SOC_Init(void) | 初始化电量计 返回值1,i2c读写错误 返回值2,芯片处于sleep模式 返回值3,写入的profile信息读出与代码不一致 返回值4,芯片启动30s内读电量值一直异常 |
SOC_Timer(void) | 电量计计数器,用于控制电量计时序 |
SOC_Handle(void) | 电量计处理函数,每秒采集电量和电压进行更新 |
用户可根据自身需求,去修改文件中的源码设置,从而实现个性化的功能。例如低电量报警等功能。
智控板为参赛队伍设置多项必要的人机交互功能,包括发车和调试所需的按键输入(Key)、传感器光源补偿和状态提醒的RGB彩灯控制、报警及提醒的多功能蜂鸣器音效。
图4.1 人机交互功能
在“Gpio.c”文件中,已经添加了按键的相关响应接口,在“Icar.c”文件中参赛者可添加相关的按键处理代码来实现个性化的操作,通过精确捕捉按键按下的时长来检索各个模式挡位。比如:可设定在按键按下进行小车发车,可设定按键持续按下3s以上进行小车的自检等等。
图4.2 添加按键处理代码
用户可自己设定RGB灯光的颜色来便于观察小车的运行状态,譬如:在小车静态情况下设置为蓝色,运行过程中RGB灯光切换为绿色,电量较低时RGB切换为黄色或者红色。来展示小车的状态。
RGB彩灯规格推荐WS2812系列灯珠(淘宝可买),灯的数量自选,可串联使用,通过单总线协议控制灯效,彩灯供电推荐5V,并接入智控板的扩展IO使用。
图4.3 WS2812系列彩灯
智控板针对WS2812单总线协议控制RGB彩灯的代码在“Rgb.c”文件中,其核心API说明如下表:
【表7】RGB对应API说明
API(可使用的程序接口) | Function(功能) |
---|---|
RGB_Init(void); | RGB灯初始化 |
RGB_SetAllColor(unsigned long color); | 设置灯光的颜色 |
RGB_SetColorToColor(unsigned long color0, unsigned long color1); | 设置灯管颜色从color0渐变到color1 |
彩灯的色值在“Rgb.h”文件中有定义,参赛者可自定义添加颜色。
图4.4 RGB彩灯颜色定义
智控板为参赛队伍设计一颗5V无源蜂鸣器,用户可自己设定蜂鸣器的运行模式进行人机交互。例如:在系统初始化成功之后,设定开机音效;按键按下时,设定提示音效;低电量的情况下进行电量报警的音效。
蜂鸣器使用的函数说明如下表:
【表8】蜂鸣器对应API说明
API(可使用的程序接口) | Function(功能) |
---|---|
GPIO_Initialize(void); | 初始化一个蜂鸣器,状态LED和按键输入 |
GPIO_Timer(void); | GPIO的线程控制 |
GPIO_Handle(void); | GPIO的处理函数 |
GPIO_BuzzerEnable(Buzzer_Enum buzzer); | 蜂鸣器工作模式设定,可设定为以下5种 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。