ROS image_transport 使用笔记 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.advertisesensor_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 name3.1. Topic name规则介绍image_transport 发布和订阅独特的ROS Topic为每一个可用的Transport。与ROS Publisher不同它并非注册一个单独的Topic。而是多个TopicTopic命名遵循一个标准规则。在接口中我们只能指定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/compressed3.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文件运行且文件中指定了namecamera_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 valuepng /5. 图像压缩jpeg压缩一般是有损压缩png压缩是无损压缩jpeg的压缩质量是用图像质量换取存储空间值越低图像质量越差存储空间越小png的压缩质量是用计算时间换取存储空间值越高计算量越大存储空间越小但都能保证压缩是无损的参考文献image_transport - 不止所见 - 博客园image_transport - ROS WikiROS 学习系列 -- image_transport 发布jpg图片文件流在image_view中看视频效果 - it610.comcompressed_image_transport - ROS Wiki无损压缩png_由于PNG格式具有压缩参数它是否无损_culunxun2863的博客-CSDN博客