背景介绍
感知决策规划灯模块的实时数据收集和实时处理需要相互独立且将有交互的模块集成在一起。
涉及大量图像点云算法。
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改进:两次复制
- 发送节点把消息序列化成流式数据
- 接收节点直接从共享内存里面取相应的消息指针,把共享内存消息取出来进行反序列化成结构化信息进行使用
- 去中心化网络拓扑
- 中心化网络拓扑过度依赖Master单点;缺乏异常处理机制
- Apollo建立了一个点对点复杂网络拓扑
- RTP服务自适应
- 修改完全是在ROS底层的修改
- 数据兼容性扩展
- 原ROS需要预先定义消息类型,能更好的对两个节点之间进行解耦合
- protobuf具有良好的向后兼容的特性,使用的时候可以定义预先字段和新增字段,下游如果不需要新增字段就不用关注新增字段
- 通信性能优化
-
TF(Transformation System)
- 坐标系转换
- ROS架构是松耦合的关系,每个节点都有自己的坐标系
-
rqt User Interface
- r——ROS
- qt——可视化工具
- 功能
- rqt_view实时查看图像状态
- multipolot
- rqt_graph,实时展示
- rqt_console
- rqt_logger_level
-
Robot models(URDF)
- Link:单个节点
- Joint:节点之间的关系
-
Simulation descriptions(SDF)
- 一种调试工具
Service
- service name对应topic name,srv的描述文件对应message的描述文件,但srv的描述文件里定义了两类消息,用三个短横杠区分
ROS深入介绍
-
ROS package
- src存放源文件
- msg存放节点之间进行通信的消息定义
- srv节点服务通信时服务的定义
- config配置文件相关信息
- include头文件相关信息
- launch启动文件
-
用这种组织方式,rosrun/roslaunch启动的时候package name会自动补全,节点或launch文件可以自动寻找
-
packag.xml定义了可执行文件依赖的一些库,包含软件版本开发者信息等描述文件
-
CMakeLists.xml定义如何编译ROS工程,制定了Cmake版本,package名字,头文件信息等,与package.xml库一一对应
-
Catkin build会把整个工程目录里的package都统一编译,可以指定编译
-
简单的ROS构建
-
ROS提供的日志系统也是分级的
-
ROS_INFO默认打印的信息到当前屏幕
-
ROS_INFO_STREAM流式数据会默认打印到后台节点对应的日志信息
-
quenesize:因为消息的产生一般快于消息的通信,quene把消息发送和产生消息进行隔离,减少通信过程中的阻塞延迟。如果发生延迟,则会丢弃一部分队列里的旧消息,压入新消息
-
rosspin所有的回调函数不是主动触发的,声明后生效
-
Publisher
-
自动驾驶中,一个节点可能是订阅方也可能是发送方
-
RViz
- 一种可视化工具,立体化展示拓扑网络,也可以看作一个节点