ROS发布图片ros::Publisher和image_transport::Publisher

本文介绍了在ROS中使用cv_bridge和image_transport两种方式实现读取并发布视频或图片,比较了它们在性能上的差异,特别强调了image_transport的压缩功能对传输效率的影响。
摘要由CSDN通过智能技术生成

概要

想要实现读取视频或者图片,然后发布到ros中,用rivz显示。
需要借助几个库,如下

catkin_create_pkg test roscpp rosmsg cv_bridge image_transport sensor_msgs std_msgs

实现方式

方式一 ros::Publisher

#include <cv_bridge/cv_bridge.h>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>

#include <chrono>
#include <opencv2/opencv.hpp>

double GetTimeCostms(const std::chrono::time_point<std::chrono::high_resolution_clock>& start) {
  auto end = std::chrono::high_resolution_clock::now();
  double milliseconds = std::chrono::duration_cast<std::chrono::duration<double>>(end - start).count() * 1000;
  // ROS_INFO_STREAM("handle cost ms:" << milliseconds);
  return milliseconds;
}

int main(int argc, char** argv) {
  // 初始化ROS节点
  ros::init(argc, argv, "image_publisher");

  // 创建一个ROS节点句柄
  ros::NodeHandle nh;

  // 创建一个图像发布者
  ros::Publisher image_pub = nh.advertise<sensor_msgs::Image>("image_topic", 10);

  // 读取本地图片
  cv::Mat image = cv::imread("./picture/0.jpg");

  // 发布图像消息
  ros::Rate rate(25);  // 设置发布频率为10Hz
  while (ros::ok()) {
    auto start = std::chrono::high_resolution_clock::now();
    auto start1 = start;
    // 创建一个CvBridge对象
    cv_bridge::CvImage cv_image;
    // 将OpenCV图像转换为ROS图像消息
    cv::Mat imageResize;
    // cv::resize(image, imageResize, cv::Size(), 0.5, 0.5);
    // cv_image.image = imageResize;
    cv_image.image = image;
    cv_image.encoding = "bgr8";
    cv_image.header.stamp = ros::Time::now();
    auto msg = cv_image.toImageMsg();
    ROS_INFO_STREAM("1cost ms:" << GetTimeCostms(start));
    start = std::chrono::high_resolution_clock::now();
    image_pub.publish(msg);
    ROS_INFO_STREAM("2cost ms:" << GetTimeCostms(start));
    ROS_INFO_STREAM("3cost ms:" << GetTimeCostms(start1));
    ros::spinOnce();
    rate.sleep();
  }

  return 0;
}

在这里插入图片描述

方式二 image_transport::Publisher

#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>

#include <chrono>
#include <opencv2/opencv.hpp>

double GetTimeCostms(const std::chrono::time_point<std::chrono::high_resolution_clock>& start) {
  auto end = std::chrono::high_resolution_clock::now();
  double milliseconds = std::chrono::duration_cast<std::chrono::duration<double>>(end - start).count() * 1000;
  // ROS_INFO_STREAM("handle cost ms:" << milliseconds);
  return milliseconds;
}

int main(int argc, char** argv) {
  // 初始化ROS节点
  ros::init(argc, argv, "image_publisher");

  // 创建一个ROS节点句柄
  ros::NodeHandle nh;

  // 创建一个图像发布者
  image_transport::ImageTransport it_(nh);
  image_transport::Publisher image_pub = it_.advertise("image_topic", 10);

  // 读取本地图片
  cv::Mat image = cv::imread("./picture/0.jpg");

  // 发布图像消息
  ros::Rate rate(25);  // 设置发布频率为10Hz
  while (ros::ok()) {
    auto start = std::chrono::high_resolution_clock::now();
    auto start1 = start;
    // 创建一个CvBridge对象
    cv_bridge::CvImage cv_image;
    // 将OpenCV图像转换为ROS图像消息
    cv::Mat imageResize;
    // cv::resize(image, imageResize, cv::Size(), 0.5, 0.5);
    // cv_image.image = imageResize;
    cv_image.image = image;
    cv_image.encoding = "bgr8";
    // cv_image.header.stamp = ros::Time::now();
    auto msg = cv_image.toImageMsg();
    ROS_INFO_STREAM("1cost ms:" << GetTimeCostms(start));
    start = std::chrono::high_resolution_clock::now();
    image_pub.publish(msg);
    ROS_INFO_STREAM("2cost ms:" << GetTimeCostms(start));
    ROS_INFO_STREAM("3cost ms:" << GetTimeCostms(start1));
    ros::spinOnce();
    rate.sleep();
  }

  return 0;
}
-> % rostopic list 
/clicked_point
/image_topic
/image_topic/compressed
/image_topic/compressed/parameter_descriptions
/image_topic/compressed/parameter_updates
/image_topic/compressedDepth
/image_topic/compressedDepth/parameter_descriptions
/image_topic/compressedDepth/parameter_updates
/image_topic/theora
/image_topic/theora/parameter_descriptions
/image_topic/theora/parameter_updates
/initialpose
/move_base_simple/goal
/rosout
/rosout_agg
/rviz_1707222063696618079/compressed/parameter_descriptions
/rviz_1707222063696618079/compressed/parameter_updates
/tf
/tf_static

ros topic 对比

使用方式二多了很多个topic。

  1. raw在这里插入图片描述

  2. compressed在这里插入图片描述

  3. compressedDepth 在这里插入图片描述
    在这里插入图片描述

  4. theora 在这里插入图片描述

性能对比

在这里插入图片描述

总结

需要跨终端传输,用image_transport::Publisher,会压缩,方便传输,接收放也需要解压。
不需要时,直接ros::Publisher,节省性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值