Localization module 分析

作用:

实时确定车辆的位置。

Localization节点流图:

节点数据流图:

localization data flow

输入:

  • Imu数据:/apollo/sensor/gnss/corrected_imu。

  • Gps数据:/apollo/sensor/gnss/odometry。

输出:

  • 定位信息:/apollo/localization/pose。

  • 监视信息:/apollo/localization/。

代码分析:

主要文件:localization.cc,localization.h,localization_base.h。

Localization类:

  • 继承于ApolloApp类,有三个数据,localization_具体的定位算法实例指针,localization_factory_存储定位算法类,config_存储配置文件信息。

  • Init()函数注册RTKLocalization类到localization_factory_,此类基于RTK算法实现定位算法;读取配置文件到config_。

  • Name()函数返回模块名字。

  • Start()函数,用localization_factory_类实例化一个定位算法对象,用localization_直向。若创建成功,调用定位算法的start()函数。

LocalizationBase类:

  • 定位算法的基类。

  • Start()函数启动定位算法。

  • Stop()函数终止定位算法。

RTKLocalization类:

  • 继承LocalizationBase类。

  • Start()函数:创建timer,检测gps和imu是否有数据。超时执行OnTimer()函数。OnTimer()函数检查gps和imu是否有数据,然后调用PublishLocalization()发布定位信息,并更新数据接收时间。在PublishLocalization()函数中先调用PrepareLocalizationMsg()函数计算定位信息,并填充发布数据结构localization;然后调用AdapterManager::PublishLocalization发布定位topic。PrepareLocalizationMsg(&localization)函数首先获取gps数据,然后根据gps数据时间戳获取imu数据,然后调用ComposeLocalizationMsg()函数,进行数据融合以定位,其实所谓的数据融合也就是在最终的定位信息中分别使用gps和imu测得数据设置定位信息,唯一由两个器件融合的量只有线速度。所谓RTK算法应该单指由gps数据获取gps定位信息,在localization阶段其实是使用这个定位信息,真正RTK算法应该是作用在gps数据的处理上。

  • Stop()函数停止timer,即退出定位模式。

疑惑:

  • 定位信息给出的应该是车辆在世界中的的绝对位置,因为采用gps数据,那么这个位置如何与地图建立关系的?

答:地图中的点也可能是世界中的绝对位置。

  • map_offset这个量的作用://TODO