基于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. Panda-admin 37 文章
  2. 解弘艺 17 文章
  3. 高曾谊 16 文章
  4. 旺仔牛奶opo 15 文章
  5. 胡中天 14 文章
  6. LH 14 文章
  7. 罗柏荣 13 文章
  8. 林晨 12 文章