參考文獻:http://blog.csdn.net/sinat_27554409/article/details/48446611 老王說ROS
http://blog.csdn.net/yaked/article/details/50776224 rosspin、rosspinOnce及多線程訂閱
1、 Ros:spin() VS ros::spinOnce() 區別
對於前者來說,spin(),運行一次之后,會一直停在那不動,所以spin()后面可以不用加任何東西。ROS 會自動的調用一些回調函數。
Spinonce 就靈活的多了,不過需要控制好它的調用周期,它比spin定時要准很多。
當我們用nh.createTimer創建定時函數的時候,發現其定時周期不可控,用rqt查看的。所以,我們改成spinOnce 的模式來定時調用。此能實現精准調用。
參考文檔:老王說ROS(7)用ros做系統設計 http://blog.exbot.net/archives/1675
以上都是同步的,在一個線程當中。
2、多線程
在ROS當中,原作者是不推薦用多線程的,他建議用多進程,變成一個個節點的形式進行通信。
分為兩種模式:同步和異步。
同步:MultiThreadSpinner s(4),一共5個線程。包括了主線程。
異步:AsyncSpinner s(4), 一共5個線程。包括了主線程。
利用Timer 可能會出現一些問題。
3、當程序當中有數據處理線程的時候,建議開辟 異步多線程 訂閱,算法寫在訂閱函數里面。
當然,目前的處理當中,我更傾向於重新開辟一個線程,然后通過循環數組來進行數據交互。