# 智能汽车竞赛-赛曙科技开源学习资料 **Repository Path**: l_yan/SASU-IntelligentCar-Match-Kits ## Basic Information - **Project Name**: 智能汽车竞赛-赛曙科技开源学习资料 - **Description**: 北京赛曙科技有限公司,智能汽车竞赛,开源学习资料。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 12 - **Created**: 2025-01-24 - **Last Updated**: 2025-01-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、开源资料简介 ​ 智能汽车竞赛-AI无人驾驶组智控板(也称下位机控制板/CarDo),由 [**北京赛曙科技有限公司**](https://bjsstech.com/)主导研发,是一款针对智能汽车、全面软硬件生态开源的控制主板(MCB)。 ​ 此外,为推动AI无人驾驶教育事业快速普及,降低该类高新赛事技术门槛,倡导公平、公正与合作共赢的比赛精神,赛曙科技联合诸位研发工程师历经数月开发与测试验证,现无偿开源以下技术方案: - [01] CarDo智控板PCB工程; - [02] CarDo智控板嵌入式软件工程; - [03] CarDo智控板使用说明文档; - [04] 智能汽车自检助手(.exe); - [05] 上下位机通信协议; - [06] 百度Edgeboard-FZ3B AI软件工程(C++版本); - [07] 百度飞桨 EasyData AI 数据标注教程; - [[08] 百度飞桨 Aistudio AI模型训练工程及教程(SSD);](https://aistudio.baidu.com/aistudio/projectdetail/5003894) - [09] 百度飞桨 Edgeboard 板卡AI模型终端部署教程(C++版本); - [[10] 智能汽车竞赛交通标志 AI 数据集(VOC格式);](https://aistudio.baidu.com/aistudio/datasetdetail/176448) - [11] 智能汽车制作演示视频(Demo); # 二、智控板简介 ​ 大学生智能汽车竞赛开源智控板(CarDo),其核心功能包括阿克曼转向模型(舵机)控制、直流电机闭环(PID)控制、上下位机串口通信(UART)、电池电量监控(SOC)、以及声光电等形式的人机交互(HMI)功能。 ![](./res/24a5bfef21afdf96de4ad02c2c27c51e.png) ​ 图2.1 智控板核心功能拓扑 ## 2.1 智控板外型图纸 ​ 智控板外型尺寸如图2.2所示,电路板以4个3mm固定孔与智能汽车底板连接,车模出厂均开孔,参赛队伍自行安装测试。 ![](./res/9e52eda85767408fdccc0469bc3e32b9.png) ​ 图2.2 智控板PCB尺寸 ​ 智控板的电气接口如图2.3所示,PCB丝印层已标注信号标识,电源输入端已设计防反接和常规EMC保护措施,各调试接口均按最佳人机友好方式设计,确保比赛调试高效可靠。 ![](./res/8279bf72cff0c63d114f6a09697e158a.png) ​ 图2.3 智控板(CarDo)外设接口 ## 2.2 智控板装配效果 ​ 智控板在智能汽车上的装配示意图如图2.4所示,其人机交互接口(开关、按键、程序下载口)均对应车壳开孔位置,此外参赛队伍需要额外制作线材:EB电源线x1、电机电源线x1、编码器信号线x1、双头USB-A(公头)x1。 ![](./res/4531ad4fc5aca16de9c245910cb79055.png) ​ 图2.4 智控板装配示意图 # 三、智控板编程说明 ​ 智控板采用GD32F103C8T6-ARM-Cortex-M3单片机作为核心控制器,其最大主频为108MHz(实际使用72MHz), 软硬件均保持与STM32F103C8x单片机一致。源码工程基于Keil-5创建,程序下载及调试可通过J-Link-OB调试器完成。 ![](./res/c36bb39dc2c08c3924ad767f43e9863b.png) ​ 图3.1 J-Link OB 调试器 ​ 注意在使用相关模块功能时,添加相关的线程计数函数在timer.c当中,并在main.c添加相关的初始化函数和处理函数。 ## 3.1 Block模块化设计 ​ 如图3.2所示,智控板嵌入式软件基于模块化(Blocks)规则搭建,分别针对硬件底层驱动(BSP)、应用级算法逻辑(Logic)和伪线程逻辑分配(Thread)三部分代码模块化设计。 ![](./res/174d8d1c9daccd588f1ac89bc47efe23.png) ​ 图3.2 智控板模块化(Blocks)软件架构 ​ 源码工程依据模块初始化(Init)→逻辑控制(Handle)→线程控制(Timer)的流程搭建,每类功能块(Block)代码的架构清晰且高效运行。参赛者可按此规则自定义功能块,并协同调度相关资源。 ​ 代码初始化部分代码均在程序主入口“main.c”中: ![](./res/a7a98f8446eb1083663f56936dc3d6d9.png) ​ 图3.3 智控板程序初始化位置 ​ 各功能块逻辑控制部分在程序主入口“main.c”的循环部分(While),这部分代码包含各个模块的核心控制逻辑与数据交互内容。例如蜂鸣器音效的控制逻辑控制,需要根据不同频率和名叫次数产生各项音效(确认/报警/完成等),通过各个标志位和计数器实现。 ​ 功能块的逻辑控制代码将封装在一个_Handle()函数中,并且在While循环里持续运行,请注意这部分代码禁止产生任何延时(Delay)或堵塞(Stop)效果,通常认为_Handle()代码中执行的内容零延迟(No Delay!)。程序中所有时序效果都由线程(Timer)控制。 ![](./res/01b45ada668f3a866ff7f5a50b0b636f.png) ​ 图3.4 智控板功能块逻辑控制代码位置 ​ 智控板线程控制代码位于“Timer.c”文件的定时器中断里,终端周期为1ms,所有功能块控制逻辑所需的时序均在此统一控制。 ![](./res/c48d30c595a0bf3c73aeafe5aaff6e22.png) ​ 图3.5 智控板线程控制代码位置 ## 3.2 上下位机通信协议 ​ 【表1】智控板上下位机USB/UART通信协议 ![](./res/bef319a990438649bf24cc490315f90a.png) ​ 数据解析:上表数据涉及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]; ## 3.3 智能车姿态控制(舵机) ​ 舵机的相关驱动代码在“Servo.c”文件中 ![](./res/44c9f649271dcacff83c7c502a87d4ae.png) ​ 图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)中修改配置参数。(注意:舵机在使用时请先进行中值校准)。 ![](./res/5749abab535c3cb99ef870a9d2b2d63a.png) ​ 图 3.7 舵机阈值设定 ## 3.4 智能车速度控制(直流电机) ​ 智控板针对智能汽车的行驶速度控制任务,涉及到编码器速度采样(Encoder)、闭环速控模型计算(PID)、直流电机全桥驱动电路控制(Motor)三部分内容。其代码构成如下图: ![](./res/35cb77a930e9241f72e0acc89b1f8a87.png) ​ 图3.8 车辆速度控制代码文件 ### 3.4.1 编码器采样(Encoder) ​ 编码器采样的程序及API说明如下表: ​ 【表3】ENCODER对应API说明 | API(可使用的程序接口) | Function(功能) | |--------------------------|----------------| | ENCODER_Init(void); | 编码器初始化 | | ENCODER_RevSample(void); | 编码器转速采样 | ## 3.4.2 闭环速控模型(PID) ​ 智控板针对智能汽车竞赛的车模(I车模)深度开发调试,给定一版PID模型参数供各位参赛选手学习研究。通常需要根据每辆智能汽车的硬件条件深度调试,匹配最佳的PID参数,参赛选手可在“Pid.h”文件的宏定义部分修改该参数: ![](./res/735e9ad1a0ff2a95ee7642c91e1fc2b5.png) ​ 图 3.9 PID参数修改 ​ ​ PID闭环速控模型的API功能及说明如下表: ​ 【表4】PID对应API说明 | API(可使用的程序接口) | Function(功能) | |------------------------------------|------------------------------------------------------------------| | PID_Init(void) | PID参数初始化 | | PID_MoveCalculate(PID_Struct \*pp) | PID速控模型计算输出的pwm(注意:需要编码器转速采样之后,进行处理) | ## 3.4.3 直流电机全桥驱动控制(MOTOR) ​ 据实测,智控板针对智能汽车竞赛车模(I车模)的实际驱动速度为:空载最高14.7m/s,负载最高11.7m/s。在驱动代码的头文件(Motor.h)中限制了车辆的最高速,以保障各项安全。同时参赛队伍可以修改控制周期等参数调试。 ![](./res/21aa75b4e1db256b49f4bb5ffff5afec.png) ​ 图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对电机进行一次控制 | ## 3.5 电量计 ​ 电池在长时间使用过程中,过充亦或者使用电压持续过低容易对电池造成损坏,电量计用于采集电池的电压和电量,可有效协助参赛队伍合理利用电池。 电量计的相关驱动代码在“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) | 电量计处理函数,每秒采集电量和电压进行更新 | ​ 用户可根据自身需求,去修改文件中的源码设置,从而实现个性化的功能。例如低电量报警等功能。 # 四、人机交互功能(HMI) ​ 智控板为参赛队伍设置多项必要的人机交互功能,包括发车和调试所需的按键输入(Key)、传感器光源补偿和状态提醒的RGB彩灯控制、报警及提醒的多功能蜂鸣器音效。 ![](./res/53d5f7be01b52ec83dce37398c88088e.png) ​ 图4.1 人机交互功能 ## 4.1 按键挡位 ​ 在“Gpio.c”文件中,已经添加了按键的相关响应接口,在“Icar.c”文件中参赛者可添加相关的按键处理代码来实现个性化的操作,通过精确捕捉按键按下的时长来检索各个模式挡位。比如:可设定在按键按下进行小车发车,可设定按键持续按下3s以上进行小车的自检等等。 ![](./res/b6f48f4e2978c79122964423cd751928.png) ​ 图4.2 添加按键处理代码 ## 4.2 RGB全彩灯控制 ​ 用户可自己设定RGB灯光的颜色来便于观察小车的运行状态,譬如:在小车静态情况下设置为蓝色,运行过程中RGB灯光切换为绿色,电量较低时RGB切换为黄色或者红色。来展示小车的状态。 ​ RGB彩灯规格推荐WS2812系列灯珠(淘宝可买),灯的数量自选,可串联使用,通过单总线协议控制灯效,彩灯供电推荐5V,并接入智控板的扩展IO使用。 ![](./res/c49c0581c36572bf590df2645d331d81.png) ​ 图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”文件中有定义,参赛者可自定义添加颜色。 ![](./res/36796e90530bcc4ae81e2bf8daf23430.png) ​ 图4.4 RGB彩灯颜色定义 # 4.3 蜂鸣器音效控制 ​ 智控板为参赛队伍设计一颗5V无源蜂鸣器,用户可自己设定蜂鸣器的运行模式进行人机交互。例如:在系统初始化成功之后,设定开机音效;按键按下时,设定提示音效;低电量的情况下进行电量报警的音效。 ​ 蜂鸣器使用的函数说明如下表: ​ 【表8】蜂鸣器对应API说明 | API(可使用的程序接口) | Function(功能) | |----------------------------------------|------------------------------------------------------------------------------------| | GPIO_Initialize(void); | 初始化一个蜂鸣器,状态LED和按键输入 | | GPIO_Timer(void); | GPIO的线程控制 | | GPIO_Handle(void); | GPIO的处理函数 | | GPIO_BuzzerEnable(Buzzer_Enum buzzer); | 蜂鸣器工作模式设定,可设定为以下5种![](media/8a0fa893d2fbee4e323a5374f645c402.png) |