robot_localization(3):配置

將傳感器數據合併到robot_localization的任何狀態估計節點的位置估計中時,重要的是要提取儘可能多的信息。本教程詳細介紹了傳感器集成的最佳實踐。

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

1 傳感器配置

即使所討論的消息類型在配置向量中不包含某些變量(例如,雖然<<MsgLink(geometry_msgs/TwistWithCovarianceStamped)>>缺少任何位姿數據,但是配置向量仍然具有位姿變量的值),所有傳感器的配置向量格式也相同。未使用的變量將被忽略。

注意:配置矢量在輸入消息的frame_id中給出。例如,考慮一個速度傳感器,該傳感器會生成一個geometry_msgs/TwistWithCovarianceStamped消息,其frame_idvelocity_sensor_frame。在此示例中,我們假設存在一個從velocity_sensor_frame到機器人的base_link_frame(例如base_link)的轉換,並且該轉換會將Velocity_sensor_frame中的X速度轉換爲base_link_frame中的Z速度。爲了將來自傳感器的X速度數據包括到濾波器中,配置矢量應將X速度值設置爲true,而不是Z˙速度值:

<rosparam param="twist0_config">[false, false, false,
                                 false, false, false,
                                 true,  false, false,
                                 false, false, false,
                                 false, false, false]</rosparam>

注意:布爾值的順序是:
(X,Y,Z,roll,pitch,yaw,X˙,Y˙,Z˙,roll˙,pitch˙,yaw˙,X¨,Y¨,Z¨)(X,Y,Z,roll,pitch,yaw,X˙,Y˙,Z˙,roll˙,pitch˙,yaw˙,X¨,Y¨,Z¨)。

2 以2D運行?

配置傳感器時,首先要做出的決定是機器人是否在平面環境中運行,並且您可以忽略IMU可能報告的接地平面變化的細微影響。如果是這樣,請將two_d_mode參數設置爲true。這樣可以有效地將每次測量中的3D位姿變量歸零,並強制將其融合到狀態估計中。

3 融合不可測變量

讓我們從一個例子開始。假設您有一個在平面環境中工作的輪式非完整機器人。您的機器人有一些車輪編碼器,用於估算瞬時X速度以及絕對姿態信息。此信息在nav_msgs/Odometry消息中報告。此外,您的機器人還有一個IMU,可以測量轉速,車輛姿態和線性加速度。其數據在sensor_msgs/Imu消息中報告。當我們在平面環境中操作時,我們將two_d_mode參數設置爲true。這將自動將所有3D變量清零,例如Z,roll,pitch,它們各自的速度和Z加速度。我們從以下配置開始:

<rosparam param="odom0_config">[true, true, false,
                                false, false, true,
                                true, false, false,
                                false, false, true,
                                false, false, false]</rosparam>

<rosparam param="imu0_config">[false, false, false,
                               false, false, true,
                               false, false, false,
                               false, false, true,
                               true, false, false]</rosparam>

作爲第一步,這是有道理的,因爲平面機器人只需要關注:
X,Y,X˙,Y˙,X¨,Y¨,yaw,yaw˙X , Y, X˙, Y˙, X¨, Y¨, yaw, yaw˙。但是,這裏有一些注意事項。

1.對於odom0,我們包括X和Y(在世界座標系中報告),yaw,X˙(在本體座標系中報告)和yaw˙。但是,除非您的機器人在內部使用IMU,否則很可能僅使用車輪編碼器數據來生成其測量值。因此,它的速度,航向和位置數據都是從同一源生成的。在這種情況下,我們不想使用所有值,因爲您要將重複的信息輸入到過濾器中。相反,最好只使用速度:

<rosparam param="odom0_config">[false, false, false,
                                false, false, false,
                                true, false, false,
                                false, false, true,
                                false, false, false]</rosparam>

<rosparam param="imu0_config">[false, false, false,
                               false, false, true,
                               false, false, false,
                               false, false, true,
                               true, false, false]</rosparam>

2.接下來,我們注意到我們沒有融合Y˙。乍一看,這是正確的選擇,因爲我們的機器人無法瞬時向側面移動。但是,如果nav_msgs/Odometry消息報告Y˙的值爲0(並且Y˙的協方差未誇大爲大值),則最好將該值提供給濾波器。由於在這種情況下,測量值0表示機器人無法朝該方向移動,因此它可以作爲完美的有效測量值:

<rosparam param="odom0_config">[false, false, false,
                                false, false, false,
                                true, true, false,
                                false, false, true,
                                false, false, false]</rosparam>

<rosparam param="imu0_config">[false, false, false,
                               false, false, true,
                               false, false, false,
                               false, false, true,
                               true, false, false]</rosparam>

您可能想知道爲什麼我們出於同樣的原因不融合Z˙速度。答案是我們將two_d_mode設置爲false時所做的。如果沒有的話,實際上我們可以將Z˙速度的0測量值融合到濾波器中。

3.最後,我們來到IMU。您可能會注意到,我們已將Y¨設置爲false。這是由於以下事實:許多系統,包括我們在此討論的假設系統,都不會經歷瞬時Y加速。但是,IMU可能會報告Y加速度的非零,嘈雜值,這可能會導致您的估計快速漂移。

4 微分和相對參數

robot_localization中的狀態估計節點允許用戶融合任意數量的傳感器。這允許用戶使用多個源來測量某些狀態向量變量,尤其是位姿變量。例如,您的機器人可能會從多個IMU獲得絕對方向信息,或者它可能具有多個提供其絕對位置估計值的數據源。在這種情況下,用戶有兩個選擇:

1.照原樣融合所有絕對位置/方向數據,例如:

<rosparam param="imu0_config">[false, false, false,
                               true,  true,  true,
                               false, false, false,
                               false, false, false,
                               false, false, false]</rosparam>

<rosparam param="imu1_config">[false, false, false,
                               true,  true,  true,
                               false, false, false,
                               false, false, false,
                               false, false, false]</rosparam>

在這種情況下,用戶應該非常小心,並確保正確設置每個測量方向變量的協方差。如果每個IMU公佈的偏航方差例如爲:math:0.1,但IMU的偏航測量值之間的差異爲:math:>0.1,則濾波器的輸出將在兩者之間來回振盪。每個傳感器提供的值。用戶應確保每次測量周圍的噪聲分佈重疊。

2.或者,用戶可以使用_differential參數。通過將給定傳感器的此值設置爲true,可以通過計算兩個連續時間步長之間的測量值變化,將所有位姿(位置和方向)數據轉換爲速度。然後將數據融合爲速度。再次提醒您,使用者應注意:合併絕對測量值(尤其是IMU)時,如果測量值對於給定變量具有靜態或不增加的方差,則估計協方差矩陣中的方差將是有界的。如果將該信息轉換爲速度,則在每個時間步長處,估計將獲得少量誤差,並且所討論變量的方差將無限制地增長。對於位置(X,Y,Z)信息,這不是問題,但是對於方向數據,則是一個問題。例如,一段時間後,機器人繞其環境移動並在X方向上累積1.5米的誤差是可以接受的。如果同一個機器人四處走動並在偏航中累積1.5弧度的誤差,那麼當機器人繼續向前行駛時,其位置誤差將爆炸。

_differential參數的一般經驗法則是,如果給定機器人只有一個方向數據源,則應將_differential參數設置爲false。如果有N個源,用戶可以將N-1個參數的_differential參數設置爲true,或者僅確保協方差值足夠大以消除振盪。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章