ROS架构
1、ROS架构设计
三个层次:OS层、中间层、应用层
1、OS层:
并不是一个传统意义上的操作系统,需要依托于Linux系统(如Ubuntu、macOS、Arch等)
2、中间层:
Linux其中最为重要的就是基于TCPROS/UDPROS的通信系统,ROS的通信系统基于TCP/UDP网络,在此之上进行了在此封装,也就是TCPROS/UDPROS。通信系统使用发布/订阅、客户端/服务器等模型,实现多种通信机制的数据传输。
通信机制之上,ROS提供了大量机器人开发相关的库,如数据类型定义、坐标变化、运动控制等,可以提供非应用层使用。
3、应用层:
在应用层,ROS需要运行一个管理者——Master,负责管理整个系统的正常运行。ROS社区内共享了大量的机器人应用功能包,功能包内的模块以节点为单位运行。
从系统实现的角度来看,ROS也可以分为:文件系统、计算图、开源社区
2、计算图
2、1节点
节点就是一些执行运算任务的进程,一个系统一般由多个节点组成,也可以称为“软件模块”。
2、2消息
节点之间最重要的通信机制就是基于发布/订阅模型的消息通信。每一个消息都是一种严格的数据结构,支持标准数据类型(整点、浮点型、布尔型等),也支持嵌套结构和数组(类似于C语言的struct),还可以根据需求由开发者自主定义。
2、3话题
消息以一种发布/订阅(Publish/Subscribe)的方式传递。一个节点可以针对一个给定的话题(Topic)发布消息(Talker),也可以关注某个话题并订阅特定类型的数据(Listener)。发布者和订阅者并不了解彼此的存在,系统中可能同时有多个节点发布或者订阅同一个话题的消息。
2、4服务
基于话题的发布/订阅模型是一种很灵活的通信模式,但是对于双向的同步传输模式并不适合。在ROS中,我们称这种同步传输模式为服务(Service),其基于客户端/服务器模型,包含两个部分的通信数据类型:一个用于请求,一个用于应答。与话题不同的是,ROS中只允许有一个节点提供指定命名的服务。ROS中只允许有一个节点提供指定命名的服务。
2、5节点管理器
ROS Master通过远程过程调用(RPC)提供登记列表和对其他计算图表的查找功能,帮助ROS节点之间相互查找、建立连接,同时还为系统提供参数服务器,管理全局参数。
3、文件系统
功能包(Package):功能包是ROS软件中的基本单元,包含ROS节点、库、配置文件等。
功能包清单(Package Manifest):每个功能包都包含一个名为package.xml的功能包清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等。
元功能包(Meta Package):主要作用是组织多个用于同一目的的功能包。(例:一个ROS导航的元功能包中会包含建模、定位、导航等多个功能包)
元功能包清单:类似于功能包清单,不同之处在于元功能包清单中可能会包含运行时需要依赖的功能包或者声明引用的标签。
消息类型:msg
服务类型:srv
代码:code
3、1功能包
文件夹功能如下:
config:放置功能包中的配置文件
include:放置功能包中需要用到的头文件
scripts:放置可以直接运行的python脚本
src:放置需要编译的C++代码
launch:放置功能包中的所有启动文件
msg:放置功能包自定义的消息类型
srv:放置功能包自定义的服务类型
action:放置功能包自定义的动作指令
CMakeLists.txt:编译器编译功能包的规则
package.xml:功能包清单
<build_depend></build_depend>标签定义了功能包中代码编译所依赖的其他功能包。
<run_depend></run_depend>标签定义了功能包中可执行程序运行时所依赖的其他功能包。
ROS的常用命令
命令 | 作用 |
---|---|
catkin_create_pkg | 创建功能包 |
rospack | 获取功能包的信息 |
catkin_make | 编译工作空间中的功能包 |
rosdep | 自动安装功能包依赖的其他包 |
roscd | 功能包目录跳转 |
roscp | 拷贝功能包中的文件 |
rosed | 编辑功能包中的文件 |
rosrun | 运行功能包中的可执行文件 |
roslaunch | 运行启动文件 |
3、2元功能包
元功能包是一种特殊的功能包,质保函一个package.xml元功能包清单文件。虽然元功能包清单的package.xml文件与功能包的package.xml文件类似,但是需要包含一个引用的标签如下:
<export>
<metapackage/>
</export>
此外,元功能包清单不需要<build_depend>标签声明编译过程依赖的其他功能包,只需要使用<run_depend>标签声明功能包运行时依赖的其他功能包。
4、开源社区
5、1ROS的通信机制
分布式通信机制:话题通信机制、服务通信机制、参数管理机制
5、1话题通信机制
- Talker注册
- Listener注册
- ROS Master进行信息匹配
- Listener发送链接请求
- Talker确认连接请求
- Listener尝试与Talker建立网络连接
- Talker向Listener发布数据
5、2服务通信机制
- Talker注册
- Listener注册
- ROS Master进行信息匹配
- Listener与Talker建立网络连接
- Talker向Listener发布服务应答数据
5、3参数管理机制
- Talker设置变量
- Listener查询参数值
- ROS Master向Listener发送参数值
6、话题与服务的区别
话题是ROS中基于发布/订阅模式的异步通信模式,这种方式将信息的产生和使用双方解耦,常用语不断更新的、含有较少逻辑处理的数据通信
服务多用于处理ROS中的同步通信,采用客户端/服务器模型,常用语数据量较小但有强逻辑处理的数据交换。