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

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

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

ros2 run demo_nodes_cpp talker  #树莓派端

图片

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

ros2 run demo_nodes_py listener #PC端

图片

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

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

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

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

分布式网络分组

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

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

export ROS_DOMAIN_ID=<your_domain_id>

图片

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

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

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

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

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

 ros2 run turtlesim turtlesim_node      # PC端$ ros2 run turtlesim turtle_teleop_key   # 树莓派端

图片

案例二:话题分布式通信

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

图片

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

ros2 run learning_topic topic_helloworld_pub  # 树莓派端$ ros2 run learning_topic topic_helloworld_sub  # PC端

图片

图片

案例三:服务分布式通信

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

图片

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

ros2 run learning_service service_adder_server        # PC端$ ros2 run learning_service service_adder_client 2 3    # 树莓派端

图片

图片

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

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

图片

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android开发百度地图api实现定位图标随手机方向转动

该功能的实现依赖于手机中的传感器元件如陀螺仪、加速度计等,具体开发详见android的官方开发文档: 传感器概览 | Android 开发者 | Android Developershttps://developer.android.com/guide/topics/sensors/sensors_overview?hlzh-cn要自定义一个传…

Hive学习(13)lag和lead函数取偏移量

hive里面lag函数 在数据处理和分析中,窗口函数是一种重要的技术,用于在数据集中执行聚合和分析操作。Hive作为一种大数据处理框架,也提供了窗口函数的支持。在Hive中,Lag函数是一种常用的窗口函数,可以用于计算前一行…

《动手学深度学习》学习笔记 第6章 卷积神经网络

本系列为《动手学深度学习》学习笔记 书籍链接:动手学深度学习 笔记是从第四章开始,前面三章为基础知道,有需要的可以自己去看看 关于本系列笔记: 书里为了让读者更好的理解,有大篇幅的描述性的文字,内容很…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-9PID控制器

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-9PID控制器) P —— Proportional I —— Integral D —— Derivative 当前误差/过去误差/误差的变化趋势 K p ⋅ e K_{\mathrm{p}}\cdot e Kp​⋅e:比…

golang并发编程-channel

在golang 并发编程里,经常会听到一句话:不要通过共享内存进行通信,通过通信来共享内存。下面我们会介绍下channel, 通过源码的方式去了解channel是怎么工作的。 基本结构 流程图 代码解读 type hchan struct {qcount uint // …

Qt(三):udp组播的发送与接收

1. 创建UDP套接字 使用QUdpSocket类创建一个UDP套接字。 udpSendnew QUdpSocket(this);udpRecenew QUdpSocket(this); 2. 绑定套接字 绑定套接字到一个本地地址和端口。可以使用bind()函数来完成。 如果要在组播中发送数据,可以将套接字绑定到一个通配符地址&#…

uniapp中uview组件丰富的Code 验证码输入框的使用方法

目录 基本使用 #自定义提示语 #保持倒计时 API #Props #Methods #Event 基本使用 通过ref获取组件对象,再执行后面的操作,见下方示例。 通过seconds设置需要倒计的秒数(默认60)通过ref调用组件内部的start方法,开始倒计时通过监听cha…

智慧旅游手机APP开发解决方案

我国的旅游市场已经逐渐地走向饱和,想要发展,就必须要寻求新的发展模式。本项目就是抓住贵州的交通飞速发展的契机,以高速为主线,高速周边的景点、酒店为依托,高速维修为辅线,借助今天得到广泛应用的智能移…

SpringBoot整合多数据源,并支持动态新增与切换

SpringBoot整合多数据源,并支持动态新增与切换 一、概述 在项目的开发过程中,遇到了需要从数据库中动态查询新的数据源信息并切换到该数据源做相应的查询操作,这样就产生了动态切换数据源的场景。为了能够灵活地指定具体的数据库&#xff0…

【深度学习:SENet】信道注意力和挤压激励网络(SENet):图像识别的新突破

【深度学习:SENet】信道注意力和挤压激励网络(SENet):图像识别的新突破 为什么有效如何实现工作原理应用案例 挤压和激励网络(SENets)为卷积神经网络(CNN)引入了一个新的构建模块&am…

克服幻觉:提升语言模型在自然语言处理中的准确性与可靠性

随着语言模型(LLM)在自然语言处理(NLP)中的应用日益普及,它们在文本生成、机器翻译、情感分析等许多任务中展现出惊人的能力。然而,这些模型也常常显示出一个被称作“幻觉”(hallucination&…

扫拖一体机哪个牌子好用?2024旗舰洗地机总结

近年来,家庭清洁的方式发生了翻天覆地的变化。在这场前所未有的洗地机创新浪潮中,消费者们迎来了更为便捷高效的家庭清洁解决方案。然而,随着市场竞争的激烈,面对众多品牌和型号的家用洗地机,究竟哪款扫拖一体机好用呢…

实现区域地图散点图效果,vue+echart地图+散点图

需求:根据后端返回的定位坐标数据实现定位渲染 1.效果图 2.准备工作,在main.js和index.js文件中添加以下内容 main.js app.use(BaiduMap, {// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: sRDDfAKpCSG5iF1rvwph4Q95M…

使用 go-elasticsearch v8 基本请求

使用 go-elasticsearch 请求示例 你可以通过参考Go 官方文档找到简单的示例,所以我认为先看看这个是个好主意。 连接客户端有两种方式,如下图。 至于两者的特点,TypedClient有类型,更容易编写,但文档较少。另外&…

以 RoCE+软件定义存储同时实现信创转型与架构升级

目前,不少企业数据中心使用 FC 交换机和集中式 SAN 存储(以下简称“FC-SAN 架构”),支持核心业务系统、数据库、AI/ML 等高性能业务场景。而在开展 IT 基础架构信创转型时,很多用户受限于国外交换机:FC 交换…

往期精彩推荐

所有的内容都在这个博客中,此博客为推广导航博客,过后会删掉https://blog.csdn.net/weixin_41620184/article/details/135042416 往期精彩:快来学习吧~~~ 机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归PySpark大数据处…

向日葵远程工具安装Mysql的安装与配置

目录 一、向日葵远程工具安装 1.1 简介 1.2 下载地址 二、Mysql 5.7 安装与配置 2.1 简介 2.2 安装 2.3 初始化mysql服务端 2.4 启动mysql服务 2.5 登录mysql 2.6 修改密码 2.7 设置外部访问 三、思维导图 一、向日葵远程工具安装 1.1 简介 向日葵远程控制是一款用…

VS2017 搭建opencv工程

VS2017 搭建opencv工程 opencv在处理图像方面具有很强的能力,在使用opencv之前先需要造好轮子。 1、opencv 官网 ,下载对应的资源文件包。 根据自身选择。下载包之后,解压。分为build和sources source目录下分别存放: modules: …

侯捷C++ 2.0 新特性

关键字 nullptr and std::nullptr_t auto 一致性初始化:Uniform Initialization 11之前,初始化方法包括:小括号、大括号、赋值号,这让人困惑。基于这个原因,给他来个统一,即,任何初始化都能够…

React使用动态标签名称

最近在一项目里(React antd)遇到一个需求,某项基础信息里有个图标配置(图标用的是antd的Icon组件),该项基础信息的图标信息修改后,存于后台数据库,后台数据库里存的是antd Icon组件…