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次元方向に制御できる対象というのも普及していることですし。

2015年7月28日火曜日

RaspberryPi でセンサーを使おう

今回のCansatに搭載するのは

  • GPSモジュール PA6C
  • デジタルコンパス HMC5883L
  • 加速度ジャイロセンサ MPU6050
  • 気圧センサ BMP180
  • 超音波センサ 
の5つ。
これらを統合して20msec周期での制御ができればよいと考えています。
今回の記事では上3つを扱うPythonプログラムを公開します。
拾ってきたプログラムを改変して、ある一定の時間だけログをとり続けるためのプログラムにしました。
ファイルの読み書きをするプログラムを書くよりも、標準出力するプログラムを
$ ./Program.py > data.txt
のように実行した方が楽です。


GPS PA6C

今回のGPSの取得はRapsberryPi (B+) のGPIOピンにあるTX0,RX0を使ってシリアル通信をします。とりあえず読み込んでファイルに書き込むだけのプログラムです。他のセンサも同様ですが、行頭にプログラム開始からの時間を出力しています。

デジタルコンパス HMC5883L

通信はI2Cです。pythonでI2C通信をするためにはインポートしなくてはいけないモジュールがあります。
今後は35行目のスケールを自動補正するプログラムが必要となります。
加速度センサ MPU6050


通信はI2Cです。
加速度は距離を時間に関して2回微分した値なので2回積分しなくてはいけません。
ジャイロは角速度なので1回微分すると角度になります。
積分操作をする場合は何かデータを処理してからではないと、多くの誤差を含んでしまいます。
そのための操作(フィルタリング)について考える必要があります。

2015年7月12日日曜日

Processingで3D描画してドヤ顔しよう

僕はよくProcessingで3Dの描画をして遊ぶのですが、
これが意外と簡単な割に「なんかすごい」感を出せる。

・キーボード操作 keycheck()
・XYZ軸の描画 drawAxis(float length);
・XYグリッド平面の描画 drawGrid(int size, float length);
という関数に分けて使い回しています。

キーボード操作は、
・矢印:左右回転、上下回転。
・Z,X:ズームイン、ズームアウト
変数を追加すればもっと操作を増やせます。
回転の向きは逆に感じる人もいるかもしれません。正負を逆にしてみてください。

Simple3D.pde (Google Drive)
https://goo.gl/quQW4O

2015年7月11日土曜日

パラシュートを作ろう

Cansatに使用するパラシュートを作ろうと思います。
パラシュートはいろんなところで利用されているので、パラシュートの研究ってのはたくさんされてて、理論的なことがネットにもたくさん書いてあります。
色々調べた結果がこれです。

・落下方向に垂直な面積が大きいほどゆっくり落ちる
・上に穴を開けると、風にながされにくく、安定する
・穴を大きくするだけ、はやく落ちる

いろんな数式をつかった理想的なパラシュート設計をしても、僕らが作れる限界というのがあるわけでして、「とにかくでかくていいの」という曖昧な目標でがんばります。

そこでここ最近考えていたのは、そもそもパラシュートを何枚かのパーツで作るには、その1枚の形ってどうつくればいいのだろうと。


ご存知のとおり、地球儀を平面地図にするように丸い球面は平面にできません。同様に平面からも球面をつくることもできません。(布とかを伸び縮みさせるならできなくはなさそう)

よって、平面の張り合わせで近似した球面をつくる方法を考えました。
試行錯誤の結果到達したのが、多角形を積み重ねる方式です。
(なんだそんなことか・・って思うかもだけど、結構なやみました。)
つまりどういうことかというと
このように球面に内接する6角形をつくって...

頂点を結びます。


これは単純に曲げただけの平面なので、平面にのばすとこんな感じに。


これはProcessingでゴリゴリ描いたのだけど、
もっとスマートに数式にするとこんな感じです。


とまぁ。こんな感じでパラシュートができるとうれしいな。

2015年7月2日木曜日

能代宇宙イベントに参加します

久しぶりの投稿です。
今年の8月、能代宇宙イベントに参加します。

ピクトラボの使用許可がおりたので、これからはピクトラボで活動します。
とはいっても残り1ヶ月ちょっとしかないので結構あせってます。
必要なモノとかの発注が間に合うかどうか。


試作の試作みたいな段階です。
でもまぁ勝算はあります。

頭で考えるより実際に作らないとわからないことだらけなのに、
頭やメモ帳で考えてばかりで、モノができてない状況。

今週末までに何かできてればうれしい。