Apollo详解之定位模块——RTK定位
前言
Apollo的定位模塊提供了三種定位方法,分別是RTK、NDT、MSF。
所謂RTK定位,可參考百度百科
簡單來說,就是依靠地面上擁有絕對準確位置的基站測量GPS定位的誤差,將該誤差發送給附近的接收機進行校準,提高GPS定位精度,往往可以達到厘米級的定位精度。
RTK定位組件簡述
Apollo中RTK定位組件和上述RTK定位的定義并沒有關系,其功能只是將GPS的數據和對應時間戳的IMU數據進行組合,最終輸出高精地圖下的位置。沒有涉及到RTK(Real?Time?Kinematic)實時動態測量技術。
組合導航會輸出GPS和IMU的消息,前者輸出ENU坐標系下的點坐標、位姿、線速度,后者輸出車輛坐標系的線加速度、角速度、歐拉角、航向,然而兩者輸出的頻率相差很大,GPS數據更新頻率要遠低于IMU數據的更新頻率,在Lgsvl仿真中,可以參考
可以看到,仿真中IMU消息的發布頻率比GPS高將近十倍。
RTKLocalizationComponent
該組件會訂閱GPS消息Gps和IMU消息CorrectedImu,根據Gps的時間戳找到最適合的CorrectedImu,將其中的數據組合,向相關話題輸出LocalizationEstimate。此外,該組件會將獲得的定位數據發布為localization和world坐標系之間的動態坐標變換。
配置文件
配置文件的定義可參考modules/localization/proto/rtk_config.proto
message Config {optional string localization_topic = 1; // 輸出的定位話題optional string localization_status_topic = 11; // 輸出的定位狀態話題optional string imu_topic = 2; // 訂閱的IMU消息話題optional string gps_topic = 3; // 訂閱的GPS消息話題optional string gps_status_topic = 12; // 訂閱的GPS定位狀態話題optional string broadcast_tf_frame_id = 4; // 廣播的父坐標系optional string broadcast_tf_child_frame_id = 5; // 廣播的子坐標系optional int32 imu_list_max_size = 6; // IMU消息容器的大小optional double gps_imu_time_diff_threshold = 7; // GPS和IMU消息時間戳差值的閾值optional double map_offset_x = 8; // world到mpa坐標系的偏差值optional double map_offset_y = 9;optional double map_offset_z = 10; }RTKLocalizationComponent::Proc
該函數會訂閱GPS定位消息,進行上述的處理。
RTKLocalization
RTKLocalization負責功能的具體實現,其擁有兩個雙向鏈表容器。
imu_list_
訂閱得到的CorrectedImu消息會不斷保存在該容器當中,新元素加入到尾部,容器中元素的個數大于容量時,頭部的原始會被刪除,因此該容器中,從頭部到尾部,時間戳依次增大,即頭部的數據最老,尾部的數據最新。
由于GPS消息的更新頻率要遠低于IMU的更新頻率,因此要通過該容器保存一定時間的IMU消息,以供GPS找到與其時間戳最匹配的IMU消息。
gps_status_list_
作用與imu_list_類似,保存的是IMU的狀態
RTKLocalization::FindMatchingIMU
該函數根據GPS的時間戳,在容器中找到與之最為匹配的IMU消息。可以分為三種情況:
- gps時間戳要比容器中的CorrectedImu都要新,則匹配結果為容器中最新的CorrectedImu
- gps時間比容器中的CorrectedImu都要老,則匹配結果為容器中最老的CorrectedImu
- gps時間在容器中時間戳最老和最新的兩者之間,則匹配結果為容器中gps時間兩端插值后的CorrectedImu
RTKLocalization::InterpolateIMU
若gps時間在容器中時間戳最老和最新的兩者之間,則會對GPS時間戳兩端最接近的兩個CorrectedImu進行插值,插值的過程即根據GPS時間戳對兩者取平均,時間戳靠近哪一方,平均時的占比就越大。
進行插值的量分別是角速度、線加速度、歐拉角。
RTKLocalization::ComposeLocalizationMsg
該函數將GPS和IMU的消息進行組合,得到LocalizationEstimate消息。
話題相關
該模塊訂閱和發布的話題可以在配置文件中進行定義,默認配置可參考modules/localization/conf/rtk_localization.pb.txt。
localization_topic: "/apollo/localization/pose" localization_status_topic: "/apollo/localization/msf_status" imu_topic: "/apollo/sensor/gnss/corrected_imu" gps_topic: "/apollo/sensor/gnss/odometry" gps_status_topic: "/apollo/sensor/gnss/ins_stat" broadcast_tf_frame_id: "world" broadcast_tf_child_frame_id: "localization" imu_list_max_size: 20 gps_imu_time_diff_threshold: 0.02 map_offset_x: 0.0 map_offset_y: 0.0 map_offset_z: 0.0注意:該模塊輸入話題/apollo/sensor/gnss/odometry中的Gps消息是在world坐標系下的位置坐標,而輸出話題/apollo/localization/pose的LocalizationEstimate消息是指高精地圖的map坐標系下的位置坐標,兩坐標系之間的轉換關系可通過配置文件中map_offset_x、map_offset_y、map_offset_z進行指定。
另外在建立高精地圖時,也要打開該模塊,通過訂閱/apollo/localization/pose話題來生成高精地圖。此時配置文件中map_offset_x、map_offset_y、map_offset_z定義的是世界坐標系和當前正在建立的高精地圖的map坐標系之間的變換關系。
由于 /apollo/sensor/gnss/odometry話題輸出的world坐標系下的坐標是根據經緯度獲得的,數值較大,因此可以在建圖時通過map_offset_x、map_offset_y、map_offset_z來指定map坐標的原點,不過注意,建圖后定位時map_offset_x、map_offset_y、map_offset_z參數要與建圖時保持一致。
總結
以上是生活随笔為你收集整理的Apollo详解之定位模块——RTK定位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Crazy Mother
- 下一篇: 传说中的服务器