# Localization module 分析 ## 作用: 实时确定车辆的位置。 ## Localization节点流图: ### 节点数据流图: ![localization data flow](images/localization_node_arch.bmp) ### 输入: * 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