現象
今天遇到的問題是: 使用的是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