くり込み法による幾何学推定と磁気センサのSoft-Iron Offset補正 (2軸)
磁気センサはHard-Iron offsetとSoft-Iron offsetの2種類のオフセットが載った状態で出力されます.
Hard-Iron offsetは補正しないと使い物にならないので補正の話は山のように出てきます.
一方でSoft-Iron offsetの補正は細かいアルゴリズムがなかなか話に出てきません.出てこないので自前でアルゴリズムを作ってみました.ついでにせっかくなのでブログのネタにしました.
中身のレベルとしては基本的な補正のみなので,補正したいだけの場合は既存のライブラリ探して使ったほうがたぶん性能は良いです.ここに書いてるのは勉強用ってことで.
目次
やったこと
- 磁気センサのSoft-Iron offset補正
- 2軸・平面回転での動作を前提
- 初期化プロセスで収集した十分な数のサンプリング点を基にオフセット補正パラメータを計算
- 動的なキャリブレーションはとりあえず考えない
キャリブレーションの流れ
- センサを平面回転させて十分な量のサンプリング点を収集
- サンプリング点に対して楕円でフィッティング(幾何学的推定)
- フィッティング結果から楕円パラメータを求める
- 楕円パラメータを基にオフセット補正パラメータに変換
- 以降はサンプリング毎に補正が可能
磁気センサそのもののお話
大体↓にまとまってます.神ですね. myenigma.hatenablog.com
磁気センサ
- センサ周囲の磁気強度を測れる
- だいたい3軸積んでる
- 一般的には地磁気を読んで方位角を出力する
- 2軸センサとして使用も可能
- 2軸の場合は平面移動で使用する
- 平面回転させて出力をプロットすると理想状態では真円となる
- 3軸使うと3次元移動する物体の姿勢推定に使える
磁気センサのオフセット
- 磁気センサのオフセットてなんやねん.という話
- 参考文献張っておくけど一応説明します
Hard-Iron offset
- センサ周囲に存在する磁気物体によるオフセット
- あとセンサ内部のバイアスも含む
- プロットした際に円(球)の中心がずれる原因
- サンプリング点持ってきて平均したり(最大値-最小値)/2とかで求められる
- 今回紹介するアルゴリズムはそこまで乱暴なことはしないので安心してくれ(?)
Soft-Iron offset
- センサ周囲に透磁率の高い物質が存在することによるオフセット
- あとそもそもセンサそのものの各軸の感度が異なることによっても発生
- プロットした際に円(球)が歪んで楕円(楕円体)となる原因
幾何学的推定
- 直線とか楕円とか,ある幾何学的な拘束条件に基づいてそのパラメータを推定すること
- 有名どころで行くと最小二乗法
- 実際は他にもいろいろ手法がある
- 日本語資料だと↓にまとまっている
幾何学推定のための最適化手法:最小化を超えて http://www.iim.cs.tut.ac.jp/~kanatani/papers/hypertutor.pdf
幾何学的推定の準備
一般的な楕円方程式から2次形式へ変換
幾何学的推定を適用するには一般的な円/楕円の方程式の形から2次形式へ変換してやる必要があるのでその準備
楕円の2次形式標準系は次の通り
参考文献に基づいた書き方だと
上式におけるを求めることが楕円あてはめの幾何学推定となります.
以下に一般的な楕円の方程式からこの2次形式を得る過程を書いておきます.
楕円方程式
皆さんご存じ.x軸長さ,y軸長さとして
2次形式標準系は次の通り
傾いた楕円の方程式
高校数学の範囲らしいです.
傾きとして
2次形式にすると
2次形式標準系では
係数がちょっと長いので次のようにおくと
と書き換えができます
中心が原点にない傾いた楕円の方程式
楕円中心として2次形式で表した傾いた楕円の方程式に代入
展開して
第4項~6項を
とおいて
冒頭\eqref{eq-1}の2次形式が得られました.
ノイズのモデル化(共分散行列の算出)
計算してみる
共分散行列は次式で計算できます
ここで ]は正規化共分散と呼ぶもので,に関するノイズの方向依存性を表す行列です.一様等方性(独立したノイズ)であれば単位行列です.
添え字はサンプリング点を意味します. 得られたn 個のデータのうち各点に対応する列ベクトルです.
ヤコビ行列を計算して
幾何学推定のアルゴリズム
参考文献では
- 最小化に基づく方法
- 最小二乗法 (Least squares)
- 最尤推定 (Maximum likelihood estimation)
- FNS法 (Fundamental numerical sceme)
- 超精度補正
- 最小化に基づかない方法
- 重み反復法 (Iteratively reweighted least squares)
- くりこみ法 (Renormalization)
- 超精度くりこみ法 (Hyper-Renormalization)
というように分類・紹介されています. 最小二乗法・重み反復法・くり込み法はコーディング(Matlab)したのでそれらについてアルゴリズムを抜粋します*1
最小二乗法
の最小固有値に対する単位固有ベクトルをとして幾何学推定解とする
重み反復法
- サンプリング点に対する重み,,とおく
- 次の行列を計算する
- 固有値問題
を解いて最小固有値に対する単位固有ベクトルを計算する
- 符号を除いてならを解として終了
そうでなければ次のように重みを更新してステップ2に戻る
くり込み法
- サンプリング点に対する重み,,とおく
- 次の行列,を計算する
- 固有値問題
を解いて絶対値最小の固有値に対する単位固有ベクトルを計算する
- 符号を除いてならを解として終了 そうでなければ次のように重みを更新してステップ2に戻る
磁気センサのオフセット補正
幾何学推定結果から楕円パラメータへの変換
幾何学推定結果から楕円パラメータ(長軸長さ,短軸長さ,x軸と長軸のなす角,中心)へ変換します.
\eqref{eq-A} \eqref{eq-B} \eqref{eq-C} \eqref{eq-D} \eqref{eq-E} \eqref{eq-F}式をについて解く感じですね.
中心位置
\eqref{eq-D} \eqref{eq-E}を連立してについて解きます.
逆行列を使ってパパッとできます.
傾き
\eqref{eq-eli},\eqref{eq-eli-tan}を見ると,傾いた楕円は項があることがわかります.
傾いた楕円の2次形式について対角化する過程で傾きを得ることが出来ます.
http://www.math.s.chiba-u.ac.jp/~yasuda/Chiba/Lec/senkei23U8.pdf より
ここで得られる傾きはx軸と長軸のなす角ではなく,x軸と楕円の長軸・短軸のうち近傍軸のなす角度なので,長軸・短軸の長さを求めた後に手を加える必要があります.
定数倍不定性の除去
\eqref{eq-1}式のような陰関数形式には定数倍の不定性があります.
幾何学推定ではとすることで不定性を除去しており,\eqref{eq-A} ~ \eqref{eq-F}式で求まる係数とは異なるので,これらを相互に変換する定数倍係数を求めます.
楕円パラメータを求めるには必要な過程ですが,オフセット補正行列を求めるだけなら不要です(定数倍不定性が消えるので).
幾何学推定結果を,定数倍係数とすると,
という関係が得られます.
\eqref{ff-1}式が中心の図形であることから,とすることで中心を原点に移動させます.
ここで,\eqref{ff-2}は中心原点の傾いた楕円であること,つまり\eqref{eq-eli-tan2}式の形になることから,
,よって定数倍係数は
となり,
とすることで楕円パラメータを求めるための定数倍不定性が除去できました
長軸・短軸
対角化から計算できなくはないんですが傾きとの整合性が取りづらいので\eqref{eq-A} \eqref{eq-C}を,について解きます.
傾きの修正
傾きを求める項でも述べましたが,\eqref{eq-phase}式はx軸と楕円の長軸・短軸のうち近傍軸のなす角度なので手を加える必要があります.
Matlabだとこんな感じです.MathJaxとはてなのソースコードシンタックスハイライトが同居できなかったんでハイライトはなしです.
if a < b swap = a; a = b; b = swap; if phi> 0 phi = phi - 0.5*pi; else phi = phi + 0.5*pi; end end
オフセット補正行列
幾何学推定したり,楕円パラメータ求めたりと長かったですね.ここから本題です.
ちなみに本題は一瞬で終わります.
Hard-Iron offset補正ベクトル
楕円中心を原点に持ってくるだけです.
楕円中心としてHard-Iron offset補正ベクトルは
Soft-Iron offset補正行列
回転した楕円について,回転行列で回転→短軸長さを長軸長さに合わせる→逆回転 させるような行列を作ってやればよいです.
長軸と短軸の比として(ここで比を取ることで定数倍係数が消えるので,補正するだけなら定数倍不定性を考える必要はないんですよね)
Soft-Iron offset補正行列は
補正
磁気センサデータ,補正済み磁気センサデータとして次式で補正が出来ます.
Matlab Code
CurveFittingSample.mを実行したら乱数で作った楕円が補正される様が見れます.
*1:文献中のはと混同を避けるために変更しています
- 固有値問題