跳轉到內容

Khepera III 工具箱/示例/里程計校準

來自華夏公益教科書

在本教程中,您將學習如何校準機器人的里程計。有各種方法可以校準差速驅動機器人的里程計。我們這裡展示的程式也許不是最精確的,但它肯定是最簡單的方法之一,可以快速獲得不錯的校準值。

里程計概述

[編輯 | 編輯原始碼]

您的 Khepera III 機器人配備了兩個直流電機,每個電機都帶有一個編碼器。這些編碼器允許以非常小的增量(~ 2760 步對應一個輪子的轉動)獲得機器人的當前位置。透過記錄輪子是如何轉動的,就可以估計機器人的軌跡。此過程通常被稱為里程計(或使用里程計進行位置估計),並在odometry_track程式中實現。

此過程的主要問題是誤差累積。在每一步(每次您進行編碼器測量時),位置更新都會涉及一些誤差。此誤差會隨著時間的推移而累積,因此會使長距離(> 10 米)上的準確跟蹤變得不可能。然而,在短距離(< 1 米,在平坦表面上),里程計可以提供非常精確的結果。

為了獲得這些良好的結果,校準機器人至關重要。車輪直徑的微小差異(~ 1 微米)會在幾米後導致重大誤差,如果它們沒有被正確地考慮在內。請注意,每個機器人(如果您有多個)都必須單獨校準,最好是在它之後將要使用的同類型的地板上。

啟動 Khepera III 機器人,並確保它透過 WLAN 連線到您的計算機。在下文中,我們假設您使用的是機器人 203。

您將需要幾個電機程式和odometry_goto程式來進行校準。使用以下命令將這些程式複製到您的機器人上:

cd Programs
k3put +203 motor* odometry_goto

登入機器人(k3go +203)並初始化電機

cd your_username
./motors_initialize

您現在已準備好校準機器人的里程計。

里程計校準

[編輯 | 編輯原始碼]

在差速驅動系統中,有 3 個自由引數需要知道才能使用里程計估計位置:

  • 左輪的每個增量距離(轉換因子)。
  • 右輪的每個增量距離(轉換因子)。
  • 兩個輪子之間的距離(軸長)。

由於這些引數很難直接測量,因此我們將改為測量 4 個引數,這些引數可以讓我們推匯出上述引數。這 4 個引數按測量順序排列如下:

  1. increments_per_tour:每個輪轉數的增量數。
  2. axis_wheel_ratio:軸長與平均車輪直徑的比率。
  3. diameter_leftdiameter_right:兩個車輪的直徑,以縮放因子為單位。(實際上,是兩個車輪直徑之間的比率 - 這就是為什麼這兩個值只算作一個引數。)
  4. scaling_factor:一個縮放因子。

然後可以按如下方式推匯出必要的引數:

distance_per_increment_left = wheel_diameter_left * scaling_factor * 2 * PI / increments_per_tour
distance_per_increment_right = wheel_diameter_right * scaling_factor * 2 * PI / increments_per_tour
axis_length = axis_wheel_ratio * (wheel_diameter_left + wheel_diameter_right) / 2 * scaling_factor

這些方程在calibration.pl中實現,它將建立一個校準檔案並將其上傳到機器人上。

步驟 1:每輪轉數的增量

[編輯 | 編輯原始碼]

每個輪轉數的增量數是一個常數,僅取決於使用的編碼器和齒輪箱。對於 Khepera III 機器人,此值為 2764.8(4 * 16 * 1.6 * 27)。

您可以透過在輪子上標記一個點,然後讓它們移動這個增量數來實驗驗證這個數字:

./motor_setposition 0 0
./motor_gotoposition 2765 2765

您的標記應該正好回到同一個位置。

步驟 2:軸長與車輪直徑的比率

[編輯 | 編輯原始碼]

軸長和車輪直徑只能用標準測量工具進行近似測量。但是,它們的比率可以透過讓機器人原地旋轉並計算步數來非常精確地測量。此步數除以 2764.8 直接得到我們正在尋找的比率。當然,為了獲得更精確的值,我們將讓機器人進行多次旋轉。

根據使用尺子的粗略測量,我們知道這個比率大約為 2.11(88.5 毫米 / 42 毫米),因此讓我們從這個值開始,讓機器人原地旋轉 10 次。為此,位置值將為

10 * 2.11 * 2764.8 = 58337.28

將機器人放在地上,標記其方向,然後輸入

./motor_setposition 0 0
./motor_gotoposition -p 58337 -58337

-p 選項將啟用梯形速度曲線。機器人停止後,它的方向應該幾乎與開始時相同,但很可能會有幾度的偏差。透過調整位置值,使其方向完全相同(只要您能用肉眼判斷出來)。一旦您找到了一個好的值(假設為 58255),只需反向計算即可找出比率:

58255 / (10 * 2764.8) = 2.1070

如果您想獲得更精確的值,可以重複上述實驗,進行 100 次旋轉。

步驟 3:車輪直徑

[編輯 | 編輯原始碼]

為了實驗找出兩個車輪之間的直徑差異,我們將載入當前的里程計模型到機器人上,然後讓它在您的場地周圍移動,同時跟蹤它的位置。最後,我們讓機器人移動回它認為的起點,並記錄與真實初始位置的偏移量。

首先,我們需要上傳當前的里程計值。編輯calibration.pl並執行它:

./calibration.pl

如果在此指令碼中設定了機器人的 IP 地址,它將把里程計值上傳到機器人上。(請注意,任何現有里程計值都將被無情地覆蓋。)否則,您必須自己編輯機器人上的/etc/khepera/odometry檔案。

您在開頭上傳的odometry_goto程式現在將使用這些值來跟蹤位置。將機器人放在一個開放區域,周圍至少有 1 米的空間,標記其位置,然後輸入

./odometry_goto position 1 0 1 1 0 1 0 0

機器人現在將移動到一個寬度為 1 米的正方形的所有角點,因此將覆蓋大約 4 米的距離。最後,機器人認為它回到了初始位置(儘管方向不同),但很可能偏離了 30 釐米。比較最終位置和初始位置(忽略方向),然後按如下方式調整車輪直徑差異:

  • 如果機器人位於其初始位置的右側(即正方形沒有閉合),則透過增加calibration.pl中的wheel_diameter_difference來增加右輪的直徑。
  • 如果機器人位於其初始位置的左側,則透過減少calibration.pl中的wheel_diameter_difference來增加左輪的直徑。

然後,上傳新的里程計值並重復此步驟,直到初始位置和最終位置之間的距離小於 5 釐米。如果您有足夠的空間,可以增加矩形的尺寸以獲得更精確的測量結果。

步驟 4:縮放因子

[編輯 | 編輯原始碼]

縮放因子同樣很容易找出。將機器人放在您的地板上,它前面有一個 1 米的開放區域,標記其初始位置,然後輸入

./odometry_goto position 1 0

機器人將停在初始位置前大約 1 米處。用捲尺精確測量該距離,然後按如下方式計算相應的縮放因子:

scaling_factor = real_distance / 1 m

當然,如果您有足夠的空間,可以選擇更長的距離。

調整calibration.pl中的縮放因子,並再次執行該指令碼,將最新的里程計校準值上傳到機器人上。您的機器人現在已校準!

華夏公益教科書