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);
}