当前位置: 首页 > backend >正文

ros2_不同ROS_DOMAIN_ID环境变量之间通信

1.需求

两台linux ros2系统设备, 配置了不同环境变量ROS_DOMAIN_ID,
期望在不同的ROS_DOMAIN_ID 之间, 进行话题通信.

2.解决方案调研

方案1: 第3方库 接受/转发消息

MQTT通信:
设备1或设备2: 安装MOTT broker
设备1: MQTT订阅消息
设备2: MQTT发布消息
设备1: 接受消息, 直接处理 或 转发为ros2 topic
socket tcp/udp 通信:
同mqtt, 自定义tcp/udp服务, 接受/转发消息

方案2: 确认 ros2 官网是否有相关解决方案

参考: https://wenku.csdn.net/doc/5e604uicy3
domain_bridge 跨ROS_DOMAIN_ID 发布消息
官网
github

方案确认:

参考官网实例, 使用domain_bridge, 能简单快速实现需求.
故使用 方案2: domain_bridge

3.domain_bridge 说明

ros2 domain bridge github 链接

domain_bridge 安装

sudo apt install ros-$ROS_DISTRO-domain-bridge

domain_bridge配置文件
example_bridge_config.yaml
: https://github.com/ros2/domain_bridge/blob/main/examples/example_bridge_config.yaml

name: my_bridge
from_domain: 1  # 源 domain
to_domain: 2    # 目的 domain
topics:topic: # 话题名type: std_msgs/msg/String # 消息类型

4.domain_bridge 使用示例

1.话题发布publish

1_topic_public.py

import rclpy
from rclpy.node import Node
from std_msgs.msg import Stringclass MinimalPublisher(Node):def __init__(self):super().__init__('minimal_publisher')self.publisher_ = self.create_publisher(String, 'topic', 10)timer_period = 0.5  # secondsself.timer = self.create_timer(timer_period, self.timer_callback)self.i = 0def timer_callback(self):msg = String()msg.data = 'Hello World: %d' % self.iself.publisher_.publish(msg)self.get_logger().info('Publishing: "%s"' % msg.data)self.i += 1def main(args=None):rclpy.init(args=args)minimal_publisher = MinimalPublisher()rclpy.spin(minimal_publisher)minimal_publisher.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

2.订阅端subscribe

2_topic_subscriber.py

import rclpy
from rclpy.node import Node
from std_msgs.msg import Stringclass MinimalSubscriber(Node):def __init__(self):super().__init__('minimal_subscriber')self.subscription = self.create_subscription(String,'topic',self.listener_callback,10)self.subscription  # prevent unused variable warningdef listener_callback(self, msg):self.get_logger().info('I heard: "%s"' % msg.data)def main(args=None):rclpy.init(args=args)minimal_subscriber = MinimalSubscriber()rclpy.spin(minimal_subscriber)minimal_subscriber.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

3.测试命令

终端设置不同的ROS_DOMAIN_ID环境变量, 进行通行

终端1:
export ROS_DOMAIN_ID=1
python3 1_topic_public.py
终端2:
export ROS_DOMAIN_ID=2
python3 2_topic_subscriber.py

此时 终端2 无法订阅到话题

终端3:

1.创建配置: example_bridge_config.yaml

# Name of the domain bridge, used for node naming and logging
name: my_bridge
from_domain: 1
to_domain: 2
topics:topic:type: std_msgs/msg/String

2.运行 domain_bridge
ros2 run domain_bridge domain_bridge example_bridge_config.yaml

此时会看到 终端2 能够订阅到话题
在这里插入图片描述

5.总结

  1. 一开始向 抖音豆包, 腾讯元宝 需求解决方案, 给的全是错误答案, 根本不可行
  2. 外网搜索, 匹配到关键字 domain_bridge , 才知道ros2 官方有跨ROS_DOMAIN_ID 通信解决方法

http://www.xdnf.cn/news/2890.html

相关文章:

  • vuex与vuex-persistedstate 插件固化数据
  • Spring框架allow-bean-definition-overriding详细解释
  • terraform隐藏云账号ak/sk信息
  • Linux系统中的静态库和动态库
  • 《无刷空心杯电机减速机选型及行业发展趋势》
  • 解密面试高频题:加权轮询负载均衡算法 (Java 实现)
  • 量子算法调试:Grover算法搜索空间压缩过程可视化方案
  • 算法笔记.kruskal算法求最小生成树
  • 汤晓鸥:计算机视觉的开拓者与AI产业化的先行者
  • 深入理解 Spring 类型转换核心接口 ConversionService
  • emqx部署
  • 厚铜板的镀前处理差异:工艺参数与成本影响
  • C22-作业练习之最大公约数与最小公倍数
  • idea启动springboot方式及web调用
  • 半监督学习与强化学习的结合:新兴的智能训练模式
  • Docker网络架构深度解析与技术实践
  • 【深入理解指针(6)】
  • IIC 通信协议
  • Spring系列四:AOP切面编程第三部分
  • MySQL-排序
  • Finish技术生态计划: FinishRpc
  • print用法讲解(Python)
  • 数字人接大模型第二步:语音克隆
  • 洛谷P1003[NOIP 2011 提高组] 铺地毯
  • GPU虚拟化实现(四)
  • XMOS人工智能降噪——AI降噪让极端嘈杂环境下的通话和拾音变得可能
  • 说说stack reconciler 和fiber reconciler
  • 算法题(136):逛画展
  • 如何利用谷歌趋势精确估算关键词搜索量?
  • DDI0487--A1.3