ros先訂閱後發佈 無法收到消息的解決辦法

現象

今天遇到的問題是: 使用的是Ros1, 在先訂閱後發佈時, 會導致訂閱者無法收到訂閱的消息, 除非在發佈者發佈後重新訂閱.

 

思考

以前使用的是Ros2似乎並不關心訂閱和發佈的先後順序,  似乎都可以收到消息.  

這個問題後面再確認下, 今天也記錄下.

因爲計算機上已經沒有Ros2的環境了, 所以這個問題暫時擱置, 等有機會的確認下, 不過如果有解決辦法的話, 那麼Ros2訂閱和發佈的先後順序也就不重要了.

 

這個問題是個致命的問題, 因爲在兩個節點通信時, 如果一方沒有訂閱成功消息, 那麼後面的操作也就沒有用了.

如果在發佈者發佈後再訂閱, 那麼也不是個辦法. 因爲一個節點的不僅會有訂閱者也會有發佈者, 無法確定誰先誰後的順序, 這樣是無法解決這個問題的.

 

>以下是代碼:

template<typename MsgConstPtr, typename funCallback>
void Subscriber::createSubscriber(funCallback &callback, uint32_t nSizeQueue) {
    m_subsriber = Handle::ptrNodeHandle->subscribe(m_strTopic, nSizeQueue, callback);
}

 

解決辦法

經過查看Ros有關源碼發現, 最後解決了這個問題

根據循環判斷訂閱者查詢發佈者的數量, 如果爲0那麼說明訂閱失敗, 重新訂閱直到訂閱成功.

> >以下是代碼:

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