两台linux ros2系统设备, 配置了不同环境变量ROS_DOMAIN_ID,
期望在不同的ROS_DOMAIN_ID 之间, 进行话题通信.
MQTT通信:
设备1或设备2: 安装MOTT broker
设备1: MQTT订阅消息
设备2: MQTT发布消息
设备1: 接受消息, 直接处理 或 转发为ros2 topic
socket tcp/udp 通信:
同mqtt, 自定义tcp/udp服务, 接受/转发消息
参考: https://wenku.csdn.net/doc/5e604uicy3
domain_bridge 跨ROS_DOMAIN_ID 发布消息
官网
github
参考官网实例, 使用domain_bridge, 能简单快速实现需求.
故使用 方案2: 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 # 消息类型
1_topic_public.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
self.publisher_ = self.create_publisher(String, 'topic', 10)
timer_period = 0.5 # seconds
self.timer = self.create_timer(timer_period, self.timer_callback)
self.i = 0
def timer_callback(self):
msg = String()
msg.data = 'Hello World: %d' % self.i
self.publisher_.publish(msg)
self.get_logger().info('Publishing: "%s"' % msg.data)
self.i += 1
def 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_topic_subscriber.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class 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 warning
def 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()
终端设置不同的ROS_DOMAIN_ID
环境变量, 进行通行
export ROS_DOMAIN_ID=1
python3 1_topic_public.py
export ROS_DOMAIN_ID=2
python3 2_topic_subscriber.py
此时 终端2 无法订阅到话题
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