前言
各位参赛的同学们,大家好!新的一届智能车又来临了,和往届相比,第二十届智能车大赛的赛项发生了很大的变化。今天,我们将聚焦极速越野组,由龙邱工程师为大家带来极速越野组的全面讲解。讲解内容包括赛题解析,机械结构,硬件配置,软件基础与控制思路。
写这篇手册是帮助新同学快速的了解充满魅力的智能车大赛。同时,会在这里给大家分享我们极速越野组的方案与调车心得。我们深知,没有绝对的最优解,但在手册里,我们会毫无保留地分享我们在极速越野组积累的方案经验与调车心得。希望这些内容能为大家提供一条清晰的探索思路,让大家在备赛过程中少走弯路,更加从容地应对比赛挑战。
如果大家想要探讨智能车相关话题,欢迎加入我们的QQ讨论群。在这里,无论是智能车的硬件设计、软件编程,还是比赛策略、技术难题,都能展开交流。
龙邱20届智能车综合技术交流群:228227119
龙邱20届智能车越野组交流群:432826229
1. 组别简介
1.1. 规则信息来源
- 智能汽车竞赛官网:全国大学生智能汽车竞赛
- 卓老师 CSDN 博客:《第二十届全国大学生智能汽车竞速比赛规则》第二十届全国大学生智能汽车竞速比赛规则_20届智能车-CSDN博客
- 卓老师微信公众号推文及每篇公众号文章的评论区:TsinghuaJoking
1.2. 赛题要求
1.3. 规则解析
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. 器件清单
TC297核心板 | |||
IPS2.0 寸屏幕 | 显示数据 | 否 | 否 |
电路板安装支架 | 方便母板、驱动板安装 | 是 | 否 |
遥控器 | 日常调试用,比赛禁用 | 否 | 否 |
2.2. 模块详解
2.2.1. TC297核心板
- 采用TC297芯片,主频 三核300Mhz,SDRAM:2.7M,FLASH:8M;内存大,运算速度快。
- 独创三排针设计,外形尺寸47*37MM,在极小的尺寸里引出了大部分常用的管脚,功能齐全、板子小巧,非常适合智能车使用。
- 板子带有多种保护电路设计,使用更安全。
- 提供智能车常用外设模块例程库,注释详细,使用简单,并配有视频教程,更适合新手学习和使用。
2.2.2. TC2&3通用母板
主板是电路连接枢纽,负责分配供电,保障各组件稳定运行。它还能高速传输信号,实现数据交互,配备丰富扩展接口,便于拓展功能,同时具备稳压作用,确保电力输出稳定。
可以选用V7版母板,引出多种和模块对应的接口,接线简单。
模块接口使用标准硬件SPI、IIC、UART接口,数据传输快。
板载多种供电电路,为模块提供充足的供电保障。
2.2.3. 2134BLDC无刷驱动
直流有感无刷电机的原理是基于磁场的相互作用,通过霍尔传感器感应转子的位置,从而控制定子绕组的通电顺序,使转子能够持续旋转。其工作过程为:当电机通电时,定子绕组中会产生一个旋转磁场,这个旋转磁场会吸引转子上的永磁体,使转子开始旋转。当转子旋转到一定角度时,霍尔传感器会检测到转子的位置,并将这个位置信号发送给电子控制器。电子控制器根据霍尔传感器发送的位置信号,控制定子绕组的通电顺序和电流大小,使转子能够继续旋转。这个过程会不断重复,直到电机停止运行。
以一个三相有感无刷电机为例,假设电机的额定电压为 12V,电机的三根线分别为 A、B、C。当电机通电时,单片机会根据霍尔传感器发送的位置信号,通过电机驱动板,控制 A、B、C 三根线的通电顺序和电流大小。例如,当霍尔传感器检测到转子的位置在 A 相时单片机会控制 A 相绕组通电,B、C 相绕组断电。此时,A 相绕组中会产生一个磁场,这个磁场会吸引转子上的永磁体,使转子开始旋转。当转子旋转到一定角度时,霍尔传感器会检测到转子的位置在 B 相时,电子控制器会控制 B 相绕组通电,A、C 相绕组断电。此时,B 相绕组中会产生一个磁场,这个磁场会吸引转子上的永磁体,使转子继续旋转。这个过程会不断重复,直到电机停止运行。
该驱动采用门极驱动芯片 EG2134 + MOSFET 管 MOT4572方案,无需升压电路,输入电源 10V ~ 25.2V 均可使用。
控制方法:控制一个电机只需要输入三个 PWM 信号和三个普通 GPIO 输出高低电平来控制速度和方向转向。
- 2*5排针接口:隔离供电以及信号输入。
- 电源接口:直流电压输入,输入电压12-28V,适合多种额定电压的电机使用。
- BLDC:直流电压输出,输出电压与输入PWM值正相关。
- 霍尔入:接电机霍尔线,读取电机霍尔值感知转子位置。
- 霍尔出:接单片机IO口,单片机采集转子位置。
当PWM波的占空比越大时,蓝色端子输出的电压值与XT30端子的电压值越接近,反之则与0V越接近。
U xt30×脉宽 = U蓝×周期,两端同时除以周期,得到如下关系式:
U xt30×占空比 = U蓝。
例如当电源端子的幅值为24V,占空比为50%时,与直流电压12V作用到电机上所产生的效果是一模一样的,即速度相同;即24V×50%=12V。
另外,既然满足这个关系,那PWM波的频率是不是可以随意了,答案当然不是,频率太低会导致电机运转不畅,振动大,噪音大;频率太高会导致驱动器开关损耗较大,甚至有电机会啸叫而不转的情况。一般1k~30k的PWM频率较为普遍,几百Hz的也有,实际上需要根据电机功率在测试时确定合适的PWM频率范围为宜。
可以观察到,输入信号除了供电(3V3、GND)以及三个PWM信号,还有三个输入叫“I/O”,这个信号的作用是控制BLDC端输出正反电压的,这样就可以控制电机进行正反两个方向的旋转。连接并正确使用电机驱动板,其中2*5排针口为信号接口,需要连接到主控板,其VCC连接主控板电机接口的VCC,剩余引脚按顺序连接,GND可以不连接。电源端口为供电端口,连接主控板上的电池口。BLDC的端口为电机连接口,这里必须根据程序说明接线。
驱动板采用GPIO与PWM相结合控制电机转动,程序采用六步换向法控制电机转动。所谓六步换向法就是通过通常采用霍尔传感器来检测转子永磁体的位置。霍尔传感器利用霍尔效应工作,当有磁场作用时会输出相应的电信号。通过这几个霍尔传感器的不同输出组合,就能判断出转子的位置,进而确定定子绕组的通电顺序,实现电机的换向。一般会使用三个霍尔传感器,它们按一定角度间隔安装在定子上,能产生 6 种不同的信号组合,对应着 6 个不同的转子位置区间,每个区间对应一次换向操作。
六部换向过程
以三相有感无刷电机为例,假设电机的三相绕组分别为 A 相、B 相、C 相,三个霍尔传感器分别为 H1、H2、H3。下面是具体的六部换向过程:
状态 1(001)
霍尔传感器输出信号为 001(H1 为低电平、H2 为低电平、H3 为高电平)。此时,给 A 相绕组通正向电流,B 相绕组通反向电流,C 相绕组不通电。这样就在定子中产生一个特定方向的磁场,与转子永磁体的磁场相互作用,产生转矩使转子转动。
状态 2(011)
随着转子转动,霍尔传感器输出变为 011。这时,控制电路改变通电顺序,让 A 相绕组继续通正向电流,C 相绕组通反向电流,B 相绕组不通电。新产生的磁场推动转子继续转动。
状态 3(010)
当霍尔传感器输出为 010 时,B 相绕组通正向电流,C 相绕组通反向电流,A 相绕组不通电,促使转子进一步转动。
状态 4(110)
输出信号变为 110 后,B 相绕组通正向电流,A 相绕组通反向电流,C 相绕组不通电,维持转子的转动。
状态 5(100)
若霍尔传感器输出 100,C 相绕组通正向电流,A 相绕组通反向电流,B 相绕组不通电,推动转子持续旋转。
状态 6(101)
最后,当输出为 101 时,C 相绕组通正向电流,B 相绕组通反向电流,A 相绕组不通电。之后转子转动又会回到状态 1 的位置,如此循环往复,实现电机的连续转动。
驱动板与V7母板接线示意图:
2.2.4. BD1202模块
LQBD1202模块是一种高性能双频GNSS定位模块,基于先进的CYNOSURE III架构,支持GPS、BeiDou、GLONASS、Galieo、NAVIC/IRNSS、QZSS。该模块继承了高效的电源管理架构,同时提供高精度、高灵敏度和低功耗的GNSS解决方案,适用于骑车、电子产品的导航应用等。支持所有民用GNSS系统;支持BDS-3信号:B1C、B2A;可同时接收L1和L5波段信号,亚米级定位精度,智能抗干扰。
模块与单片机之间通过串口通信,使用简单方便,单片机例程中提供坐标解析程序和坐标转换程序,使定位更准确。
2.2.5. 摄像头
摄像头作为获取赛道信息的视觉传感器,是所有视觉类赛项最核心的传感器。摄像头我们推荐大家使用神眼摄像头。使用MT9V034 芯片的神眼摄像头,采用了全局快门技术,所有像素点可同时收集光线、同时曝光,能在同一时刻形成完整图像,拍摄运动物体时不会发生形变,适合拍摄快速运动的物体。并且神眼摄像头在不裁剪图像的情况下帧数可达到260帧,性能非常强。
使用摄像头可以识别场地上跑道的白线或元素,实现精准的循迹完成比赛。
2.2.6. 陀螺仪
陀螺仪选用LQ9AGM陀螺仪,九轴设计,零漂小,数据稳定,可以采集地磁(注意:地磁采集可能会受到电机和舵机转动的干扰,安装陀螺仪时尽量远离电机和舵机放置,减小干扰)。
陀螺仪在智能车中的应用:
- 与转向环串级使用,达到更好的控制效果。
- 调整平衡车姿态,使车身平衡且能正常转向和前进。
- 作为角度环闭环控制的输入。
- 积分角度作为元素状态切换条件,例如确定环岛的进环、环内、出环时机。
- 读取地磁信号,通过地磁信号辅助GPS定位,提高定位精度。
九轴陀螺仪主要由加速度计、陀螺仪和磁力计三部分组成,加速度计用于测量物体的加速度,陀螺仪用于测量物体的角速度,磁力计用于测量地磁信号。通过对加速度和角速度的测量,可以推导出物体的角位移。简单来说就是可以读取物体的偏移角度,以及移动的加速度。可以通过程序处理得到物体的欧拉角以及移动加速度,通过磁力计可以获取地磁信号,实现电子罗盘功能,为设备提供精确的方向指示,辅助GPS完成更精准的定位。。
陀螺仪的欧拉角是用来描述物体在空间中的姿态(即旋转角度)的一种表示方法,包括滚转角(Roll)、俯仰角(Pitch)和偏航角(Yaw)。
滚转角(Roll)是物体绕X轴旋转的角度,用来描述物体绕自身前后倾斜的程度。当物体绕X轴正方向逆时针旋转时,滚转角为正值,绕X轴负方向顺时针旋转时,滚转角为负值。
俯仰角(Pitch)是物体绕Y轴旋转的角度,用来描述物体绕自身左右倾斜的程度。当物体绕Y轴正方向逆时针旋转时,俯仰角为正值,绕Y轴负方向顺时针旋转时,俯仰角为负值。
偏航角(Yaw)是物体绕Z轴旋转的角度,用来描述物体绕自身旋转的方向。当物体绕Z轴正方向逆时针旋转时,偏航角为正值,绕Z轴负方向顺时针旋转时,偏航角为负值。
通过测量陀螺仪的角速度,可以积分得到物体的欧拉角。欧拉角的变化可以用来控制物体的姿态,例如在飞行器中,通过调整滚转角、俯仰角和偏航角,可以实现飞行器的稳定控制和导航功能。
需要注意的是,欧拉角表示的是物体在空间中的绝对姿态,而非相对于某个参考物体的姿态。在实际应用中,为了避免欧拉角的奇异性问题,常常使用四元数或旋转矩阵等其他表示方法。
2.2.7. 编码器
在智能车中,编码器的主要功能是测量定时器中断周期内的脉冲数,用作速度控制回路中的实际反馈值。通过将此实际值与预设的目标值进行比较,并采用PID控制器来调整输出,从而实现精确的速度闭环控制。
编码器发送脉冲信号,定时器引脚接收脉冲信号,通过AB信号的差异或者根据方向引脚电平判断是正值还是负值,脉冲信号值会在定时器中累计,直到手动清除,所以每次读取编码器值后需要清除累计值,才可以获得实时速度值。
细心的读者可能会发现,相同转速下编码器值读取大小与读取时间间隔有关,读取时间间隔越大,累计值越大,读取到的值也会越大。
2.3. 整车接线示意图
以下是极速越野组整车接线示意图,所有接口都采用对插模式,模块上的引脚顺序和母板上对应接口的引脚顺序相同,使用排线直接对连即可,特殊说明电机驱动板与母板之间连线:驱动板控制口使用2*5P灰排线连接到母板双路驱动接口(P1接23_1、P2接21_4、P3接32_4、P4接21_3、P5接21_2、P6接20_8),驱动板霍尔出接口使用2*3P灰排线连接到母板编码器4接口(HA接20_3、HB接20_0、HC接00_5),电机ZH1.5接口连接到驱动板霍尔入接口,电机三项控制线连接到驱动板BLDC接口,其中A接电机橙色线、B接电机黄色线、C接电机蓝色线。
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版本打开),链接:百度网盘 请输入提取码 提取码:eawu
ADS安装教程:
英飞凌tricore系列单片机龙邱库快速入门之ADS环境基础--龙邱科技210507_哔哩哔哩_bilibili
3.2.2. 下载开源库
这里提供的是龙邱TC297的新库,新库分享到了QQ群里,大家可以进群下载(注:大家也可以询问淘宝客服,客服会给大家提供):
龙邱20届智能车综合技术交流群: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按钮,自动编译项目并且烧录。
关于封装库的使用教程可以参考:
3.2.4. 搭建环境时的常见问题
最常见的问题:板子与下载器都连接好了,驱动也没问题但是还是烧录失败?
解决方法:先给母板外部供电后,再连接下载器。
导入新工程后记得右击选择“Set Active Project”,来设置活动页面,其他的问题展开就太多了,这里不在列举了。其他问题可以进这个链接查看:
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)。
串口通信可以通过硬件或软件实现,其中硬件串口通常具有更高的速度和可靠性,而软件串口则具有更高的灵活性和可定制性。在单片机中,串口通常用于与其他设备进行通信,例如遥控器、传感器、显示屏、上位机等。
串口协议是指在串行通信过程中,双方之间所遵守的通信规则和约定。UART串口协议包含以下内容:
- 数据帧格式:UART串口协议使用包含起始位、数据位(5至8位)、可选的奇偶校验位及1或2个停止位的数据帧来传输信息。具体格式需双方预先协商确定。
- 波特率:UART串口协议使用波特率来指定数据传输的速率。波特率表示每秒钟传输的位数。常见的波特率包括9600、19200、38400、57600和115200等。通信双方必须使用相同的波特率才能正确地接收和发送数据。
- 帧同步:UART串口协议使用起始位和停止位来标识每个数据帧的开始和结束。起始位是一个低电平信号,用于通知接收端数据帧的开始。停止位是一个高电平信号,用于通知接收端数据帧的结束。
- 错误检测:UART串口协议利用奇偶校验位检查数据位数量是否符合预期,并通过校验和验证整个数据帧的完整性,以此来发现传输过程中的错误。
- 数据流控制:UART串口协议支持硬件数据流控制和软件数据流控制。硬件数据流控制使用CTS和RTS信号来控制数据传输。软件数据流控制使用XON(ASCII码为0x11)和XOFF(ASCII码为0x13)字符来控制数据传输。
串口通信作为一种基础而强大的技术手段,广泛应用于智能车等自动化领域中,可以实现数据的传输,从而对系统进行实时监控和调试。
5. 通用控制算法
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 算法来实现对电机的闭环控制。示例代码:
- 头文件:
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文件:
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. 数据解析
单片机通过串口接收GPS信号,GPS输出的数据为一个字符串,需要将字符串解析获取到经纬度坐标并保存在数组中方便循迹使用。以下是数据解析程序,通过识别是否接收到字符串和“,”判断数据有效信息和位置,并将经纬度信息保存在数组中。
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; //手动给真值,(数据是否解析完成)
}
else
{
while(1); //解析错误
}
}
}
}
}
6.1.2. 坐标系转换
GPS采集到的数据为WGS-84坐标系,WGS-84坐标系是一种地心坐标系,在这个坐标系中,坐标通常以常以经度(λ)、纬度(φ)和大地高(h)来表示。而我们实际应用的值需要转换为平面坐标系,需要将WGS-84坐标转换成平面直角坐标,才能被工程使用。在我们的例程中已经添加了坐标转换程序,可以直接调用”latlon2utm()”函数直接转换。
6.1.3. 判断方向
当有了平面直角坐标系后,我们就可以使用坐标系中任意两个点判断方向,在车模行进过程中,我们可以提前记录下一个目标点的坐标,车模再通过采集自身的坐标,即可计算出车模当前位置与下一个目标点位置的真北角度是多少,还可以通过计算车模上一个采集到的位置坐标和当前采集的位置坐标,获取当前车模的运动方向。再通过当前车模运放方向和到下一个目标点方向计算得出车模需要循迹的偏航角度。
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()”函数得到距离信息。
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. 陀螺仪的使用
陀螺仪在极速越野组中起着非常重要的作用,由于GPS采集到的数据会出现漂移,加上陀螺仪后,可以更好的增加定位精度,甚至可以不适用GPS,只用陀螺仪即可完成整个比赛。在比赛中我们可以利用陀螺仪欧拉角计算车模运动方向,再配合编码器累加计算距离即可实现惯性导航算法,使用惯性导航可以更加精准的完成车模循迹,再配合上GPS做调整,使循迹过程中细节的处理变得更加简单。使用陀螺仪还可以检测车身的倾斜状态,当在颠簸路段和坡道时,车模的前后倾斜状态会发生改变,主控可以及时的采集到车模的倾斜状态,控制电机及时进行加速或减速,防止翻车。
6.3. 摄像头的使用
神眼摄像头在极速越野组中可以通过识别跑道上的白线完成循迹,虽然室外白线相比室内赛道窄很多,但是只要场地内的白线清晰,完成循迹也没有问题的。摄像头的主要作用可以应用到科目三的过桥洞,由于桥洞宽度只有50CM,使用GPS可能很难精准的通过桥洞。可以先用GPS循迹将车模引导到桥洞入口附近,当摄像头检测到桥洞内铺设的10CM白色引导线时,切换到摄像头循迹,即可简单的通过这个元素。对于摄像头识别部分的代码比较多,可以参考摄像头寻白线的代码,网上开源较多,大家可以搜索参考、移植。这里就不做过多的解释了。
6.4. 元素识别
极速越野组的比赛分为三个科目,由简入难的比赛模式使得每个科目可以选择使用不同的循迹方式。
科目一:往返赛道,这个科目主要考察车模的运动特性,包括车模的极限速度、加减速特性。车模从发车区域出发,经过掉头区折返。这个科目主要考察学生电机驱动的设计以及定位精度,同学们在制作电机驱动板板时要尽量电路简单,选用大功率的MOS管,对于MOS管的供电和电机输出部分,布线要充分利用板子空间,将耐流做到足够充裕,防止炸板。在循迹上可以考虑GPS加陀螺仪,让车模在直线循迹上尽量保持直线行驶,不出现因GPS数据漂移导致车模形式起来左右晃动。
科目二:八字赛道,这个科目主要考察车模转向特性以及定位特性。车模从发车区域出发,绕行赛道中的锥桶之后返回。锥桶间距大于等于2米。由于锥桶间距较小,考虑到GPS循迹漂移可能实现绕锥桶比较困难,可以考虑使用陀螺仪加编码器惯性导航。可以更准确的完成循迹。
科目三:特殊路况考察,这个科目考察车模运动的稳定性、安全性、路径通过的精确度。其中包括坡道、颠簸路面、草坪区域以及桥洞。车模从发车区域出发,通过掉头区域运行之后返回发车区。这个科目最只要的就是定位的精准度,精准度越高通过元素越简单,可以考虑陀螺仪、摄像头、GPS三者结合循迹,在坡道、颠簸路段上,可以考虑使用GPS加陀螺仪,GPS提供到导航定位信息,陀螺仪可以检测车模的前后倾斜角度,及时的控制电机加减速,防止翻车;识别人工草坪和桥洞时,由于草坪颜色和跑道颜色差异较大、桥洞中间具有10CM宽白色引导线,可以烤炉使用摄像头完成精准循迹,先通过GPS循迹引导车模到元素附近,再切换摄像头循迹通过元素。
7. 备赛建议与资源推荐
- 学习路径:C语言→单片机基础→传感器实验→算法移植。
- 团队分工:硬件(电路设计)、软件(算法调试)、机械(车模改装)。
- 学习资源:CSDN、往届技术报告、GitHub、B 站学习视频。
- 基础解疑:官方Q群客服、官方淘宝客服。
- 在越野车模调试时尽量配备一个遥控器,遥控器可以用来控制车模采集坐标点,还可以在调试时防止车模失控,紧急停车,保护车模。