【技术手册】第二十一届全国大学生智能车竞赛---单车定向组

前言

各位参赛的同学们,大家好!新的一届智能车竞赛又来临了,和往届相比,第二十一届智能车竞赛的赛项发生了很大的变化。今天,我们将聚焦单车定向组,由龙邱工程师为大家带来该组别的全面讲解。讲解内容包括赛题解析、机械结构、硬件配置、软件基础与控制思路。

编写这篇手册是为了帮助新同学快速了解充满魅力的智能车竞赛。同时,我们会在这里毫无保留地分享我们在单车定向组的方案与调车心得。我们深知,没有绝对的最优解,但在手册中,我们会尽力分享我们积累的经验与理解。希望这些内容能为大家提供一条清晰的探索思路,让大家在备赛过程中少走弯路,更加从容地应对比赛挑战。

如果大家想要探讨智能车相关话题,欢迎加入我们的 QQ 讨论群。在这里,无论是智能车的硬件设计、软件编程,还是比赛策略、技术难题,都能展开交流。

龙邱21届智能车综合技术交流群: 228227119

龙邱21届智能车综合技术答疑 :693088639

龙邱21届智能车单车定向组:492447915

1. 组别简介

1.1. 规则信息来源

智能汽车竞赛官网http://www.smartcarrace.com/
卓老师 CSDN 博客: 《第二十届全国大学生智能汽车竞速比赛规则》

https://blog.csdn.net/zhuoqingjoking97298/article/details/154598625
《第21届智能车竞赛单车定向组比赛科目细则》

https://blog.csdn.net/zhuoqingjoking97298/article/details/154698058

1.2. 赛题要求

1.3. 规则解析

单车定向组共设四个科目,涵盖高速与低速场景下的平衡控制能力考核:

• 科目一:直线竞速(15~30米直线往返,考察高速稳定性)

复制代码
这个科目是比赛车模高速行进的能力。 车模从发车区出发, 直线行驶到掉头区返回。 发车区到调头区域之间的距离大约 在 15米 ~ 30米。

• 科目二:八字慢速(半径2米圆内绕桩,考验低速平衡能力)

复制代码
车模从发车区发车, 要求在半径为 2米 的圆内完成锥桶八字绕桩行进。 两个锥桶之间的间隔为2米。 发车区的宽度为一米。
车模在比赛过程中, 只准沿着 八字绕桩路径单向行驶, 绕行一周, 不允许来回往复运行。

比赛成绩是以本组内完赛最长时间 t0为基础,车模完赛运行时间是 t, 最终比赛成绩为 t0-t。

• 科目三:颠簸路段(坡道、草地、锥桶综合地形,验证鲁棒性)

复制代码
颠簸路段科目考察车模速度和稳定性。 车模从发车区出发, 途径坡道, 草地,锥桶 经过掉头区返回到发车区。 
发车区到调头区域之间的距离大约在 20米 ~ 30米。 锥桶中心之间的间距在 2米 ~ 5米 之间。
其中的坡道规格与 室内赛道中的坡道规格相同, 只是宽度加宽大于90厘米 ~ 100厘米 左右,
实际比赛中, 使用两个室内赛道中的坡道并排放置, 形式比赛中的坡道。

• 科目四:电磁门无线定向(国赛项目,具体细节待公布)

复制代码
这个科目是国赛比赛科目。 详细电磁门无线定向规格将会在 2026年4月底之前公布。
1.3.1. 主控平台

极速越野组可用的微控制器(MCU)型号包括:

AURIX™ 系列 : TC212、 TC264、 TC297、 TC364、 TC377、 TC387

推荐使用 TC297MCU,主频:三核 300MHz, SDRAM: 2.7M, FLASH: 8M,从数据看
TC297MCU 的主频和 TC377 相同, SDRAM 和 FLASH 都要优于 TC377MCU。

1.3.2. 规则要点

⚫ 元素尺寸:注意每个元素的间距,尺寸等,调试时尽量按标准摆放

需要注意:自制的电路板需在正面覆铜面展示队伍信息,包括学校名称、队伍名称、制作日期。

2. 硬件清单

2.1. 器件清单

模块名称 作用 是否必须 是否需要自制
TC297TX英飞凌核心板 MCU最小系统,引出GPIO管脚
英飞凌TC2&3通用母板 稳压电源、统一外设资源接口
DRV8701E 单路驱动 驱动单路电机
LSM6DSR陀螺仪 姿态反馈,转向控制
LQ_1024编码器 反馈电机转速,可做惯性导航
BD1202北斗双频GNSS定位模块 采集点位,导航循迹
DAP miniWiggler英飞凌下载器 下载程序,串口调试,在线仿真
3S 1500mAH锂电池 整车供电,放电倍率高
IPS2.0模块2V2 IPS屏幕,显示数据,GPS点位等
十通道双摇杆遥控器 遥控采点,调试等

2.2. 模块详解

2.2.1. TC297 核心板

⚫ 采用 TC297 芯片,主频 三核 300Mhz, SDRAM: 2.7M, FLASH: 8M;内存大,运算速度

快。

⚫ 独创三排针设计,外形尺寸 47*37MM,在极小的尺寸里引出了大部分常用的管脚,功能齐

全、板子小巧,非常适合智能车使用。

⚫ 板子带有多种保护电路设计,使用更安全。

⚫ 提供智能车常用外设模块例程库,注释详细,使用简单,并配有视频教程,更适合新手学习

和使用。

2.2.2. TC2&3 通用母板
2.2.3. DRV8701 单路驱动

电机应该都比较熟悉,在电机两端施加电压,电机就会旋转,电压越大,转速越快。通过电压越大,转速越快这句话,我们可以想到用PWM来控制转速,但是直接把电机直接接在核心板IO口是不可行的(因为IO口电压比较低,而且驱动电流太小),因而就需要电机驱动。

该驱动采用门极驱动芯片 DRV8701E + N-MOS 管 TPH1R403NL 方案,无需升压电路,输入电源 5.9V ~ 28V 均可使用,带过流保护功能。

控制方法:控制一个电机只需要输入一个 PWM 信号控制转速,通过一个普通 GPIO 输出高低电平来控制转向。

⚫PH-4P接口:隔离供电以及信号输入,其中PWM为PWM信号输入引脚,IO为电机旋转方向引脚。

⚫ 红色接线端子:直流电压输入,输入电压5-28V,一般大小为电机可承受的最大电压。

⚫ 蓝色接线端子:直流电压输出,输出电压与输入PWM值正相关。

当输入的PWM波的占空比越大时,蓝色端子输出的电压值与红色端子的电压值越接近,反之则与0V越接近。

U 红色端子×脉宽 = U蓝×周期,两端同时除以周期,得到如下关系式:

U 红色端子×占空比 = U蓝。

例如当红色端子的幅值为24V,占空比为50%时,与直流电压12V作用到电机上所产生的效果是一模一样的,即速度相同;即24V×50%=12V。

另外,既然满足这个关系,那PWM波的频率是不是可以随意了,答案当然不是,频率太低会导致电机运转不畅,振动大,噪音大;频率太高会导致驱动器开关损耗较大,甚至有电机会啸叫而不转的情况。一般1k~30k的PWM频率较为普遍,几百Hz的也有,实际上需要根据电机功率在测试时确定合适的PWM频率范围为宜。

可以观察到,输入信号除了供电(3V3、GND)以及PWM信号,还有一个输入叫"I/O",这个信号的作用是控制蓝色端子输出正反电压的,这样就可以控制电机进行正反两个方向的旋转。连接并正确使用电机驱动板,其中2.0mm间距的白色接口为信号接口,需要连接到主控板,其VCC连接主控板电机接口的VCC,剩余引脚按顺序连接,GND可以不连接。XT30端口为供电端口,连接主控板上的电池口。蓝色的端口为电机连接口,这里没有正负之分。

驱动板采用GPIO与PWM相结合控制电机转动,其中GPIO引脚控制电机转动方向,PWM引脚控制电机转动速度,电机驱动板输出电压(蓝色端子的电压值)。

2.2.4. BD1202 模块

LQBD1202 模块是一种高性能双频 GNSS 定位模块,基于先进的 CYNOSURE III 架构,支持

GPS、 BeiDou、 GLONASS、 Galieo、 NAVIC/IRNSS、 QZSS。该模块继承了高效的电源管理架

构,同时提供高精度、高灵敏度和低功耗的 GNSS 解决方案,适用于骑车、电子产品的导航应用

等。 支持所有民用 GNSS 系统;支持 BDS-3 信号: B1C、 B2A;可同时接收 L1 和 L5 波段信号,

亚米级定位精度,智能抗干扰。

模块与单片机之间通过串口通信, 使用简单方便,单片机例程中提供坐标解析程序和坐标转

换程序,使定位更准确。

(注意:龙邱科技现售卖的GPS模块已是V5版本,

引脚已与主板引脚对齐 顺序为VCC GND RXD TXD PPS)注意VCC GND不要接反

2.2.5. 陀螺仪

通过对陀螺仪数据的精准采集与合理应用,是实现单车稳定平衡的第一步,也是后续所有高级控制算法的基础。

陀螺仪选用 LQ9AGM 陀螺仪,九轴设计,零漂小,数据稳定,可以采集地磁(注意:地磁采

集可能会受到电机和舵机转动的干扰,安装陀螺仪时尽量远离电机和舵机放置,减小干扰)。

陀螺仪在智能车中的应用:

⚫ 与转向环串级使用,达到更好的控制效果。

⚫ 调整平衡车姿态,使车身平衡且能正常转向和前进。

⚫ 作为角度环闭环控制的输入。

⚫ 积分角度作为元素状态切换条件,例如确定环岛的进环、环内、出环时机。

⚫ 读取地磁信号,通过地磁信号辅助 GPS 定位,提高定位精度。

九轴陀螺仪主要由加速度计、 陀螺仪和磁力计三部分组成,加速度计用于测量物体的加速

度,陀螺仪用于测量物体的角速度,磁力计用于测量地磁信号。通过对加速度和角速度的测量,

可以推导出物体的角位移。简单来说就是可以读取物体的偏移角度,以及移动的加速度。可以通

过程序处理得到物体的欧拉角以及移动加速度,通过磁力计可以获取地磁信号,实现电子罗盘功

能,为设备提供精确的方向指示,辅助 GPS 完成更精准的定位。

陀螺仪的欧拉角是用来描述物体在空间中的姿态(即旋转角度)的一种表示方法,包括滚转

角(Roll)、俯仰角(Pitch)和偏航角(Yaw)。

九轴陀螺仪主要由加速度计、 陀螺仪和磁力计三部分组成,加速度计用于测量物体的加速

度,陀螺仪用于测量物体的角速度,磁力计用于测量地磁信号。通过对加速度和角速度的测量,

可以推导出物体的角位移。简单来说就是可以读取物体的偏移角度,以及移动的加速度。可以通

过程序处理得到物体的欧拉角以及移动加速度,通过磁力计可以获取地磁信号,实现电子罗盘功

能,为设备提供精确的方向指示,辅助 GPS 完成更精准的定位。

陀螺仪的欧拉角是用来描述物体在空间中的姿态(即旋转角度)的一种表示方法,包括滚转

角(Roll)、俯仰角(Pitch)和偏航角(Yaw)。

偏航角(Yaw)是物体绕 Z 轴旋转的角度,用来描述物体绕自身旋转的方向。当物体绕 Z 轴

正方向逆时针旋转时,偏航角为正值,绕 Z 轴负方向顺时针旋转时,偏航角为负值。

通过测量陀螺仪的角速度,可以积分得到物体的欧拉角。欧拉角的变化可以用来控制物体的

姿态,例如在飞行器中,通过调整滚转角、俯仰角和偏航角,可以实现飞行器的稳定控制和导航

功能。

需要注意的是,欧拉角表示的是物体在空间中的绝对姿态,而非相对于某个参考物体的姿

态。在实际应用中,为了避免欧拉角的奇异性问题,常常使用四元数或旋转矩阵等其他表示方

法。

2.2.6. 编码器

在智能车中,编码器的主要功能是测量定时器中断周期内的脉冲数,用作速度控制回路中的

实际反馈值。通过将此实际值与预设的目标值进行比较,并采用 PID 控制器来调整输出,从而实

现精确的速度闭环控制。

编码器发送脉冲信号,定时器引脚接收脉冲信号,通过 AB 信号的差异或者根据方向引脚电平

判断是正值还是负值,脉冲信号值会在定时器中累计,直到手动清除,所以每次读取编码器值后

需要清除累计值,才可以获得实时速度值。

细心的读者可能会发现,相同转速下编码器值读取大小与读取时间间隔有关,读取时间间隔

越大,累计值越大,读取到的值也会越大。

3. 开发工具

3.1. 硬件设计软件

熟练掌握至少一种常用的电路设计软件,如 Altium Designer、 立创 EDA 等。了解软件的界

面布局、基本操作流程和常用功能模块,如原理图设计、 PCB 布局、布线、铺铜、规则检查、生

成报表等。

能够使用软件进行简单的电路原理图绘制和 PCB 设计, 包括元件库的创建和管理、原理图的

连接和标注、 PCB 的布局规划和布线、铺铜等。掌握 PCB 布局和布线的基本技巧和方法,如元件

的合理布局、信号线的走向和间距控制、电源线和地线的布线方式、过孔的使用和优化等。

了解 PCB 设计的基本原则和规范,如电气性能要求、信号完整性、电源完整性、电磁兼容性

(EMC)等。能够根据电路的功能和性能要求,进行合理的 PCB 设计,确保 PCB 的电气性能和

可靠性满足实际应用的需求。同时,要了解 PCB 制造工艺和生产流程,掌握 PCB 设计文件的输

出和制作要求,能够与 PCB 制造商进行有效的沟通和协作,确保 PCB 的制造质量和生产进度。

我司提供的资料中包含 PDF 版原理图、 基于 Altium Designer(AD)的原理图封装库和

PCB 封装库。同学们在自己制作 PCB 时可以使用 AD 导入我司提供的封装库文件,参考 PDF 版

原理图完成电路板设计。主板原理图中包含了智能车竞赛中常用的外设模块端口,在自己制版时

仅需要画出用到的外设接口即可,没有用到的接口不需要引出。

需要注意:自制的电路板需在正面覆铜面展示队伍信息,包括学校名称、队伍名称、制作日

期。

3.2. 搭建开发环境

3.2.1. ADS 集成开发环境

由于这部分展开来讲有点多,所以这里提供了一个链接,大家可以跳转进去查看教程。

ADS 安装包:(内涵多个版本 ADS 安装包,最新版例程使用 ADS1.9.2 及以上打开,老版例程使用 ADS1.6.0 版本打开)

链接: https://pan.baidu.com/s/1Wg7uZ-PFW63A-0p1yOg5jQ 提取码: eawu

ADS 安装教程:

ttps://www.bilibili.com/video/BV1wV411E7PY/?from=search&seid=15035982395236446406

3.2.2. 下载开源库

这里提供的是龙邱 TC297 的新库,新库分享到了 QQ 群里,大家可以进群下载(注:大家也

可以询问淘宝客服,客服会给大家提供):

龙邱 21 届智能车综合技术交流群: 228227119-> 群文件:龙邱智能车库 -> 下载例程库

群文件中含有 LQ_TC297_LIB_V5.0 和 LQ_TC297_LIB_V7.0 例程库,使用 V5、 V6 母板的同

学下载 V5.0 版本例程库, ADS 版本为 1.6.0;使用 V7 母板的同学下载 V7.0 版本例程库, ADS

使用 1.9.2 及以上版本。

3.2.3. 点灯程序测试

我们写一个最简单的点灯程序,来给大家演示一下烧录

点击烧录 Flash Active Project 按钮,自动编译项目并且烧录。

关于封装库的使用教程可以参考:

龙邱芯片开源库使用介绍:

https://mp.weixin.qq.com/s/ZwwvQOhNiwHVuYw8nISv2Q

3.2.4. 搭建环境时的常见问题

最常见的问题:板子与下载器都连接好了,驱动也没问题但是还是烧录失败?

解决方法:先给母板外部供电后,再连接下载器。

导入新工程后记得右击选择"Set Active Project",来设置活动页面,其他的问题展开就太

多了,这里不在列举了。其他问题可以进这个链接查看:

ADS 常见问题汇总:

https://mp.weixin.qq.com/s/EM0Co37XrFKD5DUQX8YK5g

3.3. 多功能调试助手

在日常的备赛过程中,上位机或图传等调试助手扮演着至关重要的角色,它能提供实时的数

据反馈,帮助研发人员快速定位并解决问题。使得开发者可以更加专注于智能车算法的设计和优

化,而不用被琐碎的调试所困扰。可以提高开发效率,使团队能在短时间内完成更复杂的任务。

4. 外设基础

在使用外设时,首要步骤是明确这些设备与单片机之间连接的具体引脚。 引脚查询方法:

⚫ 查看电路板丝印层的标注。

⚫ 查看电路板设计原理图。

4.1. GPIO 输入输出

GPIO 是通用输入输出(General Purpose Input/Output)端口的简称。 通俗来讲就是单片

机可控制的引脚,所有的 GPIO 引脚都有基本的输入输出功能。

最基本的输出功能是由单片机控制引脚输出高、低电平,实现开关控制,如把 GPIO 引脚接入

到 LED 灯,那就可以控制 LED 灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或三

极管控制外部大功率电路的通断。

最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过检测电平高低区分

按键是否被按下。

此处应用的是引脚的输出功能,引脚的输出模式有以下几种:

⚫ 推挽输出: 推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都

具有驱动能力。

⚫ 开漏输出: 开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真

正输出高电平。

补充说明:所谓的驱动能力,就是指输出电流的能力。对于驱动大负载(即负载内阻越小,

负载越大)时,例如 IO 输出为 5V,驱动的负载内阻为 10 欧姆,于是根据欧姆定律可以正常情况

下负载上的电流为 0.5A(推算出功率为 2.5W)。显然一般的 IO 不可能有这么大的驱动能力,也

就是没有办法输出这么大的电流。于是造成的结果就是输出电压会被拉下来,达不到标称的 5V。

当然如果只是数字信号的传递,下一级的输入阻抗理论上最好是高阻,也就是只需要传电压,基

本没有电流,也就没有功率,于是就不需要很大的驱动能力。

4.2. ADC 采集

ADC 是"Analog-to-Digital Converter" 的英文简称,能将模拟信号转变为数字信号。 通常

是将信号采样并保持以后,再进行量化和编码,这两个过程是在转化的同时实现的。具体的转化

步骤在这里就不展开说了,如果是开发者使用,我们应该关注哪些参数:

⚫ 分辨率---表示 AD 对输入信号的分辨能力,及数值部分的精度。一般模拟采样中使用 8 位还

是 12 位的 ADC 说的就是分辨率。例如:输入模拟电压的变化范围为 0~ 3.3 V,输出 12 位

二进制数可以分辨的最小模拟电压为 3.3V / 4095 ≈ 0.806mV;

⚫ 工作电压和基准电压(内部或者外部基准):工作电压是 AD 芯片工作的额定电压,关键的

是基准电压,又叫参考电压,可以来之芯片内部又或者外部接入,其决定了 AD 的分辨率,

所有基准电压一定要稳。

4.3. 定时器中断

定时器中断是一种基于定时器的中断,它允许在特定时间间隔内触发一个事件或一段代码。

在智能汽车竞赛中,定时器中断常用于周期性任务,例如定时、传感器数据采集、 转向环和速度

环控制、 编码器计距离或者陀螺仪角度积分。

例如设置中断周期为 5ms,那么就会每 5ms 执行一次中断里的程序。

4.4. PWM

PWM 是一种用数字信号模拟模拟信号的技术,它通过在一个固定的时间周期内改变信号的脉

冲宽度来模拟电压或电流的变化。 PWM 信号通常用于控制各种设备,如电机、 LED 灯、伺服机构

等,以调整它们的输出或工作状态。 PWM 信号具有两个主要参数:

⚫ 周期/频率(Period): PWM 信号的一个完整周期持续的时间,通常以微秒或毫秒为单

位。 电机通常选择 10kHz ~ 20kHz 的 PWM 频率, 频率过低会导致电机噪音和发热,

频率过高可能超出驱动芯片的响应能力; 舵机通常要求 50Hz ~ 333Hz,其角度由高电

平脉冲宽度(0.5ms ~ 2.5ms)决定。

⚫ 占空比(Duty Cycle):高电平状态所占整个周期的百分比。它决定了 PWM 信号的平

均电压或电流值。

PWM 信号的占空比决定了目标设备的输出特性,例如电机的转速或 LED 的亮度。更大的占

空比通常表示更高的输出值。 在智能车竞赛中, PWM 是实现电机速度控制和舵机转向调节的核心

技术。通过调整 PWM 信号的占空比,可以精确控制电机的转速和舵机的转向角度。

4.5. 串口通信

单片机中的串口是一种用于数据传输的通信接口,它可以将数据以串行的方式进行传输。串

口通常由两个引脚组成,即发送引脚(TX)和接收引脚(RX)。当单片机需要发送数据时,它将

数据转换为串行格式,并通过 TX 引脚发送出去。接收方通过 RX 引脚接收数据,并将其转换为原

始格式,从这里可以知道串口通信在连接时需要将发送引脚(TX)连接接收引脚(RX)。

5. 通用控制算法

串口通信可以通过硬件或软件实现,其中硬件串口通常具有更高的速度和可靠性,而软件串

口则具有更高的灵活性和可定制性。在单片机中,串口通常用于与其他设备进行通信,例如遥控

器、 传感器、显示屏、上位机等。

串口协议是指在串行通信过程中,双方之间所遵守的通信规则和约定。 UART 串口协议包含以

下内容:

⚫ 数据帧格式: UART 串口协议使用包含起始位、数据位(5 至 8 位)、可选的奇偶校验位

及 1 或 2 个停止位的数据帧来传输信息。具体格式需双方预先协商确定。

⚫ 波特率: UART 串口协议使用波特率来指定数据传输的速率。波特率表示每秒钟传输的

位数。常见的波特率包括 9600、 19200、 38400、 57600 和 115200 等。通信双方必须

使用相同的波特率才能正确地接收和发送数据。

⚫ 帧同步: UART 串口协议使用起始位和停止位来标识每个数据帧的开始和结束。起始位

是一个低电平信号,用于通知接收端数据帧的开始。停止位是一个高电平信号,用于通

知接收端数据帧的结束。

⚫ 错误检测: UART 串口协议利用奇偶校验位检查数据位数量是否符合预期,并通过校验

和验证整个数据帧的完整性,以此来发现传输过程中的错误。

⚫ 数据流控制: UART 串口协议支持硬件数据流控制和软件数据流控制。硬件数据流控制

使用 CTS 和 RTS 信号来控制数据传输。软件数据流控制使用 XON(ASCII 码为 0x11)

和 XOFF(ASCII 码为 0x13)字符来控制数据传输。

串口通信作为一种基础而强大的技术手段,广泛应用于智能车等自动化领域中,可以实现数

据的传输, 从而对系统进行实时监控和调试。

5.1. PID 算法简介

PID 算法是工业应用中最广泛算法之一,是一种常用的反馈控制算法,它是根据系统当前状态

与期望状态之间的差异来调整控制器输出的方式。在闭环系统的控制中,可自动对控制系统进行

准确且迅速的校正。 PID 算法已经有 100 多年历史,在四轴飞行器,平衡小车、汽车定速巡航、

温度控制器等场景均有应用。 PID 是 Proportional-Integral-Derivative 的缩写,分别代表比例、

积分和微分三个部分。

PID 控制算法将比例、积分和微分三个部分的输出进行线性组合,得到最终的控制器输出。通

过调整三个部分的权重和参数,可以实现对系统的精确控制。

其中:

Kp:比例增益,为调试参数。

Ki:积分增益,为调试参数。

Kd:微分增益,为调试参数。

Error:误差 = 设定值(输入) - 反馈值(测量元件输出值) 。

根据实际系统的特性和需求,调整 PID 控制算法中的比例、积分和微分三个部分的权重和参

数,以使系统能够以最佳的性能响应和控制的过程,我们一般称之为"调参"。

在调参过程中:

Kp 过大会对误差的变化做出过大的反应,从而导致系统动作幅度过大,容易引起振荡甚至不

稳定。过小意味着对误差的调整力度不足,系统达到目标值的速度变慢,响应滞后。

Kp 即使设置得较好,仅靠 Kp 控制仍会存在部分问题:

Kp 控制对持续存在的小误差没有累计作用,无法完全消除系统的稳态误差。这是因为比例控

制的输出直接与当前误差成正比,而当误差较小时,调整力度可能不足。需要 Ki(积分)控制来

消除这种误差。

Kp 控制对快速变化的误差反应不足,而 Kd(微分)控制可以预测误差变化趋势,帮助提高

系统动态性能, 避免过冲, 减少超调。

5.2. 电机闭环控制

给定占空比 → 测转速 → 比较实际转速和目标转速 → 重新调整占空比,这样的过程其实就是

一个闭环控制,我们发现这个过程形成了一个回环:每次调整的占空比大小都是基于上一次结果

得到的。相比开环控制,闭环控制多了信息反馈环节(测电机转速),我们根据反馈信息再做出

进一步调整,接着获得调整后的反馈信息,再基于更新过的反馈信息进行新一轮的调控。

通常我们使用增量式 PID 算法来实现对电机的闭环控制。 示例代码:

⚫ 头文件:

c 复制代码
typedef struct PID
{
	double Error; // 当前偏差
	double LastError; // 上次偏差
	double PrevError; // 上上次偏差
	float KP; // 比例系数
	float KI; // 积分系数
	float KD; // 微分系数
}PID;
extern PID left_MotorPID; // 左右电机结构体变量声明
#define MOTOR_MAX_DUTY 3000 // 电机最大占空比限制

⚫ C 文件:

c 复制代码
PID left_MotorPID; // 定义左右电机 PID 结构体变量
/**
* @brief 占空比限幅保护函数
* @return 限制后的占空比值
*/
double limit_DutyCycle(double duty, double min, double max)
{
	return duty >= max ? max : (duty <= min ? min : duty);
}
/**
* @brief 增量式 PID 控制器实现
* @param pid 指向 PID 控制器的指针
* @param actual_Speed 实际速度值
* @param target_Speed 目标速度值
* @return 本次 PID 计算得到的增量值
*/
double PID_Increment(PID *pid, double actual_Speed, double target_Speed)
{
	double Increment = 0;
	// 设置 PID 参数
	pid->KP = 18;
	pid->KI = 18;
	pid->KD = 0;
	pid->Error = target_Speed - actual_Speed; // 计算误差
	// 计算增量
	Increment = pid->KP * (pid->Error - pid->LastError)
	+ pid->KI * pid->Error
	+ pid->KD * (pid->Error - 2 * pid->LastError + pid->PrevError);
	// 更新误差记录
	pid->PrevError = pid->LastError;
	pid->LastError = pid->Error;
	return Increment;
}
/**
* @brief 电机控制函数
* 计算并更新左右电机的占空比
*/
void control_Motors()
{
	// 更新左电机占空比
	left_MotorDuty += PID_Increment(&left_MotorPID, left_EncoderValue, left_TargetSpeed);
	left_MotorDuty = limit_DutyCycle(left_MotorDuty, -MOTOR_MAX_DUTY,
	MOTOR_MAX_DUTY);
}

6. 单车定向赛项分享

6.1. GPS 的使用

6.1.1. 数据解析

6.1.1. 数据解析

单片机通过串口接收 GPS 信号, GPS 输出的数据为一个字符串,需要将字符串解析获取到经

纬度坐标并保存在数组中方便循迹使用。以下是数据解析程序,通过识别是否接收到字符串和

","判断数据有效信息和位置,并将经纬度信息保存在数组中。

c 复制代码
void parseGpsBuffer(void)
{
    char *subString;
    char *subStringNext;
    char i = 0;
    if (Save_Data.isGetData) // 如果字符串不为空
    {
        for (i = 0; i <= 8; i++) // 循环7次
        {
            if (i == 0)
            {
                if ((subString = strchr(Save_Data.GPS_Buffer, ',')) == NULL) // 没有检测到逗号
                    while (1)
                        ; // 解析错误
            }
            else // 检测到逗号,返回逗号的位置
            {
                subString++;                                          // 位置加1(定位到逗号的后一位)
                if ((subStringNext = strchr(subString, ',')) != NULL) // 定位下一个逗号的位置
                {
                    char usefullBuffer[2];
                    switch (i)
                    {
                    case 1:
                        memcpy(Save_Data.UTCTime, subString, subStringNext - subString); // 两个逗号之间为 时间信息 并转换成北京时间
                        Save_Data.UTCTime[1] = Save_Data.UTCTime[1] + 8;
                        if (Save_Data.UTCTime[1] > '9')
                        {
                            Save_Data.UTCTime[0]++;
                            if (Save_Data.UTCTime[0] == '3')
                                Save_Data.UTCTime[0] = '0';
                            Save_Data.UTCTime[1] = (Save_Data.UTCTime[1] % '9') + '0' - 1;
                        }
                        break; // 结束switch
                    case 2:
                        memcpy(usefullBuffer, subString, subStringNext - subString);
                        break; // 数据是否有效标志
                    case 3:
                        memcpy(Save_Data.latitude, subString, subStringNext - subString);
                        break; // 获取纬度信息
                    case 4:
                        memcpy(Save_Data.N_S, subString, subStringNext - subString);
                        break; // 获取N/S
                    case 5:
                        memcpy(Save_Data.longitude, subString, subStringNext - subString);
                        break; // 获取经度信息
                    case 6:
                        memcpy(Save_Data.E_W, subString, subStringNext - subString);
                        break; // 获取E/W
                    case 7:
                        memcpy(Save_Data.speed, subString, subStringNext - subString);
                        break; // 获取速度
                    case 8:
                        memcpy(Save_Data.direction, subString, subStringNext - subString);
                        break; // 获取方向
                    default:
                        break;
                    }
                    subString = subStringNext; // 下一个逗号位置给第一个指针,
                    Save_Data.isParseData = 1; // 手动给真值,(数据是否解析完成)
                    //          if(usefullBuffer[0] == 'A')
                    //            Save_Data.isUsefull = true;
                    //          else if(usefullBuffer[0] == 'V')
                    //            Save_Data.isUsefull = false;
                }
                else
                {
                    while (1)
                        ; // 解析错误
                }
            }
        }
    }
}
6.1.2. 坐标系转换

GPS 采集到的数据为 WGS-84 坐标系, WGS-84 坐标系是一种地心坐标系,在这个坐标系

中,坐标通常以常以经度(λ)、纬度(φ)和大地高(h)来表示。而我们实际应用的值需要转换

为平面坐标系,需要将 WGS-84 坐标转换成平面直角坐标,才能被工程使用。在我们的例程中已

经添加了坐标转换程序,可以直接调用"latlon2utm()" 函数直接转换。

6.1.3. 判断方向

当有了平面直角坐标系后,我们就可以使用坐标系中任意两个点判断方向,在车模行进过程

中,我们可以提前记录下一个目标点的坐标,车模再通过采集自身的坐标,即可计算出车模当前

位置与下一个目标点位置的真北角度是多少,还可以通过计算车模上一个采集到的位置坐标和当

前采集的位置坐标,获取当前车模的运动方向。再通过当前车模运放方向和到下一个目标点方向

计算得出车模需要循迹的偏航角度。

c 复制代码
double get_angle(Position_t *Point1, Position_t *Point2)
{
	double angle=0.0;
	angle = atan2(Point1->PX - Point2->PX, Point1->PY - Point2->PY);//(-180, 180)
	angle = angle*180/3.1415926+180;
	if(angle < 0)
	return 360+angle;
	else
	return angle;
}
6.1.4. 判断距离

判断距离是为了检测当前车模位置到下一目标点位置的距离,如果距离过远可以加速冲刺,

接近下一目标点时可以提前减速,方便车模转弯。在平面直角坐标系中可以通过两个坐标点求平

方根" sqrt()" 函数得到距离信息。

c 复制代码
next_dis =
sqrt(pow((T_self.PX - T_peak[T_Trg_C].PX),2) + pow((T_self.PY - T_peak[T_Trg_C].PY),2));

6.2. 陀螺仪的使用

在单车平衡控制中,我们主要依赖:

陀螺仪:直接测量车身的角速度,这是内环(角速度环)最核心的反馈信号,用于实现快速、阻尼良好的平衡控制。

加速度计:用于测量静态或低速下的重力方向,与陀螺仪数据融合,以较慢的响应速度解算出更准确、无长期

漂移的车身倾角(Roll角),作为中环(角度环)的反馈。

在单车平衡控制系统中,陀螺仪(IMU)是实现稳定控制的核心传感器,其数据直接支撑串级PID中的两个关键闭环:

中环(角度环)与内环(角速度环)。整个控制流程可概括为以下环节:

  1. 作为中环(角度环)的反馈来源

    ⚫陀螺仪输出的角速度数据与加速度计测量的重力方向信息,通过传感器融合算法(如Mahony算法或卡尔曼滤波),

    实时解算出准确且动态响应良好的车身横滚角。

    ⚫该角度作为中环的实际角度反馈值,与由外环生成或设定的目标角度进行比较,产生角度误差。

    ⚫中环PID根据该误差计算出为恢复平衡所需的理论目标角速度。

  2. 作为内环(角速度环)的直接反馈

    ⚫内环是控制系统的最终执行环,直接决定舵机的动作。

    ⚫陀螺仪提供的角速度原始值被直接用作内环的实际角速度反馈。

    ⚫内环PID将中环输出的目标角速度与陀螺仪实测的实际角速度进行比对,实时计算出最直接的舵机PWM控制

    信号,驱动车把快速响应,抑制车身摆动,使车模迅速逼近平衡姿态。

因此,陀螺仪数据的准确性与实时性是整车控制性能的基石。在软件实现中,需特别关注IMU的安装减振、数

据校准以及融合算法的可靠性,才能确保两个控制环都能获得高质量的反馈信号。

具体更多细节,可以参考 龙邱科技:单车定向组方案设计与控制思路分享 微信推文

https://mp.weixin.qq.com/s/x7729EsoKzAodmsyJlL-hQ

6.3. 摄像头的使用

神眼摄像头在单车定向组中可以通过识别坡道上的大面积白色完成坡道矫正循迹。摄像头的主要作用可以应用到

科目三的坡道,坡道较为狭窄,使用 GPS 可能很难精准的通过桥洞。可以先用 GPS循迹将车模引导到桥

洞入口附近,当摄像头检测到坡道上大面积的白色区域时,切换到摄像头循迹,即可简单的通过这个元素。

对于摄像头识别部分的代码比较多,可以参考使用取白色平均值算法,计算出大面积白色的中心坐标,

先将车辆往坡道靠近后再切换回GPS模式,这样上坡道概率会提升。

6.4. 元素识别

单车定向组别的比赛分为四个科目,由简入难的比赛模式使得每个科目可以选择使用不同的循迹方式。

科目一 :往返赛道,这个科目主要考察车模的高速运动特性,包括车模的极限速度、加减速特

性。车模从发车区域出发,经过掉头区折返。这个科目在往届主要考察学生电机驱动的设计以及

定位精度。

在今年的单车定向组别下,更考验学生对三串级PID的理解,这里再强调每一个环的作用:

⚫外环(位置环):基于GPS/惯导/遥控等指令,计算目标倾倒角度,为整个控制系统提

供转向意图。作用:决定"车要往哪里去"。

⚫中环(角度环):通过IMU姿态反馈,将外环给出的目标角度与实际角度进行PID计算,

输出为达到目标角度所需的目标角速度指令。作用:将转向意图转化为"车身需要以多快的速度倾倒"来达成目标。

⚫内环(角速度环):快速响应陀螺仪测量的实际角速度,通过PID调节使实际角速度精准跟踪中环

给出的目标角速度,并输出直接驱动舵机的PWM控制信号。作用:作为"执行层",快速而精准地实现

中环的角速度指令,直接控制舵机动作。

在参数不良好的情况下,高速及其容易出现左右甩舵而直接翻车的情况。核心解决方案可以参考微信推文中提到的
动态PID 方法,在不同的速度下调用不同的PID以适应不同速度下的平衡稳定性。在速度较快时,
最重要的是降低内环(角速度)的PID(P),而中环(角度环)的PID几乎不用变化。

同时,同学们在制作电机驱动板板时要尽量电路简单,选用大功率的 MOS 管,对于 MOS 管的供电

和电机输出部分,布线要充分利用板子空间,将耐流做到足够充裕,防止炸板。在循迹上可以考

虑 GPS 加陀螺仪,让车模在直线循迹上尽量保持直线行驶,不出现因 GPS 数据漂移导致车模形式

起来左右晃动。

科目二 :八字赛道,这个科目在今年单车定向主要考察车模低速特性以及定位特性。车模从发

车区域出发,绕行赛道中的锥桶之后返回。时间用时越长得分越高。

关于低速稳定性,可以使用二串级PID ,直接将车辆倾倒控制在一定角度内,也就是车辆一但有倾倒角度,

立马通过大角度打方向(同时可以多给一些速度),提供更大的离心力效应,立刻将车辆倾倒趋势控制住,

以适应低速稳定性。锥桶间距等于 2 米。同时必须在2m半径的圆内行驶。由于锥桶间距较小,推荐使用

陀螺仪加编码器惯性导航。可以更准确的完成循迹。

科目三 :特殊路况考察,这个科目考察车模运动的稳定性、安全性、路径通过的精确度。

其中包括坡道、草坪区域、锥桶绕行。车模从发车区域出发,通过掉头区域运行之后返回发车区。这个科目

最主要的就是定位的精准度,精准度越高通过元素越简单,可以考虑陀螺仪、摄像头、 GPS 、编码器

四者结合循迹。识别坡道 时考虑使用摄像头完成精准循迹,先通过 GPS 循迹引导车模到坡道元素附近,

再切换摄像头循迹通过元素,或者用编码器+陀螺仪的惯性导航方式,先直接通过坡道元素,后续再切换

为正常循迹。草坪区域 通过时推荐在速度闭环的情况下进行适当减速,在高阻尼的草皮下行驶,车模

的平衡控制响应变慢、效能降低。最后的锥桶绕行使用GPS或者惯性导航都可行,踩点后可以将点位

显示在屏幕上,将路径大致路径可视化,在下一次发车前可以通过观察上一次的行驶路径进行简单的调整纠正。

(如果是GPS原始数据,修正小数点后第六位即可,纬度可直接±0.000001,经度推荐±0.000004)

7. 备赛建议与资源推荐

⚫ 学习路径: C 语言→单片机基础→传感器实验→算法移植。

⚫ 团队分工:硬件(电路设计)、软件(算法调试)、机械(车模改装)。

⚫ 学习资源: CSDN、往届技术报告、 GitHub、 B 站学习视频。

⚫ 基础解疑:官方 Q 群客服、官方淘宝客服。

⚫ 在越野车模调试时尽量配备一个遥控器,遥控器可以用来控制车模采集坐标点,还可以在调

试时防止车模失控,紧急停车,保护车模。

结语

到这里,这篇手册分享就结束了。 智能车大赛的魅力不仅在于追求胜利,更在于探索过程中的每一次自我突破。 大家在参考我们方案的同时,别忘了充分发挥自己的创造力, 去挖掘更多可能。

祝愿每一位同学都能在比赛中有所收获,享受智能车带来的乐趣。期待在赛场上看到你们的精彩表现,祝大家都能取得理想的成绩,加油!

相关推荐
Funing77 天前
硬件实战项目——纯硬件寻迹小车
嵌入式硬件·电机·电路·智能车
SkyXZ~8 个月前
机器人/智能车纯视觉巡线经典策略—滑动窗口+直方图法
计算机视觉·机器人·视觉巡线·智能车