apollo學習基礎之三[適配器adapter學習]

   

                 apollo學習基礎之三[適配器adapter學習]

 

目錄

   

                 apollo學習基礎之三[適配器adapter學習]

1.適配封裝設計

2. AdapterManager的設計

3.總結歸納:


       我們知道,百度優化了ROS,使用ros的通信機制,但是我們在源碼學習中,很少見到ros的publisher 和subscriber等熟悉的身影。主要原因是百度對通信層進行了封裝,adapter類。那我們就以modules/localization模塊首先介紹如何使用封裝後的Adapter,另外,百度添加一個adapterManager,用來對所有的adapter進行管理。

APOLLO_MAIN(apollo::localization::Localization)

    POLLO_MAIN就是一個宏,初始化ros中的node,不難看出localization模塊本身啓動後就是一個進程。同時使用在宏中的ApolloApp::Spin()中首先會執行Init函數,即apollo::routing::localization類的Init()函數;APOLLO_MAIN宏中apollo_app_.Spin()[apollo_app.cc]裏面又調用status = Start()接口,實際就是Status Localization::Start() ,而又調用localization_->Start(),實際就是使用rtk_localiztion.cc的Status RTKLocalization::Start() 函數。這裏面就初始化了適配器:

 這裏配置調取adapterManager的Init函數,static,參數是localization模塊下的adapter_conf:

這裏接收數據,就是callbakc函數,直接接收到數據放到共享內容中。若果你先處理的話可以直接註冊自己模塊的callback 函數,像routing一樣:

 適配器器通過文件rtk_adapter.conf:

        其實就是創建ros Publisher 和Subscriber對象需要的配置參數,如是pub還是sub,message queue的大小,最後一條是是否爲ros,目前都是ros,表明該進程Node爲ros節點,通過ros的底層通訊機制進行通訊,例如TCPROS/UDPROS,不過msg類型不是ros原生的msg類型,而是都是protobuf中的proto。

進入到adapterManager::Init中:

上面代碼有兩個作用:
1.創建ros::NodeHandle對象;調用EnableGps()函數,完成了創建Publisher 和Subscriber對象。在Subscriber創建的時候,肯定需要制定回調百度統一封裝的GpsAdapter::RosCallback。

2.因爲rtk_localization中沒有對sub的消息處理,就沒有像routing那樣有

    AdapterManager::AddRoutingRequestCallback(&Routing::OnRoutingRequest, this)的語句而是直接用AdapterManager::GetGps()接收回調。

1.適配封裝設計

apollo 在//modules/common/adapters/message_adapters.h中定義了

其中模板類adapter的類型localization::Gps爲proto,

adapter繼承自AdapterBase,AdapterBase是個抽象類,就是一堆接口,這些接口在Adapter中實現

2. AdapterManager的設計

Init的調用中,很多函數的實現是通過DECLARE_SINGLETON宏來實現的。

REGISTER_ADAPTER宏創建了適配所有Adapter的函數,主要是將Adapter和AdapterManager 聯繫起來的。

最終調用的是GpsAdapter的RosCallback()把數據存放在消息隊列中,其實調用的是Adapter模板類中的

 

3.總結歸納:

1、定義msg格式,這裏就是proto,例如localization::Gps,然後定義相應的模板類GpsAdapter

2、在AdapterManager::Init()函數中,添加

3、在自己的模塊,例如localization,首先定義一個adapter.conf,如下所示

4、然後在自己的模塊的Init()/start()函數中,調用AdapterManager::Init(),輸入參數爲上述adapter.conf:

5、使用:

  • rtk_localizetion模塊中這樣使用

  • Routing模塊中這樣使用

在自己模塊編寫回調函數OnRoutingRequest;

 

 

 

 

 

 

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