1. 程式人生 > >ROS中單獨開闢執行緒接受message

ROS中單獨開闢執行緒接受message

ros::AsyncSpinner 已經可以開闢許多執行緒來接收message,但是有時候我們需要指定某個執行緒來單獨對摸個topic的message進行接收處理。

#include <ros/ros.h>
#include "ros/callback_queue.h"
void processImageGrabed(const sensor_msgs::Image::ConstPtr &pImage)
{
     cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(pImage, sensor_msgs::image_encodings::BGR8);
     string sImageFile = image_folder + "/" + pImage->header.frame_id;
     cv::imwrite(sImageFile, cv_ptr->image);
}

void save_thread_func()
{
    ros::NodeHandle node;
    ros::SubscribeOptions ops;
    ops.template init<sensor_msgs::Image>(_image_grabed_topic, 1000000, processImageGrabed);
    ros::CallbackQueue queue;
    ops.callback_queue = &queue;
    ros::Subscriber sub = node.subscribe(ops);
    while(node.ok())
    {
        queue.callAvailable(ros::WallDuration(0.1));
    }
}

int main(int argc, char **argv)  
{
    ros::init(argc, argv, "_node");
    std::thread t_saveImage(save_thread_func);
    ros::spin();
    return 0;  
}
關鍵實現線上程函式save_thread_func()中,收到message後processImageGrabed()作為callback函式處理訊息。