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:

apollo学习基础之三[适配器adapter学习]_第1张图片

        其实就是创建ros Publisher 和Subscriber对象需要的配置参数,如是pub还是sub,message queue的大小,最后一条是是否为ros,目前都是ros,表明该进程Node为ros节点,通过ros的底层通讯机制进行通讯,例如TCPROS/UDPROS,不过msg类型不是ros原生的msg类型,而是都是protobuf中的proto。

进入到adapterManager::Init中:

apollo学习基础之三[适配器adapter学习]_第2张图片

上面代码有两个作用:
1.创建ros::NodeHandle对象;调用EnableGps()函数,完成了创建Publisher 和Subscriber对象。在Subscriber创建的时候,肯定需要制定回调百度统一封装的GpsAdapter::RosCallback。

2.因为rtk_localization中没有对sub的消息处理,就没有像routing那样有

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

apollo学习基础之三[适配器adapter学习]_第3张图片

1.适配封装设计

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

其中模板类adapter的类型localization::Gps为proto,

apollo学习基础之三[适配器adapter学习]_第4张图片

adapter继承自AdapterBase,AdapterBase是个抽象类,就是一堆接口,这些接口在Adapter中实现

apollo学习基础之三[适配器adapter学习]_第5张图片

2. AdapterManager的设计

apollo学习基础之三[适配器adapter学习]_第6张图片

Init的调用中,很多函数的实现是通过DECLARE_SINGLETON宏来实现的。

apollo学习基础之三[适配器adapter学习]_第7张图片

REGISTER_ADAPTER宏创建了适配所有Adapter的函数,主要是将Adapter和AdapterManager 联系起来的。

最终调用的是GpsAdapter的RosCallback()把数据存放在消息队列中,其实调用的是Adapter模板类中的

apollo学习基础之三[适配器adapter学习]_第8张图片

 

3.总结归纳:

1、定义msg格式,这里就是proto,例如localization::Gps,然后定义相应的模板类GpsAdapter

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

3、在自己的模块,例如localization,首先定义一个adapter.conf,如下所示

apollo学习基础之三[适配器adapter学习]_第9张图片

4、然后在自己的模块的Init()/start()函数中,调用AdapterManager::Init(),输入参数为上述adapter.conf:

5、使用:

  • rtk_localizetion模块中这样使用

  • Routing模块中这样使用

在自己模块编写回调函数OnRoutingRequest;

 

 

 

 

 

 

你可能感兴趣的:(apollo)