简单的ROS跨设备控制
RRRROS
ROS常用的进程通信机制是消息传递,是基于各个node与master的XML-RPC实现,并且可能用到TCP/UDP等传输层协议,非常地网络。这样看来,ROS进行跨设备通信应该是比较简单的。本篇主要记录一个简单的ROS跨设备应用场景,并简介其中的原理。
使用ROS跨设备rviz可视化
你有一个工控设备,在一个轻量级机器人上。机器人没办法给你举着一个屏幕,方便你控制他的方式只有ssh。这时候,你打开了机器人身上的一个激光雷达,但突然记起来,自己没办法可视化机器人看到的东西,怎么办呢?当然,你大可以像我一样显得蛋疼去写一个用终端可视化点云的工具...,就像这样 Github: Enigmatisms/tviz:
反正写完我也没用过,还是上正经方法吧。首先,如果要跨设备使用ROS,两个设备必须能够互相访问,比如:在同一个网段下。可能出现单向能ping通的情况(比如墙,或者无内网穿透)。互相可以ping通应该就没有问题。
从这里开始,我设定如下的应用场景:
- 主机A,是用于可视化的设备,运行rviz
- 从机B,是机器人(或者相应工控设备),直接连接了传感器但是不方便显示
首先,在主机A上ssh到从机B。并且修改从机/etc/hosts
,首先查看A,B设备的ip,设为a,b:
1 | ifconfig |
给主机以及从机命名(随便叫),比如我叫主机
master,从机slave,/etc/hosts
中就填写并保存,相应地,主机的/etc/hosts
也这么修改
1 | 192.168.xx.a master |
修改完之后,从机需要修改ROS定义的两个环境变量:
1 | export ROS_HOSTNAME=slave |
注意,从机的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 | export ROS_HOSTNAME=master |
注意这里,master
URI就是主机自己的ip。之后,主机开roscore &
(一定要在主机上开,因为这是设定嘛,master
URI都说了roscore在这里),再打开rviz,配置好。从机只需要能够输出ros消息即可,在主机上用rostopic list
就能看到消息了。
- P.S:2D激光雷达数据传输完全没问题,就算是帧率高,点数多,也不会有太大延迟,但是图像消息就不一样了。如果需要跨设备图传,不要使用原始的
sensor_msgs/Image
消息,会非常慢,ppt级传输。可以使用sensor_msgs/CompressedImage
,亲测很快。但是这取决于你想看流畅高刷还是高清无码,不过个人觉得,compressed image消息并没有使得画面质量有太多的下降。