image_transport


0. image_transport簡介
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.

1. image_transport 使用:

image_transport可以使用C++或Python接口。我們主要看看C++接口。

1.1: 下載image_transport源碼

$cd catkin_ws/src

$git clone https://github.com/ros-perception/image_common.git

1.2: 學習用法

正常發布和訂閱,是通過NodeHandle, 如下:

// Do not communicate images this way!
#include /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<<SPAN class=ID style="BOX-SIZING: border-box; COLOR: rgb(0,0,0)">sensor_msgs::Image>("out_image_topic", 1);

而使用image_transport:

// Use the image_transport classes instead.
#include /ros.h>
#include /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);

image_transport 發布和訂閱獨特的ROS Topic為每一個可用的Transport。 與ROS Publisher不同,它並非注冊一個單獨的Topic。 而是多個Topic, Topic命名遵循一個標准規則。在接口中,我們只能指定Base Topic名。其它具體名字,由規則指定。

例如,上面發布了名為:out_image_base_topic地Topic。但這個名稱只是Base Topic Name。

而advertise會創建多個以base  Topic Name 為基礎的Topic。 例如: /out_image_base_topic/compressed

.....

1.3:例子察看:

察看image_transport\tutorial目錄,其中為例子代碼。

首先看CMakeLists.txt.

add_executable(my_publisher src/my_publisher.cpp)

add_executable(my_subscriber src/my_subscriber.cpp)

add_library(resized_publisher src/manifest.cpp src/resized_publisher.cpp src/resized_subscriber.cpp)

可以看到,例子中生成了一個庫和兩個可執行文件。

my_publisher.cpp:

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();
}
}

運行:

$roscore

$rosrun image_transport_tutorial my_publisher /home/sam/image/image1.jpg

看效果:

$rosrun rqt_image_view rqt_image_view

選擇不同的Topic, 可以看到圖像。

$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

在usb_cam Package中,也使用了image_transport. 只是它使用的接口是advertiseCamera()

相關API:

http://docs.ros.org/api/image_transport/html/

https://blog.csdn.net/qq_27806947/article/details/92827520

官方鏈接:http://wiki.ros.org/image_transport


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM