ros学习

mac2024-03-12  28

ros话题发布,话题订阅,传输图片 整个流程参考:https://blog.csdn.net/u010925447/article/details/80033288 my_pulisher.cpp

#include <ros/ros.h> #include <image_transport/image_transport.h> #include <opencv2/highgui/highgui.hpp> #include <cv_bridge/cv_bridge.h> 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/rgb/image_rect_color", 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(); } }

my_subscriber.cpp

#include <ros/ros.h> #include <image_transport/image_transport.h> #include <opencv2/highgui/highgui.hpp> #include <cv_bridge/cv_bridge.h> void imageCallback(const sensor_msgs::ImageConstPtr& msg) { try { cv::Mat src = cv_bridge::toCvShare(msg, "bgr8")->image.clone(); if(src.empty()){ //std::cout << "non image"<<std::endl; }else{ std::cout << "get image"<<std::endl; cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image); cv::waitKey(0); } } catch (cv_bridge::Exception& e) { ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str()); } } int main(int argc, char **argv) { ros::init(argc, argv, "image_listener"); ros::NodeHandle nh; cv::namedWindow("view"); cv::startWindowThread(); image_transport::ImageTransport it(nh); image_transport::Subscriber sub = it.subscribe("camera/rgb/image_rect_color", 1, imageCallback); ros::spin(); cv::destroyWindow("view"); }

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3) project(my_image_transport) add_compile_options(-std=c++11) find_package(catkin REQUIRED COMPONENTS cv_bridge image_transport OpenCV ) include_directories( # include ${catkin_INCLUDE_DIRS} ) include_directories(include ${OpenCV_INCLUDE_DIRS}) #build my_publisher and my_subscriber add_executable(my_publisher src/my_publisher.cpp) target_link_libraries(my_publisher ${catkin_LIBRARIES} ${OpenCV_LIBRARY_DIRS}) add_executable(my_subscriber src/my_subscriber.cpp) target_link_libraries(my_subscriber ${catkin_LIBRARIES} ${OpenCV_LIBRARY_DIRS})

开终端

roscore

发布

rosrun my_image_transport my_publisher /home/coco/visp-ws/tutorial/image/monkey.jpeg

订阅

rosrun my_image_transport my_subscriber

问题: 1.opencv的imshow显示失败,对话框未响应: 解决:在imshow后添加cv::waitKey(0); 或如上代码

最新回复(0)