基于 RT-Thread的麦克纳姆轮小车循迹运动控制算法开发和研究
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于 RT-Thread的麦克纳姆轮小车循迹运动控制算法开发和研究相关的知识,希望对你有一定的参考价值。
队伍名称:浙工大鸿泉全向 SOLO
队参赛队员:杨一帆、袁启恒、何志涛
带队教师:陈国定、褚衍清
简 介: 本文详细介绍了全向行进组智能车的制作方案。该方案以南京沁恒公司的 CH32V103R8T6芯片为处理器,使用 RT-Thread操作系统。利用 MT9V034总钻风摄像头对赛道信息进行图像采集、检测,还使用了 BMX055陀螺仪对小车的位姿进行检测,辅以进入三岔和坡道处理。车模使用了官方的 H车模,其中有四个 Mecanum轮(麦克纳姆轮)。采用双核方案分块处理数据,相互通信,通过大津算法对采集到的图像进行二值化处理并计算偏差,使用了 1024线正交编码器采集脉冲来测算四个麦轮的实时速度,利用增量式、不完全微分、模糊、串级 PID控制小车在赛道上寻迹,实现车速和运动方向的闭环控制。为了提高模型车的速度和稳定性,采用 MATLAB和 QT等软件进行建模仿真,并进行了大量的硬件与软件测试、实验分析来改进设计方案与控制参数。本项目还利用 HC05蓝牙、 QT上位机、 TFT屏幕等对程序进行调试,实现人机交互,以获得更好的运行效果。
关键词
: RT-Thread,麦克纳姆轮,PID
§01 引言
全国大学生智能汽车竞赛是受高等学校自动化专业教学指导委员会负责主办的竞赛。大赛为智能车领域培养了大量后备人才,为大学生提供了一个充分展示想象力和创造力的舞台,吸引着越来越多来自不同专业的大学生参与其中。本次竞赛包括基础四轮组、双车接力组、全向行进组等组别,其中全向行进组的智能车比赛任务新颖,需要切换车姿形态,因而备受关注。
在此次比赛中,浙工大鸿泉全向 SOLO队使用了 RT-Thread操作系统。这是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务。 RT-Thread主要采用 C语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。针对资源受限的微控制器( MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM内存资源的 NANO版本; RT-Thread具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。本次竞赛官方要求的 MCU(CH32V103R8T6)资源极为受限,经常会出现 Flash、RAM不够等问题,因此如若恰当采用 RT-Thread进行任务分配,可以有效发挥资源有限情况下的最大性能。
本技术报告主要包括了机械系统、硬件系统、软件系统、 RT-Thread操作系统等方面的内容,详尽地阐述了浙工大鸿泉全向 SOLO队的设计方案,具体表现在硬件电路方面的创新设计以及控制策略方面的独特想法。
在准备比赛的过程中,浙工大鸿泉全向 SOLO队的成员们广泛涉猎自动控制、模式识别、传感器技术、汽车电子、电气、计算机、机械等多个学科,几个月来的经历,培养了队员们电路设计、软件编程、系统调试等方面的能力,锻炼了其知识融合、实践动手的能力,对其今后的学习与工作都有着重大的实际意义。
§02 系统总体设计
本章主要介绍智能车系统总体方案的选定和总体设计思路,然后具体分为机械结构设计、硬件电路设计与实现、软件系统设计等三个方面。这三方面具体分析和介绍会在后续章节进行更深入的探讨。
2.1系统总体设计方案
智能车系统的总体设计框图如下:
▲ 图2.1 智能车总体设计框图
我们采用了沁恒 WCH的 CH32V103R8T6芯片作为主控芯片。在图像采集传感器上,我们使用了 MT9V032摄像头来做循迹处理。考虑到 H车模中 Mecanum轮的全方位运行的特点和此次竞赛中要求在三岔路口切换行进姿态以及单片机定时器资源的受限,我们外加了一个舵机来控制摄像头的采集方位,从而实现全向的循迹运行。此外,我们还使用了 BMX055陀螺仪辅助车身的坡道判断以及进入三岔时车身旋转的精准把控。
为便于调试,我们使用了五轴按键、拨码开关、蓝牙、 TFT18显示屏来构成人机交互模块。
车模整体情况如下图所示:
▲ 图2.2 车模整体情况
2.2机械结构设计方案
全向行进组的比赛历史性地将 H车放在赛道上竞速,众所周知 H车的轮子为四个麦克纳姆轮,四个电机分别控制一个轮子,车身体型也较大,在转向和行进的过程中会有轮子打滑的问题,相较于其他组别速度不能控制的太快。我们将上述要求总结为三点:快速性、准确性、稳定性。快速性要求车模能尽可能地轻,这样就有更小的惯性以及更好的加速度。这方面,我们尽量减少了多余器件的使用,诸如电池等,我们选用了更轻的 7.4V的电池作为主力电池。还有许多连接部件,在兼顾牢固程度的情况下,我们多采用尼龙材质,以此减少重量。准确性上,我们要准确获得赛道信息计算偏差,因此我们选择了 140度的无畸变广角镜头,将摄像头的位置架的略高,图像能看的更远更广,使得我们在芯片 RAM小的情况下仍能判别到各个赛道元素。我们还设计了 3D打印了底座,并使用碳素杆和尼龙连接组件作为安装摄像头的主桅,使用三角结构固定摄像头支架,以此减轻摄像头的振动,增强摄像头图像采集的准确性。稳定性方面,我们考虑将重心压低,并保持重心位于车模的中心。主控板放置在中心,电机驱动板对称放置在两侧电机上方,电池则位于主控板下方,保证重心较低。
2.3硬件电路设计方案
硬件电路的设计是至关重要的,他决定了车模的上限,其具体包括主控板和电机驱动板。为了节约时间和成本,主控板中,我们采用了 CH32V103R8T6核心板插入主控板的方式。这样只需设计主控板的各个模块即可,核心板可以随插随用。主控板上的设计包括电源模块、 DC-DC模块、升压降压模块、各个传感器的接口等等。其中最重要的就是电源电路的设计,电源电路设计不正确会导致芯片复位等重大问题的产生,这在比赛中是极其致命的。另外, pcb设计的排版布局也十分重要,我们需要考虑各个器件的安装位置,合理安排各个接口的位置,我们还要考虑芯片资源的使用,合理分配芯片的引脚资源。
其次是电机驱动板的设计,电机驱动板的设计要求也是稳定性与可靠性。一旦驱动板出现问题,车模的运行控制会出现很大问题。所以我们在前辈的基础上,提高电路的散热和通流能力,提高驱动板的稳定性。
2.4软件系统设计方案
高效的软件程序是智能车高速平稳运行的基础。全向行进组智能车系统一般采用 CMOS摄像头进行赛道识别,因此图像采集以及校正处理成为了整个软件的核心内容。
由于 CH32V103R8T6的内存限制以及运算时间上的限制,我们尽可能能缩小了采集的图像大小,并对图像进一步进行像素合并、压缩。使得资源充足的同时,也能保证后续的中心线提取后计算的位置偏差精度不会过大影响车模的转向。
在智能车的转向和速度控制方面,使用鲁棒性很好的经典 PID控制算法,配合使用理论计算和实际参数补偿的办法,使智能车能够稳定而快速地沿赛道运行。前期我们花了一定时间调试电磁车,发现电磁车速度和摄像头车有较大差距,特别是圆环的路径,所以之后放弃电磁,使用摄像头循迹。
之后是 Mecanum轮控制的算法。基于 Mecanum轮的运动学原理,我们使用 Vx、Vy、Omega三个速度来描述车模的运动。具体的控制方法上,我们根据不同的应用场景,采取了增量式 PID、不完全微分 PID等控制算法。
§03 机械设计
H车模的结构较为简单,主要有四个 RS380电机和四个麦克纳姆轮组成。在设计机械结构时,我们在降低重心的基础上,提高车模的稳定能力。以下是部分重要部件安装方式的介绍。
3.1编码器的安装
电机速度的获取对于电机转速的控制是必不可少的。编码器固定于配套的编码器支架上,固定上来说比较简单。但编码器齿轮、电机齿轮、轮胎齿轮间距的调节至关重要。尽量使得传动齿轮之间保持平行,传动部分轻松、流畅,这样就避免了丢数情况。
▲ 图3.1 编码器安装
3.2摄像头安装
为了使得摄像头调试方便,对于摄像头的仰角的调整,我们的调整原则是能够看到尽量远的同时,也要保证看的够近,才有更多的空间调整车身姿态。摄像头固定的杆子采用了轻便坚固的碳纤维管作为安装摄像头的材料,再用底座与支架将摄像头固定下来。底座与一个舵机相连接。
▲ 图3.2 摄像头安装
3.3陀螺仪的安装
陀螺仪的安装比较重要,因为在后续使用过程中,姿态解算等都需要陀螺仪所处位置的牢固稳定。并且考虑到陀螺仪的中心对称特性,我们需要将陀螺仪尽量安装在小车的中心位置。于是,陀螺仪被安装在电池下方,位于小车的中心,并用热熔胶固定接口,保证陀螺仪的稳定。
▲ 图3.3 陀螺仪安装
3.4舵机的安装
整体来说便是摄像头安装到碳素杆上,碳素杆通过底座安装到舵机的舵盘上,舵机通过 3D打印的支架安装到主控板上方,因为主控板本身是居中安装的,所以能保证摄像头居中安装。因为比赛规则中规定小车要在三岔道路内横向行驶,因此必须要让摄像头能转 180度,除了采用双摄的方案外,我们才用舵机转摄像头的方案,使小车能实现前后双向行驶,减少小车的转体的时间。
▲ 图3.4 舵机的安装
3.5车模挡板的改进
最初版的车模挡板延续了去年的风格,其样式如下:
▲ 图3.11 初代车模挡板
初代车模挡板的设计理念主要是为了车轮防撞,因为 H车的轮胎可变因素较多,速度一旦快起来车模可能会冲出赛道,因此设计挡板避免车模受损。
在设计第二代挡板的时候,主要考虑减少挡板的长度,避免挡板卡住路肩的情况,就形成了第二代车模挡板,即在最初的挡板上修改,我们将两侧的部分切割掉,这样即保留了碳素板的强度,同时不至于卡到凸台上,其最终实物如下图:
▲ 图3.5 最终车模挡板
▲ 图3.6 车模挡板安装效果
§04 硬件电路设计
本车硬件设计主要分为以下几个模块:电源管理模块,声音采集模块,速度采集模块,单片机处理核心模块,电机驱动模块,交互模块。稳定性是硬件的基本要求,我们选取线性电源芯片给 MCU供电,减少主控的附件,按照车模外形设计电路板的外形,将驱动电路与 MCU分开,分成了主控和驱动部分电路。
4.1主控芯片
本车模采用南京沁恒公司的 CH32V103R8T6芯片作为主控芯片,该芯片采用封装,方便焊接。此次竞赛我们采用了双核通信的方案,单片机及外围电路如下:
▲ 图4.1 单片机以及外围电路
4.2电源管理模块
电源模块方面采用线性转压芯片,线性转压相比于开关转压更加稳定,更加适用于用多级转压电路中,但是缺点是效率较低,容易发热。目前线性电源的技术很成熟,且制作成本较低,可以达到很高的稳定度,输出电压的纹波也很小,而且没有开关电源具有的干扰和噪音。但是,开关电源的效率要比线性电源高。本系统中电源稳压电路分别需要有 +5V,+3.3V,+12V供电。 +3.3V给单片机、 SD卡模块、拨码开关、液晶等供电;编码器模块、蜂鸣器模块、蓝牙模块供电;电机则直接由电池供电。由于整个系统中 +5V电路功耗较小,为了降低电源纹波,我们考虑使用线性稳压电路。另外,舵机和电机工作时,电池电压压降较大,为提高系统工作稳定性,必须使用低压降电源稳压芯片,最后我们采用 TPS7350和 SPX29300作为转压芯片为单片机以及摄像头供电,效果较为理想。转压电路原理图如图 4.2所示。
▲ 图4.2 转压电路原理图
4.3调试模块
在调试时必要的会需要对行进时实时数据进行监测,运用蓝牙可以很方便的实现, OLED对菜单显示可以方便调节参数。蓝牙和 OLED接口原理图如图 4.3。
▲ 图4.3 蓝牙和OLED电路原理图
4.4图像采集模块
比赛可以选择的摄像头主要分为两类,一类是 CCD,另一类是 CMOS摄像头。
CCD摄像头返回的像素点太少,只有一行,对赛道的信息提取较少,无法满足全向行进组的循迹要求,但是可以用来辅助作为判定元素使用。
CMOS摄像头体积小,图像稳定性高,帧率高,功耗低,考虑到全向行进组速度要求高,同时为了保证系统的稳定性和光线问题,我们最终选择了灰度摄像头,返回的赛道信息完整,可以用于赛道元素判定,同时在车模运行方向上视线远,只要安装角度合理,可以获得足够的远瞻和近瞻,远瞻补偿了执行图像处理函数和舵机的延时,可以满足车模高速运行的循迹要求。图像处理方面我们用了总钻风,进行识别场地信息,摄像头接口电路图如下所示。
▲ 图4.4 摄像头接口电路
4.5测速模块
光电编码器是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器 ,这也是目前应用最多的测速传感器之一。其获取信息准确、精度高、应用简单。
采用 1024线光电编码器,供电电压为 3.3V-5V,输出为小幅值的方波信号。通过正交解码后获得的脉冲数,同时定时获取脉冲数,即可获得编码器的转速,通过计算编码器齿轮和车模齿轮的齿轮比,即可计算出车轮的转速,只需测量轮子的半径即可计算出实际的车速。测速模块为了减少车辆负载,采用体积较小的可以正交解码的 1024线逐飞 mini编码器。
▲ 图4.5 编码器电路原理图
4.6 交互模块
为了方便调节参数,在驱动板上有拨码开关和五向按键。
▲ 图4.6 五向按键即薄膜开关电路
4.7 SD卡电路
SD卡槽电路原理图如下:
▲ 图4.7 SD卡槽电路图
4.7.1SD卡介绍
SD卡( SecureDigitalMemoryCard)是一种基于半导体快闪存的新一代记忆设备。由日本松下、东芝及美国 SanDisk公司于 1999年8月共同开发研制,其大小犹如一张邮票,重量只有 2克,却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。
SD卡的数据存储管理可以类似于硬盘的磁盘管理系统,以 FAT格式来存储数据。 SD卡的接口支持 SD模式和 SPI模式,主机系统可以选择其中任一模式。 SPI模式允许简单通用的 SPI通道接口,这种模式相对于 SD模式的不足之处是降低了速度。
4.7.2SD卡接口设计
我们使用了电压可变的 SD卡信号供电电路, SD卡信号电平可以在 1.8v和 3.3v之间切换,即支持 1.8v电平的高速 SD3.0协议,从而实现最高 SDR104等级的通讯速度。
▲ 图4.8 SD通讯等级示意图
4.7.3软件设计
SD卡使用时直接将需要存储的数据按顺序写入固定的扇区中,需要时再读固定的扇区将数据按顺序取出来。
4.8驱动板改进
在我们传统使用的 IR2104驱动板中需要两路 PWM波控制一个电机,而对于我们竞赛要求使用的单片机资源受限,定时器资源不够,因此我们改用了 DRV驱动电路,只需要改变 GPIO的高低电平即可控制车轮的正反转,一路 PWM控制一个电机,这样控制四个电机只需要一个定时器。
▲ 图4.9 驱动电路原理图
▲ 图4.10 DRV 驱动实物图
4.9舵机供电电路
采用较高的电压可以提高舵机的响应速度,但同时过高的电压容易导致舵机工作不稳定。综合各方面因素的考虑,舵机采用电池电压直接进行供电。为了防止舵机产生的反向电动势对主板的影响,在电池与舵机之间接一个肖特基二极管同时舵机的信号口和单片机的 IO之间使用光耦进行电气隔离。舵机模块电路的原理图如下。
▲ 图4.11 舵机电路原理图
§05 软件系统设计
高效的软件程序是智能车高速平稳运行的基础。全向行进组智能车系统一般采用 CMOS摄像头进行赛道识别,因此图像采集以及校正处理成为了整个软件的核心内容。
在智能车的转向和速度控制方面,使用鲁棒性很好的经典 PID控制算法,配合使用理论计算和实际参数补偿的办法,使智能车能够稳定而快速地沿赛道运行。
5.1双核方案及其通信设计
由于赛题规定的芯片定时器资源的限制,我们使用双核方案。双核方案不仅能使定时器资源分配均匀,也能很好地将比赛任务以代码形式分配到两个核中,相比较单核而言 Flash和 Ram资源都可以更加方便使用。
5.2.1方案分配详情
我们定义主核为图像处理核,主核的摄像头采集赛道图像,舵机负责输出 PWM来转动摄像头,实现三岔路口横跑及出三岔快速反跑 ;从核为转向控制核,四个电机的接口都在从核上,从核用于输出 PWM,来控制电机的转动。
另外,从核产生定时中断,每进一次中断,就让主核与从核相连接的引脚产生上升沿,这样主机接收到引脚上升沿时产生中断,这样就达到了时钟同步的目的。如果从核周期中断是 10ms一次的话,那么主核的外部引脚中断也是 10ms一次。
综上,双核角度下的软件方案大致如下:主核的摄像头采集赛道图像,由主核计算出转角值,来控制电机进行左右转弯。从核上面只有两个编码器数据,其他两个编码器的数据需要主核将采集到编码器数据回传给从核。从核接收到主核回传的编码器数据后,再通过电机转速 PID对电机进行转速控制。
5.2.2通信协议介绍
为了简化主核与从核之间的数据交互,我们通过串口将主核与从核进行连接。主核的 RX引脚接从核的 TX引脚,主核的 TX引脚接从核的 RX引脚。
为了保证数据的正确性,我们需要定义一个简单的通信协议对数据进行校验,确保数据无误才能使用,这个协议可以自定义。我们定义的通信格式大致如下:
▲ 图5.2.0 通讯协议
5.2赛道中心线提取及优化处理
5.2.1原始图像的特点
在单片机采集图像信号后需要对其进行处理以提取主要的赛道信息,今年使用总钻风,由于芯片 RAM相较于往年使用的芯片太小,我们采集图像时遇到了不少问题,图像会卡住,,一部分原因是我们时序原因,但是修改后仍然会出现问题,虽然概率非常小,但是不得不说对稳定性是有了一定影响,当然也有可能是我们软硬件设计上的原因导致。摄像头采集图像时,由于我们的图像小精度低,在十字、车库、三岔等赛道元素存在反光、阴影、远处图像不清晰等的干扰,使得采集到的图像质量大打折扣,加大了图像处理的难度。所以,我们必须想办法通过软件方式排除或是减弱这些干扰因素,尽可能减少误判的发生。采集到的图像中,我们主要信息有:赛道两侧边界,赛道宽度,赛道类型等。
由于今年芯片资源的受限,图像信息被严重压缩,信息量减小了非常多。尤其是在 MT9V032的上下左右各个角落处,桶形失真和梯形失真会有叠加,导致图像畸变更加严重。因此,在数据采集时选择只采集半幅图像,也就是中心上下处的图像,这样采集所得的图像几乎不存在筒形失真。
通过摄像头采集到几种典型赛道图像如图 5-1~图 5-3所示
5.2.2 赛道提线
边界提取算法的基本思想如下:
(1) 使用大津法对整张图像进行二值化(经过尝试,大津法的动态阈值效果是要优于硬件二值化的)。
(2) 从最底下向上逐行寻找边界点,因为赛道是连续的,所以我们根据上一行中的黑点位置来确定本行的边沿点搜索范围。也就是所谓的边沿跟踪搜索,近处信息更加靠谱,从近处往远处扫,可以防止扫到赛道外。
(3) 回环弯:如果遇到回环弯,是不需要进行特殊处理的,调整好巡线范围即可。
(4) 十字:十字的识别和处理难度较往年有很大提升(光线不好的时候容易出现各种问题,为了在光线不佳情况下,也能尽量较好地循迹,我们花费了非常长的时间,对十字整个算法进行重写),且进十字和十字内部,可能会扫到横向水平线,导致拐出去,我们对十字进行了识别、补线和特殊处理,一方面可以防止反光和阴影影响,一方面可以无抖动的通过十字。
(5) 圆环:圆环的识别是直接对圆环的入口进行识别的,不过由于图像压缩,所以看到的圆环图像和往年有蛮大不同,容易出现上下边界连通域
看不到圆环的情况,不过圆环的处理难度感觉没有十字麻烦。只要能找准拐点,就可以根据拐点获得更多的信息,多和其他元素进行对比,并修改算法,就不会发生误判。
(6)坡道:遇到较大的坡道,上面看不到什么东西,所以选择通过陀螺仪识别车的位姿来判定坡道,并通过限幅使车在坡道上不会抖动,稳定过坡。
(7)车库:车库的识别并没有什么难度,识别起跑线即可,进入车库是用的补线的方式,因为车库是个直角弯道,弯道接车库和长直接车库轨迹不太类似,而且摩擦力不同轨迹也不同。如何顺滑的进入车库是有一定难度的,稍有不慎,就会蹭到路肩上。这就需要我们在控制方案上下点心思了。
5.2.3边界提取算法流程图
▲ 图5.12 边界提取流程图
图 5-12边界提取流程图
5.2.4偏差量的计算
采集到的图像缩小较严重,且远处信息不可靠,所以为了增强循迹鲁棒性,我们限制了偏差计算的高度。而且由于双倍路肩对我们图像的影响,斜率算法感觉不是很可靠,经常出现超调,尤其是十字圆环处,所以我们放弃使用斜率算法,使用较为稳定的偏差算法。
获得偏差前需要先标定赛道边沿,将小车放在直道上,标定出标准的左右边线。通过取到的左线和左标准边线作差,将取到的右边线和右标准线作差,得出前方一定距离处的偏差量,将此用作后期控制等算法中的偏差量。
另外一个需要关注的问题是,选用多少距离范围的数据用作偏差量。当处于直道上时,由于小车的速度较快,因此要选取较远处的偏差,以防止小车来不及转向;当处于弯道内时,由于摄像头的视野有限,应尽量使用能采集到的最远处的数据段。这样能在连续弯的切换上较为流畅,以及在回环弯上较为稳定。
5.2.5路径选择
我们知道小车能否以最短的时间完成比赛,与小车的速度和路径都有着密切的关系,因此,如何使赛车以一个最合理、最高效的路径完成比赛是提高小车速度的关键。
由于今年时间有限,我们把所有元素解决并调试稳定后,已经接近比赛了,但我们知道,全向行进组使用匀速是无法取得较好成绩的,所以对于小车路径的进行优化,不能仅在匀速下调节转弯系数,而应该将变速考虑进去。调节路径的方法是在慢速匀速情况下调出一套较为切内弯的 PD系数,慢慢的提高匀速的速度。这是由于在弯道内前瞻量是有限的,因此在提速的过程中,不可避免地会出现反应迟钝的情况,此时就应当停止调节转向参数。在此基础上获得这套转向参数的可用速度范围,并添加变速程序,即可达到稳定并且高速的效果。
5.3控制算法设计
在电机运行和 mecanum轮的方向控制上,需要采用合适的控制方法。这里我们采用了经典的 PID控制算法,以及一些与其相关的改进方法,如不完全微分 PID和抗积分饱和 PID等,并取得了良好的效果。以下简要介绍 mecanum轮的运动学分析和几种 PID控制算法,以及特殊元素三岔路口的策略。
5.3.1 mecanum轮的运动学分析
假设小车底盘在行进过程中一直与地面平行,可以将小车系统的运动分为 3个独立自由度上的运动,即平面上的 向和 向运动,和小车本身围绕竖直轴的纯转动。也即,在研究过程中,小车可以由 2个平面移动自由度和 1个转动自由度分别控制。 2个平面自由度控制小车的位置, 1个转动自由度控制小车的姿态。所以小车所有的运行状况都可以用这三种情况耦合而成。故以小车的几何中心为原点,长为 轴,宽为 轴,小车底盘向上的法向量作为 z轴,建立直角坐标系。计小车在 方向上的速度为 ,在 方向的速度为 ,围绕 轴的转动的角速度记为。
▲ 图5.13 mecanum轮示意图
上图中, 是四个轮毂的速度, 为辊子与轮毂的径向的夹角。 为小车在方向的速度, 为小车在 方向的速度。 为小车绕中轴逆时针转动的角速度。 为辊子的切向速度。
参考文献 Mecanum轮全方位移动机器人原理与应用,即可得到四个轮毂速度(=1,2,3,4)的等式:
上式中,可以根据小车在三个自由度上的状态倒推出四个轮毂的速度。只要控制电机的速度,就可以让小车调整到目的状态。
5.3.2经典 PID控制算法介绍
比例、积分、微分控制,简称 PID控制。 PID控制器问世至今已有近 70年历史,其有着结构简单、稳定性好、工作可靠、调整方便等优点,现已成为工业控制领域的主要技术之一。
当不能完全掌握被控对象的结构和参数、或得不到精确的数学模型时,其它的控制理论技术难以被采用,必须依靠经验和现场调试来确定控制器的结构和参数,此时应用 PID控制技术是最为方便的。
PID控制在实际中也有 PI和 PD控制。 PID控制器是一种线性的控制器,其根据给定值与实际输出值构成控制偏差。将偏差的比例 §、积分 (I)和微分 (D)通过线性组合构成控制量,对被控对象进行控制,故称为 PID控制器,其原理框图如图 4.7所示。
▲ 图5.13 PID 控制器算法图
由于单片机控制是采样控制,只能根据采样时刻的偏差控制输出量而不能计算连续输出量,所以要采用离散化的 PID算法。离散 PID分为位置式和增量式两种。位置式 PID和增量式 PID的公式如下:
运用上述公式,可以写出 PID控制算法。在智能车的制作过程中,由于增量式 PID相对于位置式 PID有明显的优势,所以我们选择增量式 PID作为速度控制算法,用编码器获取速度作为反馈量,实现闭环控制。
5.3.3不完全微分 PID控制算法介绍
在经典 PID的基础上进行的改进的不完全微分 PID,其优势是对反复跳变的被控量有着更好的控制。智能车的方向控制过程中,图像处理后的车模位置偏差在反复跳变。综上考虑,使用增量式不完全微分 PID控制电机转速。不完全微分 PID控制控制框图为:
▲ 图5.14 不完全微分PID控制图
其位置算式为:
我们同样使用了增量式的不完全微分 PID,这个 PID主要用来智能车的方向控制。
5.3.4串级 PID
串级控制系统是改善控制质量的有效方法之一,在过程控制中得到了广泛的应用。所谓串级控制,就是采用两个控制器串联工作,外环控制器的输出作为内环控制器的设定值,由内环控制器的输出去操纵控制阀,从而对外环被控量具有更好的控制效果。这样的控制系统被称为串级系统。PID串级控制就是串级控制中的两个控制器均为 PID控制器。
▲ 图5.14 串激PID原理图
5.3.5 PID整定方法
现在 PID的整定方法基本上就是经验法即实验凑试法,实验凑试法是通过闭环运行或模拟,观察系统的响应曲线,然后根据各参数对系统的影响,反复凑试参数,直至出现满意的响应,从而确定 PID控制参数。
(1)整定比例控制将比例控制作用由小变到大,观察各次响应,直至得到反应快、超小的响应曲线。
(2)整定积分环节
若在比例控制下稳态误差不能满足要求,需加入积分控制。先将步骤(1)中选择的比例系数减小为原来的 50~80%,再将积分时间置一个较大值,观测响应曲线。然后减小积分时间,加大积分作用,并相应调整比例系数,反复试凑至得到较满意的响应,确定比例和积分的参数。
(3)整定微分环节
若经过步骤(2),PI控制只能消除稳态误差,而动态过程不能令人满意,则应加入微分控制,构成 PID控制。先置微分时间 TD=0,逐渐加大 TD,同时相应地改变比例系数和积分时间,反复试凑至获得满意的控制效果和 PID控制参数。
5.3.6三岔路口转向策略
在今年新增的三岔路口元素上,全向行进组要求车模在三岔路口实现转向。在我们双核单摄的方案里,我们的策略分为了舵机转向和车模转向。
舵机只要找到对应角度下的 pwm,在三岔路口打成让舵机对应的角度使摄像头朝向前进的方向即可。
而车模转向,我们使用了 BMX055陀螺仪姿态解算出来的实时偏航角速度,将单位时间的角速度值累加起来,就可以获得旋转角度值,来进行闭环控制。这样获取出来的旋转角度值具有很强的鲁棒性,不管设置的速度是多少都能得到一个较为准确的角度。
具体实现方法为:
(1)以一个较快的速度旋转 30°,将陀螺仪的值对 10去整后积分。积分后的值记录下来。将这个值设置为阈值
(2)开始让车自身原地旋转,每次进中断的时候,将积分到的值,与阈值做比较。
(3)积分值大于阈值时候,四个电机停止运动。并进入下一状态,有摄像头接管。
§06 RT-Thread应用
RT-Thread,全称是 RealTime-Thread,是近年来发展迅速的嵌入式实时多线程操作系统,现已经成为市面上装机量最大、开发者数量最多、软硬件生态最好的物联网操作系统之一。
在智能车控制系统开发过程中引入实时嵌入式操作系统,不仅可以充分发挥不同芯片的性能,让智能车跑的更加顺畅;而且在一定程度上屏蔽了不同单片机底层硬件细节,提高控制软件开发效率。
RT-Thread内核是 RT-Thread的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等; libcpu/BSP(芯片移植相关文件 /板级支持包)与硬件密切相关,由外设驱动和 CPU移植构成。
在本次全向行进组中,因控制器资源有限因此使用的是仅需 3KB Flash、 1.2KB的 RAM内存资源的 Nano版本 RTT。
▲ 图6.1 RT-Thread Nano版本
根据比赛任务的分析,我们一定程度上做好了线程分配,灵活地使用了信号量、邮箱等组件,我们的切身感受是,不仅这些组件和开发模式是有趣的,而且任务调度器在上下文环境的切换非常快速,代码也变得相对裸机的代码而言,更加地精简且易懂。此次具体应用中,我们简单运用了几个 RTT的内核组件,详情将介绍如下。
6.1线程创建
RTT的应用中,最核心的部分是线程的创建。我们依次根据比赛任务,将图像及参数屏幕显示、蜂鸣器响应、按键检测这 3个任务分配到 4个线程中,且均使用动态线程创建,省去手动创建控制块的代码。
其中图像及参数屏幕显示和蜂鸣器响应这两个线程的优先级一样,但时间片图像显示设置得更长,这里使用了时间片的轮转调度算法。 4个线程的创建代码及其优先级和时间片展示如下,具体线程入口函数具体代码将于附录展示。
▲ 图6.2 图像及参数显示线程
▲ 图6.4 按键检测线程
6.2邮箱使用
在 RTT的线程间通信机制中,我们使用了比消息队列机制更高效的邮箱(mbox)。
在邮箱中,一封邮件的长度固定为 4字节,我们此次在蜂鸣器的线程中使用,具体的使用方式为:在图像处理中,如若识别到不同的赛道元素,我们将设定发送不同的时间变量给蜂鸣器邮箱,使得蜂鸣器在遇到不同赛道元素的时候的响应时长有别。
邮箱创建可见图 6-3。
6.3信号量使用
在此次 RTT使用中,我们最大的应用之一就是将图像采集部分用 RTT替换。我们创建了图像采集的信号量,与之对应的是在 DMA结束场中断的时候用 rt_sem_release(camera_sem);的语句来释放信号量,我们可以在主函数的主循环内用
rt_sem_take(camera_sem, RT_WAITING_FOREVER);函数来检测信号量确保一次图像采集完毕,以便随后进行图像处理。
6.4软件定时器使用
软件定时器基于滴答定时器,以系统节拍的长度为定时单位(可修改,通常为 1ms)。
尽管理论上我们可以创建并使用无限个定时器,但我们在实际使用的时候,还是选择了使用一个定时器。因为我们双核方案需要考虑时钟同步问题,构建多个定时器会带了工作量和代码繁杂,可何况一个定时中断已经可以帮助我们满足比赛任务。
软件定时器的创建如图 6-5所示,函数中最后一个参数即设置为周期性超时,这样这个软件定时器结束进入的回调函数就相当于一次定时中断的中断服务函数。
▲ 图6.5 软件定时器
6.5使用总结
在本次竞赛备战期间,我们学习了 RT-Thread操作系统,新颖的任务模块化编程方式让我们大为感兴趣,紧接着随后了解到 RTT的实时性高,可以充分发挥我们芯片有限资源下的性能,于是我们果断采用了 RTT操作系统。
因为是竞速组别,全向行进组也要求我们的智能车速度更快,因此使用 RT-Thread能使我们的小车在原来的硬件和机械基础上跑的更快一点。经实践测试证明,我们的小车在之前 1.3m/s速度的基础上,更换 RT-Thread系统后,平均速度快了 0.5m/s,是有一定提速效果的,这种效果在比赛中就能体现的淋漓精致,差 0.5m/s的速度就意味着差那么一两秒。
CH32V103由于资源有限,因此我们使用的是 RT-Thread nano版本。经过代码移植后,我们可以明显发现在线程调度的算法下,代码结构变得更加清晰。蜂鸣器、屏幕显示、按键检测、图像采集这些在平时穿插在代码里的功能在 RTT开发模式下被提取出成一个个任务,优先级清晰可见,同一优先级时间片轮询也使任务进行的设置更为方便。
同时,我们出现图像卡死的情况随之减少且几乎没有再发生,这是非常重要的。在此之前,我们的小车经常因为或许是时序的问题、或是时序顺序下的计算问题,经常出现图像卡死的情况,有时不能正常寻迹,总是会冲出赛道,甚至会出现程序卡死、轮子疯转的情况,导致车体的损坏。
虽然在使用过程中, RT-Thread操作系统会占用我们芯片的 FLASH,但我们组采用的是双核通信的方案,在代码进行整理和压缩以后,并且在实际跑的过程中注释掉一些平时调试用的、不必要的代码, FLASH还是够用的,因此不成问题。也感谢逐飞科技,在沁恒和 RT-Thread公司的技术支持下移植好 RT-Thread操作系统到 CH32V103芯片平台,使我们更好地上手 RT-Thread操作系统。
本章内容中有我们在软件上使用 RT-Thread的部分截图。具体核心代码请见附录。
§07 系统开发与调试
智能车的平台搭建除了算法的构思、硬件电路设计以及机械结构的搭建外,软件代码的编写及调试也是至关重要的。在整个方案的实现及调试过程中,熟悉好各种电脑软件的使用方法,有助于整体开发效率的提升。
7.1开发环境:MounRiver Studio
MounRiverStudio内置了 CH32V103、CH56x、GD32VF103系列芯片,以及 RV32I、RV32E、RV64I等通用的模板工程,也提供了模板自由添加接口。 MounRiverStudio是基于 Eclipse的开发环境,主要针对 RISC-V内核的单片机,这其中就包括南京沁恒这款 CH32V103芯片。作为一款 IDE,当然包含工程创建、开发和调试功能。源于 Eclipse家族,说明该 IDE继承了很多优秀的特性。
▲ 图7.1 MountRiver Studio 调试界面
7.2上位机调试
为了获取车模在行驶时的运行数据,我们在车上装了蓝牙,可以将关键参数实时发送到上位机查看,上位机我们使用山外的多功能调试助手和匿名科创地面站,它支持查看图像、虚拟示波器、串口助手等功能,使用方便。
▲ 图7.2 安外功能调试助手
▲ 图7.3 匿名科创地面站
我们编写了多个上位机,为了更加方便对车模运行信息的查看和存储,主要用途在数据的采集,把电感值和图像各种信息从 SD卡里读出来。
▲ 图7.4 QT上位机
§08 总结
本文主要介绍了浙江工业大学浙工大鸿泉全向 SOLO队在准备比赛时的基本思路,包括了基于 RT-Thread操作系统使用,机械、电路、电池以及图像算法等创新思想。
1. 图像方面
:图像因 RAM资源限制而精度不高,我们完全改变了对十字、圆环、起跑线的识别和处理方法。为了配合单片机的性能,我们在精简代码的同时保证了大程度上的识别稳定。
2. 机械结构方面
:我们都知道车速上限就是机械结构。由于我们车模很重,舵机负荷大,为了解决惯性大和转向打滑的问题,我们花了不少时间调整板子布局,同时对整车的重量和重心都进行了调整,整车的重量太轻太重都会影响车模的运行,而车模重心则容易影响整体车模的转向性能。
3. 电路方面
:以模块形式分类,对最小系统、主板、电机驱动、电池保护等模块分别设计,经过不断实验和改进,最后决定了最终的电路图。
4. 程序方面
:我们选用 MounRiver Studio作为开发工具调试程序,使用 C语言进行编程。经过长时间的编写修改程序和调试参数,最终实现了小车的直道加速,入弯减速,出弯加速。并能够在一定时间内完成比赛。
5. 操作系统方面
:使用 RT-Thread操作系统,有了系统多线程工作机制的加持,可以让单片机一直在干有意义的事,而不会多个任务间相互影响,提高了芯片工作效率,而不会像裸机开发那样一个延时就会影响整个主循环。其中 RT-Thread操作系统优先级最大 256个,线程数量不限制,线程支持时间片轮训调度,支持通过宏定义自动初始化,支持 FINSH组件,使得 RTOS调试变得简单。
※ 参考文献 ※
一、参考文献
[1]邵贝贝 .单片机嵌入式应用的在线开发方法 [M].北京 :清华大学出版社 ,2004.
[2]王晓明 .电动机的单片机控制 [M].北京 :北京航空航天大学出版社 ,2002.
[3]臧杰 ,阎岩 .汽车构造 [M].北京 :机械工业出版社 ,2005.
[4]童诗白 ,华成英 .模拟电子技术基础 [M].北京 :高等教育出版社 ,2001.
[5]尹勇 .ProtelDXP电路设计入门与进阶 [M].北京 :科学出版社 ,2004.
[6]尹怡欣 ,陶永华 .新型 PID控制及其应用 [M].北京 :机械工业出版社 ,1998.
[7]李太福 .基于在线参数自整定的模糊 PID伺服控制系统 [J].交流伺服系统 ,2005,4:203-215.
[8]仲志丹 ,张洛平 ,张青霞 .PID调节器参数自寻优控制在运动伺服中的应用 [J].洛阳工学院学报 ,2000,21(1): 57-60.
[9]卓晴 ,黄开胜 ,邵贝贝 .学做智能车 :挑战 “飞思卡尔 ”杯.北京 :北京航空航天大学出版社 ,2007.
[10]王兆滨 ,韩鹏程 .MSP432的RT-Thread操作系统移植 [J].单片机与嵌入式系统应用 ,2021,21(05):39-42.
[11]熊谱翔 ,全召 .RT-ThreadSmart微内核操作系统概述 [J].单片机与嵌入式系统应用 ,2021,21(03):9-12+17.
● 相关图表链接:
- 图2.1 智能车总体设计框图
- 图2.2 车模整体情况
- 图3.1 编码器安装
- 图3.2 摄像头安装
- 图3.3 陀螺仪安装
- 图3.4 舵机的安装
- 图3.11 初代车模挡板
- 图3.5 最终车模挡板
- 图3.6 车模挡板安装效果
- 图4.1 单片机以及外围电路
- 图4.2 转压电路原理图
- 图4.3 蓝牙和OLED电路原理图
- 图4.4 摄像头接口电路
- 图4.5 编码器电路原理图
- 图4.6 五向按键即薄膜开关电路
- 图4.7 SD卡槽电路图
- 图4.8 SD通讯等级示意图
- 图4.9 驱动电路原理图
- 图4.10 DRV 驱动实物图
- 图4.11 舵机电路原理图
- 图5.2.0 通讯协议
- 图5.12 边界提取流程图
- 图5.13 mecanum轮示意图
- 图5.13 PID 控制器算法图
- 图5.14 不完全微分PID控制图
- 图5.14 串激PID原理图
- 图6.1 RT-Thread Nano版本
- 图6.2 图像及参数显示线程
- 图6.4 按键检测线程
- 图6.5 软件定时器
- 图7.1 MountRiver Studio 调试界面
- 图7.2 安外功能调试助手
- 图7.3 匿名科创地面站
- 图7.4 QT上位机
以上是关于基于 RT-Thread的麦克纳姆轮小车循迹运动控制算法开发和研究的主要内容,如果未能解决你的问题,请参考以下文章
基于L298N驱动的麦克纳姆轮小车 代码与逻辑以及上位机控制
基于L298N驱动的麦克纳姆轮小车 代码与逻辑以及上位机控制