【連載①】宇宙を目指す小さなIMU試作の記録:概要編
はじめに
Arduinoを使って、加速度・ジャイロ・温度センサーを組み合わせ、宇宙空間で使えるIMU(慣性計測装置)の試作と補正に取り組んだ記録です。
※あくまで試作ですので。
連載の目的
- MEMSセンサーによる姿勢推定技術の学習
姿勢推定
1. 姿勢推定とは?
姿勢推定とは、「物体が空間上でどの方向を向いているか」を数値的に表現する技術です。
たとえばドローン、スマートフォン、VRヘッドセット、ロボット、そして人工衛星のすべてが、**「今、自分がどこを向いているのか」**を常に把握する必要があります。
これを可能にするのが IMU(Inertial Measurement Unit:慣性計測装置) です。
2. MEMSセンサーとは?
MEMS(Micro Electro Mechanical Systems)は、微細加工技術で作られた非常に小さなセンサーのこと。
IMUでは主に次の2種類のMEMSセンサーが使われます:
- 加速度センサー(Accelerometer):重力や移動加速度を検知
- ジャイロセンサー(Gyroscope):回転速度を検知(角速度)
これらを組み合わせて、物体の姿勢(ピッチ・ロール・ヨー)を推定します。
3. 姿勢推定の基本原理(ざっくり)
✅ 加速度センサーの働き
- 静止時には「重力」を検知 → 地面との角度を推定できる
- ただし動くと加速度が混ざってしまう
✅ ジャイロセンサーの働き
- 回転速度を積分して角度を出す(θ = ∫ωdt)
- ただし、積分誤差(ドリフト)が蓄積する
✅ これを組み合わせると…
- 加速度:長期的に安定しているが、動作中は信用できない
- ジャイロ:短期的に正確だが、時間が経つとズレる
→ この2つをうまく合成する(センサーフュージョン)ことで、安定した姿勢推定が可能になります。
4. どこまで本連載で扱うか?
この連載では、次のステップに分けて 姿勢推定の"入口"となる基礎技術を体験できます:
- MPU6050から加速度とジャイロの生データを取り出す
- TMP102で温度変化を取得し、センサーのドリフト傾向を見る
- Pythonで温度 vs センサー出力の相関を可視化する
- 宇宙空間のような温度変動・重力なしの環境でどうするかを考察
5. 目指す最終イメージ(応用)
将来的には、こういったMEMSセンサーをベースにした小型のIMUモジュールを開発し、
- 小型衛星(CubeSat)の姿勢制御
- 宇宙ロボットのナビゲーション
- モバイルセンサーの高精度化
といった分野への応用につなげていきたいと考えています。
温度ドリフトなどのセンサ誤差への理解
1. センサーデータは“完璧”ではない
MEMSセンサーから出力される加速度や角速度のデータは、本当の値とは必ずしも一致しません。これはどんなに高価なセンサーでも同じで、そこには必ず「誤差(エラー)」が含まれています。
センサーの誤差には、以下のような種類があります:
- オフセット(バイアス):センサーが静止していても0でない出力をする
- スケールファクター誤差:出力が実際の加速度や角速度と比例しない
- ノイズ:毎回わずかに変動するランダムな揺らぎ
- 温度ドリフト:温度変化に伴って、上記のオフセットやスケールがズレる
2. なぜ温度でドリフトするのか?
MEMSセンサーは、シリコン基板の上にマイクロサイズの振動構造体や可動部を作ることで、加速度や角速度を検出しています。
この構造体は、温度が変化すると膨張・収縮し、センサーの感度やオフセットが変わるのです。
たとえば:
- 室温では0gだった加速度センサーが、50℃になると 0.05g 出力してしまう
- ジャイロが静止状態で 0°/s を出すべきなのに、温度上昇とともに 数°/s のバイアスが発生する
このような誤差は、「温度ドリフト」と呼ばれます。
3. センサー誤差を放置するとどうなるか?
たとえば、ジャイロの角速度出力を積分して角度を出すような場合、温度によるバイアスがあると、それが積分されてどんどん角度がズレていきます(これをドリフトと呼ぶ)。
また、加速度センサーにおいても、Z軸の値が徐々に変化していくことで、姿勢推定や重力判定の精度が著しく悪化します。
4. 宇宙での応用を見据えて
宇宙空間では、温度変動は数百度に達することもあり、しかも**重力がないため「ドリフトに気づきにくい」**という厳しい条件があります。
本連載では地上での試作を通じて、「誤差を見える化し、補正する」という技術の基礎を学んでいきます。
使用する技術・機材
- Arduino Uno
- MPU6050(加速度+ジャイロ)
- TMP102(温度センサー)
- Python(pandas, matplotlib)
Discussion