使用ROS实现多机通讯

ROS的通信机制不仅可以在进程间之间通讯,而且可以在不同设备间进行通讯,只需要简单几句语句,即可实现多电脑之间的Topic共享,远程控制等功能。本文指导如何通过绑定IP和主机名实现主从通讯,包括下载包、网络检测、ROS环境配置和小乌龟历程测试。实现双向通讯

一、绑定IP和主机名

要实现多机通信,首先要求主从电脑连接同一个局域网(WIFI),然后分别打开终端查看对应的IP地址和主机名

1.1 获取IP和主机名

终端输入ifconfig即可查看IP地址;hostname查看主机名字。
我使用的主机为ubuntu的虚拟机,从机为nuc13。

img

img

img

1.2 修改hosts文件进行绑定

修改hosts文件的目的是将电脑的IP和主机名绑定,这样两台电脑之间就可以通过hostname找到对方了。如果没有绑定,直接去ping对方主机名是无法解析对方主机名的。分别对两个电脑的/etc/hosts文件,从第三行开始插入对方电脑的ip地址和主机名hostname.

在电脑A中插入以下加粗的指令

127.0.0.1 localhost
127.0.0.1 [hostname_A]
[IP_A] [hostname_A]
[IP_B] [hostname_B]

在电脑B中插入以下加粗的指令

127.0.0.1 localhost
127.0.0.1 [hostname_B]
[IP_B] [hostname_B]
[IP_A] [hostname_A]

1.3 重启网络

sudo /etc/init.d/networking restart

二、开始通讯并检测

2.1检测通讯

<span style="color:#000000"><code class="language-dos">设置完之后,可以简单的通过<span style="color:#0000ff">ping</span>命令测试网络是否联通。<span style="color:#0000ff">ping</span>是用来检测本机与网络中的另一主机之间网络是否联通。
```
主机侧: <span style="color:#0000ff">ping</span> <span style="color:#880000">192</span>.<span style="color:#880000">168</span>.<span style="color:#880000">31</span>.<span style="color:#880000">171</span>  //或者<span style="color:#0000ff">ping</span> isvl-NUC13ANKi7
从机侧: <span style="color:#0000ff">ping</span> <span style="color:#880000">192</span>.<span style="color:#880000">168</span>.<span style="color:#880000">31</span>.<span style="color:#880000">189</span>  //或者<span style="color:#0000ff">ping</span> ubuntu
```
</code></span>

ping成功后会出现以下数据传输结果。双向网络能正常联通,则底层网络通信实现

img

2.2设置ROS_MASTER_URI

在两台电脑中选择其中一台作为主机器人(master),并设置对应的ROS master,在从机上设置ROS_MASTER_URI。

直接在./bashrc配置文件中添加环境变量。
sudo gedit ~/.bashrc

在主机上设置

<span style="color:#000000"><code class="language-bash"><span style="color:#0000ff">export</span> ROS_HOSTNAME=192.169.31.189  <span style="color:#008000"># 主机IP或名称</span>
<span style="color:#0000ff">export</span> ROS_MASTER_URI=http://192.168.31.189:11311 <span style="color:#008000">#主机ip或名称</span>
</code></span>

在从机上设置

<span style="color:#000000"><code class="language-bash"><span style="color:#0000ff">export</span> ROS_HOSTNAME=192.169.31.191  <span style="color:#008000"># 从机IP或名称</span>
<span style="color:#0000ff">export</span> ROS_MASTER_URI=http://192.168.31.189:11311 <span style="color:#008000">#主机ip或名称</span>
</code></span>

source ~/.bashrc

2.3 多机器人通信测试,使用turtlesim小乌龟测试

在主机上运行小乌龟仿真

<span style="color:#000000"><code class="language-undefined">roscore

rosrun turtlesim turtlesim_node
</code></span>

在从机上运行键盘控制器,控制主机的小乌龟运动

<span style="color:#000000"><code class="language-undefined">rosrun turtlesim  turtle_teleop_key
</code></span>

三、结论

ROS中所谓的主从机,并不是只有主机能控制从机,从机不能控制主机。实际上是一个双向通信的过程,只不过是roscore的位置是在主机上运行的。

注意: 如果网络ping通过了,但是数据没有传输,可能原因是电脑防火墙问题。

### ROS 通讯配置方法 在 ROS 框架下,多机通信是一种常见的需求,尤其是在分布式器人系统或节点协作场景中。以下是关于 ROS 多机通信的最佳实践和配置方法。 #### 1. 设置主名解析 为了使不同器之间能够互相识别,需要设置每台计算的主名及其对应的 IP 地址。可以通过编辑 `/etc/hosts` 文件来完成这一操作: ```bash sudo nano /etc/hosts ``` 在文件中添加如下内容(假设两台器分别为 `robot1` 和 `robot2`): ``` <IP_of_robot1> robot1 <IP_of_robot2> robot2 ``` 这样可以确保每一台器都能通过名称访问另一台器[^1]。 #### 2. 配置 ROS_MASTER_URI ROS 使用一个主节点(Master Node)来协调各个节点之间的消息传递。因此,在所有参与通信的器上都需要正确设置 `ROS_MASTER_URI` 环境变量。例如,如果主节点运行在 `robot1` 上,则可以在其他器上执行以下命令: ```bash export ROS_MASTER_URI=http://robot1:<port> ``` 其中 `<port>` 默认为 `11311`,除非另有指定[^4]。 #### 3. 同步时间戳 由于 ROS 基于时间戳同步数据流,所以各设备间的时间一致性非常重要。推荐使用 NTP (Network Time Protocol) 来保持网络中的所有计算单元具有相同的时间标准。安装并启动 ntpd 服务即可实现这一点: ```bash sudo apt-get install ntp sudo service ntp start ``` #### 4. 跨网段通信注意事项 当涉及跨子网或路由器环境下的 ROS 多机通信时,可能需要额外考虑防火墙规则或者 NAT 映射等问题。通常情况下,开放特定端口范围有助于解决这类障碍。对于大数应用而言,默认监听端口区间已经足够覆盖常规用途[^2]。 #### 5. 利用 roslaunch 进行远程部署 roslaunch 工具支持直接定义哪些节点应该在哪一台物理硬件上被执行。这极大地简化了复杂系统的初始化过程。只需在一个 launch 文件里声明目标地址参数即可自动分配任务到相应位置上去工作[^3]。 ```xml <machine name="remote_machine" address="robot2" env-loader="/path/to/env_loader.sh"/> <node pkg="example_pkg" type="talker.py" machine="remote_machine"/> ``` 上述 XML 片段演示了一个简单的例子:它告诉 ROS 将 talker.py 放置到名为 remote_machine 的实体上面去运作。 --- ### 示例代码展示 下面给出一段 Python 编写的简单发布者程序作为参考实例之一: ```python #!/usr/bin/env python import rospy from std_msgs.msg import String def publisher(): pub = rospy.Publisher('chatter', String, queue_size=10) rospy.init_node('multi_com_pub', anonymous=True) rate = rospy.Rate(1) while not rospy.is_shutdown(): hello_str = "Hello Multi-Machine %s" % rospy.get_time() rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep() if __name__ == '__main__': try: publisher() except rospy.ROSInterruptException: pass ``` 同样也可以编写订阅者的对应部分以验证整个链路是否正常建立起来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

meslog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值