キャリブレーション
ボードを回転させると、磁力計に対する地球の磁場の向きは変わるはずですが、 その大きさは変わらないはずです! ところが、磁力計はボードを回転させると 磁場の大きさが変化していることを示します。
なぜそうなるのでしょうか? 実は、正しい値を返すには磁力計を キャリブレーションする必要があります。
このキャリブレーションにはかなり多くの数学(行列)が関わるため、ここでは扱いませんが、 興味があれば、このアプリケーションノートに手順が説明されています。代わりに、この セクションでは、どれだけずれているのかを可視化することにします。
次の実験をしてみましょう。ボードをさまざまな方向にゆっくり回転させながら、
磁力計の読み取り値を記録します。読み取り値をタブ区切り値(TSV)として整形するために、
iprintln マクロを使います。
#![deny(unsafe_code)]
#![no_main]
#![no_std]
#[allow(unused_imports)]
use aux15::{entry, iprint, iprintln, prelude::*, I16x3};
#[entry]
fn main() -> ! {
let (_leds, mut lsm303dlhc, mut delay, mut itm) = aux15::init();
loop {
let I16x3 { x, y, z } = lsm303dlhc.mag().unwrap();
iprintln!(&mut itm.stim[0], "{}\t{}\t{}", x, y, z);
delay.delay_ms(100_u8);
}
}
コンソールには次のような出力が表示されるはずです。
$ # itmdump コンソール
-76 213 -54
-76 213 -54
-76 213 -54
-76 213 -54
-73 213 -55
次のようにして、これをファイルにパイプできます。
$ # 注意! 実行中の別の `itmdump` インスタンスがある場合は終了してください
$ itmdump -F -f itm.txt > emf.txt
数秒間データを記録しながら、ボードを多くの異なる方向に回転させてください。
次に、その TSV ファイルを表計算ソフトに取り込むか(または以下に示す Python スクリプトを使って)、 最初の 2 列を散布図としてプロットしてください。
#!/usr/bin/python
import csv
import math
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import sys
# プロットスタイルを適用する
sns.set()
x = []
y = []
with open(sys.argv[1], 'r') as f:
rows = csv.reader(f, delimiter='\t')
for row in rows:
# データが欠けている行を破棄する
if len(row) != 3 or not row[0] or not row[1]:
continue
x.append(int(row[0]))
y.append(int(row[1]))
r = math.ceil(max(max(np.abs(x)), max(np.abs(y))) / 100) * 100
plt.plot(x, y, '.')
plt.xlim(-r, r)
plt.ylim(-r, r)
plt.gca().set_aspect(1)
plt.tight_layout()
plt.savefig('emf.svg')
plt.close
ボードを平らな水平面の上で回転させた場合、磁場の Z 成分は 比較的一定のままであり、このプロットは原点を中心とする円周(楕円ではなく) になっているはずです。上のプロットのように、ボードをランダムな方向に回転させた 場合は、原点を中心とする多数の点からなる円が得られるはずです。 円の形からのずれは、磁力計をキャリブレーションする必要があることを示しています。
要点: センサーの読み取り値をただ信じてはいけません。妥当な値を出力していることを 確認してください。そうでない場合は、キャリブレーションしてください。