ROS多執行緒訂閱訊息

2022-07-29 21:09:16 字數 1033 閱讀 7446

對於一些只訂閱乙個話題的簡單節點來說,我們使用ros::spin()進入接收迴圈,每當有訂閱的話題發布時,進入**函式接收和處理訊息資料。但是更多的時候,乙個節點往往要接收和處理不同**的資料,並且這些資料的產生頻率也各不相同,當我們在乙個**函式裡耗費太多時間時,會導致其他**函式被阻塞,導致資料丟失。這種場合需要給乙個節點開闢多個執行緒,保證資料流的暢通。

為了觀察不同話題的訊息被阻塞的情況,可以參考以下實驗**

可以看到,發布程式中,以10hz的頻率發布了chatter1和chatter2兩個話題,在訂閱程式中,**函式1中加入了2s的延時,導致了**函式2也只能2s才能接收到乙個資料,為了是**函式2能正常接收資料,我研究一下在乙個ros節點中開闢多個執行緒的方法。

在ros中,有兩種方法可以在乙個節點中開闢多個執行緒

1.ros::multithreadedspinner

multithreadedspinner類似於ros::spin(),在構造過程中可以指定它所用執行緒數,但如果不指定執行緒數或者執行緒數設定為0,它將在每個cpu核心開闢乙個執行緒。

用法如下

ros::multithreadedspinner spinner(4); // use 4 threads

spinner.spin(); // spin() will not return until the node has been shutdown

2.ros::asyncspinner

asyncspinner比multithreadedspinner更優,它有start() 和stop() 函式,並且在銷毀的時候會自動停止。下面的用法等價於上面的multithreadedspinner例子。

ros::asyncspinner spinner(4); // use 4 threads

spinner.start();

ros::waitforshutdown();

以上**片參考了ros wiki

完整的工程**可以參考

Ros 中的多執行緒

參考文獻 老王說 ros rosspin rosspinonce 及多執行緒訂閱 1 ros spin vs ros spinonce 區別 對於前者來說,spin 執行一次之後,會一直停在那不動,所以spin 後面可以不用加任何東西。ros 會自動的呼叫一些 函式。spinonce 就靈活的多了,...

多執行緒訊息傳遞

mfc工作者執行緒向主線程傳遞訊息 我們在編寫vc網路應用程式時,經常會用到2個執行緒,乙個是主線程,主線程負責與介面相關的工作 乙個是網路接收執行緒,負責接收網路上的資料,它在後台工作,接收執行緒經常需要與主線程進行互動,例如接收到的資料要顯示在視窗中等。由於工作者執行緒沒有訊息佇列和訊息迴圈,因...

redis 多執行緒 取消訂閱 頻道

問題1,呼叫exit 返回0,但無法立刻退出dispatch,必須等待收到新的channel推送才能退出 ret event base loopexit base,null 問題2,呼叫exit 返回0,呼叫loopbreak,始終返回 1,無法退出dispath 必須等待收到新的channel推送...