ROS分布式部署通信

目录

一、概念

[二、设置 ROS 分布式网络](#二、设置 ROS 分布式网络)

[1. 环境要求](#1. 环境要求)

[2. 主机(Master)设置](#2. 主机(Master)设置)

[3. 从机(节点设备)设置](#3. 从机(节点设备)设置)

[4. 测试是否正常通信](#4. 测试是否正常通信)

三、进阶启动多从机节点(launch)。


一、概念

ROS 分布式通信用于在多台计算机之间共享 ROS 话题(topics)、服务(services)和参数(parameters)。这在机器人系统中非常常见,例如:一台主控电脑(主机) 运行计算任务,多个机器人或设备(从机) 负责执行任务。

ROS 使用 ROS Master(roscore) 作为中央协调节点,所有 ROS 进程(节点) 需要与 Master 通信:ROS Master 运行在一台主机上,其他设备 通过 ROS_MASTER_URI 连接到 Master,节点之间直接 P2P点对点通信(数据流不经过 Master)

适用 **场景:**假设我们有一台PC虚拟机和一台树莓派,它们都运行相同的操作系统,并处于同一局域网中。在这种配置下,我们可以将树莓派连接到小车,利用树莓派来控制小车的运动。由于ROS采用基于节点的通信机制,我们可以将主节点运行在PC虚拟机上,而将树莓派上运行小车底盘控制节点。树莓派的主要职责是控制小车的运动,而其他计算任务和算法则由PC虚拟机上的节点来完成。这样,PC虚拟机作为控制中心,负责协调和处理其他任务,树莓派只需专注于执行小车的控制功能,无需承担其他计算任务。这种方式能够高效地分配任务,确保系统的协同工作,从而实现智能控制。

解决问题:当从机数量增加时,这种分布式架构的优势更加明显。每个从机只需要专注于执行自己的基本任务,例如控制硬件或处理低层任务,而其他复杂的计算任务、算法处理等则由主机来完成。这样,不仅可以减轻从机的负担,还能够将计算密集型的任务集中在主机上,提升整个系统的效率和可扩展性。随着从机数量的增加,主机作为控制中心,能够协调更多的从机,确保系统的高效运行,而不需要为每个从机单独处理算法和计算任务。

当我们使用第三方插件来进行地图建模或视频采集时,如果这些任务都在树莓派上运行,由于树莓派的硬件资源有限,可能会导致性能下降,甚至无法满足某些任务的需求。为了解决这个问题,我们可以采用分布式架构,将这些资源消耗较大的插件迁移到PC端运行,这样可以避免树莓派的性能瓶颈,确保系统的流畅运行。具体来说,树莓派可以专注于进行传感器数据采集和控制任务,而计算密集型的任务,如地图建模和视频处理,可以交给PC端处理,从而提高整个系统的效率,避免因树莓派资源不足导致的性能问题。

二、设置 ROS 分布式网络

1. 环境要求

确保所有计算机:

(1)都在同一局域网内。

(2)可以通过 ping 互相访问

(3)安装相同版本的 ROS(推荐 Ubuntu + ROS Noetic)

2. 主机(Master)设置

选定一台机器作为主机,在主机(假设 IP 为 192.168.1.100)上,使用命令:vi ~/.bashrc,修改文件夹中以下的内容。注意:ROS_MASTER_URI填写的谁的ip,谁就是主机(来运行roscore)。

bash 复制代码
# 指定 ROS Master(roscore 运行的机器)的 IP 地址和端口号(默认 11311)
export ROS_MASTER_URI=http://192.168.1.100:11311  
# 指定当前设备的 IP 地址,让其他设备可以找到它
export ROS_IP=192.168.1.100    
# 设置当前设备的主机名(可选,通常与 ROS_IP 相同)                
export ROS_HOSTNAME=192.168.1.100               

使用命令:source ~/.bashrc刷新,然后在主机上启动 roscore

3. 从机(节点设备)设置

在从机(假设 IP 为 192.168.1.101)上,使用命令:vi ~/.bashrc修改文件夹中以下的内容。

bash 复制代码
export ROS_MASTER_URI=http://192.168.1.100:11311 #主机的ip地址
export ROS_IP=192.168.1.101  #自身的ip地址
export ROS_HOSTNAME=192.168.1.101 #自定义

使用命令:source ~/.bashrc刷新,然后使用命令rostopic list进行测试连接,如果能看到 roscore 发布的 /rosout 话题,说明连接成功。

4. 测试是否正常通信

**注意:**这里使用话题来测试通信,无论是主机发布话题还是从机发布话题都是可以的,这里我们使用主机来发布话题。

在主机上运行roscore后,在 主机(192.168.1.100)上运行:

cpp 复制代码
rostopic pub /test_topic std_msgs/String "Hello from Master" -r 1
/*
rostopic pub ------ 发布(publish)一个 ROS 话题。
/test_topic ------ 话题名称,这里是 /test_topic,可以自定义。
std_msgs/String ------ 消息类型,这里是 std_msgs 包中的 String 类型(即字符串消息)。
"Hello from Master" ------ 要发布的消息内容,这里是 "Hello from Master"。
-r 1 ------ 设置发布频率,-r 1 表示每秒发布 1 次消息。

*/

从机(192.168.1.101)上运行:

cpp 复制代码
rostopic echo /test_topic

如果从机能收到 "Hello from Master",说明分布式通信成功!

三、进阶启动多从机节点(launch)。

适用场景 :多个机器人在不同的物理或虚拟环境中协作完成任务。每个机器人可能有不同的传感器、执行器,并需要与其他机器人共享信息。在这种场景中,你可以使用 launch 文件来配置每个机器人的节点和它们在不同机器上的位置,确保每个机器人能够通过 ROS_MASTER_URI 连接到同一个 ROS Master,实现跨机器的节点通信。注意 :确保从机已经被登录或者为SSH 免密登录,否则 roslaunch 不能远程启动。

(1)选定一台机器作为 Master (比如 192.168.1.100),在主机上编写launch文件,如下所示,在主机上运行roscore。

XML 复制代码
<launch>
    <!-- 定义两个机器人,每个机器人通过其地址连接 -->
    <machine name="robot1" address="192.168.1.101" env-loader="/home/user/.bashrc"/>
    <machine name="robot2" address="192.168.1.102" env-loader="/home/user/.bashrc"/>
    
    <!-- 在 robot1 上运行节点 -->
    <node machine="robot1" pkg="my_package" type="robot_node" name="robot1_node"/>
    
    <!-- 在 robot2 上运行节点 -->
    <node machine="robot2" pkg="my_package" type="robot_node" name="robot2_node"/>
</launch>


<!-- 
name="robot1" 和 name="robot2" ------ 定义两台远程机器人,分别命名为 robot1 和 robot2。
address="192.168.1.101" 和 address="192.168.1.102" ------ 指定 IP 地址,表明 robot1 运行在 192.168.1.101,robot2 运行在 192.168.1.102。
env-loader="/home/user/.bashrc" ------ 加载环境变量,ROS 需要依赖 ~/.bashrc 里的 ROS_MASTER_URI 和 ROS_IP 等环境变量,确保远程机器能正确找到 ROS Master。

<node> 表示在 ROS 中启动一个 节点。
machine="robot1" 和 machine="robot2" ------ 指定在哪台机器上运行该节点。
pkg="my_package" ------ ROS 包名,表示这个节点属于 my_package 包。
type="robot_node" ------ 可执行文件名,即 my_package 包中的 robot_node 这个可执行程序。
name="robot1_node" 和 name="robot2_node" ------ 指定 ROS 节点名称
-->

(2)确保 Master 机器的 .bashrc 里有正确的环境变量。

bash 复制代码
export ROS_MASTER_URI=http://192.168.1.100:11311
export ROS_IP=192.168.1.100

(3)在远程机器 (robot1robot2) 上配置环境变量.bashrc

robot1(192.168.1.101):

bash 复制代码
export ROS_MASTER_URI=http://192.168.1.100:11311
export ROS_IP=192.168.1.101  # robot1 的 IP

robot2(192.168.1.102):

bash 复制代码
export ROS_MASTER_URI=http://192.168.1.100:11311
export ROS_IP=192.168.1.102  # robot2 的 IP

(4)在 Master 机器上运行 launch 文件。

bash 复制代码
cd ~/catkin_ws
source devel/setup.bash
roslaunch my_package my_launch_file.launch

(5)查看是否成功。

robot1robot2 上分别运行rosnode list命令,检查节点是否正确启动,出现下面节点,说明节点已成功运行!

相关推荐
Y_3_731 分钟前
RabbitMQ应用问题大全(精心整理版)
分布式·spring·microsoft·rabbitmq
码农幻想梦2 小时前
19723分布式队列
分布式
littleschemer3 小时前
聊天服务器分布式改造
分布式·spring cloud·qq·聊天室
Hard_pea3 小时前
Spark 深入解析
大数据·分布式·spark
站在墙头上4 小时前
Kafka的各个组件说明
分布式·kafka
清云逸仙4 小时前
RabbitMQ专项
分布式·rabbitmq
serendipity_hky4 小时前
【RabbitMQ | 第1篇】Erlang 和 RabbitMQ 的下载安装
分布式·rabbitmq·erlang
TiDB_PingCAP12 小时前
海量数据融合互通丨TiDB 在安徽省住房公积金监管服务平台的应用实践
分布式·tidb·htap
程序员的世界你不懂13 小时前
Kafka 推送消息,移动端自动化测试,数据驱动测试
分布式·kafka·linq
Demons_kirit17 小时前
Dubbo+Zookeeper
分布式·zookeeper·dubbo