Madgwickフィルタでクォータニオンを推定する
Madgwickフィルタでクォータニオンを推定します。 加速度とジャイロを使ったMadgwickフィルタと,地磁気を考慮したMadgwickフィルタの2つを考えます。
An efficient orientation filter for inertial and inertial/magnetic sensor arraysを参考にしています。
MadgwickフィルタはKalmanフィルタに比べて高速,同程度以上の高精度の推定が可能なフィルタです。また,低周波での動作も可能です。
1. 加速度とジャイロを用いる場合
1.1 クォータニオン
クォータニオンの表記には以下を用います。 ABˆq=[q1q2q3q4]=[cosθ−rxsinθ−rysinθ−rzsinθ]
共役クォータニオンは ABˆq∗=[q1−q2−q3−q4]
と表され,Avの空間回転は Bv=ABˆq⊗Av⊗ABˆq∗ となります。
1.2 角速度からクォータニオンの算出
角速度ベクトルを Sω=[0ωxωyωz]
とするとクォータニオンの時間変化はテンソル積を用いて
SE˙q=12SEˆq⊗Sω
と表されます。Madgwickフィルタでは1時刻前のクォータニオンと角速度のテンソル積をとります。
SE˙qω,t=12SEˆqest,t−1⊗Sωt
角速度を用いてクォータニオンを求める場合は積分をします。
SEqω,t=SEˆqest,t−1+SE˙qω,tΔt
1.3 加速度からクォータニオンの算出
地球座標系(E)での重力加速度は既知であり,この重力加速度のベクトルにクォータニオンによる回転を施せばセンサ座標系での重力加速度ベクトルSEˆq∗⊗Eˆg⊗SEˆqが求まります。
ですが,センサ座標系(S)で計測される重力加速度Sˆaの間には誤差fgが生まれます。Madgwickフィルタではこの誤差を最小化するような最適化問題を考えます。 min fg(SEˆq,Sˆa)
fg(SEˆq,Sˆa)=SEˆq∗⊗Eˆg⊗SEˆq−Sˆa=[2(q2q4−q1q3)−ax2(q1q2+q3q4)−ay2(12−q22−q23)−az]Eˆg=[0001],Eˆa=[0axayaz]
この最適化問題の解法として勾配降下法を用いています。
SEqk+1=SEˆqk−μt∇fg||∇fg||
∇fg=JTg(SEˆqest,t−1)fg(SEˆqest,t−1,Sˆat)
Jg(SEˆq)=[−2q32q4−2q12q22q22q12q42q30−4q2−4q30]SEq∇,t=SEˆqest,t−1−μt∇fg||∇fg||
最適なμtについては以下の通りです。 このμtはSEq∇,tの収束率をSE˙qω,tの大きさで制限することによって,勾配降下法におけるオーバーシュートを避けることができます。 αは加速度や地磁気に含まれるノイズの大きさによって変えるようです。 μt=α||SE˙qω,t||Δt,α>1
1.4 フィルタフュージョン
相補フィルタのような形で勾配降下法から得られたクォータニオンと角速度から得られたクォータニオンを合わせます。それぞれのフィルタの時定数が角速度から求まるクォータニオンの時間微分の大きさによって変化するイメージです。パラメータβについては明確な最適値があります。βが大きいとジャイロドリフトを抑えられるが,小さいと勾配降下法の大きなステップによるノイズを抑えられるというトレードオフの関係もあります。 SEˆqest,t=γt SEˆq∇,t+(1−γt)SEqω,t
γt=βμtΔt+β=βα||SE˙qω,t||+β
γtについて微小な部分を無視すると
SEˆqest,t≈βΔtμtSEˆq∇,t+(1−0)SEqω,t=SEˆqest,t−1+(SE˙qω,t−β∇fg||∇fg||)Δt
となります。
ブロック図は以下のようになります。
2. 地磁気も考慮する場合
2.1 加速度と地磁気からクォータニオンを算出
地磁気から得られる値を考慮した上で最小化問題に加え,同様に勾配降下法を解きます。
Sˆm=[0mxmymz]
Sˆht=[0hxhyhz]=SEˆqest,t−1⊗Sˆmt⊗SEˆq∗est,t−1
Eˆbt=[0bx0bz]=[0√h2x+h2y0hz]
fb(SEˆq,Eˆb,Sˆm)=[2bx(12−q23−q24)+2bz(q2q4−q1q3)−mx2bx(q2q3−q1q4)+2bz(q1q2+q3q4)−my2bx(q1q3+q2q4)+2bz(12−q22−q23)−mz] Jb(SEˆq,Eˆb)=[−2bzq32bzq4−4bxq3−2bzq1−4bxq4+2bzq2−2bxq4+2bzq22bxq3+2bzq12bxq2+2bzq4−2bxq1+2q32bxq32bxq4−4bzq22bxq1−4bzq32bxq2] fg,b(SEˆq,Sˆa,Eˆb,Sˆm)=[fg(SEˆq,Sˆa)fb(SEˆq,Eˆb,Sˆm)] Jg,b(SEˆq,Eˆb)=[JTg(SEˆq)JTb(SEˆq,Eˆb)]SEqk+1=SEˆqk−μt∇fg,b||∇fg,b||
∇fg,b=JTg,b(SEˆqest,t−1,Eˆbt)fg,b(SEˆqest,t−1,Sˆat,Eˆbt,Sˆmt)
2.2 角速度のオフセット補償
1時刻前の共役クォータニオンと勾配に直交するベクトルとのテンソル積をとって積分し,適当なパラメータζをかけてその時刻でのオフセットとします。 Sωϵ,t=2SEˆq∗est,t−1⊗∇fg,b||∇fg,b||
Sωb,t=ζ∑tSωϵ,tΔt
Sωc,t=Sωt−Sωb,t
SE˙qω,t=12SEˆqest,t−1⊗Sωc,t
SEqω,t=SEˆqest,t−1+SE˙qω,tΔt
2.4 フィルタフュージョン
加速度とジャイロを用いた場合と同様に考えます。 SEˆqest,t≈SEˆqest,t−1+(SE˙qω,t−β∇fg,b||∇fg,b||)Δt
ブロック図は以下のようになります。
3. 実践する
プロペラを用いた倒立振子の製作の姿勢推定に用いました。