在使用robot_localization
中的狀態估計節點開始之前,用戶必須確保其傳感器數據格式正確,這一點很重要。每種類型的傳感器數據都有各種注意事項,建議用戶在嘗試使用robot_localization
之前完整閱讀本教程。
有關更多信息,建議用戶觀看ROSCon 2015的演示文稿。
1 遵守ROS標準
要考慮的兩個最重要的ROS REP是:
鼓勵不熟悉ROS或狀態估計的用戶閱讀兩個REP,因爲它幾乎肯定會幫助您準備傳感器數據。robot_localization
嘗試儘可能遵守這些標準。
此外,它可能會有益於用戶查看每種受支持的ROS消息類型的規範:
- nav_msgs/Odometry
- geometry_msgs/PoseWithCovarianceStamped
- geometry_msgs/TwistWithCovarianceStamped
- sensor_msgs/Imu
2 座標系和轉換傳感器數據
REP-105指定了四個主要座標系:base_link
,odom
,map
和Earth
。base_link
座標系牢固地固定在機器人上。map
和odom
是固定的世界座標系,其原點通常與機器人的起始位置對齊。Earth
座標系用於爲多個map
座標系(例如,分佈在較大區域的機器人)提供公共參考座標系。earth
座標系與本教程無關。
robot_localization
的狀態估計節點會生成狀態估計,其狀態在map
或odom
座標系中給出,其速度在base_link
座標系中給出。在與狀態融合之前,所有傳入的數據都將轉換爲這些座標系之一。每種消息類型中的數據如下轉換:
- nav_msgs/Odometry:所有位姿數據(位置和方向)都從消息頭的
frame_id
轉換爲world_frame
參數指定的座標系(通常爲map
或odom
)。在消息本身中,這特別是指pose
屬性中包含的所有內容。所有twist
數據(線速度和角速度)都將從消息的child_frame_id
轉換爲base_link_frame
參數(通常爲base_link
)指定的座標系。 - geometry_msgs/PoseWithCovarianceStamped:以與Odometry消息中的pose數據相同的方式處理。
- geometry_msgs/TwistWithCovarianceStamped:以與Odometry消息中的twist數據相同的方式處理。
- sensor_msgs/Imu:儘管ROS社區正在解決IMU消息,但目前存在一些歧義。大多數IMU在固定的世界座標系中報告方向數據,該座標系的X和Z軸分別由指向磁北和地球中心的向量定義,Y軸朝東(與磁北向量偏移90度)。此座標系通常稱爲NED(北,東,下)。但是,REP-103爲室外導航指定了ENU(東,北,上)座標系。在撰寫本文時,
robot_localization
假定所有IMU數據都使用ENU座標系,並且不適用於NED座標系數據。將來可能會有所改變,但就目前而言,用戶應確保將數據轉換爲ENU框架後,再將其與robot_localization
中的任何節點一起使用。
IMU也可以在機器人的“中性”位置以外的其他位置定向。例如,用戶可以將IMU安裝在其側面,或者旋轉IMU使其面對機器人正面以外的方向。通常通過從base_link_frame
參數到IMU消息的frame_id
的靜態轉換來指定此偏移量。robot_localization
中的狀態估計節點將自動校正傳感器的方向,以使其數據與base_link_frame
參數指定的座標系對齊。
3 處理tf_prefix
隨着從ROS Indigo開始向tf2的遷移,robot_localization
仍然允許使用tf_prefix
參數,但是根據tf2,所有frame_id
值的前導”/“都將被去除。
4 每種傳感器消息類型的注意事項
4.1 Odometry
許多機器人平臺都配備了提供瞬時平移和旋轉速度的車輪編碼器。許多人還內部整合了這些速度以生成位置估計。如果您對此數據負責或可以對其進行編輯,請記住以下幾點:
1.Velocities/Poses:robot_localization
可以整合速度或絕對姿態信息。通常,最佳做法是:
- 如果里程計同時提供位置和線速度,請融合線速度。
- 如果里程計同時提供方向和角速度,請融合方向。
注意:如果您有兩個方向數據來源,則需要特別注意。如果兩個方向都具有精確的協方差矩陣,則可以安全地融合方向。但是,如果其中一個或兩個都未報告其協方差,則應僅融合來自更精確傳感器的方向數據。對於另一個傳感器,請使用角速度(如果已提供),或繼續融合絕對方向數據,但是要爲該傳感器打開_differential模式。
2.frame_id:參見上面有關座標系和變換的部分。
3.協方差:協方差值與robot_localization
有關。robot_pose_ekf嘗試在Odometry消息中融合所有pose變量。已經編寫了一些機器人驅動程序來滿足其要求。這意味着,如果給定的傳感器沒有產生某個變量(例如,沒有報告位置Z的機器人),那麼使robot_pose_ekf
忽略它的唯一方法是將其方差膨脹到一個非常大的值(如1000),以便有效地忽略所討論的變量。這種做法既不必要,甚至有害於robot_localization
的性能。例外情況是您有第二個輸入源測量有問題的變量,在這種情況下,協方差將起作用。
注意:有關更多信息,請參見配置robot_localization和從robot_pose_ekf遷移。
4.Signs:遵守REP-103意味着您需要確保數據符號正確無誤。例如,如果您有一個地面機器人,然後逆時針旋轉它,則其偏航角應增加,並且其偏航速度應爲正。如果將其向前推動,則其X位置應增加,並且其X速度應爲正。
5.Transforms:廣播odom->base_link
轉換。當world_frame
參數設置爲配置文件中odom_frame
參數的值時,robot_localization
的狀態估計節點既輸出nav_msgs/Odometry消息中的位置估計,也輸出從其odom_frame
參數指定的座標系到其base_link_frame
參數的轉換。但是,某些機器人驅動程序也會將此測距信息與里程計信息一起廣播。如果用戶希望robot_localization
負責此轉換,則需要禁用其機器人驅動程序對該轉換的廣播。這通常作爲參數公開。
4.2 IMU
除以下內容外,請務必閱讀上述有關座標系和IMU數據轉換的部分。
1.遵守規範:與odometry一樣,請確保您的數據符合REP-103和sensor_msgs/Imu規範。仔細檢查數據符號,並確保frame_id
值正確。
2.協方差:遵循odometry的建議,請確保您的協方差有意義。不要使用較大的值來使濾波器忽略給定的變量。將您要忽略的變量的配置設置爲false
。
加速度:注意加速度數據。robot_localization
中的狀態估計節點假定放置在平面上其中立的右側向上位置的IMU將:
- Measure +9.81 meters per second squared for the Z axis.
- If the sensor is rolled +90 degrees (left side up), the acceleration should be +9.81 meters per second squared for the Y axis.
- If the sensor is pitched +90 degrees (front side down), it should read -9.81 meters per second squared for the X axis.
4.3 PoseWithCovarianceStamped
請參閱Odometry。
4.4 TwistWithCovarianceStamped
請參閱Odometry。
5 常見錯誤
- 輸入數據不符合REP-103。確保所有值(尤其是方向角度)在正確的方向上增加或減少。
- 不正確的
frame_id
值。應當在base_link_frame
參數給定的座標系中報告速度數據,或者應該在速度數據的frame_id
和base_link_frame
之間進行轉換。 - 協方差誇大。在測量中忽略變量的首選方法是通過
odomN_config
參數。 - 缺少協方差。如果已配置給定傳感器以將給定變量融合到狀態估計節點中,則該值的方差(即位置處的協方差矩陣值,其中是該變量)不應爲0。如果正在融合的變量遇到方差值0,則狀態估算節點將爲該值添加一個小的epsilon值(1e-6)。更好的解決方案是讓用戶適當設置協方差。