第十六届全国大学生智能汽车竞赛

RT-Thread创新论文

RT-Thread在全向运动控制中的运用

队伍名称:驭速者


第一章引言

1.1智能汽车制作情况

智能汽车的制作将从软件、硬件以及机械结构三个方面进行分析。
一、软件方面,程序设计上,采用模块化设计的方法,根据传感器种类以及控制方式上的差异,分别编写数据采集、处理、传递的程序文件。本队的智能汽车设计主要将电感与摄像头作为检测外部环境的传感器,传感器采集的原始数据通过差比和、大津法等算法转换成可利用的数据,最终作用于电机的运动控制上,完成车智能汽车全向移动的功能。对于竞赛中环岛、三岔、车库、坡道等特殊赛道元素的处理,在程序设计上完成了逻辑结构的梳理、程序代码的实现,其中,元素识别、逻辑结构、运动控制三者在程序上的实现层次分明,大部分以函数的形式进行封装,以便于在程序总体框架中的使用。
二、硬件方面,硬件设计上,依据具体实现功能的不同,将智能汽车所需的电路板划分为主控板、电机驱动板、电源及驱动开关板三种类型。其中,主控板主要用于CH32V103核心板与外设之间的数据传输,电机驱动板主要用于将控制信号转化为驱动信号来驱动电机完成运动控制,电源及驱动开关板则是通过开关的方式控制对主控板以及电机的供电。
三、机械结构方面,结构设计上,车模在垂直方向上采用分层搭建的方式。由于竞赛要求车模每次在三岔路口完成换向运动,所以我们在车模制作中尽量使车模对称分布,来保证智能汽车横向摄像头循迹运动的顺畅。

1.2RT-Thread技术概述

RT-Thread是一个嵌入式实时多线程操作系统, 基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。 事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、 任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务), 给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务通过线程实现的, RT-Thread 中的线程调度器也就是以上提到的任务调度器。
RT-Thread主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中, 使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此以外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。
在物联网市场迅猛发展的当下,嵌入式设备的联网已是大势所趋。终端联网使得软件复杂性大幅增加,传统的 RTOS 内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是, 它不仅仅是一个实时内核,还具备丰富的中间层组件,为开发者提供了极大的便利。

1.3RT-Thread技术在智能汽车中的作用

RT-Thread技术在智能汽车竞赛中发挥了其独特的优势。在智能汽车竞赛中,RT-Thread与竞赛所要求使用的芯片相融合,RT-Thread系统内核的线程管理、时钟管理、内存管理等功能在程序总体设计上降低了代码的复杂度、提高了程序的可读性,多线程的模式使得车模上多类传感器的数据采集、处理、传递得以实现,极大地提高了智能汽车在竞赛时的效能。

以下章节内容框架将从麦克纳姆轮工作原理及运动方式、对于RT-Thread技术的理解、RT-Thread与全向运动控制的有机结合和最后的问题总结与对改进方向的阐述。

第二章 全向运动控制原理

2.1 麦克纳姆轮运动分析

在竞赛以及特殊作业中,全向移动经常是必须具备的功能。从概念上阐述,全向移动意味着在平面内可以做出任意方向平移的同时实现自转的动作。而麦克纳轮是实现全向运动控制的基础。麦克纳姆轮结构如图2.1。
在这里插入图片描述

图2.1
一、麦克纳姆轮结构特点,麦克纳姆轮利用其独特的结构,可以完成全向移动的运动方式。麦克纳姆由两大部分组成:轮毂和辊子。轮毂是整个轮子的主体支架,辊子则是安装在轮毂上的鼓状物。麦克纳姆轮的轮毂轴与辊子转轴呈 45°角。
二、麦克纳姆轮力学特性,根据其运动受力分析,对于麦克纳姆轮的安装方式常采用O-长方形的方式,即轮子转动可以产生 yaw 轴转动力矩,而且转动力矩的力臂也比较长,这样最利于发挥麦克纳姆轮的特性。
三、麦克纳姆轮的运动学特性,不通过传统且复杂的以逆运动学模型为基础的底盘运动解算,而是通过三轴方向的运动合成来计算出运动时各轮子的转速。

在这里插入图片描述

图2.2
在这里插入图片描述

图2.3
其中分别为X轴方向的速度,Y轴方向的速度以及YAW自转方向的速度,则分别为对应的四个麦克纳姆轮的转速。公式如图2.3。

2.2 全向控制的独特性与创新性

在智能汽车竞赛任务要求中,全向控制的独特性在于循迹以及运动状态切换两方面。
一、循迹角度,在智能汽车循迹过程中,对车模的整体速度控制是受车身上的传感器反馈回来的数据所影响的,智能汽车通过对反馈的数据进行算法处理,转化成运动所需的控制量来驱使电机完成智能汽车车身姿态与运动状态的矫正,使得车本身按照赛道的变化完成循迹任务。但不同于其他车模结构,麦轮车模的四个轮子分别由四个电机控制,所以从理论上分析,循迹任务的完成可以存在多种方式,但经过长期的实验测试,得出以下两种全向控制方案。
其一,以车身的Y轴为分解线,将车身对称分为左右两部分,左两轮与右两轮通过差速控制。
其二,将车身的运动分解为X,Y,Z三轴,正常循迹以Y轴为正方向,X轴方向置零,Z轴方向的速度通过六轴加速度陀螺仪模块ICM-20602获取中Z轴角速度,将原始的Z轴角速度通过一阶低通滤波得到更为平滑且连续的Z轴角速度,其次,再通过一阶线性控制,将Z轴角速度转化成Z轴速度,然后根据三轴速度结合运动合成公式,得到车身四个轮子的期望速度,期望速度根据传感器计算得出的赛道差值,最终转化成PWM占空比驱动电机。对于麦克纳姆轮本身结构造成的弯道易甩尾的问题,可通过对赛道差值采用分段比例控制方法的方式解决这个问题。
二、运动状态切换的角度,全向控制可以根据对四个电机设定不同的期望速度值以及方向来实现。
对于全向运动的控制,其独特性也就在于由于麦克纳姆轮的结构特性导致的运动方式的独特,其创新性在于,对于这种独特的运动方式和控制算法。

第三章 RT-Thread与全向控制算法

3.1 全向控制算法的创新与研究

3.1.1 环岛及岔路识别算法

全向控制算法主要用于智能汽车竞赛赛道中特殊元素的处理,其中包括环岛及岔路识别算法,赛道元素处理算法以及运动控制算法三部分。
环岛及岔路识别算法,竞赛中岔路的识别利用电感与摄像头的配合使用,在入三岔口,根据对岔路口电感值分布的研究发现,车身前的三个电感在通过岔路时皆呈现递减的趋势并且小于额定值,这不同于其他的赛道元素,可作为入三岔的识别标志。出三岔则是根据摄像头对于三岔识别完成的,同时结合了车身上电感的电感值突变。环岛元素通过电感进行识别,根据对环岛部分电感值的分布进行分析,在车模经过环岛时,电感值呈现规律性变化,即三个电感值呈现先增后减的趋势,并且为了减小此过程中的误差,因对电感值取平均再进行利用。
在这两个特殊赛道元素处理时,都利用了三个电感,三个电感在进行条件判断时需要进行层次的设置,以提高条件的鲁棒性。

3.1.2 赛道元素处理算法

赛道元素处理算法,在赛道元素识别完成以后,根据设定的各元素标志位以标志位之间的关系,打开运动控制算法部分的标志位,并且为了防止赛道元素之间的误判,通过软件延时,在完成延时动作后,再进行下一次元素的识别。

3.1.3 运动控制算法

运动控制算法,在环岛岔路识别算法、赛道元素处理算法的基础上,通过运动控制标志位的不同取值,调用全向控制中封装好的运动控制函数,用于智能汽车不同运动状态的调整。

3.2 RT-Thread操作系统的分析与研究

RT-Thread在项目工程中的使用主要涉及以下几个方面,线程管理、时钟管理、线程同步中的信号量的使用、线程通信中邮箱的使用,内核移植。
一、对于线程管理的理解,为了解决一个涉及知识领域多、规模较大的问题,通常有两种选择,一种是先找到问题的头绪,然后根据问题凸显的线索,一步步地去解决;另一种是将大问题有条理地划分为若干个小规模问题,在解决小规模问题的同时,也在逐步地解决大规模问题。RT-Thread本身是一个多线程操作系统,其提供的多线程设计极大地为开发者完成开发任务提供了便利。对于一个嵌入式系统的开发,数据的采集和显示就可以形成两个线程,两个任务可以同时进行,也可通过设置优先级的方式安排线程的执行顺序,这就不同于裸机开发过程中数据的采集与显示,两者的执行只有单一的方式以及任务。线程管理示意如图3.1。

在这里插入图片描述

图3.1

二、对于时钟管理的理解,时钟管理包括了时钟节拍以及RT-Thread中的定时器,与其他操作系统一样,RT-Thread操作系统同样具有时钟节拍,以供系统处理所有和时间有关的事件。但在RT-Thread操作系统中,使用最为广泛的其定时器。RT-Thread为使用者提供了两种软件定时器,包括单次触发定时器与周期触发定时器。从理论上分析,RT-Thread为使用者提供了大量定时器,极大地弥补了各类芯片硬件定时器资源不足的缺点,而定时器资源在较大规模嵌入式任务开发过程中发挥着起搏器的作用,所以,RT-Thread操作系统的使用对于项目以及开发者大有裨益。定时器控制块内容如图3.2。

在这里插入图片描述

图3.2

三、对于线程同步中信号量的应用研究,RT-Thread操作系统之所以使用起来很流畅,关键因素还在于线程之间的同步。从多线程系统角度分析,多线程在极大地明确了线程间的任务分配,这样项目工程层次内容分明。但多线程需要“默契”协作,也就是通过 线程同步的方式,建立起特定的执行顺序。信号量就是线程中的一种同步方式。信号量的作用发挥在线程的获取与释放的方面,线程通过获取或释放它以完成线程间的同步或互斥。
四、线程通信的应用的重要性,在进行逻辑编程时,为了完成不同功能之间是数据交流即通信时,设置全局变量自然成了较为有效一种方式,但这同样可以通过RT-Thread操作系统中用于线程通信的邮箱服务所的代替。通过邮箱中邮件非阻塞方式的发送,线程、中断服务以及定时器向线程发送消息变得更为有效。此外,对于邮件收取时会阻塞的情况,发送线程可通过设置超时时间等操作来完成邮件的收发,其过程大致如图3.3。邮箱控制块内容如图3.4。

在这里插入图片描述

图3.3
在这里插入图片描述

图3.4

五、对于RT-Thread操作系统内核的移植,需要根据所使用的MCU类别以及编程工具来具体实现。

3.3 RT-Thread在全向控制算法中的运用

在将RT-Thread操作系统移植到以CH32V103芯片作为MCU平台的项目工程完毕后,通过RT-Thread操作系统提供的丰富功能以及资料,完成RT-Thread技术与项目整体工程架构以及全向控制算法的融合。

3.3.1 RT-Thread时钟管理的运用

CH32V103R8芯片本身具有的硬件定时器资源仅有四个即三个通用定时器和一个高级定时器,硬件定时器是由芯片本身提供的,一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。在我们的智能汽车设计方案中对于所需的外围设备资源进行了规划:使用第一个定时器的四个通道输出PWM控制四个电机;使用第二个定时器用于舵机的控制;使用第三个定时器用于摄像头像素时钟信号获取,周期中断再使用一个定时器,这里已经用了四个定时器,再利用CH32V103R8芯片的两个SPI,分别用于屏幕以及角度编码器和六轴陀螺仪加速度计模块。
在裸机编程过程中,还会遇到需要使用额外定时器进行延时、计数等情况,这样定时器资源就明显不足。但通过使用RT-Thread操作系统,在满足外围设备的定时器需求的情况下,根据自己的需要,又设计了四个周期触发类型的软件定时器,这对我们竞赛任务的完成提供了很大的帮助。在使用RT-Thread操作系统以后,我们将编码器速度数据、ICM-20602角速度数据与电感的电感值的采集放在了timer1定时器中,在进行环岛、三岔识别时,为了更好地进行车身姿态的调整,我们又设计了三个软件定时器用于姿态调整的延时。
在全向控制算法中,上述的用于元素识别的三个延时操作起着至关重要的作用,所以对延时的精准度也提出更高的要求,通过实验得出使用RT-Thread操作系统的软件定时器的延时效果好于裸机编程时的延时函数。
此外,由于在timer1定时器中数据的采集涉及了三类传感器即角度编码器、ICM-20602模块与电感,所以这三类数据采集可以设计成三个线程同步进行,并且这三个线程访问的临界区不同,不会造成数据的错乱,反而会加快数据处理的速度。
在全向运动控制算法中,对于环岛以及岔路的识别函数,由于它们识别所需要的数据都在周期中断定时器中2ms检测一次,并且它们的识别算法相互独立,就可以不通过线程的同步,以实现较好的检测效果。但对于这两种赛道元素的识别采用了梯度检测法,其算法的计算量较大,在保证周期中断中数据检测与处理的效率的情况下,可利用RT-Thread再设计一个周期触发的软件定时器,专门用于元素识别算法大数据量的计算。除此之外还可以通过提高周期中断时间或者降低计算量等方式。

3.3.2 RT-Thread中线程间同步的运用

在项目框架整体设计方案上,电感作为智能汽车循迹的主要传感器,由逐飞科技提供的MT9V03X总钻风数字智能车摄像头做赛道元素的辅助判断。在使用RT-Thread操作系统后,图像的采集不再通过mt9v03x_finish_flag标志位来判断图像数据是否采集完毕,而是通过RT-Thread提供的内核组件,在初始化中新建一个图像的信号量,在DMA场中断中对信号量进行释放,最后在程序主循环中通过死等待的方式获取信号量,然后再进行后续图像处理程序的执行。这是对RT-Thread操作系统中信号量的实际运用,这种运用相较于裸机编程极大地提高了代码的可操作性行,避免了裸机编程时图像数据的问题。

3.3.3 RT-Thread中线程间通信的运用

RT-Thread操作系统中的线程通信的邮箱的功能在全向控制中同样起到了关键作用。为了能更好地反映元素检测的效果,我们为蜂鸣器创建了一个线程,在这个蜂鸣器线程中,我们又创建了一个邮箱用于邮件的收发,在蜂鸣器线程中,邮箱在收到正确的邮件后,控制蜂鸣器的响默与响的时间长短。这样便可以在车模运动过程中得知程序的运行状态以及车模的运行参数设定是否合理。而邮件的发送函数则是在赛道元素识别算法中得以调用。
同理,在上蜂鸣器的基础上进行提高与创新。全向控制算法中,环岛及岔路识别算法,赛道元素处理算法以及运动控制算法的实现皆封装成函数,三者之间的联系基本上通过全局变量形式的标志位进行,所以这里也可以利用RT-Thread中操作系统中的线程与邮箱的功能组件,为运动控制函数创建一个线程,再在线程中创建一个邮箱,通过接受赛道元素处理函数发回的不同指令邮件,再调用车模底盘运动控制函数,进而完成对车模整体的运动控制与姿态调整。
在于与逻辑编程的比较之下,通过RT-Thread操作系统的线程、邮箱等功能组件,我们避免了程序代码上的冗余,使得控制逻辑更加清晰。邮箱在未接受到邮件时会释放内存,减少CPU的占用。此外,代码复杂度的降低也加快了程序的执行速率与效率,保障了智能车能更为稳定且高效地完成竞赛任务。

3.3.4 RT-Thread的内核移植

1.资料准备,首先从RT-Thread的官网下载RT-Thread的操作系统,因所使用的MCU为CH32V103,其RAM区仅有20KB,所以下载RT-Thread Nano。其次从码云下载逐飞科技提供的裸机的开源库。从码云上获取了逐飞科技开源的rtthread_libraries文件,其中包括了RT-Thread的内核文件以及finsh文件。
2.将rtthread_libraries文件拷贝到工程目录下。运行MounRiver Studio的IDE打开开源库的工程,然后可以看到rtthread_libraries已经加载到了工程中。
3.添加头文件路径。右击工程,点击属性,点击 C/C++ Build 下的设置 ,分别添加汇编与 C 的头文件路径,最后点击应用即可。然后将RT-Thread的头文件#include”trthread.h”包含到#include”headfile.h”中,方便调用RT-Thread相关底层文件。
4.修改启动汇编文件。使其在启动时先跳转至 entry() 函数执行,而不是跳转至 main(),这样就实现了 RT-Thread 的启动。同时修改滴答定时器,为操作系统提供心跳/节拍。在这里将延时函数替换为 RT-Thread 提供的延时函数 rt_thread_mdelay()。该函数会引起系统调度,切换到其他线程运行,体现了线程实时性的特点。
5.修改board.c文件。系统内存堆的初始化在 board.c 中的 rt_hw_board_init() 函数中完成,内存堆功能是否使用取决于宏 RT_USING_HEAP 是否开启,RT-Thread Nano 默认不开启内存堆功能,这样可以保持一个较小的体积,不用为内存堆开辟空间。开启系统 heap 将可以使用动态内存功能,如使用 rt_malloc、rt_free 以及各种系统动态创建对象的 API。
6.RT-Thread操作系统移植完成。

第四章 结论

4.1 智能车模制作整体情况及技术指标

智能车车模制作,第一步,我们确定车模整体的设计方案,然后从软件、硬件、机械结构三个方面同时进行,并且细划分为三个阶段。第一阶段:车模搭建阶段,第二阶段:车模综合测试阶段,第三阶段:元素识别阶段,第四阶段:车模全元素测试阶段。
第一阶段:
软件方面,先是在学习板的基础上对设计方案中涉及的外设进行学习运用,同时配合硬件的工作,完成硬件部分功能的测试;在外设学习达到一定能力时,根据硬件的进度,对外设进行综合测试使用。
硬件方面,根据对 MCU的资源规划,对主控与外设的连接进行初步的设计,根据电路设计,选择合适的元器件,进行电路上的功能测试,我们从电机驱动着手,以DRV8701ERGER芯片作为驱动芯片,设计并实现驱动电路,在主控板设计并实现前,先以电源供电的方式,完成对电机驱动的测试。
机械方面,通过合适的车体设计以及车模搭建材料的筛选,通过小组讨论,合理安排电路板摆放以及传感器的安装。
第二阶段:
在车模基本成型后,从软件、硬件、机械三个方面对车模进行综合测试,以验证软件框架、硬件电路设计、机械结构的稳定性与适应性三方面的配合,同时检测其中的问题并解决。
第三、四阶段:
在硬件部门基本稳定,机械结构稳定的情况下,在软件方面进行元素识别以及联调联试。

4.2 RT-Thread主要功能应用要点

RT-Thread在我们项目工程中应用主要体现在RT-Thread内核的移植并在项目工程中得到应用。此外,RT-Thread中的线程管理、时钟管理中的定时器、线程同步中的信号量以及线程通信中的邮箱功能组件在全向控制中都得到了应用。

4.3 存在的问题及改进方向

一、在车模的制作过程中确实遇到了很多的问题,其中许多问题需要自己去理顺问题思路,探索解决办法。车模整体的全向控制方案,仍存在瑕疵。这个问题在于出入库的控制不是很稳定,这样便会导致后续的正常循迹与元素识别存在误判的情况。对于出库我们设计了两种方案,第一种横向盲走出库,通过车身的电感检测车身是否处于赛道中心,而后开启正常了循迹;第二种方案则是打角出库,通过设定合适的角度,给予麦轮合理的差速,实现出库的效果。两种方案都存在不稳定的情况,对于后面的改进,我们会将横向移动出库与摄像头循迹相结合,在横向出库稳定的情况下,再开启摄像头循迹。这个方向会有不错的控制效果。
二、全向控制算法中,在赛道元素识别成功的情况下,车模运动状态的切换存在不流畅的问题,这与全向控制算法中对于元素的处理的控制算法不够完善。在改进方向上, 寻找跟精准的元素识别算法,从控制的稳定性角度着手,完善赛道元素底层控制算法。
三、RT-Thread操作系统相较于裸机编程存在诸多优势。其中RT-Thread提供了许多更为实用贴切的功能组件,这为项目软件框架的优化提供了更多的可能性与开发性,从RT-Thread操作系统角度,程序中全向控制将更多地运用RT-Thread操作系统,通过其丰富且强大的功能组件,不断完成项目工程的软件框架,为RT-Thread在全向控制中更好的运用奠定基础。

参考文献

[1]《智能车制作》清华大学出版社
[2] RT-Thread文档中心