ROS 下的多机协作--主从节点通信
1. 介绍
现如今,随工业智能化水平提高,单机器人已难以满足大规模任务的需要,因此多机协同控制方法应运而生,并逐渐应用于无人车、无人机的集群以及物流配送等诸多领域。
要想实现多机协同控制,首要任务是实现多机通信,而ROS操作系统为我们提供了多机通信的优良环境,使得我们可以在分布式的ROS节点间进行通信。下面引入ROS通信的相关基础知识:
1.1 ROS节点:可以分布于多个相同或不同的主机中
1.2 ROS通信机制:1. 话题; 2. 服务; 3. action等进阶方式。
下图直观展示了话题topic、发布Publisher、订阅Subscriber和话题消息message:
1.3 节点管理器 ROS Master:在ROS1中一台机器作为ROS Master,即以中心化方式管理分布式节点之间的通信。
1.4 方案一:机器人之间组网,在局域网下实现信息交互、相互感知、相互控制
- 硬件系统:以路由器为中心节点的星形网络,数据通过路由器做IP地址转发,使得主从机在同一个局域网下。
- 软件系统:ROS Master是整个分布式ROS节点中心,作为其他节点通信桥梁。
下面进行主从机配置,使得主从机节点相互通信。
2. 主从机配置
2.1 添加IP地址
首先确保主从机处于同一局域网。
使用ifconfig
指令查看主机和从机的 ip 地址,使用hostname
指令查看主机和从机名
下面以我的ROS机器为例:
主机名:wheeltec 主机IP:192.168.0.100
从机名:rikibot 从机IP:192.168.0.187
在/etc/hosts
文件中,主机加入从机IP和从机名;从机加入主机IP和主机名。
至此,主从机IP添加完毕,可以相互ping
通。
2.2 设置 ROS Master
由于ROS1中只能一台机器作为ROS Master,因此,我们要设置所有从机的ROS_MASTER_URI,在.bashrc
文件中,修改如下:
至此,主从机在局域网内的通信配置完毕。
3. 测试主从机分布式节点通信
我们首先启动主机wheeltec,输入命令:
roslaunch turn_on_wheeltec_robot turn_on_wheeltec_robot.launch
从而开启ROS Master,管理节点之间的话题通信。
打开rqt_graph
,可以看到主机节点话题图:
再启动从机rikibot,输入命令:
roslaunch turn_on_wheeltec_robot bringup.launch
打开rqt_graph
,可以看到主从机节点已经建立了话题通信:
下面这张图展示了两台机器分别启动的单机节点图,以及建立多机通信之后的节点网络,主从机各自的节点、话题已用不同颜色+序号分开:
至此,主从机便可以相互订阅和发布话题,从而进行通信啦!
上一篇: 容器环境中的持续集成最佳实践:基于 Drone + GitFlow + K8s 构建云原生语义 CI 工作流
下一篇: 搭载凯虹操作系统的工业平板电脑、机器人、无人机等产品通过了 3.2 版本的兼容性评估,继续繁荣 OpenHarmony 生态系统。
推荐阅读
-
ROS 下的多机协作--主从节点通信
-
趣谈留言队列,搞清楚留言队列到底是什么!-说到消息队列,洪觉大概能猜到人们听到消息队列的反应,大致可以分为以下几类人。 第一类人,懵懵懂懂,刚上大学接触编程,还没用过消息队列,甚至还以为消息队列就是代码里面要新建一个List之类的;第二类人,听过消息队列,了解消息队列,但具体是什么还不是太明白,只知道一说到消息队列,脑海里马上出现了三组词,削峰、异步、解耦;第三类人,用过消息队列,对它有一定了解,但不知道为什么要这样设计,消息队列有什么样的前世今生,是如何演化到现在的模式的?**第四类人,已经对消息队列有了足够的了解,可以阅读本帖作为复习和温习。**你属于哪一类?无论你对消息队列了解多少,读完这篇文章后,我相信你都会有所收获。 什么是消息队列?我们为什么要使用消息队列?真的只是因为它看起来很勉强、很常用吗?当然不是,一项技术的出现往往是为了解决某种痛点,我们就从这个痛点出发,看看消息队列到底是为了解决什么问题而诞生的。 相信大家在工作之前,或者工作中接触单片机的次数会多一点,不管什么业务都一股脑塞进一个系统里,这种情况下接触消息队列的场景会比较少。但随着业务的增长,量上去了,单机系统就很难维护了,也扛不住并发量的增长,就需要把原来的单体应用拆分成多个服务。例如,牛奇网采用分布式架构,将原来的单体系统拆分成用户服务、题库服务、求职服务、论坛服务等,每个分布式节点都有一个集群,保证高可用性。 那虽然在这样的微服务架构下,如果某个核心业务并发量过大,系统就扛不住了。比如淘宝、淘票票、拼多多、京东等电商场景中的支付场景,你在某宝下单并支付后,调用支付服务,完成支付后,还需要更新订单的状态,这个时候就需要调用订单服务,那我们平时也下单,除了简单完成这些操作外,还会给你相应的积分;商家也会收到订单消息,并给您发送旺旺消息,确认订单无误;同时,也会给您发送消息,确认订单无误。确认订单无误;同时您还可以查看您的物流状态;还有系统为了给您推荐更适合您的商品,会根据您的订单做类似的推荐等等,我说的这些都是当我们下单后,肉眼可以感知到系统所做的动作。 **一个支付动作如果还需要调用那么多服务,等他们响应成功,最后再告诉用户你支付成功了,用户在系统中的整个体验会非常糟糕。**设想一下,假设请求服务+处理请求+响应总共需要 50ms,我们上面列出的场景:支付服务、订单服务、积分服务、商家服务、物流服务、推荐服务,总共需要 300ms。