ROS image_transport使用笔记

image_transport是ROS中用于图像订阅和发布的工具,支持低带宽压缩格式,如JPEG和PNG。它提供了透明的压缩图像传输,并允许用户指定传输策略。使用时,需通过image_transport::ImageTransport类创建订阅者和发布者。topic名称遵循特定规则,基于base topic创建多个带有transport名称的topic。参数设置通常通过参数服务器完成,如设置压缩格式和质量。图像压缩方面,JPEG为有损压缩,PNG为无损压缩,两者在质量和存储空间之间取得平衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 简介

image_transport应该总被用在image订阅和发布上。它为低带宽压缩格式(compressed formats)image传输提供透明支持。例如:为JPEG/PNG压缩和视频流提供单独插件,为此类image提供传输(订阅和发布)。

当我们基于Image工作时,我们常希望指定传输策略。例如使用压缩Image或视频流编码。image_transport提供class和node提供支持位随意格式的各类传输。抽离了格式等复杂信息,所以用户只看到sensor_msgs/Image这个message。

指定格式的传输由插件提供,image_transport自身只提供“raw”传输。其它的格式支持依赖于其它子package.image_transport_plugins.

2. 使用方法

先看一下ROS中标准的消息订阅和发布方式

// Do not communicate images this way!
#include <ros/ros.h>

void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
  // ...
}

ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("in_image_topic", 1, imageCallback);
ros::Publisher pub = nh.advertise<sensor_msgs::Image>("out_image_topic", 1);

使用image_transport的方式

#include <ros/ros.h>
#include <image_transport/image_transport.h>

void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
  // ...
}

ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe("in_image_base_topic", 1, imageCallback);
image_transport::Publisher pub = it.advertise("out_image_base_topic", 1);

3. Topic name

3.1. Topic name规则介绍

image_transport 发布和订阅独特的ROS Topic为每一个可用的Transport。 与ROS Publisher不同,它并非注册一个单独的Topic。 而是多个Topic, Topic命名遵循一个标准规则。在接口中,我们只能指定Base Topic名。其它具体名字,由规则指定。

输出的topic name是有一定的规则的<base topic>/<transport name>/<parameter name> 

例如,上面发布了名为out_image_base_topic的Topic。但这个名称只是Base Topic Name。

而advertise会创建多个以base  Topic Name 为基础的Topic。 如 /out_image_base_topic/compressed

3.2. 使用中遇到的问题

看下面代码

int main(int argc, char** argv)
{
	ros::init(argc, argv, "image_publisher");
	ros::NodeHandle nh;
	image_transport::ImageTransport it(nh);
	image_transport::Publisher pub = it.advertise("camera/image", 1);

	cv::Mat image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR);
	sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();

	ros::Rate loop_rate(5);
	while (nh.ok()) {
		pub.publish(msg);
		ros::spinOnce();
		loop_rate.sleep();
	}
}

同样的代码,如果使用rosrun运行,topic name如下

rostopic list

/camera/image
/camera/image/compressed
/camera/image/compressed/parameter_descriptions
/camera/image/compressed/parameter_updates
/camera/image/compressedDepth
/camera/image/compressedDepth/parameter_descriptions
/camera/image/compressedDepth/parameter_updates
/camera/image/theora
/camera/image/theora/parameter_descriptions
/camera/image/theora/parameter_updates

如果使用lauch文件运行,且文件中指定了name="camera_name",则话题名如下

rostopic list

/camera_name/camera/image
/camera_name/camera/image/compressed
/camera_name/camera/image/compressed/parameter_descriptions
/camera_name/camera/image/compressed/parameter_updates
/camera_name/camera/image/compressedDepth
/camera_name/camera/image/compressedDepth/parameter_descriptions
/camera_name/camera/image/compressedDepth/parameter_updates
/camera_name/camera/image/theora
/camera_name/camera/image/theora/parameter_descriptions
/camera_name/camera/image/theora/parameter_updates

但我们并不希望topic name前有camera_name这个前缀

解决方法是把代码中这一行

image_transport::Publisher pub = it.advertise("camera/image", 1);

改成

image_transport::Publisher pub = it.advertise("/camera/image", 1);

注意,就是在base topic前加了一个/

4. 参数设置

image_transport的很多参数并不是通过代码设置的,而是使用参数服务器进行设置的,例如

<base_topic>/compressed/format # 设置压缩格式,"jpeg" or "png"
<base_topic>/compressed/jpeg_quality # 设置jpeg的压缩质量
<base_topic>/compressed/png_level # 设置png的压缩质量

使用时只需要launch文件中设置即可

<param name="/nio/sensor/usb_cam/compressed/format" value="png" />

5. 图像压缩

jpeg压缩一般是有损压缩,png压缩是无损压缩

jpeg的压缩质量是用图像质量换取存储空间,值越低图像质量越差存储空间越小

png的压缩质量是用计算时间换取存储空间,值越高计算量越大存储空间越小,但都能保证压缩是无损的

参考文献

image_transport - 不止所见 - 博客园

image_transport - ROS Wiki

ROS 学习系列 -- image_transport 发布jpg图片文件流在image_view中看视频效果 - it610.com

compressed_image_transport - ROS Wiki

无损压缩png_由于PNG格式具有压缩参数,它是否无损?_culunxun2863的博客-CSDN博客

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值