夏盛明
(福州理工学院 计算与信息科学学院,福州 350000)
采用开源技术方案构建无人驾驶设备在许多行业中都有广泛的应用。在某些非关键应用领域,采用开源技术建造的无人车辆可以达到满足实际使用需求的效果。在农业自动化应用领域,可以通过现有的开源技术改造出农业用自动驾驶拖拉机,进行农田自动化开垦作业[1]。在安全领域,用于安全领域巡逻自动驾驶车辆,可自动巡视周边环境情况,报告潜在安全威胁,进行搜救任务[2]。在城市卫生领域,采用城市清洁卫生自动驾驶车辆[3],按照规划好的路径,进行道路的自动化清扫作业,可实现城市卫生的自动化维护。采用开源技术也能够实现对固定翼无人机的控制[4],以及无人船控制等[5]。
无人车自动驾驶控制系统的构建可采用开源系统方案。选择使用基于开源技术的硬件系统Pixhawk4[6-7]与开源飞控协议栈系统Ardupilot[8-9]。由Pixhawk4与Ardupilot共同组合成特殊领域无人靶车的控制系统。 Pixhawk4 是一个在开源社区中成熟的开源无人控制系统高级硬件平台,使用了STM32F765片上处理器,计算速度达到216 MHz, 支持浮点运算。Pixhawk4集成了IMU惯性测量单元,拥有SPI、I2C、Serial等总线端口,方便与外部GPS、雷达、无线电等传感器模块相互连接通信。开源飞控协议栈系统Ardupilot功能丰富可用于开发无人驾驶设备,例如固定翼无人机、旋翼无人机、地面无人车辆等[10-12]。Ardupilot拥有较好的系统架构,实现模块结构清晰易于理解,适宜作为无人系统设备控制基础软件平台。
通过使用开源技术,可以较快的实现系统的开发,同时也可降低系统成本。由于开源技术系统经过了时间累积,系统功能经过实际使用与反馈,对于系统中暴露出的问题逐渐得到了修复。从成本角度来看,基于开源技术系统构建的无人车自动驾驶控制系统[13-14]可以节省系统开发时间,降低系统后期集成测试的难度与复杂度,提升系统开发效率。但是,相对于商业系统,开源技术系统存在着某些功能不完善的缺点,开源技术系统与实际的目标可应用系统往往存在一些差距,需要对开源技术系统进行一系列的二次开发,形成最终与实际目的功能需求相匹配的系统。
特殊领域无人靶车系统目前有通过工控机、LabVIEW、NI-VISION等技术实现的系统[15],采用各类传感器集成的系统[16]。
本文所讨论的特殊领域无人靶车系统主要由无人车自动驾驶控制系统、底层系统平台(包括动力控制系统与标靶系统)、远程地面站系统组成。特殊领域无人靶车系统架构图如图1所示。在图1中,特殊领域无人靶车系统由无人车自动驾驶控制系统与底层系统组成。无人车自动驾驶控制系统实现无人车的自动行走策略控制,通过传感器系统感知当前无人车系统的姿态信息,包括位置、速度、加速度等信息数据,对无人车系统的运动控制量进行计算,将控制量通过PWM信号传递给底层系统动力装置。自动驾驶控制系统将各类控制命令通过Serial线传输给底层系统。底层动力系统平台是特殊领域无人靶车系统的动力平台,实现了特殊领域无人靶车系统的底层结构单元,包括车轮、电池、动力控制单元等;运行的嵌入式实时操作系统,实现底盘车轮动力与转向控制、靶标动作控制等。底层动力系统平台接收上层无人车自动驾驶控制系统发出的运动控制量,进行车轮转速控制、行进控制等。
图1 特殊领域无人靶车系统架构图
用户可通过远程地面站系统与特殊领域无人靶车系统进行通信,控制特殊领域无人靶车系统的运动。无线电视远程地面站系统与特殊领域无人靶车系统的通信媒介使用了Mavlink无线电[17-18]串行数据传输协议进行数据通信。针对Mavlink现有的消息格式进行补充,实现Mavlink能够传递靶车的动作控制命令、靶标技术数据等。Mavlink是一个轻量级别的消息传输协议,主要用于无人装备与地面站系统之间的数据通信,Mavlink采用了消息主题发布与注册的策略,进行消息的传递,通过XML[19]文件定义了所支持的消息集合,方便消息的扩展。
自动驾驶控制系统由软件控制系统Ardupilot与硬件控制平台Pixhawk所组成,自动驾驶控制系统组成图如图2所示。Ardupilot可用于控制固定翼、旋翼飞行器、无人车辆、小型潜水装置等设备,实现无人车辆的位置控制、速度控制、导航控制、命令与消息数据传输等。硬件平台Pixhawk用于支持Ardupilot运行,包括了CPU与RAM等主要内部计算能力部件、IMU与磁力计等[20-21]用于运动控制计算部件。Pixhawk通过多种类型的总线接口,可与外部GPS/RTK系统[22-23]、无线电、电机、雷达等装置连接。
图2 自动驾驶控制系统组成图
自动驾驶控制系统需要与远程地面站系统通过无线电通信,接收控制命令与传输系统状态数据等。现有传输协议Mavlink可以实现消息数据的传输。现有传输协议Mavlink消息主要用于传输无人车辆的运动控制命令,包括导航自动运动控制、在线运动控制、运动模式切换等,以及包括用于与无人车的数据通信的消息,用于传输传感器数据,行车状态数据信息等。但是,现有的Mavlink消息未能满足特殊领域用无人靶车的传输命令与数据的功能需求,需要对Mavlink 消息协议进行扩展。自动驾驶控制系统需要实现能够解析远程地面站系统所发出的用于控制底层动力系统平台的控制命令,包括运动控制、标靶控制、成绩数据统计等。当前Mavlink 协议中并没有相关内容,需要对这些命令与数据消息进行格式定义,实现数据通过Mavlink协议消息进行传输,所以,通过对Mavlink消息格式定义XML文件中添加新的消息定义,可通过工具自动生成新增功能的消息封装模块。在Ardupilot中也需要增加相应功能实现对相应消息的解析处理,以及与底层动力系统平台的消息通信功能。在Ardupilot工程目录下的“Rover”目录中开发无人车项目代码目录,可在GCS_Mavlink.cpp文件中定义控制消息的解析与处理函数,用于实现对自定义Mavlink消息功能处理,例如与地面站系统进行自定义消息的传输。
用户可以通过远程地面站系统向特殊领域无人靶车系统发送运动指令,进行行走路径规划与标靶的动作控制。自动驾驶控制系统在接受到地面站系统消息后对消息进行解析,判断消息的类型然后进行处理,对用于控制底层系统平台的各类命令消息,自动驾驶控制系统将把消息解析后的命令内容通过格式封装,传递给底层系统平台进行命令控制,自动驾驶控制系统处理地面站消息流程如图3所示。
图3 自动驾驶控制系统处理地面站消息流程
图4 命令与数据消息交互协议
自动驾驶控制系统与底层动力系统平台通过Serial接口进行消息数据通信,传递远程地面站系统发送的控制靶标命令、获取底层动力系统平台上统计的成绩信息等。通过设计数据通信协议,采用异步的消息通信,格式化的消息保证了数据在自动驾驶控制系统与底层动力系统之间可以成功交互。自动驾驶控制系统成功向底层动力系统平台发送命令消息后,底层动力系统平台将向自动驾驶控制系统传递消息、接收反馈,通知自动驾驶控制系统消息接收成功或失败,自动驾驶控制系统将不会等待命令的执行结果,将继续处理后续消息。底层动力系统平台在处理完成命令后,将获得数据封装成消息发送给自动驾驶控制系统处理,自动驾驶控制系统在接收到数据消息后,向底层动力系统平台发送接收确认消息。命令与数据消息交互协议如图4所示,消息格式如图5所示。在Ardupilot的Libraries子目录中包含着控制系统所使用的各种系统依赖算法库、功能库。使用librariesap_serialmanager目录下所定义Ap_SerialManager函数类可实现系统与底层平台的Serial端口通信,该功能类可提供打开查找设置的Serial端口,与底层平台设备发送与接收数据。
图5 消息格式
自动驾驶控制系统支持手动方式控制与自动方式控制。手动方式控制即指通过手动遥控驾驶无人车。手动遥控驾驶无人车时,自动驾驶控制系统将遥控器上的遥控控制模拟输入转换为PWM信号[24]输出给底层动力系统平台。自动方式控制即指通过地面站系统规划自动驾驶无人车行驶路径,实现无人车自动行驶的方式。通过地面站系统规划路径,无人车自动驾驶时,自动驾驶控制系统通过EKF[25-27]算法融合IMU数据、GPS数据,计算无人车系统当前位置、速度、加速度、航向、角速度、角加速度、与目标位置的差距、与目标速度的差距、与目标航向的差距等信息,通过PID算法得出用于控制航向与速度冲量的PWM信号控制量,输出给底层动力系统平台。自动驾驶控制系统控制流程如图6所示。在Ardupilot工程项目的“Rover”目录下,对RC_Channel.cpp文件进行修改可增加遥控器拨号开关,实现模式切换。例如实现自动行驶模式与手动驾驶模式的切换。对手动驾驶模式可对Mode_manual.cpp内定义的函数进行功能修改,实现手动驾驶动力控制的丰富与优化。在Mode_auto.cpp中实现自动驾驶控制逻辑,需要增加从Serial端口读取的探测前方障碍物的数据,实现车辆行驶的自动避障功能。
图6 自动驾驶控制系统控制流程
底层动力系统数据消息包括了底层动力系统平台运动速度数据、成绩数据信息、执行远程地面站系统命令反馈信息。自动驾驶控制系统接受底层系统传递的数据消息,对接收的数据消息解析出数据内容,并将数据内容经过Mavlink消息格式封装后,传送给远程的地面站系统,自动驾驶控制系统处理底层系统消息流程如图7所示。
图7 自动驾驶控制系统处理底层系统消息流程
卫星导航系统采用了GPS/RTK系统,原理为:在一定的地面距离范围内,由已知位置的RTK基站向RTK移动站广播RTCM[28]数据,RTK移动站在接收到RTCM数据后,可以修正自身的RTK定位信息,获得更高的定位精度。
在地面固定点布署RTK基站系统,无人靶车上集成了GPS接收器作为RTK移动站,实现更高的定位精度,精度可以达到厘米级别,RTK系统结构图如图8所示。使用RTK系统可用于提高特殊领域无人靶车行走路线的准确度,无人车行走路线实际点与计划点误差可控制在几十厘米以内,基本满足实际应用需求。实际应用过程中,在靠近较高建筑物的环境下,GPS信号容易被建筑物等遮挡,造成定位数据的误差,但是特殊领域无人靶车主要用于野外,环境中较少存在较高建筑物,即建筑物遮挡GPS信号这类情况发生概率较少,在天气晴朗云层较少的条件下,实际行走路径与规划路径误差在可接受范围内。
图8 RTK系统结构图
特殊领域无人靶车在按照规划路径自动行驶的过程中,不可避免的在路程上会碰到障碍物,例如野外的大型石块、较大的台阶、大型的树木等。底层动力系统平台上集成了超声波装置用于判断前方是否存在物体,如果存在物体,自动驾驶控制系统将依据障碍物体出现的相对方位进行一定程度的航向调整,尝试从没有障碍物的方向行驶。实现方式是在底层动力系统平台前方左右两侧各安装一个超声波装置,用于探测与前方物体的距离。避免障碍物的设计机制如下:
(1)如果左侧超声波探测到物体距离小于设定距离,自动驾驶控制系统将降低车辆速度,控制车辆向右转弯,将方向转弯至检测到无障碍物后行驶一小段时间t,绕开障碍物后,再将车辆转向目的点方向继续行驶。
(2)如果右侧探测到物体距离小于障碍物设定距离,自动驾驶控制系统将降低车辆速度,控制车辆向左转弯,将方向转弯至检测到无障碍物后行驶一小段时间t,绕开障碍物后,再将车辆转向目的点方向继续行驶。
(3)如果两侧的超声波装置同时探测到物体距离小于障碍物设定距离,自动驾驶控制系统将降低车辆速度,并把车辆随机转向一个角度,将方向转弯至检测到无障碍物后行驶一小段时间t,绕开障碍物后,再将车辆转向目的点方向继续行驶。
(4)自动驾驶控制系统在检测到前方有障碍物时,将会把速度在1秒内降为较慢的速度,避免在转向的过程中接触障碍物,采用类似A*算法,尝试转向以绕开障碍物。
(5)自动驾驶控制系统通过卫星导航系统计算行驶路径轨迹,在遇到障碍物后采取绕行避开障碍物,然后将尝试回到预先设定轨迹上继续行驶。
当前支持的障碍物绕行方式是在活动开阔,偶尔发现行进路途中存在单一的障碍物条件下进行绕行,实现机制较为简单,只适用于相对开阔的地区,并且障碍物较为稀少的情况。对于复杂情况下,需要通过单目摄像头、双目摄像头、3D摄像头等视觉感知传感器实现计算机视觉避障[29]。
本文讨论通过使用开源技术架构设计实现了特殊领域无人靶车的自动驾驶控制系统,在一定程度上可加快最终产品的成型。但是采用的开源技术与商业技术相比还是存在一些功能上的不成熟等缺点,开发者需要对所采用的技术有比较深刻的了解,且必须具有改进现有开源系统的开发能力,在碰到问题时能够快速定位。文中结论不仅为后续产品的升级开发提供可能,而且对于采用基于开源技术手段来实现一些非关键敏感领域的智能化应用系统仍然具有一定的价值。