Who is さくふわめろんぱん

さくふわめろんぱん(@skfwMelonpan)はロボットとか人工知能に興味があるパンです。
自分のために調べたことがみんなの役に立ったらいいなぁ。

2015年7月31日金曜日

3軸デジタルコンパスHMC5883L 3軸の謎

Amazonとかで手軽に買えるデジタルコンパスにHMC5883Lがあります。
データシート(http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/HMC5883L_3-Axis_Digital_Compass_IC.pdf

これは3軸コンパスといってX軸、Y軸、Z軸方向にかかっている磁場を測定できます。
普通のコンパス用途ならX軸、Y軸の値だけでかまわないし、海外のサイトでもZ軸を扱っていない場合が多いです。

基本的なデータの取得に関しては他のサイトやブログで十分なので、取得できた値をどうすればよいかという話を書いていきます。

補正

まず、重要なのはデジタルコンパスは使うためには補正が必要だということです。
このコンパスをきれいに使うには2つの補正が必要!
理解するためには計測している対象である地磁気について知っておく必要があるかもしれません。(参考:国土地理院のページ
地磁気は地球上どこでも、南極から北極にむかう方向の矢印だと思ってください。
その大きさは東京付近で約45000nTだそうです。(wikipedia より)
(※)1nT(テスラ) = 10μG(ガウス)なので 45000nT=0.45G
センサは±8Gまで測定できます(0.45 < 8 はずいぶん大きい)
測定範囲を設定することができるようです。(データシートP13)
こうした方が精度良く測定できそうですね。(最小範囲は±0.88G : 分解能は0.73mG)
デフォルトでは±1.33G : 分解能は0.92mGになっています。
よく scale = 0.92 という変数がプログラムに散見されたが、このことだったのか。
つまり、センサの値を丁寧にガウスに変換してたのね。
でも最終的に角度が欲しいだけならそんな几帳面さ要りません。
角度は比率でとっちゃうし、地磁気の大きさなんて実際つかえない。
地磁気の大きさ以外に、向きも場所によって変わります。
それが変わっちゃお手上げなのですが、そんなにコロコロ変わるものでもありません。

偏角と伏角(へんかくとふっかく)


偏角は水平方向の角度で、コンパスが指す方向と北極の方向のズレです。
東京では+7°くらいずれます。最終的な方角に-7°してあげましょう。
GPSによって取得できる緯度は北極方向の測地線なので、GPSとコンパスを使う場合には少し気にしましょう。
伏角は磁場が地面にめりこんでる角度です。
僕もこれを知るまでは地磁気は地面に平行だとおもっていたのですが、結構めりこみます。東京で地面の下に49°くらいの角度です。
つまりデジタルコンパスのZ軸方向の値は負です。
図にするとこんな感じ。

センサの内部的な問題


偏角と伏角のように場所に依存するのではなく、センサの内部的な問題で磁気が記憶されて電圧が多く乗ってしまったりということがあるようです。(よくわかってない)
具体的にどういうことになるかというとこんな感じです。



定常的に誤差がのるので使う直前にこの誤差をオフセットとして算出して打ち消すようにします。
どうやるかというと、一定時間センサで値を取り続けながらセンサをグルグル回します。センサをいろんな角度になるようにしてください。グルグルというより、ぐるんぐるんに回さないといい補正はできません。そのようにして取った値を3次元空間にプロットすると、上の図のような球面になります。その中心を計算してオフセットとして差し引きます。簡単に計算するために
球の中心のx座標 = (xの最大値 - xの最小値) /2
球の中心のy座標 = (yの最大値 - yの最小値) /2
球の中心のz座標 = (zの最大値 - zの最小値) /2
としてますが、もっと正確には、数値解析的に最適にフィットする球面で近似して中心を求めた方が良さそうです。(あ、これやってみたい)

角度へ変換

ここまでだとまだセンサの値はx,y,z方向にかかる地磁気の強さです。
補正されたとしても、これを見て方角が分かる人はそんなにいないでしょう。
(x,y,z)という変数の直行座標系を(r,θ,φ)という変数の球面座標系に変換します。
r : 地磁気の大きさ
θ : z軸からの角度
φ: xy平面に投影したときのx軸からの角度
基本的に方角を知る上で必要となるのはφ(xy平面上の角度)だけですね。
θを使えばセンサの傾きも取得できるはずなのですが、うまくできません。

変換公式

逆三角関数をつかうのでマイコンによってはヘビーかもしれません。
また、地磁気の向きがz軸と重なるとφの値が定まりません。
(なるべく水平に使った方がφが安定するよということ)
置き方によってそうなるかもしれない場合は変数を調整するといいかもしれません。

式を見るとわかるようにφの式にzは使われません。
ということで結局z軸の値はあまり使われないということでした。
でも3軸である以上は何か使い道があるはず。

1つは傾きを知れることなのですが、傾きすぎると方位の値がぶれます。
よく考えたら、方位磁針を縦向きに置いたら方位がわからなくなるのはあたりまえですね。

地磁気センサ単体で傾きを知るのは難しいかもしれないので、加速度ジャイロセンサと組み合わせることで、加速度ジャイロセンサの示す姿勢に対して地磁気がどちらに働いているかというのを提示するというのがいいのかもしれません。

球体方位磁針のように考えて、制御に活かせると新しいかもしれませんね。
3次元方向に制御できる対象というのも普及していることですし。

2 件のコメント:

  1. こんにちは。
    球の中心を求める計算式なのですが、
    (最大値+最小値)/2
    が正しい計算式のような気がします、、、^^;

    返信削除
    返信
    1. 確かに!
      ご指摘ありがとうございます。
      修正します!

      削除