Odometry是一個位置偵測的系統,可以用來計算機器在場地上的座標位置
定義座標系統
在計算位置時,必須先有一套座標系統。在此設定做表的原點在場地俯視圖的左上角,而 x 隨著機器往右提升,y隨著機器往下提升。
定義變數
計算機器面相角度變化
再把兩個算式簡化,得到:
最後得到機器面向角度變化:
計算local座標變化
我們可以把 local y 座標的變化定義為從起始點到機器最後位置畫出直線的長度,可以用此公式計算:
同樣的,也可以用此公式計算local x的變化:
轉換到Global座標
最後用旋轉矩陣轉換到Global:
演算法
計算機器面向角度變化,和機器的面向角度(如果有Inertial Sensor,可以直接讀值,並計算角度變化)
如果角度變化為零,則 local y 變化為左輪、右輪的角度變化;local x 變化為橫向輪角度變化。否則,以 計算local座標變化 計算 local 座標變化
把 local 座標變化轉換為 global 座標變化
把 global 座標變化加起來,得到機器位置座標
注意事項
這個演算法必須在while loop裡跑,但是不能影響到機器主程序,所以也要把它放在一個獨立執行的Task裡。
此算法一個迴圈能在一秒內跑越多次越好(盡量達到 50~100次)
ΔS:橫向輪子的角度變化(假設此輪在車後)
Δθ:機器的面相角度變化
Δxlocal:local x座標變化
Δylocal:local y座標變化
Δxglobal:global x座標變化
Δyglobal:global y座標變化
角度的變化量會直接影響到後續計算的座標變化。如果機器有裝角度感應器,如Inertial Sensor,就可以用感應器讀到的值算角度變化。如果沒有,就需要靠左右輪計算。設 r 為機器的旋轉半徑,可以用扇形公式得到左右輪的角度變化:
ΔL=(r+sL)Δθ ΔR=(r−sR)Δθ
ΔθΔL=r+sL ΔθΔR=r−sR
r=ΔθΔL−sL=ΔθΔR+sR
ΔL−sLΔθ=ΔR+sRΔθ
ΔL−ΔR=(sL+sR)Δθ
Δθ=sL+sRΔL−ΔR
Δylocal=(ΔθΔR+sR)(2sin(21Δθ)) Δxlocal=(ΔθΔS+sS)(2sin(21Δθ)) Δxglobal=Δylocal⋅cos(θ−21Δθ)−Δxlocal⋅sin(θ−21Δθ) Δyglobal=Δylocal⋅sin(θ−21Δθ)+Δxlocal⋅cos(θ−21Δθ)