基于ros2的消息传输和图片传输

ROS2的分布式通信机制相比于ROS1的中心式通信机制,更易应用于多机通信,比较适合群智背景下的协作任务。

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

结果如下:

attachments-2022-07-QTwzTC9o62d958ee4ee17.png

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版本修改。

attachments-2022-07-dKhhtHoZ62d95c151422f.png

运行:

# Terminal1:
ros2 run image_trans image_publisher /path_to_your_image/
# Terminal2:
ros2 run image_trans image_subscriber

结果如下:

attachments-2022-07-6m5a732I62d95cc07dcd7.png

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
王家瑶
王家瑶

5 篇文章

作家榜 »

  1. 解弘艺 17 文章
  2. 高曾谊 16 文章
  3. 胡中天 14 文章
  4. 旺仔牛奶opo 14 文章
  5. LH 14 文章
  6. 罗柏荣 13 文章
  7. Panda-admin 13 文章
  8. 林晨 12 文章