学习资料参考:ROS机器人开发实践(胡春旭)
ROS-架构的三个层次
OS层(linux系统)
中间层(实现ROS核心通信机制以及众多机器人开发的中间层)
- TCPROS/UDPROS通信系统(最重要)
- Nodelet(进程内通信)
- 对多进程通信提供数据传输(优化)
- 适合对数据传输实时性方面有较高要求的应用
应用层(在ROS Master的管理下保证功能节点的正常运行)
ROS-系统实现的三个层次
计算图
- 特点
- 功能模块以节点为单位运行
- 可以分布于多个相同或不同的主机中
- 通过端到端的拓扑结构进行连接
- 节点
- 一个系统由多个节点(软件模块)构成
- 多节点同时运行时,将端到端的通信绘制成节点关系图:
- 消息(Message)
- 消息通信:发布/订阅(Publish/Subscribe)模型
- 每一个消息都是一种严格的数据结构
- 支持标准数据类型(int,float,bool)
- 支持嵌套结构和数组(类似结构体)
- 可自定义
- 话题(topic)
- 异步,适用于不断更新的含较少逻辑处理的数据通信
- Node(Talker发布者) 针对Topic 发布Message
- Node(Listener订阅者)关注某个Topic订阅某个特定类型的数据。
- 发布者和订阅者彼此不知道其存在
- 系统中可同时有多个节点发布和订阅同一个Topic的Message。
- 服务(Service)
- 同步,适用于数据量小,但强逻辑处理的数据通信
- 适用于双向的同步传输
- 基于客户端/服务器(Client/Server)模型
- 包含两个部分的通信数据通信:
- 类似于web服务器
- ROS只允许有一个节点提供指定命名的服务。
- 节点管理器(ROS Master)
- 登记列表
- 对其他计算图表的查找
- 相互查找
- 建立连接
文件系统
- 功能包(Package)
- ROS软件的基本单元,包含:
- ROS节点
- 库
- 配置文件
- 功能包清单(Package Manifest)
- 每一个Package包含一个名为package.xml的功能包清单,包含:
- 作者信息
- 许可信息
- 依赖选项
- 编译标志
- 元功能包(Meta Package)
- 原功能包集(Stack)升级为元功能包
- 组织多个用于同一目的的功能包。
-(EXAMPLE)ROS导航的元功能包 包含:
- 建模
- 定位
- 导航等
- 元功能包清单
- 运行时依赖的功能包
- 声明引用的标签
- 消息(Message)类型
- ROS提供的消息类型
- 使用.msg文件在功能包的msg文件下自定义消息类型
- 服务(Service)类型
- ROS提供的服务类型
- 使用.srv文件在功能包的srv文件夹中进行定义
- 代码(Code)
开源社区
- 发行版(Distribution)
- 软件源(Repository)
- ROS wiki
- 邮件列表(Mailing List)
- ROS Answers
- 博客(Blog)
关键概念:节点、消息、话题、服务、功能包、元功能包。
ROS-三种通信机制(分布式通信机制)
基于发布/订阅的话题通信
- Talker和Listener分别发布订阅同一个话题,启动顺序没有强制要求
- 建立通信详细过程:
- advertise(“bar”,foo:1234)
- subscribe(“bar”)
- {foo:1234}
- connect(“scan”, TCP)
- TCP server:foo:2345)
- connect(foo:2345)
- data messages
基于客户端/服务器的服务通信
- 减少了talker和listener之间的RPC通信
- 建立通信详细过程
- Advertise Service (“bar”, foo:1234)
- lookupService(“bar”)
- {foo:3456}
- request data(args)
- reply data
基于RPC的参数服务器(参数管理机制)
- setParam(“foo”,1)
- getParam(“foo”)
- {foo:1}
- 特别注意: 如果Talker向Master更新参数值,Listener不重新查询数值是无法知道参数的更新。(需要动态参数更新的机制)