目录
[1 通信接口](#1 通信接口)
[2 参数说明](#2 参数说明)
[2.1 定义](#2.1 定义)
[2.2 param参数指令](#2.2 param参数指令)
[2.3 创建参数示例](#2.3 创建参数示例)
[3 分布式通信](#3 分布式通信)
[3.1 定义及介绍](#3.1 定义及介绍)
[3.2 分布式网络分组举例](#3.2 分布式网络分组举例)
[3.3 ROS1/2分布式通讯对比](#3.3 ROS1/2分布式通讯对比)
1 通信接口
ROS三种常用通信机制为:话题、服务、动作,通过每一种通信定义的接口,各个节点相互联系。接口可以降低程序之间依赖,便于使用别人的代码。
PS.
(1)话题详见:https://blog.csdn.net/weixin_45728280/article/details/155324727?spm=1011.2415.3001.5331
(2)服务、动作详见:
https://blog.csdn.net/weixin_45728280/article/details/155356915?spm=1011.2415.3001.5331
(3)文件说明
|--------|------------------|
| 文件名 | 作用 |
| action | 存放动作通信的.action文件 |
| msg | 存放话题通信的.msg文件 |
| srv | 存放服务通信的.srv文件 |
2 参数说明
2.1 定义
类似C++中全局变量,便于在多个程序中共享某些数据,参数是ROS机器人系统中的全局字典,可以运行多个节点中共享数据。
2.2 param参数指令
|--------------------------------|----------|
| 指令 | 作用 |
| ros2 param list | 列出当前多个参数 |
| ros2 get param_key | 显示某个参数值 |
| ros2 set param_key param_value | 设置某个参数值 |
| ros2 param dump file_name | 保存参数到文件 |
| ros2 param load file_name | 从文件读取参数 |
| ros2 param delete param_key | 删除参数 |
2.3 创建参数示例
(1)创建param_demo功能包并进入-编写程序
cd ros2_ws/src ros2 pkg create param_demo --build-type ament_python --dependencies rclpy cd param_demo_param_demo gedit param_demo.py
python# 导入 rclpy 模块 import rclpy # 导入 Node 类 from rclpy.node import Node # 导入 Parameter 类 from rclpy.parameter import Parameter # 定义一个继承自 Node 类的 MinimalParam 类 class MinimalParam(Node): def __init__(self): # 调用父类构造函数初始化节点 super().__init__('minimal_param_node') # 声明一个名为'my_ parameter'的参数,并设置默认值为'ros2' self.declare_parameter('my_parameter', 'ros2') # 创建定时器,设置回调函数为 timer_callback,时间间隔为 1 秒 self.timer = self.create_timer(1, self.timer_callback) def timer_callback(self): # 获取参数'my_parameter'的值,并转换为字符串 my_param = self.get_parameter('my_parameter').get_parameter_value().string_value # 打印带有参数值的 日志消息 self.get_logger().info('Hello %s!' % my_param) # 创建一个新的参数对象 my_new_param = Parameter( # 参数名称为'my_parameter' 'my_parameter', # 参数类型为字符串 rclpy.Parameter.Type.STRING, # 参数值为'ros2' 'ros2' ) # 将新的参数对象放入列表中 all_new_parameters = [my_new_param] # 设置节点的参数值为新的参数值 self.set_parameters(all_new_parameters) def main(): # 初始化 ROS 节点 rclpy.init() # 创建 MinimalParam 对象 node = MinimalParam() # 进入主循环 rclpy.spin(node) if __name__ == '__main__': main()(2)赋予可执行权限
pythonchmod +x param_demo.py(3)setup.py设置
pythoncd .. gedit setup.py(4)编译运行测试
pythoncd ~/ros2_ws colcon build source ./install/setup.bash ros2 run param_demo param_demo另启终端
pythoncd ~/ros2_ws source ./install/setup.bash ros2 param set minimal_param_node my_paramter world # world可以自定
3 分布式通信
3.1 定义及介绍
可以通过网络在不同主机之间实现数据交互。
ROS2是一个分布式通信架构,基于的中间件是DDS,处于同一个网络中通过DDS的域ID机制实现。流程为:启动节点设置域ID,不同节点同域ID则可以自由发现并通信;默认情况是域ID为0。
ROS2提供一个DOMAIN机制,类似于分组,同DOMAIN的终端可以通信,同网络下不同DOMAIN的域ID应不同,推荐0-101间选择,下面介绍如何分组。
3.2 分布式网络分组举例
(1)编辑./bashrc文件
pythongedit ~/.bashrc文末输入
pythonexport ROS_DOMAIN_ID=25(2)其他终端.bashrc文件中加入"export ROS_DOMIAN_ID=25"即可进行分布式通信。
3.3 ROS1/2分布式通讯对比
|------------------------------|---------------------------------------------------|
| ROS1 | ROS2 |
| 使用匿名TCP/IP通信 | 常用TCP、UDP、DDS |
| 采用发布/订阅模式,通过central master实现 | 引入discover、authentication、authorization机制的分布式服务发现 |
| 节点需要主动向master注册以获取对等节点信息 | 节点直接与对等节点通信 |
| 通信可靠性依赖中心节点master | 默认用ZeroMQ搭建通信中间件 ,实现去中心化 |
| | 支持点对点及组播通信,扩展性更好 |
| | 容错能力更强,部分节点掉线也可以保持通信 |




