最近工作中需要用到多机通讯,这里稍微总结一下使用方法。
目录
一、网络配置
二、修改两个设备的hosts文件
三、修改两个ros设备的.bashrc
四、launch文件中给节点设定运行的设备
一、网络配置
首先确保两个ros设备连接到同一局域网下,然后查询两个设备的在这个局域网内的IP地址,运行:
ifconfig
这里举个例子,主机的IP地址为192.168.1.127,从机的IP地址为192.168.1.126;之后可测试一下能否互相ping通,成功后进行下一步。
二、修改两个设备的hosts文件
这里需要在主机和从机的hosts文件中分别添加对方的IP和用户名。
- 主机端
192.168.1.126 ros_cv
- 从机端
192.168.1.127 camar
三、修改两个ros设备的.bashrc
在ros的使用中.bashrc是一个比较常见的配置文件,主要是修改终端的配置。这里我们需要对两设备的.bashrc进行修改。
- 主机端
export ROS_MASTER_URI=http://192.168.1.127:11311
export ROS_HOSTNAME="192.168.1.127"
- 从机端
export ROS_MASTER_URI=http://192.168.1.127:11311
export ROS_HOSTNAME="192.168.1.126"
这个设置使得两个设备的 ROS_MASTER_URI统一为主机上的地址,从而让从机可以和主机的roscore通讯。
但是需要注意这样从机的roscore就不能运行了,如需运行,把这两行注释掉即可。
完成上述设置后,双端的topic和节点就可以互相交流了,可以用小海龟简单试一下。
一遍成功的ROS主从机详细配置_一遍成功ros-CSDN博客
四、launch文件启动两个设备上的节点
首先需要配置ssh密钥使主机能够用ssh远程访问从机,因为ros是通过ssh访问其他设备启动节点的。这个方法可以参考以下链接
如何在 Ubuntu 20.04 上设置 SSH 密钥_ubuntu ssh key-CSDN博客
过去几天了我记不清了,应该是只要在主机上运行
ssh-keygen
生成密钥,然后同样在主机上运行
ssh-copy-id username@remote_host
username@remote_host是从机的用户名和ip地址,这样似乎就完成了(似乎)。
然后即可用launch一次启动包含在两个设备上的节点,可以参考以下launch语法。
<!-- 远程ros_cv机器上的 node -->
<machine name="cv_server" address="192.168.1.126" user="ros_cv" env-loader="/home/ros_cv/ros_remote_env.sh" />
<!-- rgb-yolo节点 -->
<node machine="cv_server" pkg="visual_tools" type="drone_check_yolo_d435i.py" name="drone_check_yolo" output="screen" required="true" />
如上所示,首先在launch中添加一个词条<machine>,address设定为从机的IP地址,user设定为从机的用户名,也有一些大佬通过添加password词条使得ssh不需要进行密钥的配置(但是我没测试成功)。
在roslaunch中启动远程节点的方法_ros脚本启动远程节点-CSDN博客
对于env-loader这个词条,则需要在从机上添加一个.sh文件:
#!/bin/bash
export ROSLAUNCH_SSH_UNKNOWN=1
export ROS_MASTER_URI=http://192.268.1.127:11311
source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
export ROS_HOSTNAME=192.168.1.126
exec "$@"
其中ROS_MASTER_URI和ROS_HOSTNAME分别包括主机和从机的IP地址,和第三部分一致。
然后再node的词条中添加一个machine=“machine name”的词条就大功告成了。