重力は上向き?
最初に何をするのでしょうか?
サニティチェックを実行します!
スターターコードは、加速度計によって測定された加速度の X、Y、Z 成分を出力します。
これらの値はすでに「スケーリング」されており、単位は g です。ここで 1 g は、
重力加速度、つまりおよそ毎秒毎秒 9.8 メートルに等しくなります。
#![deny(unsafe_code)]
#![no_main]
#![no_std]
#[allow(unused_imports)]
use aux16::{entry, iprint, iprintln, prelude::*, I16x3, Sensitivity};
#[entry]
fn main() -> ! {
let (mut lsm303dlhc, mut delay, _mono_timer, mut itm) = aux16::init();
// extend sensing range to `[-12g, +12g]`
lsm303dlhc.set_accel_sensitivity(Sensitivity::G12).unwrap();
loop {
const SENSITIVITY: f32 = 12. / (1 << 14) as f32;
let I16x3 { x, y, z } = lsm303dlhc.accel().unwrap();
let x = f32::from(x) * SENSITIVITY;
let y = f32::from(y) * SENSITIVITY;
let z = f32::from(z) * SENSITIVITY;
iprintln!(&mut itm.stim[0], "{:?}", (x, y, z));
delay.delay_ms(1_000_u16);
}
}
ボードを静止させた状態でこのプログラムを実行すると、出力は次のようになります。
$ # itmdump console
(..)
(0.0, 0.0, 1.078125)
(0.0, 0.0, 1.078125)
(0.0, 0.0, 1.171875)
(0.0, 0.0, 1.03125)
(0.0, 0.0, 1.078125)
ボードは動いていないのに加速度がゼロではないので、これは奇妙です。いったい何が起きているのでしょうか?
これは重力に関係しているに違いありませんよね? 重力加速度は 1 g ですから。しかし、
重力は物体を下向きに引っ張るので、Z 軸方向の加速度は正ではなく負になるはずです
……
プログラムが Z 軸を逆にしてしまったのでしょうか? いいえ。ボードを回転させて重力を X 軸や Y 軸に揃えて試してみることはできますが、加速度計が測定する加速度は常に上を向いています。
ここで起きているのは、加速度計が測定しているのが、あなたが観測している加速度ではなく、
ボードの 固有加速度 だということです。この固有加速度とは、自由落下している観測者から見た
ボードの加速度です。自由落下している観測者は、1g の加速度で地球の中心に向かって移動しています。
その観測者の視点では、ボードは実際には 1g の加速度で上向きに(地球の中心から遠ざかる方向に)
動いています。これが、固有加速度が上を向く理由です。これはまた、もしボードが自由落下していたなら、
加速度計は固有加速度をゼロと報告する、ということも意味します。お願いですから、家では試さないでください。
はい、物理は難しいですね。先に進みましょう。