百度apollo - Apollo对ROS优化总结

时间:2024-03-31 09:29:35

0. 简介

百度的Apollo主要的改进点有如下几个部分:
通信性能优化

  • 通信性能优化 -> 共享内存能减少传输中的数据拷贝,显著提升传输效率
  • 去中心化的网络拓扑 -> 使用RTPS服务发现协议实现完全的P2P网络拓扑
  • 数据兼容性扩展 -> protobuf能够很好支持向后兼容

1. Apollo对ROS优化总结

1.1 关于通信性能优化

通信性能优化过程中通过指针或者调用值的方式实现了共享内存,该方法支持一次写入、多次读取。这里就不多说了。

1.2 关于去中心化的网络拓扑

apollo在ROS中添加基于RTPS服务协议功能,但是去中心化的功能在ROS2里面已经被解决,因此,具体哪个优化更加好,还等待后续测试。

1.3 关于数据兼容性扩展

在Apollo中在模块内部使用protobuf来替代ROSmessage,个人认为这是Apollo最主要的优化,关于protobuf的介绍可以看我整理的protobuf分类。

2. 详细介绍

2.1 通信性能优化 -> 共享内存

  • 共享内存 -> 在一对一传输过程中,吞吐量达到socket两倍,一对多传输过程中,共享内存传输对带宽的优势进一步扩大。
  • 共享内存 -> 传输延迟比Shared节省一半,对强实时性系统的自动驾驶汽车帮助很大。
  • 共享内存 -> CPU资源占用要比socket减少很多,一定程度上提升计算算法和能力。

ROS问题:自动驾驶大量使用传感器引发很大的传输带宽需求

自动驾驶系统为了能够感知复杂的道路情况,需要多种传感器协同工作才能覆盖不同的场景、不同路况需求。多传感器共同使用会对车载系统造成很大压力。

百度apollo - Apollo对ROS优化总结

Apollo优化:共享内存能减少传输中的数据拷贝,显著提升传输效率

百度apollo - Apollo对ROS优化总结

ROS问题:单路传感器消息有多个消费者时负载成倍增长

百度apollo - Apollo对ROS优化总结

Apollo优化:共享内存可以有效满足一对多的传输场景

百度apollo - Apollo对ROS优化总结

共享内存本身的特性能够支持一次写入、多次读取功能。对于一对多传输场景,不同的使用者就可以同时读取,实现一次写入,多次读取的功能,成倍提升传输效率。

Apollo通信性能优化效果

百度apollo - Apollo对ROS优化总结

2.2 去中心化的网络拓扑

ROS特点:ROS以Master为中心构建hybridp2p拓扑网络

百度apollo - Apollo对ROS优化总结

ROS是以Master为中心构建Hybrid p2p拓扑网络,带来了比较强的容错性,当某个算法出现异常导致崩溃的时候,不会引起整个的异常,为局部异常处理提供便利。

ROS问题:Master作为拓扑网络的中心,一旦异常将影响整个网络

百度apollo - Apollo对ROS优化总结

整个系统非常依赖Master这个单点,一旦Master异常,所有节点都不能发现其他节点,这样整个系统就不能正常工作。但是这个问题在ROS2中得到了解决。

Apollo优化:使用RTPS服务发现协议实现完全的P2P网络拓扑

百度apollo - Apollo对ROS优化总结

在ROS中添加基于RTPS服务协议功能,网络构建不会以Master作为中心,而是通过域概念作为划分,所有节点加入域中,会通过RTPS协议相互广播通知其他节点,然后节点间会建立点对点连接,来发布订阅消息,以替代Master作为*信息交换的功能

使用RTPS的工作原理:
  • Sub节点启动,通过组播向网络注册
  • 通过节点发现,两两建立unicast
  • 向新加入的节点发送历史拓扑消息
  • 收发双发建立连接,开始通信
Sub节点启动,通过组播向网络注册

百度apollo - Apollo对ROS优化总结

通过节点发现,两两建立unicast

百度apollo - Apollo对ROS优化总结

向新加入的节点发送历史拓扑消息

百度apollo - Apollo对ROS优化总结

收发双发建立连接,开始通信

百度apollo - Apollo对ROS优化总结

2.3 数据兼容性扩展

ROS特点:Message是ROS中描述软件组件接口的语言

Message是ROS中描述接口的一种语言,当两个节点之间需要建立连接的时候,通常需要满足两个条件。一是接收和发送的Topic属于同一个话题,二是两个模块定义的模式要完全一致。

百度apollo - Apollo对ROS优化总结

ROS怎么定义message?ROS使用msg文件对数据接口进行抽象化的描述,并可以生成不同语言的接口实现,以满足不同语言的通信交流需求。

百度apollo - Apollo对ROS优化总结

ROS问题:接口升级后,不同版本的模块难以兼容

对于兼容性的问题,当项目规模比较小时,影响不大;但是对于无人自动驾驶比较庞大的项目时,影响就很大。当某一个模块接口升级了,需要把所有相关模块升级到最新版本之后,才能在一起进行基础功能的连调。同时对于线下仿真调试的时候,有时需要把某一个模块回到历史版本验证或定位某一个问题,这时候若接口之间出现升级,就会出现不兼容问题,导致系统运行障碍。

百度apollo - Apollo对ROS优化总结

接口兼容性问题会对历史数据使用造成更大影响,自动驾驶汽车系统中历史数据是非常宝贵和重要资源,对于这种问题有一些解决方式,一是通过离线数据批量转换和在线方式,二是转换成新数据。

百度apollo - Apollo对ROS优化总结

Apollo优化:protobuf能够很好支持向后兼容

Apollo使用protobuf来替代ROSmessage,最大好处是可以完全覆盖message中本身包含的类型,有利于把既有的ROSmessage迁移到protobuf格式下。此外protobuf有非常好的版本兼容性。

个人觉得这是对ros最大的优化所在

百度apollo - Apollo对ROS优化总结

protobuf消息格式与ROS深度集成

在Apollo ROS中,做了一整套对protobuf的支持, 在工程中可以不需要做protobuf和ROS message的转换,直接publish protobuf格式的消息,调试工具也能够非常正确的解析出来正确的protobuf消息。这样既能够很好解决兼容性问题,也不会产生额外的学习成本和使用成本。

百度apollo - Apollo对ROS优化总结