ros2 基础学习12 分布式通信

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

这就是分布式系统,可以实现多计算平台上的任务分配。

分布式通信

什么叫分布式?

之前我们也讲过,在ROS系统中,机器人功能是由各种节点组成的,这些节点可能位于不同的计算机中。

这种结构可以将原本资源消耗较多的任务,分配到不同的平台上,减轻计算压力,这就是分布式通信框架的典型应用之一。

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

机器人体积比较小,不适合放一个笔记本电脑在上边,于是采用树莓派作为控制器,主要实现传感器驱动和电机控制等功能。

不过视觉处理和应用功能就不适合在树莓派里运行了,我们放在另外一个性能更强的笔记本电脑中。

此外我们还需要在电脑上监控机器人的传感器信息,并且远程控制机器人运动。

两个电脑之间的通信,看上去还有点复杂,毕竟相互传输的数据还挺多的。

不过ROS系统都已经为我们设计好了,我们只需要在每一个电脑上配置好ROS环境,功能开发上完全不需要做任何变化,实现非常方便。

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

分布式网络搭建

除了我使用的笔记本电脑之外,另外一个计算平台我们选择了树莓派,模拟一个放置在机器人上的控制器。

树莓派配置

在开发之前,我们需要先配置好树莓派的环境,网上也有很多资料,大家都可以参考。

装系统

我们先要给树莓派装系统,这里我们选择的是Ubuntu Mate针对树莓派的镜像,下载镜像之后,烧写到树莓派的SD卡中就可以启动系统了。

Ubuntu MATE镜像下载链接:

https://ubuntu-mate.org/download/

安装ROS2

在安装好的Ubuntu Mate系统中,安装ROS2,和电脑端安装的流程一样。

编译代码

将我们课程的代码也下载到树莓派中,进行编译。

远程桌面

如果大家有显示器,可以直接在树莓派上连接键盘鼠标显示器使用,如果使用不方便的话。

也可以在树莓派上配置好远程桌面,就可以通过网络访问树莓派的桌面系统了。

以上步骤的整体流程和电脑端操作基本一致,大家也可以参考如下链接配置树莓派:

https://blog.csdn.net/qq_52785580/article/details/122599728

分布式数据传输

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

简而言之,什么都不需要做。我们直接用命令行测试一下话题通信的效果。

Attention

如使用虚拟机,请将虚拟机网络修改为桥接模式

在树莓派端,使用如下命令启动一个发布者节点:

cpp 复制代码
ros2 run demo_nodes_cpp talker  #树莓派端

图片

接下来在电脑端,使用如下命令启动一个订阅者节点:

cpp 复制代码
ros2 run demo_nodes_py listener #PC端

神奇的事情就这样发生了,只要两个计算机安装好ROS2,并且处于同一网络中。

他们就可以实现之前讲过的话题、服务、动作等通信了,感觉就像在一个电脑里一样。

不过这也会带来一个问题,如果一个网络中有很多个计算机,我们并不希望他们都可以互通互联。

而是可以分组通信,小组之间是无法实现通信的。

分布式网络分组

没问题,ROS2提供了一个DOMAIN的机制,就类似分组一样。

处于同一个DOMAIN中的计算机才能通信,我们可以在电脑和树莓派端的.bashrc中加入这样一句配置,即可将两者分配到一个小组中:

cpp 复制代码
export ROS_DOMAIN_ID=<your_domain_id>

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

案例一:小海龟分布式控制

分布式通信网络似乎已经建立成功了,是否真有我们想的这么神奇,我们继续测试之前学习过的一些例程。

先来试试ROS中的经典案例------小海龟。

我们可以在电脑端启动小海龟仿真器,树莓派上启动键盘控制节点,或者反过来也可以,依然可以流畅的控制小海龟运动:

cpp 复制代码
 ros2 run turtlesim turtlesim_node      # PC端$ ros2 run turtlesim turtle_teleop_key   # 树莓派端

案例二:话题分布式通信

我们之前编写的例程是否可以在不修改任何代码的情况下,直接使用呢?

先试试话题通信,树莓派作为发布者,发布Hello World字符串,电脑作为订阅者,订阅Hello World字符串:

cpp 复制代码
ros2 run learning_topic topic_helloworld_pub  # 树莓派端$ ros2 run learning_topic topic_helloworld_sub  # PC端

案例三:服务分布式通信

话题没有问题,服务也不在话下。

我们电脑端运行服务器程序,树莓派端运行客户端程序,还是可以顺利实现加法求和功能:

cpp 复制代码
ros2 run learning_service service_adder_server        # PC端$ ros2 run learning_service service_adder_client 2 3    # 树莓派端

案例四:机器视觉分布式应用

以上这些功能还不够复杂?没问题,视觉识别的例程安排上。

接下来,我们将使用树莓派连接摄像头,模拟一个小型机器人,可以采集实时图像。

然后再通过分布式网络,将图像发给电脑端的处理节点,识别图像中的红色物体:

cpp 复制代码
ros2 run usb_cam usb_cam_node_exe           # 树莓派端$ ros2 run learning_topic topic_webcam_sub    # PC端

没有任何问题,视觉识别的效果如下。

好啦,我们在分布式网络中测试了ROS一系列例程,都没有任何问题,在实际的机器人开发中。

类似的方法会频繁用到,ROS为分布式网络的搭建提供了非常友好的支持,我们几乎不需要任何配置,代码也不需要做任何修改。

只要使用ROS系统,一切都会变得如此轻松。

参考链接:

https://docs.ros.org/en/humble/Concepts/About-Domain-ID.html

相关推荐
天国梦11 分钟前
读后续写批改难题怎么破?天学网AI批改工具实测解析
人工智能
阿里云云原生23 分钟前
OpenTelemetry eBPF 在 AI 场景的应用:配置 ack-onepilot 实现 LLM 调用链追踪
人工智能·阿里云·云监控
sel_925 分钟前
【多轮对话论文导读(三)】多轮对话与Agent论文阅读笔记:用户模拟、轨迹生成与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·机器学习
玫瑰互动GEO25 分钟前
从工程视角拆解海外ClaudeGEO关键词优化:如何拿到AI搜索引用席位,获得B端采购选择
人工智能
数据库小学妹31 分钟前
AI Agent记忆怎么存?Redis+向量库三层记忆架构实战
人工智能·架构·向量数据库·ai数据库·数据库趋势·ai agent记忆
HySpark36 分钟前
从 VAD、声纹嵌入到聚类优化的一套解决思路
人工智能·语音识别·熙瑾会悟
YOLO数据集集合1 小时前
垃圾目标检测数据集 |垃圾检测 智慧环卫 城市管理 生活垃圾堆检测 生活垃圾 垃圾场 9023期
人工智能·目标检测·视觉检测·生活·垃圾检测·垃圾
cxr8281 小时前
混沌背后的秩序:T-Π-O 框架与复杂系统理解的认识论重构
人工智能·认知框架
sramdram1 小时前
语音识别芯片类别有哪些?离线语音识别芯片交互方案分析
人工智能·交互·语音识别·语音识别芯片·离线语音识别芯片
lisw051 小时前
用于信息超材料设计的生成模型!
人工智能·材料科学