ROS采用分布式框架将节点通过松散耦合方式结合起来。节点可分布在不同平台上,通过话题和服务进行通信。对于多个平台,ROS只能存在一个ROS Master(即ROS主机),但可存在多个从机。ROS从机可通过局域网不同IP地址SSH方式与主机取得联系。
前提准备
- ROS主机:虚拟机Vmware(Ubuntu版本: 16.04 ROS版本: kinect)
- ROS从机:树莓派3B(Ubuntu版本: 16.04 ROS版本: kinect)
虚拟机VMware固定IP地址
电脑网卡信息可从右键计算机或此电脑
→ 管理
里查看。
打开Vmware左上角工具栏 编辑
→ 虚拟网络编辑器
→ 更改设置
→ 选择电脑网卡
Ubuntu首页编辑虚拟机设置
→ 网络适配器
→ 桥接模式
安装SSH
分别在ROS主机和ROS从机安装SSH,并设置开机自启。
SSH安装
$ sudo apt-get install openssh-server
SSH启动
$ service ssh start
设置SSH开机自启
$ update-rc.d ssh enable
设置IP地址和主机名
查看IP地址和主机名
$ ifconfig 查看IP地址
$ hostname 查看主机名
查看IP地址和主机名
可以看到:
- IP地址:
192.168.1.114
- 主机名:
ubuntu
查看IP地址和主机名
可以看到:
- IP地址:
192.168.1.138
- 主机名:
pi-3b
添加对方 IP地址和主机名
- 分别在/etc/hosts文件中添加对方 IP地址和主机名:
$ sudo gedit /etc/hosts
或
$ sudo vim /etc/hosts
添加对方 IP地址和主机名
1 |
|
添加对方 IP地址和主机名
1 |
|
- ping 一下对方,测试网络是否连通:
可以看出,双向网络畅通,说明底层网络通信没有问题。
使用SSH连接
设置 ROS URI
ROS中只存在一个MASTER,可以使用终端命令将设置加入配置文件~/.bashrc
中。
设置 ROS URI
$ echo "export ROS_HOSTNAME=ubuntu" >> ~/.bashrc
$ echo "export ROS_MASTER_URI=http://ubuntu:11311" >> ~/.bashrc
$ source ~/.bashrc
设置 ROS URI
$ echo "export ROS_HOSTNAME=pi-3b" >> ~/.bashrc
$ echo "export ROS_MASTER_URI=http://ubuntu:11311" >> ~/.bashrc
$ source ~/.bashrc
测试
设置时间同步
在ROS网络中,坐标变换和消息类型都标上了消息戳,因此多机通信时间同步往往很关键。对此将ROS主机和从机都跟互联网服务器上时钟保持一致即可实现数据同步。ROS主机和从机都安装chrony即可。
$ sudo apt-get install chrony
安装 turtlesim 功能包
以乌龟例程为例,测试ROS主机和从机之间是否实现多机通信。
$ sudo apt-get install ros-kinetic-turtlesim
PC电脑:
$ roscore
$ rosrun turtlesim turtlesim_node
树莓派3B:
查看话题:
$ rostopic list
发布Twist命令:
发布Twist命令一次,控制乌龟行走:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2,0,0]' '[0,0,1.8]'
循环发布Twist命令,控制乌龟行走:
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
测试一下:
当然也可以通过按键控制控制乌龟行走:
$ rosrun turtlesim turtle_teleop_key
至此,ROS多机通信配置完成。ROS主机运行乌龟节点turtlesim_node
,从机上也能看到发布的话题以及通过命令控制主机上的乌龟行走。