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