简单的ROS跨设备控制

RRRROS


​ ROS常用的进程通信机制是消息传递,是基于各个node与master的XML-RPC实现,并且可能用到TCP/UDP等传输层协议,非常地网络。这样看来,ROS进行跨设备通信应该是比较简单的。本篇主要记录一个简单的ROS跨设备应用场景,并简介其中的原理。


使用ROS跨设备rviz可视化

​ 你有一个工控设备,在一个轻量级机器人上。机器人没办法给你举着一个屏幕,方便你控制他的方式只有ssh。这时候,你打开了机器人身上的一个激光雷达,但突然记起来,自己没办法可视化机器人看到的东西,怎么办呢?当然,你大可以像我一样显得蛋疼去写一个用终端可视化点云的工具...,就像这样 Github: Enigmatisms/tviz

Figure 1. 闲得蛋疼

​ 反正写完我也没用过,还是上正经方法吧。首先,如果要跨设备使用ROS,两个设备必须能够互相访问,比如:在同一个网段下。可能出现单向能ping通的情况(比如墙,或者无内网穿透)。互相可以ping通应该就没有问题。

​ 从这里开始,我设定如下的应用场景:

  • 主机A,是用于可视化的设备,运行rviz
  • 从机B,是机器人(或者相应工控设备),直接连接了传感器但是不方便显示

​ 首先,在主机A上ssh到从机B。并且修改从机/etc/hosts,首先查看A,B设备的ip,设为a,b:

1
2
ifconfig
sudo vim /etc/hosts

​ 给主机以及从机命名(随便叫),比如我叫主机 master,从机slave,/etc/hosts中就填写并保存,相应地,主机的/etc/hosts也这么修改

1
2
192.168.xx.a master
192.168.xx.b slave

​ 修改完之后,从机需要修改ROS定义的两个环境变量:

1
2
export ROS_HOSTNAME=slave
export ROS_MASTER_URI=http://msater:11311

​ 注意,从机的host name还是自己的name,但是master URI则是:主机ip + 端口(一般都是11311)。这里实际上是:ROS的master以及node都看ip进行通信,只有一个唯一的master(确实可以开多个roscore,但是消息不是共享的),master URI就确定了master所在的网络位置。如果不export修改ROS Master URI,一般来说:

1
echo $ROS_MASTER_URI			# 输出都是 http://localhost:11311

​ 修改ROS master URI就是告诉本机,master(roscore)在位于master URI的机器上。

​ 已经说了,按照同样的方法修改主机/etc/hosts,之后需要修改主机环境变量:

1
2
export ROS_HOSTNAME=master
export ROS_MASTER_URI=http://master:11311

注意这里,master URI就是主机自己的ip。之后,主机开roscore &(一定要在主机上开,因为这是设定嘛,master URI都说了roscore在这里),再打开rviz,配置好。从机只需要能够输出ros消息即可,在主机上用rostopic list就能看到消息了。

  • P.S:2D激光雷达数据传输完全没问题,就算是帧率高,点数多,也不会有太大延迟,但是图像消息就不一样了。如果需要跨设备图传,不要使用原始的sensor_msgs/Image消息,会非常慢,ppt级传输。可以使用sensor_msgs/CompressedImage,亲测很快。但是这取决于你想看流畅高刷还是高清无码,不过个人觉得,compressed image消息并没有使得画面质量有太多的下降。