自动驾驶对软件架构-Software Frameworks (SWFs)设计有着特殊的需求,若开始一个自动驾驶项目,作为开发者,我们可能会有如下几方面的诉求。
1、模块化和可扩展性
软件可被明确划分为独立的子模块,由于它们功能独立,这些模块可在Low Effort下被单独测试和评估,从而提高维护性并实现高效的协作开发。为了实现模块化,需要定义通用的接口,具有良好接口定义的软件架构,可便于功能的扩展。
2、性能
在实时计算中,任务应在确定的时间内执行。硬实时保证了每个计算响应都在预期的时间内以特定的速率进行。而软实时则仅保证平均响应时间。在自动驾驶领域,至少应满足软实时的要求。
3、仿真和调试
自动系统的离线仿真和调试是非常重要的一方面,因此软件架构应提供运行环境和支持工具以用于车辆不同抽象层的模拟,例如从高层级的预测到低层级的控制。
4、容错性和监控
SWF应能够在运行时从意外故障中恢复,例如硬件或软件相关的中断,特别是通讯时的噪声、抖动、延迟等。为了实现容错,监控可实现冗余的逻辑校验,以保证系统的可靠运行。
5、应用及支持
SWF应为用户或开发者提供简易的监测和数据可视化工具,提高其易用性,并可提供大量的文档、示例和教程。
01
自动驾驶软件架构介绍
在过去的这些年,自动驾驶领域出现了很多不同的软件架构。在自动驾驶项目开始前期,软件架构的选择和设计是至关重要的一步,下面我介绍两种被人所熟知且被广泛使用的自动驾驶软件架构。
Real-time Database for Cognitive Automobiles(KogMo-RTDB)
KogMo-RTDB为对象的插入、更新和删除提供了统一的接口,尽管KogMo-RTDB为数据对象提供了动态内存分配,但内存需要在对象内静态分配。这在物体尺寸变化的场景可能会变的麻烦,如通过雷达扫描设备获取的测量数据。对象可在共享内存中保留一段时间、序列化并写入存储中。然而在分布式系统中,KogMo-RTDB并不通过网络协议进行通讯。KogMo-RTDB需要额外的工具用于记录和回放数据,而且,最关键的是目前该项目的开发者社区并不活跃,因此维护的很差。
想了解KogMo-RTDB的可通过如下链接进行了解:
http://www.kogmo-rtdb.de/index.html
时间触发式架构
EB基于和Audi的合作开发经验推出的模块化ADAS开发环境平台—EB Assist Automotive Data and Time-Triggered Framework (ADTF)是目前用于ADAS系统开发和测试的最常用软件架构,可帮助ADAS软件开发者快速完成新功能的开发。作为一种具有分布式进程链的实时系统,其可支持同步和异步数据的处理。各进程链之间的通讯可通过事件、服务呼叫等方式实现。ADTF可通过自定义模块进行扩展,同时也提供诸如设备驱动和Matlab/simulink插件等工具箱以提高开发效率,与KogMo-RTDB一样,ADTF也提供离线系统的仿真和调试。由于ADTF是商业化产品,因此主要用于商业化公司而不能被我们普通开发者所使用,除非你既是土豪又对这玩意感兴趣,这样的结果就是普通开发者或兴趣爱好者很难获取有关的应用教程和案例。
下面我将切入该篇重点,着重介绍被研究结构和很多国际团队,哪怕我们普通开发者也可广泛使用的一种用于自动驾驶项目开发的软件架构:ROS
02
Robot Operating System(ROS)
楼主开通公众号时写的第一篇文章就是关于ROS的,主要就是对ROS的发展史、特性及系统架构做了简单的介绍《ROS简介及其系统框架》,下面我将结合文章开头提到的软件架构需求阐述ROS应用于自动驾驶领域的优势。
系统架构
ROS架构是一多服务器分布式计算环境,其允许应用跨服务器通讯并有机的组成一个系统整体。Master是ROS中一特殊的服务器,其负责应用的注册、执行并运行参数服务器(Parameter Server)和信息记录服务(Logging Service)。从服务器(Slave Server)与Master可使用TCP或UDP协议通过局域网与Master建立连接。
软件架构
运行在ROS环境中的应用为Nodes(节点)和Nodelets(结点),两者之间的区别就是Nodes(节点)是单独的OS进程,而Nodelets(结点)则是将多个算法打包并运行在单个OS进程中,这样避免了数据传输(因进程内部是共享的,传数据的话传个指针即可),从而实现零拷贝(Zero Copy),因此Nodelet可有效降低Node之间的消息传输(进程间通讯)。ROS应用代码可使用C 、Python或Lisp进行编写,ROS的交互层能提供如下服务:
1、 单向异步信息通讯
2、 双向同步信息通讯
3、 诊断信息传输
4、 局部和全局参数处理
5、 基于时间的坐标转换
6、 关键信息记录等
模块化和可扩展性
Message通讯机制:基于Message通讯的ROS支持两种类型的Message通讯:同步和异步。但同步通讯其实用的很少,因此主要介绍一下异步通讯。异步通讯在ROS中的应用以发布-订阅的形式设计,如下图所示:
提供信息的节点会首先定义一发布器并将其注册到ROS系统中,订阅信息的节点则需要定义和注册一订阅器,注册的发布器和订阅器之间以独有的主题名(Topic)相互进行通讯。
即插即用的模块化特性:在新系统开发时,最终采用的算法往往在原型设计之后,为了实现功能子组件的及时替换,需要组件之间建立简洁且完善的接口。而在ROS内部,所需的接口在上述介绍的Message机制中得到了很好的解决。每个节点都遵守组件的输入和输出消息格式,例如图像处理的ROS节点可不经任何修改的情况下插入系统。
性能
实时性:在当前的系统架构下,由于缺失节点执行和消息传递优先级的时间保证,ROS并不具有实时特性。ROS最初设计的目标机器人是PR2,当时只是应用于科研领域因此不需要考虑实时性方面的问题,但伴随ROS已走过11个年头,其得到了极大的推广和应用,尽管依然存在不少局限性但依然无法掩盖它的锋芒。已发布的ROS2已具有实时特性,并相比ROS1提高了系统的稳定性、安全性及分布式处理能力,关于ROS1与ROS2的区别主要如下所示,后续楼主会专门写一篇两者的对比文章。
Node Pipelining:在自动驾驶汽车中,特定的任务以预先定义的恒定速率计算是有益的,例如基于视觉的定位,其输入图像以15Hz记录,那位置的更新通常也应在15Hz速率下。如果是串行处理方式,那从图像获取到内部处理再到结果输出,其整个更新速率显然不是15Hz。但如果将单个或多个处理步骤分解成更小的单元则可满足期望的时间限制,这就是Node Pipelining的概念。
仿真和调试
离线处理:为了仿真和分析子系统及调试系统关键错误。对系统中传递的数据进行有选择的记录是ROS的基础特性。
以一个简化的视觉定位的案例具体说明下,如上图所示,用于定位组件的输入信息以Rosbag的形式记录并存储下来,存储的数据会保留时间戳及消息内容,以便及时准确的重放所有实时数据用于离线系统的仿真模拟或数据分析。另外,依赖于硬件设备,尤其是网络带宽和存储的吞吐量,所有主题信息都可在车辆行驶时在线记录以分析关键驾驶场景和决策,如路径规划和控制等。
仿真: ROS的模块化消息架构允许数据输入源的更换,因此节点可很容易的基于记录的数据进行测试。如果在仿真时还需要用户手工输入一些信息,那么Rviz(一个强大的可视化调试和仿真工具)则提供了一系列交互式标签以用于定位和定向障碍物等。
而对于整个系统的仿真及回归测试,ROS则可与Gazebo无缝链接,Gazebo是一个功能强大的3D模拟仿真引擎,其具有完整的动力学和运动学特性。通过其强大的可扩展插件系统,可支持真实传感器的仿真并包括预定义的传感器噪声。定制化的传感器模型也可通过Gazebo 的API进行添加(说太多没什么用,只有你亲自使用过才会体会它的强大,反正Gazebo很牛逼)。
容错性和安全性
系统诊断和监测:在系统开发和运行期间,攻城狮和用户可立即了解系统的健康状况,例如,所有传感器都已连接并正向系统中发送数据,且所有的组件都以预定的速率计算所需数据等。为了方便攻城狮为其组件添加诊断,ROS提供了一便于使用和集成的基础框架,以用于向中央诊断管理器发送诊断信息,该中央诊断管理器以交通灯的颜色方案显示系统运行状况以便立即查明关键组件或数据完整性是否存在风险。
Lock Stepping锁步:即由两个处理器构成的自监控对,其不间断的检查功能的正确性并可诊断出故障处理器,从而建立故障抑制区防止故障蔓延。ROS并没有特定的功能来实现锁步,然而模块化架构及标准接口有助于锁步系统的开发以提高系统可靠性。
应用及支持
坐标转换系统:在多传感器系统中会定义多个坐标系统,如摄像头、车本身或全局坐标系统,这就需要将数据在不同坐标系统中频繁转换,ROS则提供了基于时间的坐标转换服务,可实现某一坐标系的数据向任意其他坐标系的转换(强大的TF库)。
多速率系统:在自动驾驶汽车中,基于传感器的信息通常以固定的速率交互。例如摄像头的图像信息以15Hz速率获取并更新,而GNSS位置确定则只有在1Hz或5Hz速率下。当将多传感器数据进行融合时,数据同步是非常重要的一方面。为了简化多速率系统中的数据同步,ROS提供了基于时间戳的同步原理-消息过滤器(Message Filter),它从多个数据源采集不同类型的数据,只有每个信息源的信息具有相同时间戳的时候才会将信息发布出去。
可视化:ROS提供了两个扩展性极强的工具-rqt和rviz,其可帮助我们实现图像显示,3D画图(点云)、车辆状态数据(里程)等。
03
总结
通过上面的叙述,最后以一张图表的形式对三种软件架构做个比较:
备注:上中下水平依次以 o --代表
从上面的对比中,我们可清楚的看到ROS在自动驾驶领域进行应用开发时所具有的优势,尤其在原型设计方面。像百度早期的阿波罗、开源的Autoware都是基于ROS做的自动驾驶项目,很多Tier1的供应商及OEM,如BOSCH、BMW等也都会选择ROS作为他们自动驾驶项目开发的一个有力组件和工具。
- END -