robot_localization中的傳感數據準備
開始state estimation nodes 之前需要確保傳感數據已經準備完畢雁竞,傳感數據類型繁多嗡综,建議用戶在使用robot_localization之前閱讀本教程
更多信息參見2015 ROSC presentation 笔宿。
1. 遵循ROS規(guī)范
兩個重要的ROS規(guī)范:
REP-103 (Standard Units of Measure and Coordinate Conventions)
REP-105 (Coordinate Frame Conventions).
新手建議閱讀兩個規(guī)范,這會幫助準備傳感數據柒瓣。robot_localization盡可能使用這些標準扮匠,同樣可以看一下下面的ROS消息格式。
nav_msgs/Odometry
geometry_msgs/PoseWithCovarianceStamped
geometry_msgs/TwistWithCovarianceStamped
sensor_msgs/Imu
2. 坐標系與傳感數據變換
REP-103 指定三個基本坐標系: map, odom, and base_link. map 和 odom 坐標系是全局類的坐標系锋喜,與機器人起始位置相關些己, base_link 坐標系是機器本體固有坐標系豌鸡。在 robot_localization所有估計節(jié)點中, 數據融合過程中將所有傳感數據轉換到一個坐標系中進行融合段标。數據類型如下可見:
nav_msgs/Odometry -所有傳感信息從傳感器消息頭的ID坐標系轉換到全局內坐標系涯冠,通常是map 或者 odom。這個轉換使用與包含姿態(tài)數據的所有消息數據逼庞,而所有twist數據(線速度和角速度)將會轉換到 base_link坐標系蛇更。
geometry_msgs/PoseWithCovarianceStamped - 與Odometry數據類似,處理pose姿態(tài)數據
geometry_msgs/TwistWithCovarianceStamped - 與Odometry數據類似赛糟,處理twist速度數據
sensor_msgs/Imu - IMU 消息 定義有一些含糊派任,大部分IMU只是廣播世界坐標系的朝向角度,它的x朝地磁北極璧南,y朝向地磁東掌逛,與NED (North, East, Down)朝向類似。然而, REP-103 定義是 ENU (East, North, Up)坐標系作為室外導航穆咐。本文中假定所有IMU傳感器為ENU坐標系而不用NED. 這不是固定了颤诀,但是現在是按照此規(guī)則作坐標變換字旭。
IMU也可以按照機器人某個方向做基準而不是使用‘參考’位置对湃。例如,用戶可以將IMU固定在邊上遗淳,或者旋轉使其與前進方向一致拍柒。這個偏移通常靜態(tài)的定義為base_link_frame到IMU傳感frame_id的坐標變換。狀態(tài)估計節(jié)點將自動校正傳感器方向使其與機器人坐標系一致屈暗。
2.1 Handling tf_prefix
在ros-indigo數據遷移到 tf2 中, robot_localization允許使用 tf_prefix前綴參數拆讯,但與 tf2一致,所有坐標系以 '/' 開頭
3.傳感器msg類型介紹
3.1 Odometry里程計
許多機器人平臺具有編碼器采集車輪轉速,再通過轉速估計位姿养叛,當生成里程計信息時种呐,注意下面的事項:
Velocities/Poses: robot_localization可以整合速度和位姿型號,實際上最好的方式是:當里程計型號提供位姿和線速度弃甥,融合線速度爽室。當里程計提供朝向和角速度,融合朝向淆攻。警告:當具有兩種類型的朝向數據時阔墩,需要小心融合,當兩個都產生精確的協(xié)方差矩陣時融合起來較為可靠瓶珊。然而啸箫,當其中一個信息不全,則融合其中較為精確的測量伞芹。對于其他傳感器忘苛,使用角速度融合朝向角,這時需要開啟 _differential模式。
frame_id: 見之前文章中關于坐標系和坐標變換的章節(jié)扎唾。
Covariance: 協(xié)方差值 robot_pose_ekf 將所有位姿融合在一個里程計信息里蜀肘。 它在ROS的狀態(tài)估計、融合工作包中廣泛使用稽屏,許多機器人驅動按照它的需要提供支持扮宠。這意味著當一個傳感器不產生某個變量 (e.g., 機器人不產生 Z 位姿), 唯一的生產 robot_pose_ekf的方式就是忽略它將協(xié)方差設置為非常大(10^3) 。故而變量被忽略狐榔。這種不是不是必要坛增,同時可以影響 robot_localization的表現,這個可以通過另一個傳感器采集數據來補償薄腻。
參見 Best Practices for Sensor Integration 和 Migration from robot_pose_ekfSigns: 按照 REP-103收捣,需要確認 傳感器的 signs 是正確的*。例如庵楷,有一個平面機器人操作逆時針轉罢艾,這時yaw應該 增加,, yaw速度應該為 正. 當前進時尽纽,x應該增加咐蚯,x的速度為正。
Transforms: 廣播 odom->base_link 變換.當世界坐標系設定為odom坐標系時, robot_localization的狀態(tài)估計節(jié)點輸出 nav_msgs/Odometry 的位姿估計和odom到base_link的坐標變換弄贿。然而春锋,一些機器人驅動也隨里程計變化廣播坐標變換, 如果要robot_localization的坐標變換具有較高置信度差凹,需要關閉驅動的廣播期奔。這個可以通過參數控制。
3.2 IMU
Adherence to specifications: 需要按照 REP-103 和sensor_msgs/Imu 格式發(fā)布危尿,同時確保frame_id正確呐萌。
Covariance:與里程計相似,確保協(xié)方差的正確谊娇。不要使用較大的協(xié)方差數字來忽略一個變量肺孤,而應該將變量設置為false.
Acceleration: 小心使用加速度信息,要考慮重力加速度的作用邮绿,z軸應該 +9.81
當翻轉了90度渠旁,想相應朝向應該加上加速度。
3.3 PoseWithCovarianceStamped
見里程計章節(jié)
3.4 TwistWithCovarianceStamped
見里程計章節(jié)
4. 常見錯誤
輸入數據不依照REP-103船逮。確保所有值方向為正向顾腊,這個在IMU中最為重要。
錯誤的frame IDs挖胃。例如杂靶,GPS給出的UTM數據用 nav_msgs/Odometrymsg梆惯,那它的坐標系不能是base_link or base_footprint. 同樣速度信息不應該是base_link_frame,應該需要一個由速度坐標系到本體坐標系的轉換吗垮。這是第二大重點問題.
Inflated covariances協(xié)方差過大. 最好的忽略一個參數的方式是配odomN_config參數垛吗。
Missing covariances. 當融合一個傳感器到一個估計變量時,協(xié)方差(i.e., the covariance matrix value at position (i, i), where i is the index of that variable) 不應該是 0. 當協(xié)方差中出現0值烁登,程序會加一個極小的數(1e-6) 最好的解決方式就是合理配置協(xié)方差怯屉。