【倒立振子part13】カルマンフィルタで角度導出

前回は角速度と角加速度から角度の導出を行った。
その際にそれぞれデメリットがあるため改善のためにカルマンフィルタの導入する。
今回カルマンフィルタを導入するにあたり「トラ技2019/7月」を元にまとめていく。
(過去、倒立振子を作ろうと断念して放置してあった。。。)

カルマンフィルタとは

カルマンフィルタとは簡単にはセンサの測定値から誤差を取り除いて真値を推定する計算する方法のことである。
ジャイロセンサで角度を取得するためのカルマンフィルタは下記のようなイメージである。
(加速度センサとジャイロセンサから得られる測定値は正規分布に従うとする。)

測定した値のほかに真の角度が従うモデルから推定値を確立統計的に求める手法のことである。

状態空間モデル

上の図でもあるが測定した角度のほかに真の角度が従うモデル(状態空間モデル)を作る必要がある。

角度、角速度、角速度オフセットの関係式

ある時刻kでの傾斜角\theta_k、角速度\omega_k、角速度オフセット\omega_{offset}が分かっているとする。
角速度オフセットは時間によらず一定であるとするとセンサが静止している状態で平均から算出できるとする。
この時の関係式は
\theta_{k+1}=\theta_k+(\omega_k-\omega_{offset})\Delta{t}
\omega_{offset}(k+1)=\omega_{offset}(k)

状態方程式

上式を角度\theta_kと角速度オフセット\omega_{offset}状態ベクトルとした状態方程式の形に変形すると
\displaystyle{\left(\begin{array}{c}\theta_{k+1}\\ \omega_{offset}\end{array}\right)=\begin{pmatrix}1 & -\Delta{t} \\0 & 1 \end{pmatrix}\left(\begin{array}{c}\theta_k\\ \omega_{offset}\end{array}\right)+\left(\begin{array}{c}\Delta{t}\\ o\end{array}\right)\omega_k}
となる。
この時ジャイロセンサから得られる角速度\omega_kが角度を求めるための入力であると考えられる。

観測方程式

状態ベクトル\theta_kは加速度センサから求めることができるが、角速度オフセットについては時間ごとに直接求めることはできないため観測方程式は
\displaystyle{\theta_k=(1 0)\left(\begin{array}{c}\theta_k\\ \omega_{offset}\end{array}\right)}
となる。

以上より、ある時刻kの加速度センサから得られる傾斜角\theta_kとジャイロセンサから得られる角速度\omega_kによって、次の時刻の傾斜角\theta_{k+1}が求めることができる状態空間モデルが作成できた。

アルゴリズム

ここからは確率統計学についての理解が乏しく深くは理解できなかったが、
①加速度センサから傾斜角を取得
②取得した傾斜角の補正から現時点の推定
③状態空間モデルから次時点の傾斜角を予測
という流れでアルゴリズムが回っている。

②では「前時点での状態空間モデルから得られたモデル予測値」と「センサ測定値」をカルマンゲインを用いて重みを決めて推定しており、そのカルマンゲインを決めるために角速度と加速度センサから得られるデータの分散を使用している。

プログラム

トラ技にもサンプルプログラムがあったが長すぎるため簡単にできるものがないか探してみたところ、下記にてモジュール化されているプログラムが見つかった。
github.com
また実際に使用されているサイトを参考にさせていただいた。
shiker.hatenablog.com

実測

加速度センサとジャイロセンサから算出した角度とカルマンフィルタにて補正した角度の比較の実測は下図となった。

カルマンフィルタによって、ジャイロセンサによるドリフト及び加速度センサによるノイズを含まない角度の取得ができた。
今後はこの方法で得られた角度で倒立振子の制御を行う。

次回

本体の設計と製作を行う。