分布式通信配置

智能机器人的功能繁多,全都放在一个计算机里,经常会遇到计算能力不够、处理出现卡顿等情况,如果可以将这些任务拆解,分配到多个计算机中运行岂不是可以减轻压力?
这就是分布式系统,可以实现多计算平台上的任务分配。

分布式通信

什么叫分布式?
机器人功能是由各种节点组成的,这些节点可能位于不同的计算机中,这种结构可以将原本资源消耗较多的任务,分配到不同的平台上,减轻计算压力,这就是分布式通信框架的典型应用之一。

比如在这款机器人系统中,就有两个计算平台。

机器人体积比较小,不适合放一个笔记本电脑在上边,于是采用旭日派作为控制器,主要实现传感器驱动、电机控制、AI应用等功能,此外我们还需要在电脑上监控机器人的传感器信息,并且远程控制机器人运动。

两个计算平台之间的通信,看上去还有点复杂,毕竟相互传输的数据还挺多的,不过TogehterROS都已经为我们准备好了,我们只需要在每一个计算上配置好TogehterROS或者ROS2的环境,功能开发上完全不需要做任何变化,实现非常方便。

接下来,我们就带领大家一起来感受下分布式系统的魅力。

分布式网络搭建

旭日派配置完成后,确保已经和你所使用的电脑连接到了同一个局域网络中。接下来我们打通两个计算平台的通信能力。具体需要做什么呢?

简而言之,什么都不需要做。我们直接用命令行测试一下话题通信的效果。
bash
$ ros2 run examples_rclcpp_minimal_publisher publisher_member_function     # 旭日派端
$ ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function   # PC端
神奇的事情就这样发生了,旭日X3派上安装的是TogetherROS,我的电脑上安装的是ROS2,他们只要处于同一网络中,就可以实现通信了,感觉就像在一个电脑里一样。
???+ Attention:
    如使用虚拟机,请将虚拟机网络修改为桥接模式
不过这也会带来一个问题,如果一个网络中有很多个计算机,我们并不希望他们都可以互通互联,而是可以分组通信,小组之间是无法实现通信的。

分布式网络分组

没问题,ROS2提供了一个DOMAIN的机制,就类似分组一样,处于同一个DOMAIN中的计算机才能通信,我们可以在电脑和旭日X3派端中加入这样一句配置,即可将两者分配到一个小组中:
bash
$ export ROS_DOMAIN_ID=<your_domain_id>

如果分配的ID不同,则两者无法实现通信。


话题分布式通信

之前编写的例程是否可以在不修改任何代码的情况下,直接使用呢?
以话题通信为例,旭日派作为发布者,发布Hello World字符串,电脑作为订阅者,订阅Hello World字符串,我们看下效果如何。
bash
$ ros2 run learning_topic_cpp talker      # 旭日派端
$ ros2 run learning_topic_cpp listener    # PC端
好啦,我们在分布式网络中测试了ROS一系列例程,都没有任何问题,在实际的机器人开发中,类似的方法会频繁用到,我们几乎不需要任何配置,代码也不需要做任何修改,一切都会变得如此轻松。