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

加速度センサー / ジャイロ

動きや傾きを検出するセンサー。

概要

加速度センサー(加速度計、Accelerometer) は物体に加わる加速度を測定するセンサーです。単位はg(重力加速度:1g≒9.8m/s²)またはm/s²で表します。静止しているときでも重力加速度(1g)を検出するため、傾き(姿勢角)の推定にも使われます。

ジャイロスコープ(Gyroscope) は物体の角速度(回転の速さ)を測定するセンサーです。単位は°/s(度/秒)またはrad/sで表します。積分することで角度変化量が求められますが、積分誤差(ドリフト)が時間とともに累積するため、加速度センサーや磁気センサーとの組み合わせ(センサーフュージョン)が一般的です。

現代の組み込みシステムでは、加速度計とジャイロを1チップに統合したIMU(慣性計測装置)として使われることがほとんどです。I2CまたはSPIでマイコンと接続し、デジタルデータを直接読み取れます。

歴史・背景

加速度センサーの歴史は1920〜30年代の機械式地震計に遡りますが、電子的な加速度センサーが普及したのは1950〜60年代の航空宇宙開発時代です。当初は精密に製造された質量体とバネを組み合わせた機械式で、コストと重量の問題から軍事・航空用途に限定されていました。

転機となったのは1980〜90年代のMEMS技術の発展です。半導体プロセスでシリコンに微細な機械構造を作り込む技術が確立し、1991年にアナログデバイセズがMEMS加速度センサーADXL50を発売。これは自動車エアバッグセンサーとして採用され、大量生産によるコスト削減が実現しました。

ジャイロスコープのMEMS化は加速度計より数年遅れ、1990年代後半〜2000年代に実用化されました。2000年代にはニンテンドーWiiリモコン(2006年)がMEMS加速度計を搭載してモーションコントロールを一般化させ、2007年のiPhoneにも加速度計が内蔵されたことでスマートフォン向け大量生産が軌道に乗りました。

技術仕様

加速度センサーの主要スペック

パラメータ典型値説明
フルスケールレンジ±2g / ±4g / ±8g / ±16g測定可能な最大加速度
分解能16ビット±2g時: 約0.061mg/LSB
ゼロオフセット±20〜±80mgキャリブレーションで補正
ノイズ密度60〜200μg/√Hz測定ノイズの周波数特性
バンド幅(-3dB)12.5Hz〜1kHz測定できる最高周波数
クロスアクシス感度±1〜2%非目的軸の影響
温度係数±0.1〜0.5mg/°C温度変化による誤差

ジャイロスコープの主要スペック

パラメータ典型値説明
フルスケールレンジ±125〜±2000°/s測定可能な最大角速度
分解能16ビット±250°/s時: 約0.0076°/s/LSB
ゼロオフセット(バイアス)±1〜5°/sキャリブレーションで補正
ノイズ密度(ARW)0.004〜0.05°/s/√Hz角度ランダムウォーク
バイアス安定性1〜10°/h長期ドリフト
温度係数±0.015°/s/°C温度変化による誤差

MEMS加速度センサーの構造

シリコンMEMS加速度センサー断面(簡略):

    [上部固定電極]
         |
    ‐‐‐‐‐‐‐‐‐‐‐    ← エアギャップ
    [可動電極(錘)] ← バネで支持
    ‐‐‐‐‐‐‐‐‐‐‐    ← エアギャップ
         |
    [下部固定電極]

加速度 a が作用 → 錘が変位 Δx
C1(上エアギャップ)= ε×A / (d - Δx) 増加
C2(下エアギャップ)= ε×A / (d + Δx) 減少
差動容量 ΔC = C1 - C2 ∝ Δx ∝ a

ジャイロスコープのMEMS構造(コリオリ型)

MEMSジャイロ(振動型)の動作原理:

駆動モード: 質量体をX方向に一定振幅Aで振動させる
  x(t) = A cos(ω_drive × t)
  vx(t) = -Aω_drive sin(ω_drive × t)

Z軸周りに角速度 ωz が加わると:
  コリオリ力 Fy = 2m × vx × ωz

Fy はY方向の変位として現れ、これを静電容量変化で検出:
  ωz = Fy / (2m × vx)

動作原理

加速度センサーの物理

加速度センサーは、ニュートンの第二法則 F=ma に基づき、内部の「錘(proof mass)」に作用する力を測定することで加速度を求めます。

静止状態では重力加速度(1g)のみが作用します。水平から角度θ傾いたとき:

  • 加速度x軸: ax = g×sin(θ)
  • 加速度z軸: az = g×cos(θ)

これにより傾き角を計算できます(傾斜計(チルトセンサー) としての使い方)。

ただし、動的な加速度(移動による加速)と重力を分離することはできないため(等価原理)、純粋な姿勢推定には動的補正が必要です。

ジャイロスコープのドリフト問題

ジャイロスコープは角速度を積分して角度を求めますが、ゼロオフセット誤差(バイアス)が積分されドリフトが発生します。

import time

class GyroIntegrator:
    def __init__(self, bias_dps=0.02):
        self.angle = 0.0
        self.bias = bias_dps  # 例: 0.02°/s のバイアス
    
    def update(self, gyro_dps, dt):
        # バイアスを差し引いてから積分
        rate = gyro_dps - self.bias
        self.angle += rate * dt
        return self.angle

# 24時間放置すると:
# drift = 0.02°/s × 86400s = 1728° ≈ 約4.8回転分のドリフト

このドリフトを補正するために、加速度センサーや磁気センサーとのセンサーフュージョンが必要です。

姿勢推定アルゴリズム

Mahonyフィルタ(軽量・組み込み向け)

// Mahonyフィルタの実装(ドローン/ロボット向けの定番フィルタ)
#include <math.h>

#define KP 2.0f   // 比例ゲイン
#define KI 0.005f // 積分ゲイン
#define SAMPLE_FREQ 1000.0f // Hz

static float q0 = 1.0f, q1 = 0.0f, q2 = 0.0f, q3 = 0.0f;
static float integralFBx = 0.0f, integralFBy = 0.0f, integralFBz = 0.0f;

void MahonyAHRSupdateIMU(float gx, float gy, float gz,
                          float ax, float ay, float az) {
    float recipNorm;
    float halfvx, halfvy, halfvz;
    float halfex, halfey, halfez;
    float qa, qb, qc;
    
    // 加速度計データを正規化
    recipNorm = 1.0f / sqrtf(ax * ax + ay * ay + az * az);
    ax *= recipNorm;
    ay *= recipNorm;
    az *= recipNorm;
    
    // クォータニオンから推定重力方向を計算
    halfvx = q1 * q3 - q0 * q2;
    halfvy = q0 * q1 + q2 * q3;
    halfvz = q0 * q0 - 0.5f + q3 * q3;
    
    // 誤差(クロス積)
    halfex = ay * halfvz - az * halfvy;
    halfey = az * halfvx - ax * halfvz;
    halfez = ax * halfvy - ay * halfvx;
    
    // 積分フィードバック(バイアス補正)
    integralFBx += KI * halfex * (1.0f / SAMPLE_FREQ);
    integralFBy += KI * halfey * (1.0f / SAMPLE_FREQ);
    integralFBz += KI * halfez * (1.0f / SAMPLE_FREQ);
    gx += KP * halfex + integralFBx;
    gy += KP * halfey + integralFBy;
    gz += KP * halfez + integralFBz;
    
    // クォータニオン更新
    gx *= 0.5f / SAMPLE_FREQ;
    gy *= 0.5f / SAMPLE_FREQ;
    gz *= 0.5f / SAMPLE_FREQ;
    qa = q0; qb = q1; qc = q2;
    q0 += -qb * gx - qc * gy - q3 * gz;
    q1 +=  qa * gx + qc * gz - q3 * gy;
    q2 +=  qa * gy - qb * gz + q3 * gx;
    q3 +=  qa * gz + qb * gy - qc * gx;
    
    // クォータニオン正規化
    recipNorm = 1.0f / sqrtf(q0*q0 + q1*q1 + q2*q2 + q3*q3);
    q0 *= recipNorm;
    q1 *= recipNorm;
    q2 *= recipNorm;
    q3 *= recipNorm;
}

Madgwickフィルタ

Mahonyフィルタに近い計算コストで、勾配降下法(Gradient Descent)によりクォータニオンを更新します。磁気センサー対応(9軸AHRS)版もあります。

用途・ユースケース

ドローン・飛行体制御

ドローンのフライトコントローラー(Betaflight, ArduPilot等)では6〜9軸IMUを1kHz以上でサンプリングし、PIDコントローラーでモーター回転数を制御します。加速度計のみでは動的加速度と重力が区別できないため、ジャイロの高周波成分が重要です。

車載(自動車・モビリティ)

  • VSC/ESP(横滑り防止装置): ジャイロでヨーレート検出、ブレーキ個別制御
  • エアバッグECU: 衝突加速度検出(閾値超えで点火)
  • カーナビゲーション(DR): GNSSと加速度計・ジャイロを融合してトンネル内でも位置推定

スポーツ・フィットネス

スマートウォッチ・活動量計での歩数計測、ゴルフスイング解析、スキー・スノーボードのトリック判定など。

地震計測・構造物監視

低周波帯域(DC〜数Hz)の高感度加速度センサーで地震動・橋梁振動を計測。MEMSセンサーの普及により、スマートフォンを利用した分散地震計測ネットワークも研究されています。

ゲームコントローラー・VR

Nintendo Switch Joy-Con、PlayStation DualSense、Meta Quest などの6DoFコントローラーに6軸IMUが搭載され、モーションコントロールや姿勢追跡に使われます。

実装・開発のポイント

サンプリングレートとフィルタ設計

用途に応じた適切なサンプリングレートとフィルタ設定が重要です。

用途必要ODRDLPFカットオフ
傾き計(静的)50〜100Hz5〜10Hz
歩行検出50〜100Hz20Hz
ドローン姿勢制御1kHz以上92〜256Hz
衝突検知最大レートフィルタOFF
振動解析1kHz以上最大帯域

FIFO機能の活用(DMA読み出し)

高サンプリングレートでMCUのI2C/SPI処理オーバーヘッドを減らすには、IMU内蔵FIFOバッファとDMA転送を組み合わせます。

// LSM6DSOでFIFO使用例(疑似コード)
void lsm6dso_fifo_init(void) {
    // FIFOモード設定: Continuous mode, ODR=104Hz
    lsm6dso_write(FIFO_CTRL4, 0x06);  // Continuous mode
    lsm6dso_write(FIFO_CTRL3, 0x09);  // Accel+Gyro FIFO有効
}

void lsm6dso_fifo_read_all(ImuSample *samples, uint16_t *count) {
    uint8_t fifo_status[2];
    lsm6dso_read(FIFO_STATUS1, fifo_status, 2);
    
    uint16_t unread = ((uint16_t)(fifo_status[1] & 0x03) << 8) | fifo_status[0];
    *count = unread;
    
    for (uint16_t i = 0; i < unread; i++) {
        uint8_t tag_byte, raw[6];
        lsm6dso_read(FIFO_DATA_OUT_TAG, &tag_byte, 1);
        lsm6dso_read(FIFO_DATA_OUT_X_L, raw, 6);
        
        if ((tag_byte >> 3) == 0x01) {  // Gyro tag
            samples[i].gx = (int16_t)(raw[1]<<8 | raw[0]);
            samples[i].gy = (int16_t)(raw[3]<<8 | raw[2]);
            samples[i].gz = (int16_t)(raw[5]<<8 | raw[4]);
        } else if ((tag_byte >> 3) == 0x02) {  // Accel tag
            samples[i].ax = (int16_t)(raw[1]<<8 | raw[0]);
            samples[i].ay = (int16_t)(raw[3]<<8 | raw[2]);
            samples[i].az = (int16_t)(raw[5]<<8 | raw[4]);
        }
    }
}

振動対策

モーターや機械振動が多い環境では振動ノイズがエイリアシング(折り返しノイズ)を引き起こすことがあります。

  1. DLPFカットオフ周波数を適切に設定: ナイキスト周波数(ODR/2)以下に設定
  2. 防振マウント: 硬質PCB取り付けより防振フォームや柔軟ケーブル経由で実装
  3. ハードウェアフィルタ: センサー電源ラインへのデカップリングコンデンサ強化

他技術との比較

MEMS加速度計の方式比較

方式原理感度帯域用途
容量式(Capacitive)電極間容量変化中(〜数kHz)スマートフォン・IMU
圧電式(Piezoelectric)圧電素子の電荷高(〜100kHz)振動計測・衝撃検知
圧抵抗式(Piezoresistive)シリコン抵抗変化高(〜数kHz)産業用加速度計
熱対流式(Thermal)熱流体の偏り低(〜50Hz)超低周波・地震計

デジタルIMU vs アナログ加速度センサー

比較項目デジタルIMU(I2C/SPI)アナログ加速度センサー
代表例MPU-6050, LSM6DSOADXL335, MMA7361
インターフェースI2C/SPI(デジタル)アナログ電圧出力
分解能16bit(内蔵ADC)MCU ADCに依存(12bit等)
実装難易度プロトコル実装必要ADCで直接読み取り
ノイズ低い(デジタル伝送)配線長・ADCノイズに影響
価格数百〜数千円数百円
現在の主流ほぼデジタルIMUに移行低コスト・シンプル用途

コンシューマー向け vs 産業向け IMU

比較項目コンシューマー向け(MPU-6050等)産業向け(ADIS16500等)
バイアス安定性〜10°/h〜0.1°/h
ARW(角度ランダムウォーク)〜0.05°/√h〜0.005°/√h
動作温度-20〜85°C-40〜125°C
耐衝撃性5000g2000g
価格数百〜数千円数万〜数十万円
用途スマートフォン・ドローン産業ロボット・測量機器

関連用語

参考リンク