背景介绍
感知决策规划灯模块的实时数据收集和实时处理需要相互独立且将有交互的模块集成在一起。
涉及大量图像点云算法。
ROS概述
ROS的基本概念
-
ROS特征
- 点对点
- 支持分布式,在部署多机之间的消息通信时提供支持
- 多语言
- 轻量级,只需要关注核心模块的算法逻辑,无需关注底层
- 开源框架
-
ROS是一个松耦合的框架,是一个基于消息的通信,各个节点(算法模块/集合)的通信是一个解耦合的关系
-
节点相互独立相互通信。交互利用Master节点管理器
-
松耦合的体现
- 两个要通信的节点启动没有先后关系,不影响通信链路的建立
- 启动的时候会向ROScore发送注册信息和通信信息(topic)
- topic内部使用的数据格式是message,包含具体的基本数据类型和一些自定义类型等,有文本文档形式的消息文件。
- 接收节点收到message之后会根据message定义的格式进行一些反解析,触发自身执行
- 通信链路建立之后ROScore(Master)就暂时没有作用了
- 两个要通信的节点启动没有先后关系,不影响通信链路的建立
-
节点
- 包含一些常用的命令
- rosnode list:列出当前系统存在的节点
- rosnode info:查看某一个节点的具体信息,如指定节点发送的目标、topic以及topic的类型
- rostopic type+topic名字查看topic类型
- rostopic list:查看所存在topic的一些列表
- rostopic info:查看到发送这个topic的发送方,订阅这个topic的订阅方
- rostopic pub:调试计算节点模块的一些基本功能
- /topic:加上/表示作用域是全局变量,在整个计算拓扑里所有人都能看到这个topic。如果没有加上/,就会在做rostopic list的时候在前面加上发送节点的空间作用域。设计目的是为了与其他模块组合成更复杂的系统且不出现命名冲突。
- 包含一些常用的命令
-
已经预定义好的基础数据类型
-
启动roscore:命令行
-
roslaunch:把所有启动节点的行为放到统一的描述文件,不包含roscore启动,但会先检测是否存在ROScore,如果存在就启动定义节点,不存在会先启动roscore
-
roscore启动后不受任何情况的影响
- 编译系统
- scr存放源文件的一些目录
- build,devel临时文件夹
Apollo ROS原理
- ROS目前存在的不足
- 大数据量传输性能瓶颈
- 会导致时延很高
- 单中心的网络存在单点风险
- 节点管理器如果失效,整个系统就会崩溃
- 数据格式缺乏后向兼容
- message里面包含的数据类型较多,下游要做大量的适配
- 大数据量传输性能瓶颈
- Apollo ROS的改进
- 通信性能优化
- 自动驾驶大量使用传感器有很大的传输带宽要求,ROS原来会丢弃消息,造成风险
- 单路传感器消息有多个消费者时负载成倍增长,减少拷贝产生的大量负载
- 消息通信延时:基于共享内存通信减少时延
- 吞吐量:吞吐量测试1:1,5.5GB每秒,1:4,12GB每秒
- CPU资源占用率:在共享内存通信情况下降低约30%
- ROS原生通讯框架:四次复制
- 从节点到用户内存的数据复制
- 从发送方到内核的数据复制
- 经过TCP连接,从内核再向接收节点用户态空间的复制
- 接收节点拿到这个信息之后,通过反序列化把信息取出来组成一个结构变化的信息
- Apollo改进:两次复制
- 发送节点把消息序列化成流式数据
- 接收节点直接从共享内存里面取相应的消息指针,把共享内存消息取出来进行反序列化成结构化信息进行使用
- 通信性能优化