ROS
03. Image Publish & Subscribe
huskycat1202
2021. 1. 12. 03:28
1. publisher.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("image", 1); cv::Mat image = cv::imread(argv[1], cv::IMREAD_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(); } }
2. 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::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image); cv::waitKey(30); } 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"); image_transport::ImageTransport it(nh); image_transport::Subscriber sub = it.subscribe("image", 1, imageCallback); ros::spin(); cv::destroyWindow("view"); }
3. CMakeList.txt 변경사항
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation actionlib actionlib_msgs image_transport cv_bridge sensor_msgs )
패키지 image_transport, cv_bridge, sensor_msgs를 추가한다.
find_package(OpenCV REQUIRED)
OpenCV를 사용하기에 패키지를 추가한다.
add_executable(publisher src/publisher.cpp) target_link_libraries(publisher ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} ) add_dependencies(publisher ${PROJECT_NAME}_generate_messages_cpp) add_executable(subscriber src/subscriber.cpp) target_link_libraries(subscriber ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} ) add_dependencies(subscriber ${PROJECT_NAME}_generate_messages_cpp)
OpenCV 라이브러리를 추가한다. 또한 이 패키지는 메시지를 생성하기 때문에 add_dependencies()를 이용하여 자동 생성되는 메시지에 대한 패키지의 의존성을 추가한다.
4. 실제 실행 영상
5. 주의 사항 및 앞으로 할 일
roscore와 catkin build를 자주 잊어 에러가 발생하니 주의해야한다.
또한, cpp작성하고 CMakeList.txt를 적절히 편집해야한다.
마지막으로, image의 경로와 파일명을 확실히해야한다.
+image의 크기가 과하게 크면 보기 힘들다...
앞으로 하게 될 자율 주행의 경우 결국 영상을 다룰 것이기 때문에 PC에 저장된 영상도 다룰 수 있는 코드를 공부 할 예정이다.
출처
http://wiki.ros.org/image_transport/Tutorials/PublishingImages
http://wiki.ros.org/image_transport/Tutorials/SubscribingToImages