robot_localization(2):準備數據

在使用robot_localization中的狀態估計節點開始之前,用戶必須確保其傳感器數據格式正確,這一點很重要。每種類型的傳感器數據都有各種注意事項,建議用戶在嘗試使用robot_localization之前完整閱讀本教程。

有關更多信息,建議用戶觀看ROSCon 2015的演示文稿

1 遵守ROS標準

要考慮的兩個最重要的ROS REP是:

  • REP-103(標準計量單位和座標約定)
  • REP-105(座標系約定)

鼓勵不熟悉ROS或狀態估計的用戶閱讀兩個REP,因爲它幾乎肯定會幫助您準備傳感器數據。robot_localization嘗試儘可能遵守這些標準。

此外,它可能會有益於用戶查看每種受支持的ROS消息類型的規範:

2 座標系和轉換傳感器數據

REP-105指定了四個主要座標系:base_linkodommapEarthbase_link座標系牢固地固定在機器人上。mapodom是固定的世界座標系,其原點通常與機器人的起始位置對齊。Earth座標系用於爲多個map座標系(例如,分佈在較大區域的機器人)提供公共參考座標系。earth座標系與本教程無關。

robot_localization的狀態估計節點會生成狀態估計,其狀態在mapodom座標系中給出,其速度在base_link座標系中給出。在與狀態融合之前,所有傳入的數據都將轉換爲這些座標系之一。每種消息類型中的數據如下轉換:

  • nav_msgs/Odometry:所有位姿數據(位置和方向)都從消息頭的frame_id轉換爲world_frame參數指定的座標系(通常爲mapodom)。在消息本身中,這特別是指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/Posesrobot_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-103sensor_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_idbase_link_frame之間進行轉換。
  • 協方差誇大。在測量中忽略變量的首選方法是通過odomN_config參數。
  • 缺少協方差。如果已配置給定傳感器以將給定變量融合到狀態估計節點中,則該值的方差(即位置(i,i)(i,i)處的協方差矩陣值,其中ii是該變量)不應爲0。如果正在融合的變量遇到方差值0,則狀態估算節點將爲該值添加一個小的epsilon值(1e-6)。更好的解決方案是讓用戶適當設置協方差。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章