自动驾驶对软件架构-Software Frameworks (SWFs)设计有着特殊的需求,若开始一个自动驾驶项目,作为开发者,我们可能会有如下几方面的诉求。
1、模块化和可扩展性
软件可被明确划分为独立的子模块,由于它们功能独立,这些模块可在Low Effort下被单独测试和评估,从而提高维护性并实现高效的协作开发。为了实现模块化,需要定义通用的接口,具有良好接口定义的软件架构,可便于功能的扩展。
2、性能
在实时计算中,任务应在确定的时间内执行。硬实时保证了每个计算响应都在预期的时间内以特定的速率进行。而软实时则仅保证平均响应时间。在自动驾驶领域,至少应满足软实时的要求。
3、仿真和调试
自动系统的离线仿真和调试是非常重要的一方面,因此软件架构应提供运行环境和支持工具以用于车辆不同抽象层的模拟,例如从高层级的预测到低层级的控制。
4、容错性和监控
SWF应能够在运行时从意外故障中恢复,例如硬件或软件相关的中断,特别是通讯时的噪声、抖动、延迟等。为了实现容错,监控可实现冗余的逻辑校验,以保证系统的可靠运行。
5、应用及支持
SWF应为用户或开发者提供简易的监测和数据可视化工具,提高其易用性,并可提供大量的文档、示例和教程。
1、自动驾驶软件架构介绍
在过去的这些年,自动驾驶领域出现了很多不同的软件架构。在自动驾驶项目开始前期,软件架构的选择和设计是至关重要的一步,下面我介绍两种被人所熟知且被广泛使用的自动驾驶软件架构。
Real-time Database for Cognitive Automobiles(KogMo-RTDB)
KogMo-RTDB为对象的插入、更新和删除提供了统一的接口,尽管KogMo-RTDB为数据对象提供了动态内存分配,但内存需要在对象内静态分配。这在物体尺寸变化的场景可能会变的麻烦,如通过雷达扫描设备获取的测量数据。对象可在共享内存中保留一段时间、序列化并写入存储中。然而在分布式系统中,KogMo-RTDB并不通过网络协议进行通讯。KogMo-RTDB需要额外的工具用于记录和回放数据,而且,最关键的是目前该项目的开发者社区并不活跃,因此维护的很差。
时间触发式架构
EB基于和Audi的合作开发经验推出的模块化ADAS开发环境平台—EB Assist Automotive Data and Time-Triggered Framework (ADTF)是目前用于ADAS系统开发和测试的最常用软件架构,可帮助ADAS软件开发者快速完成新功能的开发。作为一种具有分布式进程链的实时系统,其可支持同步和异步数据的处理。各进程链之间的通讯可通过事件、服务呼叫等方式实现。ADTF可通过自定义模块进行扩展,同时也提供诸如设备驱动和Matlab/simulink插件等工具箱以提高开发效率,与KogMo-RTDB一样,ADTF也提供离线系统的仿真和调试。由于ADTF是商业化产品,因此主要用于商业化公司而不能被我们普通开发者所使用,除非你既是土豪又对这玩意感兴趣,这样的结果就是普通开发者或兴趣爱好者很难获取有关的应用教程和案例。
下面我将切入该篇重点,着重介绍被研究结构和很多国际团队,哪怕我们普通开发者也可广泛使用的一种用于自动驾驶项目开发的软件架构:ROS。
2、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节点可不经任何修改的情况下插入系统。