重力は上を向いている?
まず最初にやることはなんでしょうか?
正当性を検証します!
スターターコードは、加速度計で計測した加速度の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(); // 計測範囲を`-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コンソール
(..)
(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軸に合わせることができますが、 加速度センサで測定された加速度は常に上を向いています。
発生している現象は、加速度計はあなたが観測している加速度ではなく、ボードのproper accelerationを測定している、ということです。
このproper accelerationとは、自由落下中の観測者から見たボードの加速度です。自由落下中の観測者は、地球の中心部に向かって、1g
の加速度で移動しています。
この観点から見ると、ボードは上に向かって(地球の中心部から離れて)、1g
の加速度で動いています。
そして、これがproper accelerationが上に向いている理由です。
これはボードが自由落下していると、加速度計はゼロのproper accelerationを報告する、ということを意味します。
家では試さないようにして下さい。
物理は難しいです。次へ進みましょう。