ros的分布式结构允许运行在不同物理机器上的节点进行通信,在roslaunch中通过配置machine字段可以实现对这些分布在不同物理机上的节点的统一管理。
下面举例说明,假设需要在名为server的机器上运行usb_cam节点,在名为tx2的机器人上运行另一个usb_cam节点,并在server机器上的roslaunch中统一进行管理。
首先,配置hosts。
在server上,编辑/etc/hosts文件,添加
【tx2 IP地址】 【tx2 计算机名】
其中计算机名就是linux命令行”@“符号后的部分。
相似的,在tx2上,编辑/etc/hosts文件,添加
【server IP地址】 【server 计算机名】
在tx2上新建一个描述环境变量的sh脚本/xxx/env.sh,填入如下内容:
#!/bin/bash
export ROSLAUNCH_SSH_UNKNOWN=1
export ROS_MASTER_URI=http://【server 计算机名】:11311
source /opt/ros/melodic/setup.bash
source ~/catkin_ws/devel/setup.bash
export ROS_HOSTNAME=【tx2 计算机名】
exec "$@"
在server上编写如下lauchfile:
<launch>
<machine name="tx2" user="tx2用户名" password="tx2密码" address="tx2计算机名" env-loader="/xxx/env.sh"/>
<group ns="server">
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen">
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
<param name="framerate " value="10"/>
</node>
</group>
<group ns="tx2">
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" machine="tx2" >
<param name="video_device" value="/dev/video1" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
<param name="framerate " value="10"/>
</node>
</group>
</launch>
其中machine字段指定了远程机器tx2,随后的节点中使用 machine="tx2"指定节点运行在该机器上。
roslaunch底层是通过ssh操作这些远程机器的,故下面对ssh进行一些配置。
按下面方法配置known_hosts,否则报错,原因详见此处。
- 删去~/.ssh/known_hosts
- 执行下述命令将tx2机器加到known_hosts:
ssh -oHostKeyAlgorithms='ssh-rsa' 【tx2用户名】@【tx2计算机名】
至此,两台机器均已配置完毕,在server机器上运行刚才编写的launch文件进行测试:
可见,roslaunch自动通过ssh开启了tx2机器的节点,实现了对分布在不同物理机上的节点的统一管理。