ROS2——基础4(通信接口、参数说明、分布式通信)

目录

[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)赋予可执行权限

python 复制代码
chmod +x param_demo.py

(3)setup.py设置

python 复制代码
cd ..
gedit setup.py

(4)编译运行测试

python 复制代码
cd ~/ros2_ws
colcon build
source ./install/setup.bash
ros2 run param_demo param_demo

另启终端

python 复制代码
cd ~/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文件

python 复制代码
gedit ~/.bashrc

文末输入

python 复制代码
export 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搭建通信中间件 ,实现去中心化 |
| | 支持点对点及组播通信,扩展性更好 |
| | 容错能力更强,部分节点掉线也可以保持通信 |

相关推荐
大唐荣华5 小时前
模型训练显卡选型深度指南:价格、数量、性能与自建租赁抉择
人工智能·机器人·模型训练·具身智能·avida·navida
音视频牛哥1 天前
世界模型如何重塑具身智能:从VLA到预测式机器人控制
人工智能·具身智能·世界模型·world model·vla模型·多模态感知·机器人决策
VL——MOESR2 天前
【具身智能】VLA论文阅读随笔
论文阅读·人工智能·机器学习·具身智能·vla
DQQzero2 天前
量产机器人 18 金双榜第一:智元灵巧手 OmniHand 拆解
具身智能·人形机器人·灵巧手·智元·omnihand
zh路西法5 天前
【玩转VLA具身智能机械臂】(三):视觉避障——从 RGB-D 点云到 MoveIt octomap 的完整落地
c++·ros2·gazebo·moveit2·ompl·octomap
YQ_015 天前
ROS 2 Humble Nav2 生命周期教程:启动流程、状态监控、超时诊断与自愈设计
linux·机器人·ros2·nav2
路弥行至5 天前
ROS2 通信避坑实录:从 topic/msg 底层原理到一次内存错位复盘
网络·经验分享·笔记·其他·内存·topic·ros2
机器人猎头David6 天前
机器人猎头公司(倍利福猎头公司)案例分享
人工智能·机器人·招聘·具身智能·人形机器人·猎头公司·机器人猎头公司
猫先生Mr.Mao6 天前
具身智能开放策略之Octo详解:开放策略如何把多机器人经验变成可微调的通用底座
机器人·论文解读·具身智能·通用机器人策略·octo
BFT白芙堂7 天前
Franka & DROID :面向真实场景的机器人操作数据集
人工智能·学习·机器学习·机器人·具身智能·franka·robotiq