ROS1的通信,有一个中心节点master负责管理节点的注册,消息的订阅与发布。Node1发布消息到Topic下,Node2从Topic下订阅并接收消息,中心节点Master就负责管理消息从哪里发布过来,要订阅到哪里去。
ROS2的分布式通信机制相比于ROS1的通信,最大特点在于master中心节点的去除。因为存在中心节点的系统,中心节点一旦崩溃整个系统也就崩盘了。去掉中心节点后,依然是基于topic的发布订阅模式,但是所有的Node都属于同一级别,可以实现多对多的通信(通信的节点既可以处于同一台设备,也可以处于不同设备上,但这两台设备需要处于同一个局域网内,有相同的域ID,默认域ID为0,处于同一域ID内的节点才可以相互通信)。
本文是对基于ROS2实现消息传输与图片传输的工程包解读(版本:ROS2 Eloquent,实验验证在一块jetson板子上不同节点之间可正常通信,在同一pc下的不同虚拟机之间可以通信,在两块jetson板子上的不同ros2版本之间也能正常通信)。
代码链接:CrowdHMT / ros2_transport · GitLab
1.消息传输
参考自:https://docs.ros.org/en/eloquent/Tutorials/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html
创建包的过程可以跟随官网教程一步步来,有助于加深对ROS的工作空间workspace的结构理解,代码很简单,也可以自己敲一遍,加深对代码的理解。
所做的事情就是创建一个发布者节点,将文本消息“Hello World”和一个计数器数字发布到了主题“topic”下(计数器每发布一次加一);创建一个订阅者节点,接收到文本消息以及数字。
# Terminal1:
ros2 run message_transport talker
# Terminal2:
ros2 run message_transport listener
结果如下:
2.图片传输
参考自:https://github.com/ros-perception/image_transport_tutorials
image_publisher.cpp创建发布者节点“image_publisher”,调用opencv读取图片,并使用cv_bridge将图片格式转为ROS可传输的消息格式,将消息发布到主题“/camera/image”下;
image_subscriber.cpp创建订阅者节点“image_subscriber”,从主题“/camera/image”下接收消息,并使用cv_image将图片从ROS的消息格式还原为原来的格式,并使用opencv保存下来(保存到当前终端所在的目录下,命名为saved.jpg)。
colcon build之前注意CMakeLists中的一下信息,与ROS2版本相关,要根据自己的ROS2版本修改。
运行:
# Terminal1:
ros2 run image_trans image_publisher /path_to_your_image/
# Terminal2:
ros2 run image_trans image_subscriber
结果如下:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!