译自
ROS是一个中间件, 用于在不同进程间匿名发布订阅传递消息. ROS2的核心是ROS网络 ROS Graph. ROS网络是指在在不同节点间的相互通讯的连接关系.
ROS Graph的概念包括
节点 nodes - 通过 ROS client library 和其他节点通讯, 也可发布订阅主题, 提供ROS服务. 各个节点可以在同个进程中, 也可在不同进程中, 也可在不同的机器上, 多个节点通过分布式发现进程 discovery 来建立联系, 并且只会和具有相同兼容性 - 服务质量设置的节点进行通讯.
消息: messages
主题: topics
发现: discovery - 自定运行的进程, 通过此进程节点之间仙湖发现建立连接.
ROS client library: 包括 rclcpp 和 rclpy 也有一些其他社区支持的客户端语言支持程序
发现的过程:
1. 节点启动, 向相同ROS域名(ROS_DOMAIN_ID环境变量)的节点广播. 其他节点收到广播后返回自身的信息.
2. 节点会定时广播自身信息, 避免新上线的节点错过最初的发现工程.
3. 节点下线也会广播
ROS2 DDS的关系.
ROS2 是建立在DDS基础上的, DDS程序被用来发现节点,序列化,和传递信息. 例如分布式发现节点, 控制传输中不同的通讯质量.
DDS 是一个被很多公司实现的工业标准. 例如 RTI的connext 和 ePromima的FastRTPS. ROS2支持很多种DDS的实现方式, 区别在于用户要考虑其法律协议,跨平台, 多种场景对应不同的实现, 以及支持的硬件环境等等.
ROS2 有一个RMW软件包, 利用DDS程序提供的API和工具来实现ROS中间件接口. 也可以同时使用多个 RMW实现.
客户端程序库 RCL. RCL底层为C的实现, 以便于多种语言进行包装.
RCL的核心:
命名和命名空间
时间 (实际时间或模拟时间)
参数
终端输出
线程模型
跨进程通讯
ROS接口 : 消息和服务.
需要传经 msg / srv 文件.
.msg 文件
fieldtype fieldname 空格隔开. 变量名必须小写开始, 下划线分割, 但不能下划线结束. 也不能有连续的两个下划线.
例如: int32 my_int
int32[] unbounded_int_array
int8[5] five_int_array
uint8[<=5] up_to_five_int_array
string my_str 没有限制的字串
string[<=5] up_to_five_unbounded_str
string<=10 up_to_ten_char_string
string<=10[] unbounded_array of string up to ten chars each
string<=10[<=5] up_to_five_strings each up_to_ten_chars
例如 foxy\share\unique_identifier_msgs\msg\UUID.msg的内容为 uint8[16] uuid
fieldtype 域类型有内部的(内部类型可以使用数组来定义), 也可以自定义(geometry_msgs/PoseStamped).
默认值定义 fieldtype fieldname def_val
uint8 x 42
string name "join" 用单引号也可以.
int32[] samples [-100, 50, -0, 50, 100]
常量定义 fieldtype fieldname=const_val 常量名字必须大写.
uint8 X=42
服务文件定义
服务文件包含一个请求和一个回应消息, 之间用 --- 分割.
例如 foxy\share\std_srvs\srv\SetBool.srv的内容为
bool data # e.g. for hardware enabling / disabling
---
bool success # indicate successful run of triggered service
string message # informational, e.g. for error messages
------------------------------------------------------------------------------------------------------------------
服务质量
ROS2提供了分股的QoS控制规则. 用以优化微调节点通讯. 在ROS1中仅支持 TCP, 而 ROS2因为DDS传输的灵活配置, 通过核实的QoS配置可以使得ROS2像TCP一样可靠,也可以像UDP一样高效. 对于在一个易丢数据的无线网中, 可以使用一个高效的QoS规则. 对于实时计算的场景中可以使用高可靠的Qos规则.
一组服务质量规则组合在一起产生一个QoS配置文件, 设置合适的QoS配置文件不是容易的事情, ROS2预先提供了一些常用情境下的配置文件.
QoS配置文件可以应用于发布者/订阅者/服务提供者/客户端. 如果他们之间使用了不同的QoS配置文件, 有可能无法建立连接.
QoS配置文件包括以下"
历史: History
Keep Last / Keep All
深度: Depth
队列大小. 只有 Keep Last 才有效.
可靠性 Reliablility
最高效率: 有可能丢高
高可靠性: 保证成功, 有可能发送多次.
耐久力 Durability
本地缓存 Trasient local 发送者会为尚未加入的节点保存未接收的数据.
自动挥发 Volatile 不会特意保存数据
与ROS1对比, 深度和历史是一样的, ROS1的UDPROS对应高效模式, TCPROS其实也是UDP实现的.
默认的发布者和订阅者的QoS配置文件为 可靠模式,自动挥发,存储最后.
服务和参数:可靠, 耐久力.
传感器: 高效, 低深度队列.