センサー・アクチュエータ

IMU(慣性計測装置)

加速度・角速度を測るセンサーモジュール。

概要

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-6050TDK(旧InvenSense)6軸I2C/SPI±2〜16g±250〜2000°/s3.9mA
LSM6DSOST6軸I2C/SPI±2〜16g±125〜2000°/s0.55mA
BMI270Bosch6軸I2C/SPI±2〜16g±125〜2000°/s0.925mA
ICM-42688-PTDK6軸I2C/SPI±2〜16g±15.625〜2000°/s2.7mA
BNO055Bosch9軸(AHRS統合)I2C/UART±2〜16g±125〜2000°/s12.3mA
ICM-20948TDK9軸I2C/SPI±2〜16g±250〜2000°/s2.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

比較項目IMUGNSS(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°/√h0.001〜0.0001°/√h
ドリフト数°/時間数°/1000時間
用途コンシューマー・産業用航空・宇宙・潜水艦

6軸IMU vs 9軸IMU

比較項目6軸IMU9軸IMU
センサー加速度計+ジャイロ6軸+磁気センサー
ヨー推定ジャイロ積分のみ(ドリフト)磁気コンパスで絶対方位参照
屋内干渉なし金属・電磁界に影響受ける
コスト安いやや高い
推奨用途ドローン(磁場乱れる)・短時間動作歩行者ナビ・長時間姿勢追跡

関連用語

参考リンク