本文示例如何在一个节点中通过创建同步线程来处理不同的订阅
关键命令:
ros::CallbackQueue 定义用户的回调队列
ros::SubsribeOptions 自定义订阅者选项(在这里将 custom queue 的指针传入)
ros::AsyncSpinner 创建非同步的 spinner (额外的线程)给我们的自定义的队列
#include <ros/spinner.h>
#include <ros/callback_queue.h>
#include <std_msgs/Header.h>
#include <std_msgs/String.h>
// callbacks to be added to internal ROS queue
void headerCallback(const std_msgs::Header::ConstPtr& msg)
{
ROS_INFO("stamp.sec: %d", msg->stamp.sec);
}
// callbacks to be added to user queue
void stringCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("string: %s", msg->data.c_str());
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "my_queues");
ros::NodeHandle n;
// nothing special for internal ROS queue
ros::Subscriber sub1 = n.subscribe("/header_topic", 10, headerCallback);
// 自定义用户的回调队列
ros::CallbackQueue string_queue;
// create options for subscriber and pass pointer to our custom queue
ros::SubscribeOptions ops =
ros::SubscribeOptions::create<std_msgs::String>(
"/string_topic", // topic name
10, // queue length
stringCallback, // callback
ros::VoidPtr(), // tracked object, we don't need one thus NULL
&string_queue // pointer to callback queue object
);
// subscribe
ros::Subscriber sub2 = n.subscribe(ops);
// spawn async spinner with 1 thread, running on our custom queue
ros::AsyncSpinner async_spinner(1, &string_queue);
// start the spinner
async_spinner.start();
while (ros::ok())
{
// process one message from ROS internal queue
ros::spinOnce();
ROS_INFO("Press Enter to process available messages from ROS internal queue");
// wait for user input
getchar();
}
return 0;
}
在这里客制的队列在另一条线程被平行处理。这个队列会处理 topic /string_stopic 的信息,该过程不会被主线程的过程干扰。与此同时主线程上的处理需要用户在terminal上每一次按 enter 键才会进行。