【背景了解】
众所周知,ROS1想要实现跨机通信,可以选择配置单Master或者多Master网络环境,但是不管哪种,用起来都繁琐且低效。现在升级ROS2了,当我们面临同样的跨机通信需求时,恭喜你,啥也不需要做,只要终端都在同一个局域网,他们的话题消息就是共享的!!
【测试准备】
根据你的ROS2版本,安装相应的测试包代码(这里以 foxy 为例)
sudo apt install ros-foxy-examples-rclpy-minimal-publisher
【测试方法】
在机器A上运行一个 发布者
ros2 run examples_rclcpp_minimal_publisher publisher_member_function
在机器B上运行一个 订阅者
ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
此时,你会惊奇的发现,他们仿佛在一台电脑上一样,已经实现了消息互通
【进阶知识】
那么,如果你不想让两个终端消息互通该怎么做呢?也是非常简单的!
在机器A的 ~/.bashrc 中添加
export ROS_DOMAIN_ID=1
在机器B的 ~/.bashrc 中添加
export ROS_DOMAIN_ID=2
此时,再分别打开终端,运行上面的测试程序,就会发现,消息断开了!
这是为什么呢?
原来 ROS2 跨机通信使用的是 DDS 中间件,而 DDS 依赖一个 DOMAIN_ID 作为终端区分的标识符,所以,当终端的 DOMAIN_ID 设置为不同的数字时(可选范围 0 ~ 101),他们便不能相互发现并进行通信了!
【分布式通信】
众所周知,ROS2是基于分布式架构通信设计的,也就是不依赖Master节点,这一点很重要!因为当我们的机器人群体同时携带多个网卡和多个路由的时候,就可以在不动上层代码的前提下,自动组成网络回环,进而形成一些比较酷的分布式群体协同策略!!!我不知道读者们是否明白这一点在分布式应用工程实现上带来的便利,我只能说我大受震撼!