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