1.ros::spin()和spinOnce含義
如果在節點中如果訂閱了話題,那么就必須要調用ros::sping()或者ros::spinOnce()函數去處理話題綁定的回調函數,否則該節點將不會調用節點所訂閱的所有回調函數來處理接收到的數據.換句話說如果一個節點里面沒有訂閱話題只有發布話題,那么是可以不需要調用這兩個函數的.但是為了方便以后節點添加了訂閱消息話題,建議還是加上這兩個函數之一.下面是關於這兩個函數的討論:
What is the actual meaning of ros::spin()
WritingPublisherSubscriber(c++)
2.多線程調用ros::spin()和spinOnce
我們注意到 ros::spin()只會單獨開辟一個單一線程去處理這些回調函數隊列,當訂閱不同頻率的話題時,那么所有訂閱話題的接收頻率為所有話題處理最慢的一個,為了能夠讓話題接收不同的頻率,我們可以使用ros::MultiThreadedSpinner 或者ros::AsyncSpinner 來解決問題.例如:
MultiThreadedSpinner類似於ros::spin(),在構造過程中可以指定它所用線程數,但如果不指定線程數或者線程數設置為0,它將在每個cpu內核開辟一個線程。
ros::MultiThreadedSpinner spinner(4); // Use 4 threads spinner.spin(); // spin() will not return until the node has been shutdown
AsyncSpinner比MultiThreadedSpinner更優,它有start() 和stop() 函數,並且在銷毀的時候會自動停止。
[code]ros::AsyncSpinner spinner(4); // Use 4 threads spinner.start(); ros::waitForShutdown();
詳細請參考:
Callbacks and Spinning(官方介紹)