ros::spin() 和 ros::spinOnce()機制作用和區別

1、 機制:

消息發佈器一直循環發送msg到topic chatter上;消息訂閱器一旦發現 chatter上有data,就會把msg放到一個隊列回調函數中,但還未執行callback函數。
當運行ros::spin()和ros::spinOnce()時,就會執行callback函數。區別就是執行的不同。

2、作用:
1) ros::spinOnce()

當spinOnce()被調用時,調用隊列中第1個數據作爲callback函數的參數;等到下次spinOnce()被調用時,隊列中第2個數據被使用,以此類推。

這會有一個問題。因爲隊列的長度是有限的,如果發佈器發送數據的速度太快,spinOnce函數調用的頻率太少,就會導致隊列溢出。

2) ros::spin()

spin(),一旦進入spin函數,它就不會返回了,相當於它在自己的函數裏面死循環了。只要回調隊列裏面有數據在,它就會馬上去執行callback函數。如果沒有的話,它就會阻塞,不會佔用CPU。

3、 區別:

ros::spin() 在調用後不會再返回,也就是你的主程序到這兒就不往下執行了。 ros::spinOnce() 在調用後還可以繼續執行之後的程序。

“看函數名也能理解個差不多,一個是一直調用;另一個是隻調用一次,如果還想再調用,就需要加上循環了。
這裏一定要記住,ros::spin()函數一般不會出現在循環中,因爲程序執行到spin()後就不調用其他語句了,也就是說該循環沒有任何意義,還有就是spin()函數後面一定不能有其他語句(return 0 除外),有也是白搭,不會執行的。ros::spinOnce()的用法相對來說很靈活,但往往需要考慮調用消息的時機,調用頻率,以及消息池的大小,這些都要根據現實情況協調好,不然會造成數據丟包或者延遲的錯誤。”
——ros::spin() 和 ros::spinOnce() 區別及詳解

參考:

ros::spin()和ros::spinOnce()函數
ros::spin() 和 ros::spinOnce() 區別及詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章