概要
IMU(Inertial Measurement Unit:慣性計測装置)は、加速度センサー(加速度計)と角速度センサー(ジャイロスコープ)を組み合わせたセンサーモジュールです。3軸の加速度(x, y, z)と3軸の角速度(ロール、ピッチ、ヨー)を同時に計測できます。多くの製品では地磁気センサー(磁気コンパス)も統合しており、これを9軸IMUと呼びます。
IMUは物体の運動・姿勢(向き)を推定するための核心デバイスです。GPS/GNSSが届かない屋内や高ダイナミック環境でも、IMUのデータを積分することで移動距離・姿勢角を推定できます(慣性航法)。ただし積分誤差が累積するため、センサーフュージョンによるGNSSや磁気センサーとの組み合わせが実用上は不可欠です。
現代のIMUはほとんどがMEMS(Micro Electro Mechanical Systems)技術で製造され、数mm角のチップに全ての検出要素が集積されています。スマートフォン、ドローン、自動車、ゲームコントローラー、ウェアラブルデバイスなど、運動・姿勢検出が必要なあらゆる製品に搭載されています。
歴史・背景
慣性計測の歴史は機械式ジャイロスコープの発明(1852年、フーコー)に始まります。フーコーの振り子と同原理で回転する質量体が方向を保持する性質を利用し、航空機・船舶の航法装置として発展しました。第二次世界大戦中にはV2ロケットの誘導系統にジャイロスコープが使われ、慣性航法システム(INS)の原型が生まれました。
1960〜70年代のアポロ計画では月面着陸に精密な慣性航法が使われ、ジンバルマウントされた機械式ジャイロと加速度計が宇宙船の姿勢・速度・位置を管理しました。しかし機械式ジャイロは大型・高価・メンテナンスが必要なため、汎用デバイスとしての普及には限界がありました。
1980〜90年代にMEMS技術が成熟し、シリコン上に微小な機械構造を作り込むことでジャイロ・加速度計の小型化・低コスト化が実現しました。1990年代のエアバッグセンサー向けMEMS加速度計の量産が転機となり、2000年代にはスマートフォン向けに超小型・低消費電力の6軸IMUが開発されました。
2010年代にはInvenSense(現TDK)のMPU-6050が「6軸IMU」の代名詞として普及し、Arduinoコミュニティでのドローン・ロボット開発が爆発的に増加しました。現在ではBosch BMI270、STMicroelectronics LSM6DSO、TDK ICM-42688-Pなどの高性能・省電力製品が競合しています。
技術仕様
IMUの軸数による分類
| 種類 | 内容 | 軸数 |
|---|---|---|
| 3軸IMU | 加速度計のみ | 3軸 |
| 6軸IMU | 加速度計+ジャイロ | 6軸 |
| 9軸IMU | 加速度計+ジャイロ+磁気 | 9軸 |
| 10軸IMU | 加速度計+ジャイロ+磁気+気圧 | 10軸 |
代表的な IMU チップの比較
| チップ | メーカー | 軸数 | I/F | 加速度レンジ | ジャイロレンジ | 消費電流 |
|---|---|---|---|---|---|---|
| MPU-6050 | TDK(旧InvenSense) | 6軸 | I2C/SPI | ±2〜16g | ±250〜2000°/s | 3.9mA |
| LSM6DSO | ST | 6軸 | I2C/SPI | ±2〜16g | ±125〜2000°/s | 0.55mA |
| BMI270 | Bosch | 6軸 | I2C/SPI | ±2〜16g | ±125〜2000°/s | 0.925mA |
| ICM-42688-P | TDK | 6軸 | I2C/SPI | ±2〜16g | ±15.625〜2000°/s | 2.7mA |
| BNO055 | Bosch | 9軸(AHRS統合) | I2C/UART | ±2〜16g | ±125〜2000°/s | 12.3mA |
| ICM-20948 | TDK | 9軸 | I2C/SPI | ±2〜16g | ±250〜2000°/s | 2.9mA |
主要な仕様パラメータ
| パラメータ | 説明 |
|---|---|
| フルスケールレンジ(FSR) | 加速度: ±2g〜±16g、ジャイロ: ±125〜±2000°/s |
| 分解能 | 16ビットADCで加速度約0.06mg/LSB(±2g時) |
| ゼロオフセット | 理想ゼロでの出力誤差(mg単位) |
| ノイズ密度 | 加速度: μg/√Hz、ジャイロ: °/s/√Hz |
| クロスアクシス感度 | ある軸の入力が他軸に影響する誤差 |
| ODR(出力データレート) | サンプリング周波数(12.5Hz〜6.4kHz等) |
| FIFO容量 | バースト読み出し用内部バッファ(512〜8192バイト等) |
| ローパスフィルタ(DLPF) | 内蔵デジタルフィルタ、帯域幅を設定可能 |
| 温度センサー内蔵 | 多くのIMUはダイ温度センサーを内蔵 |
| 動作電圧 | 1.71〜3.6V(製品による) |
動作原理
MEMS加速度計の原理
MEMS加速度計は、シリコン上にエッチングされた微小な「錘」(proof mass)が加速度により変位する量を、静電容量変化として検出します。
静電容量検出方式:
固定電極─┤ ├─可動電極(錘に結合)─┤ ├─固定電極
加速度が作用 → 錘が変位 → 電極間距離変化 → 静電容量変化
静電容量差 → 信号処理回路 → デジタル値出力
加速度 a = k × Δx / m
(k:バネ定数, Δx:変位, m:錘の質量)
MEMSジャイロスコープの原理(コリオリ力)
MEMSジャイロはコリオリ力を利用します。振動する質量体が回転すると、振動方向と回転軸の両方に垂直な方向にコリオリ力が発生し、この変位を静電容量で検出します。
コリオリ力の式:
F_c = 2m(v × ω)
v: 質量体の振動速度(ベクトル)
ω: 角速度(ベクトル)
m: 質量体の質量
MEMSジャイロの動作:
① 駆動モード: 質量体をx方向に一定振幅で強制振動
② センスモード: z軸回転でy方向コリオリ力発生 → y変位を検出
③ ωz = F_c / (2m × v_x)
姿勢角(オイラー角)の推定
IMUデータから姿勢角(ロール φ、ピッチ θ、ヨー ψ)を推定します。
加速度計からの静的姿勢推定:
import math
def accel_to_angles(ax, ay, az):
"""加速度計から傾き角を計算(静止時のみ正確)"""
roll = math.atan2(ay, az) * 180 / math.pi
pitch = math.atan2(-ax, math.sqrt(ay**2 + az**2)) * 180 / math.pi
return roll, pitch
ジャイロからの角速度積分:
def integrate_gyro(angle, gyro_rate, dt):
"""ジャイロ角速度を積分して角度推定(ドリフトあり)"""
return angle + gyro_rate * dt
相補フィルタ(Complementary Filter)
加速度計(低域成分・ノイズあり)とジャイロ(高域成分・ドリフトあり)の長所を組み合わせる最も単純なセンサーフュージョン手法です。
ALPHA = 0.96 # ジャイロの重み(0.95〜0.99)
def complementary_filter(angle, gyro_rate, accel_angle, dt):
"""
相補フィルタ:
高周波成分(素早い動き)→ ジャイロから
低周波成分(ゆっくりした傾き)→ 加速度計から補正
"""
gyro_angle = angle + gyro_rate * dt
complemented = ALPHA * gyro_angle + (1 - ALPHA) * accel_angle
return complemented
用途・ユースケース
ドローン・UAV
4〜8軸マルチコプターの姿勢制御に不可欠です。IMUで機体の傾き・回転を高速計測(1kHz以上)し、各モーターの回転数を独立制御してホバリングを維持します。ループ周期は最短500μs〜1msが求められます。
制御ループ:
IMU(1kHz) → 姿勢推定(Madgwick/Mahony Filter) → PID制御器 → ESC → BLDCモーター
歩行者デッドレコニング(PDR)
スマートフォンのIMUで歩行ステップを検出し、歩幅と方位から位置を推定する手法。GPS補助なしで屋内ナビゲーションに利用されます。
自動車のVSC(車両安定制御)
3軸加速度計+3軸ジャイロで車両の横すべり・ロールを検出し、各輪のブレーキを個別制御してスピンを防止します。
ウェアラブル・スポーツ分析
スマートウォッチ・ランニングポッドのIMUで歩数・走行フォーム・泳ぎの解析を行います。消費カロリー計算・転倒検知にも利用。
VR/ARヘッドセット
ヘッドセットの頭部回転を超低遅延(<20ms)で追跡するため、1kHz以上のIMUが必要です。視線追跡との融合でリアルな没入感を実現。
産業用AGV・ロボット
自律走行車(AGV)の姿勢推定に使われます。エンコーダー(車輪回転数)とIMUをセンサーフュージョンすることで、スリップを補正した正確なオドメトリを実現します。
実装・開発のポイント
MPU-6050のI2C初期化と読み取り(C言語)
#include <stdint.h>
#include "i2c_hal.h"
#define MPU6050_ADDR 0x68 // AD0=LOW の場合
#define PWR_MGMT_1 0x6B
#define ACCEL_XOUT_H 0x3B
#define GYRO_XOUT_H 0x43
// MPU-6050 初期化
void mpu6050_init(void) {
// パワーマネジメントレジスタをクリア(スリープ解除)
uint8_t data = 0x00;
i2c_write_reg(MPU6050_ADDR, PWR_MGMT_1, &data, 1);
// クロックソースをジャイロX軸PLL使用(推奨)
data = 0x01;
i2c_write_reg(MPU6050_ADDR, PWR_MGMT_1, &data, 1);
}
typedef struct {
int16_t ax, ay, az;
int16_t gx, gy, gz;
int16_t temp;
} MPU6050_Data;
// 全データ読み取り(14バイトバースト読み出し)
void mpu6050_read(MPU6050_Data *d) {
uint8_t buf[14];
i2c_read_reg(MPU6050_ADDR, ACCEL_XOUT_H, buf, 14);
d->ax = (int16_t)(buf[0] << 8 | buf[1]);
d->ay = (int16_t)(buf[2] << 8 | buf[3]);
d->az = (int16_t)(buf[4] << 8 | buf[5]);
d->temp = (int16_t)(buf[6] << 8 | buf[7]);
d->gx = (int16_t)(buf[8] << 8 | buf[9]);
d->gy = (int16_t)(buf[10] << 8 | buf[11]);
d->gz = (int16_t)(buf[12] << 8 | buf[13]);
}
// 単位変換(±2g, ±250°/s 設定時)
void mpu6050_convert(MPU6050_Data *raw, float *accel_g, float *gyro_dps) {
const float ACCEL_SCALE = 16384.0f; // 1g = 16384 LSB (±2g)
const float GYRO_SCALE = 131.0f; // 1°/s = 131 LSB (±250°/s)
accel_g[0] = raw->ax / ACCEL_SCALE;
accel_g[1] = raw->ay / ACCEL_SCALE;
accel_g[2] = raw->az / ACCEL_SCALE;
gyro_dps[0] = raw->gx / GYRO_SCALE;
gyro_dps[1] = raw->gy / GYRO_SCALE;
gyro_dps[2] = raw->gz / GYRO_SCALE;
}
キャリブレーション
IMUはゼロオフセット(バイアス)誤差があるため、使用前の静止キャリブレーションが重要です。
import numpy as np
def calibrate_imu(imu, num_samples=1000):
"""
静止状態でN回計測し、オフセットを推定
加速度z軸は重力加速度(1g)を差し引く
"""
accel_sum = np.zeros(3)
gyro_sum = np.zeros(3)
for _ in range(num_samples):
ax, ay, az, gx, gy, gz = imu.read_raw()
accel_sum += [ax, ay, az]
gyro_sum += [gx, gy, gz]
accel_offset = accel_sum / num_samples
gyro_offset = gyro_sum / num_samples
# Z軸から重力を差し引く(IMUが水平に置かれている前提)
accel_offset[2] -= 1.0 # 1g
return accel_offset, gyro_offset
DMP(Digital Motion Processor)の活用
MPU-6050等にはDMP(Digital Motion Processor)と呼ばれる内蔵コプロセッサがあり、クォータニオン計算をオフロードできます。MCUのCPU負荷を大幅に削減できますが、ファームウェアのライセンスに注意が必要です。
取り付けと配置の注意点
- IMUはできるだけ機体の重心・回転中心に配置する
- 振動が多い環境では防振マウント(シリコングロメット等)を使用
- 配線は短く、電磁ノイズ源(モーター、インバーター)から遠ざける
- PCBパターンはIMU直下に銅箔を置かない(熱ストレス対策)
他技術との比較
IMU vs GNSS
| 比較項目 | IMU | GNSS(GPS等) |
|---|---|---|
| 位置精度 | 短期間は高精度、長期はドリフト | 絶対位置(誤差数m〜数cm) |
| 更新レート | 高い(100Hz〜6kHz) | 低い(1Hz〜20Hz) |
| 屋内使用 | 可能 | 不可(電波届かない) |
| 遅延 | 非常に低い | 数百ms〜1s |
| ドリフト | ある(積分誤差累積) | なし(衛星からの絶対位置) |
| 電力消費 | 低い(〜1mA) | 高い(〜20mA) |
| コスト | 安価(数百円〜) | 中程度(数百〜数千円) |
最適解は両者をセンサーフュージョンして使うことです(INS/GNSSハイブリッド航法)。
MEMS IMU vs 光ファイバージャイロ(FOG)
| 比較項目 | MEMS IMU | 光ファイバージャイロ(FOG) |
|---|---|---|
| サイズ | 非常に小型(数mm) | 大型(数十cm) |
| コスト | 安価(数百〜数千円) | 非常に高価(数十〜数百万円) |
| 精度(ARW) | 0.1〜0.01°/√h | 0.001〜0.0001°/√h |
| ドリフト | 数°/時間 | 数°/1000時間 |
| 用途 | コンシューマー・産業用 | 航空・宇宙・潜水艦 |
6軸IMU vs 9軸IMU
| 比較項目 | 6軸IMU | 9軸IMU |
|---|---|---|
| センサー | 加速度計+ジャイロ | 6軸+磁気センサー |
| ヨー推定 | ジャイロ積分のみ(ドリフト) | 磁気コンパスで絶対方位参照 |
| 屋内干渉 | なし | 金属・電磁界に影響受ける |
| コスト | 安い | やや高い |
| 推奨用途 | ドローン(磁場乱れる)・短時間動作 | 歩行者ナビ・長時間姿勢追跡 |