【ROS】ROS 发布和订阅压缩图像消息 CompressedImage

这篇具有很好参考价值的文章主要介绍了【ROS】ROS 发布和订阅压缩图像消息 CompressedImage。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


使用 cv_bridge 发布/订阅压缩图像

参考 cv_bridge 文档

发送图像

from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
# 创建 publisher
cimage_pub = rospy.Publisher("/image/compressed", CompressedImage, queue_size=1)
# 创建并发送压缩图像消息
compressed_msg = CvBridge().cv2_to_compressed_imgmsg(image, "jpg")
compressed_msg.header.stamp = rospy.Time.now()
cimage_pub.publish(compressed_msg)

其中 “jpg” 表示将图像压缩的目标格式,还有很多其他参数可选,如下所示
但亲测 “jpg” 压缩比最大,图像传输占用的带宽最少

bmp, dib
jpeg, jpg, jpe
jp2
png
pbm, pgm, ppm
sr, ras
tiff, tif

接收图像

from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
# 定义回调函数
def cvbridge_callback(self, data):
    image = CvBridge().compressed_imgmsg_to_cv2(data, "bgr8")
# 创建 subscriber
rospy.Subscriber("/image/compressed", CompressedImage, cvbridge_callback, queue_size=1)

其中 “bgr8” 表示将图像解析为 “bgr8” 格式,也是 opencv 默认的图像格式

使用 opencv 手动发布/订阅

参考 rospy wiki 教程
参考 opencv 中 imencode 与 imdecode 文档说明

发送图像

from sensor_msgs.msg import CompressedImage
import cv2
import numpy as np
# 创建 publisher
cimage_pub = rospy.Publisher("/image/compressed", CompressedImage, queue_size=1)
# 创建并发送压缩图像消息
compressed_msg = CompressedImage()
compressed_msg.header.stamp = rospy.Time.now()
compressed_msg.format = "jpg"
compressed_msg.data = np.array(cv2.imencode('.jpg', image)[1]).tobytes()
cimage_pub.publish(compressed_msg)

“jpg” 作用同上,需要手动设置 compressed_msg.format 表示为压缩格式(但亲测不设置对 rqt 显示和解压缩也没啥影响)
此外,可以手动调节压缩图像的相关参数,如调整 jpg 图像压缩质量为 5(默认为 95)

# 创建并发送压缩图像消息
compressed_msg = CompressedImage()
compressed_msg.header.stamp = rospy.Time.now()
compressed_msg.format = "jpg"
compressed_msg.data = np.array(cv2.imencode('.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 5])[1]).tobytes()
cimage_pub.publish(compressed_msg)

接收图像

from sensor_msgs.msg import CompressedImage
import cv2
import numpy as np
# 定义回调函数
def cv2_callback(self, data):
    image = np.frombuffer(data.data, np.uint8)
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
# 创建 subscriber
rospy.Subscriber("/image/compressed", CompressedImage, cv2_callback, queue_size=1)

使用 image_transport 将发送的图像转发为压缩图像

参考 image_transport wiki
如果不想写程序对图像进行处理,可以使用 image_transport 包的命令行工具来将 Image 消息转发为 CompressedImage 消息

rosrun image_transport republish raw in:=/image compressed out:=/image

该节点会自动订阅/image话题下的Image消息,并将CompressedImage格式的消息发送到/image/compressed话题下
压缩的相关参数可以通过 rqt 工具箱里的 Dynamic Reconfigure 工具箱进行调整:

ros compressedimage,python,机器人

效果展示

ros compressedimage,python,机器人
如果 rqt 可视化过程中显示错误:Unable to load plugin for transport ‘cvbridge_compressed’
可参考 【ROS】rqt显示压缩图像话题报错:Unable to load plugin for transport ‘cvbridge_compressed’文章来源地址https://www.toymoban.com/news/detail-853533.html

到了这里,关于【ROS】ROS 发布和订阅压缩图像消息 CompressedImage的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ros中常见问题处理:延迟问题解决方法、订阅的数据感觉比发布的数据要多;如果没有正在接收消息,那么状态如何获取?

    在ROS中,消息的发布和订阅是异步的,也就是说,当你调用pub.publish(output_msg)发布消息时,该函数会立即返回,并不会等待所有订阅者接收消息。因此,如果你的程序出现延迟,可能是由于某些原因导致消息被堵塞或丢失。 以下是几种可能导致延迟的原因和解决方法: 1,消

    2024年02月06日
    浏览(38)
  • ORB_SLAM3配置及修改——将图像、点云用ROS消息发布(基于无人机仿真)

            本文有点长,可以根据目录跳转到想看的部分。因为仿真和应用环境不同,可能例程的运行方式(输入话题等)有所不同,但第三部分有关ORB_SLAM3相机仿真标定、第四部分有关ORB_SLAM3源码修改的部分是通用的。 目录 一、仿真环境配置 1.双系统安装 ① 工具准备 ②

    2024年04月10日
    浏览(49)
  • ROS学习笔记(二):ROS话题的发布与订阅

    第十讲  发布者Publisher的编程 1. 创建功能包 learning_topic  $ cd ~/test1/src  $ catkin_create_pkg learning_topic std_msgs rospy roscpp geometry_msgs turtlesim 2.执行C++文件程序如下:放在创建的功能包的/learning_topic/src里 程序名为velocity_publisher.cpp 2.如何实现一个发布者(发布到ros自带节点 ) (1)初

    2024年02月04日
    浏览(78)
  • ROS实现一个节点同时发布订阅多个话题(C++版)

      如果想在一个节点同时发布订阅多个话题就要使用到多线程机制,在C++中如何使用多线程,在C++中开多线程模板已经有了介绍,就是下面这个:    但是有一点需要注意的是,创建节点的涉及到一个主线程,如果想同时发布订阅是不能使用主线程的(也就是不能主线程发

    2024年02月11日
    浏览(37)
  • Vue消息订阅与发布

      引入第三方库 pubsub.js: Student.vue School.vue TodoList案例使用消息订阅实现删除功能: App.vue : MyItem.vue:  

    2024年02月15日
    浏览(34)
  • Redis 消息队列和发布订阅

    采用redis 三种方案: ● 生产者消费者:一个消息只能有一个消费者 ● 发布者订阅者:一个消息可以被多个消费者收到 ● stream模式:实现队列和广播模式 Producer调用redis的lpush往特定key里放消息,Consumer调用brpop去不断监听key。 1、利用redis的链表,存储数据,实现队列模式

    2024年01月18日
    浏览(42)
  • Redis实现消息的发布和订阅

    4.1 发送消息 4.2 接收消息

    2024年02月13日
    浏览(39)
  • vue进阶-消息的订阅与发布

    📖vue基础学习-组件 介绍了嵌套组件间父子组件通过 props 属性进行传参。子组件传递数据给父组件通过 $emit() 返回自定义事件,父组件调用自定义事件接收子组件返回参数。 📖vue进阶-vue-route 介绍了路由组件传参,两种方式: params传参 和 query 传参 。 本章介绍组件间通信:

    2024年02月16日
    浏览(40)
  • Redis消息传递:发布订阅模式详解

    目录 1.Redis发布订阅简介 2.发布/订阅使用    2.1 基于频道(Channel)的发布/订阅    2.2 基于模式(pattern)的发布/订阅 3.深入理解Redis的订阅发布机制    3.1 基于频道(Channel)的发布/订阅如何实现的?    3.2 基于模式(Pattern)的发布/订阅如何实现的?    3.3 SpringBoot结合Redis发布

    2024年02月12日
    浏览(41)
  • 【Python】Flask + MQTT 实现消息订阅发布

    本次项目主要使用到的库: flask_mqtt 1.创建Flask项目 2创建py文件: mqtt_demo.py 3.代码实现 4.项目运行 运行项目前可在Pycharm中设置 host 和 port 设置好后直接运行项目 使用 MQTTX 进行消息测试 1、测试消息接收 创建连接 Host :为代码中定义好的 broker.emqx.io Port :为代码中定义好的

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包