ros不同订阅方式的区别
ros话题不同的订阅方式有一些不同,适合不同的功能需求。
Ros:spin() 和 ros::spinOnce() 区别
ros:spin() 和 ros::spinOnce()为单线程订阅方式。
Ros:spin()
这种方式程序运行到这一句时就会卡在这,等待发布节点发布消息。例如:
#include <move_base/move_base.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "move_base_node");
tf::TransformListener tf(ros::Duration(10));
move_base::MoveBase move_base( tf );
ros::spin();
return(0);
}
ros::spinOnce()
这种方式是循环执行,代码运行到这一句会查询是否有订阅的消息发布出来,如果有则执行相应的回调函数,若无则执行接下来的代码。例如:
#include <move_base/move_base.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "move_base_node");
tf::TransformListener tf(ros::Duration(10));
move_base::MoveBase move_base( tf );
ros::Rate rate(5); //循环周期
while(ros::ok())
{
ROS_INFO("ros::spinOnce() test");
ros::spinOnce();
rate.sleep();
}
return(0);
}
这样与ros::spin()方式效果一样,因为循环查询的原因可能没有ros::spin()方式回调的那么及时。
ros:spin() 和 ros::spinOnce()的缺点
ros:spin() 和 ros::spinOnce()每次只能执行一个回调函数,在订阅多个话题时若有一个回调函数耗时过长可能会导致其他回调函数不能及时响应,ros系统有多线程订阅的机制,每个订阅的回调函数可以在各自的线程里执行,即MultiThreadSpinner和 AsyncSpinner方式。
MultiThreadSpinner和 AsyncSpinner方式
MultiThreadSpinner和 AsyncSpinner为多线程订阅方式。
同步方式:MultiThreadedSpinner
MultiThreadedSpinner于ros::spin()类似,可以指定所用线程数若不指定或者为0,它将在每个cpu内核开辟一个线程。用法:
int main(int argc, char** argv)
{
ros::init(argc, argv, "temp_node");
/*****************************************
*其他处理
*****************************************/
ros::MultiThreadedSpinner spinner(6); //开辟6个线程
spinner.spin();
ros::waitForShutdown();
return(0);
}
异步方式:AsyncSpinner
当程序中的回调函数花费时间过长的时候,建议开辟异步多线程订阅。 用法:
int main(int argc, char** argv)
{
ros::init(argc, argv, "temp_node");
/*****************************************
*其他处理
*****************************************/
ros::AsyncSpinner spinner(6);//开辟6个线程
spinner.start();
ros::waitForShutdown();
return(0);
}