多台计算机中的ROS通信

ROS 教程之 network:多台计算机之间网络通信(1)点击打开链接

ROS 教程之 network:多台计算机之间网络通信(2)点击打开链接

ROS中多机通信主从机最简单的配置方法-树莓派 to PC点击打开链接

ROS 多台电脑间进行通信(小萌是个球)点击打开链接

在我看来,ROS最牛逼的地方就是它的通信机制了,不仅仅是进程间通信方便,就连不同设备间通信也很方便,只需添加几行代码,你就可以实现多电脑间的 Topi c共享, 远程控制等功能。下面就让我们一起来实现吧!

这里假设我们有两个电脑:电脑 A 为主机端,电脑 B 为控制端。最终要实现在 A 电脑上运行roscore,并且运行 Turtlesim 程序,然后在 B 电脑上运行键盘控制程序,控制 Turtlesim 小乌龟移动。

1. 查看电脑A和电脑B的 IP 和 Hostname

查看IP,在控制台输入:

ifconfig

2. 修改hosts文件内容

使用如下指令,分别在电脑A和电脑B的打开 hosts 文件:

sudo gedit /etc/hosts

电脑A端的 hosts文件 中添加如下加粗指令:

127.0.0.1       localhost
127.0.1.1         [ hostname_A ]

[IP_A]            [ hostname_A ]
[IP_B]            [ hostname_B ]

***

 

同理,在电脑B端的 hosts 文件中,加入如下加粗指令:

127.0.0.1       localhost
127.0.1.1         [ hostname_B ]

[IP_B]            [ hostname_B ]
[IP_A]            [ hostname_A ]

***

3. 修改 .bashrc 文件

使用如下指令,分别在电脑A和电脑B的打开 .bashrc 文件

sudo gedit ~/.bashrc

电脑A端电脑B端打开的 .bashrc 文件的最后一行,加入如下代码:

export ROS_MASTER_URI=http://[hostname_A]:11311

[注意] 此处假设电脑A为主机,如果改成电脑B为主机,则只需要将此步中的 [hostname_A] 改成 [hostname_B] 即可。

4. 运行小乌龟程序

电脑A端:

首先启动 ROS:
$ roscore

然后 Ctrl + T 打开新的控制台,运行:
$ rosrun turtlesim turtlesim_node

电脑B端:

rosrun turtlesim turtle_teleop_key

现在,你就可以用电脑 B 控制电脑 A 中的小乌龟尽情遨游啦! ~\(≧▽≦)/~啦啦啦

 

有时候出现如下错误:

couldn't find an AF_INET address for``````

解决办法     参考链接

vim ~/.bashrc

在最后添加

export ROS_HOSTNAME=你的hostname
export ROS_MASTER_URI=http://(你想要设置为主机的IP):11311
export ROS_IP=192.168.3.10 (本机的IP)

 

**********

注意,在这里的ROS_MASTER_URI要设置为你想要当作主机的IP,主机从机这里要设置为一致的IP,另外最好加上ROS_IP.

 

 

 

解决的方式很耐人寻味 

在工作站端

hostname -I    输出>>192.168.0.109

export ROS_IP=192.168.0.109 

然后就不会再报错了,为了避免每次打开terminal都要重复上面两句,可以在环境变量~/.bashrc加入

export ROS_IP=`hostname -I`
加上 export ROS_IP=`hostname -I` 可以解决问题

 

 

### 配置和实现两台主机之间基于ROS2通信 #### 网络配置 确保两台计算机位于同一网络内并能相互访问。这可以通过检查双方IP地址以及尝试ping命令验证连通性来完成。 #### ROS 2环境准备 确认ROS 2已经成功部署于每一台目标设备之上,包括但不限于安装必要的依赖库、源码编译或是二进制包形式的安装方式[^1]。 #### 设置`ROS_DOMAIN_ID` 对于参与分布式计算场景下的节点而言,在每台机器上合理设定`ROS_DOMAIN_ID`环境变量至关重要;此操作有助于区分不同的DDS域从而避免冲突。具体做法是在终端执行如下指令: ```bash export ROS_DOMAIN_ID=<your_domain_id> ``` 其中 `<your_domain_id>` 是一个介于0至232间的整数值。 #### 启动Talker与Listener节点 - **主机A**:负责发送消息的角色,即启动talker程序; ```python import rclpy from std_msgs.msg import String def main(args=None): rclpy.init(args=args) node = rclpy.create_node('minimal_publisher') publisher = node.create_publisher(String, 'topic', 10) msg = String() i = 0 while True: msg.data = f'Hello World: {i}' i += 1 node.get_logger().info(f'Sending message: "{msg.data}"') publisher.publish(msg) time.sleep(1) if __name__ == '__main__': main() ``` - **主机B**:作为接收方监听来自其他节点的消息,也就是listener部分; ```python import rclpy from std_msgs.msg import String def callback(message): print(f'Received message: "{message.data}"') def main(args=None): rclpy.init(args=args) node = rclpy.create_node('minimal_subscriber') subscription = node.create_subscription( String, 'topic', callback, 10) try: rclpy.spin(node) finally: node.destroy_node() if __name__ == '__main__': main() ``` 上述代码片段展示了如何创建一对简单的发布者/订阅者应用实例以测试跨主机间的信息交换功能。 #### Docker容器化方案(可选) 当涉及到更复杂的生产环境中时,采用Docker镜像打包应用程序不失为一种有效手段。此时需注意调整宿主机上的路由规则以便让不同物理位置处运行着各自独立容器集群得以顺利交互数据流。针对此类情况的具体实践方法已在参考资料中有提及[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值