假如机器人主机robot跑的是ros系统,笔记上也是ros系统,当调试时就需要从笔记上查看主机的topic或其他信息的时候,或者发布指令,这时就需要使用ros的多机通信功能。
主要步骤如下:
1. 查看和记下robot和笔记本的ip
2.编辑bashrc文件
1. robot作为主机,笔记本为从机,两台设备连接至同一局域网,网段要一样。查看ip地址
ifconfig
如果报错'ifconfig' not found... ...",表示没有安装工具,安装一下
sudo apt install net-tools
笔记本端,使用的是无线,查看wlan0这一段,记下inet字段后面的地址为:10.60.72.251
robot端,假如使用的是网线,查看eno1这一段,记下inet字段后面的地址为:10.60.2.158
在robot端:
打开bashrc文件,gedit ~/.bashrc,在末尾加上如下内容
export ROS_MASTER_URI=http://10.60.2.158:11311
export ROS_IP=10.60.2.158
或者使用localhost代替ip,二选一即可
export ROS_MASTER_URI=http://localhost:11311
export ROS_IP=10.60.2.158
在笔记本端:
export ROS_MASTER_URI=http://10.60.2.158:11311
export ROS_IP=10.60.72.251
总结:就是要将两台设备的ROS_MASTER_URI变量都设置为主机的ip,必须要相同。ROS_IP变量都设置为本机的ip。实现笔记本和robot间的通信。
测试
robot端:
roscore
rosrun turtlesim turtlesim_node
是可以正常启动roscore的
笔记本端:
source ~/.bashrc
rostopic list
即可以看到robot端发布的topic,从笔记本端发布指令,循环发送,10Hz指令,到类型为 geometry_msgs/Twist的,主题/turtle1/cmd_vel上,在robot端可以看到小乌龟在倒着移动。
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: -1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
运行:
在本地端打开新的乌龟仿真器,由于是运行的是名字相同的节点,查看robot主机端,发现robot端的小乌龟已经终止了。
rosrun turtlesim turtlesim_node
笔记本端运行
roscore
提示错误,roscore cannot run as another roscore/master is already running,笔记本端已经无法启动roscore了。
要想恢复原来的设置
只需要在两端的bashrc文件中的那两行删除,或者在前面加#号注释掉就可以了。
ROS多机通信机制
我们简单梳理一下,在消息通信时,什么时候会用到ROS_MASTER_URI和ROS_IP这两个环境变量。
-
Talker启动,通过ROS_MASTER_URI连接到ROS Master,注册发布者的信息,包含所要发布的话题名称(bar)和消息类型;ROS Master会将该发布者的注册信息存储到发布者注册列表中,等待接收者。
-
Listener启动,通过ROS_MASTER_URI连接到ROS Master,将其订阅的话题名bar和消息类型在ROS Master上注册(实际上也包括自己的地址和端口信息)。
-
ROS Master根据Listener所需的订阅话题在发布者注册列表寻找与之匹配的话题,并返回Talker的XML-RPC地址信息,即foo:1234。Listener根据alker的XML-RPC地址向Talker请求TCP的连接地址,Talker的地址就是图中所示的foo:2345。其中foo就是在执行talker时的环境变量ROS_IP的。
因此,如果需要正确接收到Talker发布的消息,必须在Talker和Listener上都正确设置ROS_MASTER_URI,同时必须正确设置Talker的ROS_IP,一般情况下,都是双向互通,所以listener的ROS_IP也要正确设置。