前言
各位参赛的同学们,大家好!新的一届智能车又来临了,和往届相比,第二十届智能车大赛的赛项发生了很大的变化。今天,我们将聚焦缩微光电组,由龙邱工程师为大家带来缩微光电组的全面讲解。
写这篇手册是帮助新同学快速的了解充满魅力的智能车大赛。同时,会在这里给大家分享我们缩微光电组的方案与调车心得。我们深知,没有绝对的最优解,但在手册里,我们会毫无保留地分享我们在缩微光电组积累的方案经验与调车心得。希望这些内容能为大家提供一条清晰的探索思路,让大家在备赛过程中少走弯路,更加从容地应对比赛挑战。
本手册分为七个主要部分:组别简介、硬件清单、开发工具、外设基础、通用控制算法、缩微光电赛项分享以及备赛建议与资源推荐。建议读者按照章节顺序阅读,特别是新手同学,可先从硬件清单和开发工具部分入手,逐步深入到控制算法和赛项分享。
如果大家想要探讨智能车相关话题,欢迎加入我们的QQ讨论群。在这里,无论是智能车的硬件设计、软件编程,还是比赛策略、技术难题,都能展开交流。
龙邱20届智能车综合技术交流群 228227119 龙邱20届智能车缩微组交流群 1020922696
1. 组别简介
1.1. 赛题要求
关于第二十届全国大学生智能汽车竞速比赛的规则,详⻅卓晴教授在 CSDN 博客上的⽂章《第二十届全国大学生智能汽车竞速比赛规则》。该文详细阐述了本次竞赛的各项规定及要求。链接如下:
第二十届全国大学生智能汽车竞速比赛规则_20届智能车-CSDN博客
赛题要求:
1.2. 赛项解析
1.2.1规则解析
在赛道运行两周
车模需要在赛道上运行两周,考虑道赛道面积较小,赛道完成一卷所需时间较短,因此规定车模运行两圈。
赛道为蓝色背景,白色引导线
白色引导线,在蓝色背景下很明显 ,图像中也可以很清晰的区分出来,能为车模提供清晰的引导。
赛道具有若干断路区,虚线区
赛道上设有若干断路区和虚线区。目前,尚未找到能让赛车自动识别并通过断路区的有效方法,建议参赛队伍利用惯导来帮助车模通过该区域。虚线区可能出现在环岛、直线或弯道等不同路段,给比赛增加多样性。
赛道元素不包含路障,坡道,包含六边形环岛
道元素中不包含路障和坡道,但设有六边形环岛。取消路障和坡道后,参赛车模的设计高度限制降低,车模可以设计得更低,有助于提高车模的动态转向稳定性,提升车模的性能上限。
1.2.2 赛道解析
赛道边界
相邻赛道之间的最小距离设定为 20cm,但这并不意味着赛道会出现宽度仅 20cm 的 “几” 型弯道。在弯道处会设置锥桶,这些锥桶的直径按 8cm 计算,并且要求锥桶两侧与引导线的距离大于 12cm。经计算,一个 “几” 型弯道的极限宽度大约为 32cm。
需要注意的是,锥桶距离引导线仅有 12cm,间距相对较近。为应对这种情况,我们可以考虑缩小车模尺寸来增加容错率。然而,回顾历届大赛中自制车模的表现,大车模往往更具优势。所以,参赛选手需要在容错率和车模性能上限之间做出权衡取舍。
虚线赛道
虚线是微缩赛项一大特点。如果虚线只出现在直道难度确实比较小,所以虚线可能出现在直道,弯道,与环岛。后续的讲解中也会给大家解决方案。
断路区
在赛道上存着断路区, 断路区个数不超过 三个。 断路区内没有任何导引线路。 车模可以通过自身惯性导航完成断路区的行驶。
起跑线
2. 硬件清单
2.1. 车模选型
该赛项允许自制车模。由于赛道是折线赛道,有很多的直角弯,而且弯道内侧的锥桶距离赛道只有12cm。已有的车模都不能很好的满足这些条件。我们分析完这个赛项后,就开始针对这个赛项,进行新车模的设计。经过了一版又一版的设计,终于设计出了一款性能强,上限高的车模。
车模优势
超低地盘:我们的车模地盘离地高度只有0.4cm,在考虑到与微缩电磁共用场地的情况了,已经将车模地盘做到了最低。地盘降低后可以有效的降低车模的重心,提升行驶稳定性,减少高速过弯时的侧翻风险。
强力电机:我们车模使用的是定制的强磁电机,使用该电机显著提升了车模的动力、效率和操控性。同时我们的车模底盘还对电机位置进行了开窗,增加了电机周围的空气流通,帮助电机在高速运行时更好地散热,避免过热导致的性能下降或损坏。开窗设计也可以方便我们感知电机的温度变化,判断电机是否过热。
软硅胶光头胎:软硅胶材质加光头胎设计大大增加了摩擦力,提供了超强的抓地力。同时我们的轮胎表面光滑,不易吸附灰尘或杂质,清洁方便,只需简单擦拭即可恢复抓地力。在比赛中,可以快速清理轮胎表面,减少因污渍导致的性能下降。
贴心设计:车模的宽度恰好可以在两个电机的中间放入电池。并且侧板上有滑槽,可以通过四方螺母实现无铜柱装车。
2.2. 主控
缩微光电组的微控制器需要使用infineon TRAVEO系列的单片机。
2.3. 硬件模块
2.3.1. 主板
主板是电路连接枢纽,负责分配供电,保障各组件稳定运行。它还能高速传输信号,实现数据交互,配备丰富扩展接口,便于拓展功能,同时具备稳压作用,确保电力输出稳定。
2.3.2. 双路驱动
电机驱动可以PWM的占空比转变为相应强度的电压,施加在电机的两极来驱动电机旋转。占空比越高电机驱动输出的电压越越高,电机的转速就越快。
采用门极驱动芯片 DRV8701E + N-MOS 管 TPH1R403NL 方案,无需升压电路,输入电源在 5.9V ~ 28V 均可使用,带过流保护功能。
控制方法:控制一个电机只需要输入一个 PWM 信号控制转速,通过一个普通 GPIO 输出高低电平来控制转向。
红色端子:直流电压输入,输入电压5-28V,一般大小为电机可承受的最大电压。
蓝色端子:直流电压输出,输出电压与输入PWM值正相关
PW1控制OUT1与OUT2两端的电压 IO1控制OUT1与OUT2两端的电压方向
PW2控制OUT3与OUT4两端的电压 IO2控制OUT3与OUT4两端的电压方向
如果我们母板中的驱动的接口只有5个引脚,则可以不连接END,是没有任何影响的
2.3.3. 编码器
编码器是一种将信号(如位移、角度等)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。
编码器分为增量式与位置式,而我们只用增量式的编码器。增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小,本例程使用的是此类编码器。
正交AB相512线编码器通过两个信号线的输出脉冲进行数据处理,一个输出脉冲信号就对应一个增量位移,编码器每转动固定的位移s,就会产生一个脉冲信号,通过读取单位时间t的脉冲信号的数量,便可以达到测速的效果(v=s/t),通过对脉冲信号的累加,和编码器码盘的周长便可以达到计算路程的功能(s=d0+d1+...)。
编码器的线数,代表了编码器旋转一圈所发出的脉冲数,如果一个编码器是512线,说明这个编码器转一圈对应的信号线会输出512个脉冲,AB两相转一圈发出的脉冲数一样的,不过存在90°相位差。
编码器反馈回脉冲信号,定时器引脚接收脉冲信号,通过AB信号的差异判断是正值还是负值。我们只需要看看定时器的计数器增加了多少,就能得到编码器旋转了多少。每次获取完计数值后要清空计数值,方便下次获取。要注意的是计数值大小会受时间的影响,所以记得配合定时器的定时中断来使用,从而获取有效的数据。
2.3.4. 摄像头
摄像头作为获取赛道信息的视觉传感器,是所有视觉类赛项最核心的传感器。摄像头我们推荐大家使用神眼摄像头。使用MT9V034 芯片的神眼摄像头,采用了全局快门技术,所有像素点可同时收集光线、同时曝光,能在同一时刻形成完整图像,拍摄运动物体时不会发生形变,适合拍摄快速运动的物体。并且神眼摄像头在不裁剪图像的情况下帧数可达到260帧,性能强!
2.3.5. 其他模块
陀螺仪
陀螺仪在智能车中的应用:
- 与转向环串级使用,达到更好的控制效果。
- 调整平衡车姿态,使车身平衡且能正常转向和前进。
- 作为角度环闭环控制的输入。
- 积分角度作为元素状态切换条件,例如确定环岛的进环、环内、出环时机。
陀螺仪主要由加速度计与陀螺仪两部分组成,加速度计用于测量物体的加速度,陀螺仪用于测量物体的角速度。通过对加速度和角速度的测量,可以推导出物体的角位移。简单来说就是可以读取物体的偏移角度,以及移动的加速度。可以通过程序处理得到物体的欧拉角以及移动加速度。
陀螺仪的欧拉角是用来描述物体在空间中的姿态(即旋转角度)的一种表示方法,包括滚转角(Roll)、俯仰角(Pitch)和偏航角(Yaw)。
滚转角(Roll)是物体绕X轴旋转的角度,用来描述物体绕自身前后倾斜的程度。当物体绕X轴正方向逆时针旋转时,滚转角为正值,绕X轴负方向顺时针旋转时,滚转角为负值。
俯仰角(Pitch)是物体绕Y轴旋转的角度,用来描述物体绕自身左右倾斜的程度。当物体绕Y轴正方向逆时针旋转时,俯仰角为正值,绕Y轴负方向顺时针旋转时,俯仰角为负值。
偏航角(Yaw)是物体绕Z轴旋转的角度,用来描述物体绕自身旋转的方向。当物体绕Z轴正方向逆时针旋转时,偏航角为正值,绕Z轴负方向顺时针旋转时,偏航角为负值。
通过测量陀螺仪的角速度,可以积分得到物体的欧拉角。欧拉角的变化可以用来控制物体的姿态,例如在飞行器中,通过调整滚转角、俯仰角和偏航角,可以实现飞行器的稳定控制和导航功能。
需要注意的是,欧拉角表示的是物体在空间中的绝对姿态,而非相对于某个参考物体的姿态。在实际应用中,为了避免欧拉角的奇异性问题,常常使用四元数或旋转矩阵等其他表示方法。
显示模块
屏幕可以用来显示信息,方便我们来调试。 常见的信息显示比如有 图像的显示,图像偏差的显示,速度的显示,元素识别情况等,是调车及不可少的一个模块。这里推荐大家使用IPS屏幕。显示清晰,刷新速率高,图像色彩丰富。
蓝牙转串口模块
蓝牙转串口模块是一个无线传输的串口模块,很多时候我们需要得到车模的一些动态信息,又或者在调试的时候需要通过上位机,远程来控制车模的启动与停止。
还有很多时候需要通过无线模块配合上位机的波形图来形象的显示一些参数信息,所以蓝牙转串口模式也是一个特别实用的模块。
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. 集成开发环境
由于这部分展开来讲有点多,所以这里提供了一个链接,大家可以跳转进去查看教程。
链接:百度网盘 请输入提取码 提取码:q7u1
3.2.2. 下载开源库
开源库分享到了QQ群里,大家可以进群下载(注:大家也可以询问淘宝客服,客服会给大家提供)
地址:龙邱20届智能车综合技术交流群:228227119-> 群文件:龙邱智能车库 -> 下载例程库
3.2.3. 点灯程序测试
大家按照教程配置好IDE环境后,可以使用我们的开源库编写一个
1.编写一个点灯程序
2.右击当前核心对应的工程文件,点击Make。
注:如果修改了其他核心的文件,只需要右击对应的核心右击选择Make即可。
3.点击IDE上方类似于播放键的按钮,即可烧录程序。
3.3. 多功能调试助手
我们新推出了一个多功能调试助手,包含了串口助手,波形图,无线图传上位机,网络助手。
大家如果由需要可以在龙邱20届智能车综合技术交流群中的群文件中下载。
4. 外设基础
4.1. GPIO
GPIO是通用输入输出(General Purpose Input/Output)端口的简称。通俗来讲就是单片机可控制的引脚,芯片的GPIO引脚与外部设备连接起来,GPIO引脚具有基本的输入输出功能。
最基本的输出功能是由单片机控制引脚输出高、低电平,实现开关控制,如把GPIO引脚接入到LED灯,那就可以控制LED灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的通断。
最基本的输入功能是检测外部输入电平,如把GPIO引脚连接到按键,通过检测电平高低区分按键是否被按下。
常见输入模式
上拉输入:内部接上拉电阻,无外部输入时为高电平,外部信号为低电平时可拉低引脚电平。
下拉输入:内部接下拉电阻,默认状态为低电平,外部信号为高电平时可拉高引脚电平。
常见输出模式
推挽输出:能主动输出高、低电平,驱动能力强,开关速度快。
开漏输出:可输出低电平,高电平需靠外部上拉电阻,能实现 “线与” 功能,吸收电流能力较强。
补充说明:所谓的驱动能力,就是指输出电流的能力。对于驱动大负载(即负载内阻越小,负载越大)时,例如IO输出为5V,驱动的负载内阻为10欧姆,于是根据欧姆定律可以正常情况下负载上的电流为0.5A(推算出功率为2.5W)。显然一般的IO不可能有这么大的驱动能力,也就是没有办法输出这么大的电流。于是造成的结果就是输出电压会被拉下来,达不到标称的5V。当然如果只是数字信号的传递,下一级的输入阻抗理论上最好是高阻,也就是只需要传电压,基本没有电流,也就没有功率,于是就不需要很大的驱动能力。
4.2 外部中断
外部中断是单片机系统中一种重要的机制。它由单片机外部的信号所触发,当外部信号满足特定条件时,单片机将暂时停下当前正在执行的程序,转而执行预先编写并安排好的中断服务程序,在这个程序里完成针对外部触发信号的特定处理任务。待中断服务程序执行完毕,单片机就会返回原来暂停的程序位置,继续后续的执行流程。外部中断在保障系统实时性和避免阻塞方面发挥着重要作用。
中断触发方式:
上升沿触发 当 GPIO 引脚的电平从低电平跳变到高电平时,触发中断。例如,连接一个按钮到 GPIO 引脚,当按钮按下时,引脚电平从低变高,可引发上升沿触发的中断。
下降沿触发 与上升沿触发相反,当引脚电平从高电平跳变到低电平时触发中断。比如在一些传感器应用中,传感器输出信号的下降沿可用于触发中断,告知单片机有特定事件发生。
双边沿触发 引脚电平无论是从高到低还是从低到高的跳变,都能触发中断。这种方式适用于需要捕捉信号变化方向的场景。
低电平触发 当 GPIO 引脚检测到持续的低电平时触发中断。但需注意,若低电平持续时间过长,可能会导致中断一直被触发。
中断优先级 在实际应用中,可能会有多个外部中断源同时请求中断。为了合理处理这些中断请求,单片机通常会为不同的中断源设置不同的优先级。优先级高的中断请求会优先得到响应,这样可以确保重要的事件能够及时得到处理。例如,在一个既连接了紧急报警按钮又连接了普通按键的系统中,紧急报警按钮对应的中断优先级可设置得较高,以便在紧急情况下能迅速响应。
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. ADC采集
ADC 是“Analog-to-Digital Converter”的英文简称,能将模拟信号转变为数字信号。通常是将信号采样并保持以后,再进行量化和编码,这两个过程是在转化的同时实现的。具体的转化步骤在这里就不展开说了,如果是开发者使用,我们应该关注哪些参数:
- 分辨率—表示 AD 对输入信号的分辨能力,及数值部分的精度。一般模拟采样中使用 8 位还是 12 位的 ADC 说的就是分辨率。例如:输入模拟电压的变化范围为0~3.3 V,输出12位二进制数可以分辨的最小模拟电压为 3.3V / 4095 ≈ 0.806mV;
- 工作电压和基准电压(内部或者外部基准):工作电压是 AD 芯片工作的额定电压,关键的是基准电压,又叫参考电压,可以来之芯片内部又或者外部接入,其决定了 AD 的分辨率,所有基准电压一定要稳。
应用场景:
- 传感器数据采集:在温度传感器、压力传感器等模拟传感器应用中,ADC 将传感器输出的模拟信号转换为数字信号,供单片机进行数据分析和处理。例如,智能车中的电感值读取,红外测距。
- 电池电量检测:通过检测电池的输出电压,利用 ADC 将其转换为数字信号,进而分析电池的剩余电量。例如,航模锂电池过放后对电池损伤很大,甚至直接报废。所以要对电池电量进行监测
4.6. 串口
单片机中的串口是一种用于数据传输的通信接口,它可以将数据以串行的方式进行传输。串口通常由两个引脚组成,即发送引脚(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 的缩写,分别代表比例、积分和微分三个部分。
比例(Proportional)部分根据当前误差的大小,直接按比例调整控制器输出。如果误差较大,则输出也较大。
积分(Integral)部分根据误差的累积值来调整控制器输出。它可以用来消除系统的静态误差,即当系统达到稳定状态时,误差不为零的情况。
微分(Derivative)部分根据误差的变化率来提前调整控制器输出。它可以用来预测系统的未来变化趋势,以提前调整控制器输出,避免过冲。
PID控制算法将比例、积分和微分三个部分的输出进行线性组合,得到最终的控制器输出。通过调整三个部分的权重和参数,可以实现对系统的精确控制。
Kp:比例增益(调试参数)
Ki:积分增益(调试参数)
Kd:微分增益(调试参数)
Error:误差(理想值-实际值)
根据实际系统的特性和需求,调整PID控制算法中的比例、积分和微分三个部分的权重和参数,以使系统能够以最佳的性能响应和控制的过程,我们一般称之为“调参”。
在调参过程中:
Kp 过大会对误差的变化做出过大的反应,从而导致系统动作幅度过大,容易引起振荡甚至不稳定。过小意味着对误差的调整力度不足,系统达到目标值的速度变慢,响应滞后。
Kp 即使设置得较好,仅靠 Kp 控制仍会存在部分问题:
Kp 控制对持续存在的小误差没有累计作用,无法完全消除系统的稳态误差。这是因为比例控制的输出直接与当前误差成正比,而当误差较小时,调整力度可能不足。需要Ki(积分)控制来消除这种误差。
Kp 控制对快速变化的误差反应不足,而Kd(微分)控制可以预测误差变化趋势,帮助提高系统动态性能,避免过冲,减少超调。
5.2. 通过PID实现电机的闭环控制
给定占空比 → 测转速 → 比较实际转速和目标转速 → 重新调整占空比,这样的过程其实就是一个闭环控制,我们发现这个过程形成了一个回环:每次调整的占空比大小都是基于上一次结果得到的。相比开环控制,闭环控制多了信息反馈环节(测电机转速),我们根据反馈信息再做出进一步调整,接着获得调整后的反馈信息,再基于更新过的反馈信息进行新一轮的调控。
通常我们使用增量式 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); // 更新右电机占空比 right_MotorDuty += PID_Increment(&right_MotorPID, right_EncoderValue, right_TargetSpeed); right_MotorDuty = limit_DutyCycle(right_MotorDuty, -MOTOR_MAX_DUTY, MOTOR_MAX_DUTY); }
6. 微缩光电赛项分享
6.1循迹算法
6.1.1基础循迹
在微缩赛道中,赛车需要按照引导线的方向行进。但是引导线的宽度只有1.5cm-2.5cm。很难按照寻中线的方式区搜线。最主要因为虚线路段的存在,引导线会随时中断,无法进行常规的中线循迹。所以我们可以从图像的边缘向图像得中心搜线。
误差的计算方式为 :
Error = 中点坐标 -(左边界+ 右边界)/ 2
6.1.2虚线路段
接下来我们模拟一下此时的搜线的过程
第一次搜线:当我们搜索左侧边界的时候,发现已经都搜索到了图像的最右侧了,还是没有寻到左边界,说明当前行为虚线部分。
第二次搜线:由于第一次搜线没有搜索到有效的信息,所以我们开始第二次搜索,这次我们向上移动几行开始重新搜索。搜索结束,发现还是虚线。
第三次搜线: 继续向上移动还是虚线。
第四次搜线:搜索到了有效信息,开始循迹。循迹方式与基础循迹同理
我们在搜线的时候,只要不是元素,就都按照这个方式来搜索。这样就不需要判断是否是虚线路段了。这里我们模拟了一下搜线过程,四次完成了搜线。实际上我们使用for循环判断就可以了,并不一定是四次。
6.2元素
6.2.1直角弯
以左直角弯为例,左直角弯的特征是左侧被引导线截断,右侧没有,所以我们自下而上,来寻找引导线。
直角弯的判断有以下三个条件:
- 图像左侧自下向上搜索,搜到引导线
- 图像右侧自下向上搜索,没有搜到引导线
- 图像上方自左向右搜索,没有搜到引导线
直角的处理:设置固定差速,同时不断的搜索图像上部分是否出现了引导线,如果出现了引导线,就回到正常循迹。
6.2.2环岛
环岛的识别有三个判断点(以左侧环岛为例)
- 图像左侧搜索,搜索到了引导线
- 图像右侧自下而上搜索,没有搜索到引导线
- 图像上方从左向右搜索,搜到到了引导线
进环岛:
当我们搜索到环岛的时候,此时左侧的搜线如红色箭头所示,会被环岛的下半部分挡住。
当再行驶一段距离后,环岛的下半部分会在图像中消失,搜线结果为绿色箭头所示。此时搜线的距离发生了一次突变。当这个突变发生了以后,环岛下部分就不会干扰我们的下一步进环了。接下来我们继续左侧搜线,当搜线的长度符合我们的预期长度后,就可以打角进入环岛了。
误差的计算方式为 :
Error = (中点坐标+X) -(右边界 )
X的大小会影响车模是偏左还是偏右。X可赋值为0,车模基本会行驶在引导线正中间。
环岛中:
此阶段可以选择固定差速,当陀螺仪累计了360度后,就进入下一个阶段。
出环岛:
此时的寻线方式与刚发现环岛准备进入环岛的时候的搜线一样为有边界巡线:
误差的计算方式为 : Error = (中点坐标+X) -(右边界 )
当该阶段积累了一定路程以后认为驶离环岛。
6.2.3十字
十字的判定点:
图像左侧自下而上搜索,搜索到了引导线
图像右侧自下而上搜索,搜索到了引导线
图像上方从左向右搜索,搜到到了引导线
误差的计算:
误差的计算与直道的循迹一样,不过要在靠上一点,避开横向的引导线。
误差的计算方式为 :
Error = 中点坐标 -(左边界+ 右边界)/ 2
6.2.4断路
断路的识别很简单,我们遍历图像的中构建区域,当这块儿区域的白色像素数量小于一定值的时后认为就是断路。
断路区域我们可以通过惯导来通过
6.2.5起跑线
起跑线的判定:
对图像进行从左向右和从右向左的搜线。我们将两次的搜线结果进行做差,就可以得到引导线的宽度。比如引导线的宽度为3像素,起跑线的长度为25像素。当引导线的宽度变化规律为 3 -> 25 -> 3 的时候,则寻到了引导线。此时还使用直线的循迹方式即可。
误差的计算方式为 :
Error = 中点坐标 -(左边界+ 右边界)/ 2
6.2.6 虚线与元素结合
当元素与虚线结合后,元素的判别难度会增加。虚线有一个限制是,单节长度不会超过5cm。所以元素的特征都还可以完整的保留下来。我们上述讲解的元素判定都是基于单条线的判定,我们只需要判定更多条线就能避免虚线的影响。例如这个直角弯判定:
7. 备赛建议与资源推荐
- 学习路径:C语言 → 单片机基础 → 传感器实验 → 算法移植。
- 团队分工:硬件(电路设计)、软件(算法调试)、机械(车模改装)。
- 学习资源:CSDN、往届技术报告、Gitee、GitHub、B 站学习视频。
- 基础解疑:官方Q群客服、官方淘宝客服。