1.ros::spin()和spinOnce含義html
若是在節點中若是訂閱了話題,那麼就必需要調用ros::sping()或者ros::spinOnce()函數去處理話題綁定的回調函數,不然該節點將不會調用節點所訂閱的全部回調函數來處理接收到的數據.換句話說若是一個節點裏面沒有訂閱話題只有發佈話題,那麼是能夠不須要調用這兩個函數的.可是爲了方便之後節點添加了訂閱消息話題,建議仍是加上這兩個函數之一.下面是關於這兩個函數的討論:node
What is the actual meaning of ros::spin()c++
WritingPublisherSubscriber(c++)多線程
2.多線程調用ros::spin()和spinOnce函數
咱們注意到 ros::spin()只會單獨開闢一個單一線程去處理這些回調函數隊列,當訂閱不一樣頻率的話題時,那麼全部訂閱話題的接收頻率爲全部話題處理最慢的一個,爲了可以讓話題接收不一樣的頻率,咱們可使用ros::MultiThreadedSpinner 或者ros::AsyncSpinner 來解決問題.例如:
學習
MultiThreadedSpinner相似於ros::spin(),在構造過程當中能夠指定它所用線程數,但若是不指定線程數或者線程數設置爲0,它將在每一個cpu內核開闢一個線程。spa
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();
詳細請參考:code
Callbacks and Spinning(官方介紹)htm