# 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
