概要
加速度センサー(加速度計、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が搭載され、モーションコントロールや姿勢追跡に使われます。
実装・開発のポイント
サンプリングレートとフィルタ設計
用途に応じた適切なサンプリングレートとフィルタ設定が重要です。
| 用途 | 必要ODR | DLPFカットオフ |
|---|---|---|
| 傾き計(静的) | 50〜100Hz | 5〜10Hz |
| 歩行検出 | 50〜100Hz | 20Hz |
| ドローン姿勢制御 | 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]);
}
}
}
振動対策
モーターや機械振動が多い環境では振動ノイズがエイリアシング(折り返しノイズ)を引き起こすことがあります。
- DLPFカットオフ周波数を適切に設定: ナイキスト周波数(ODR/2)以下に設定
- 防振マウント: 硬質PCB取り付けより防振フォームや柔軟ケーブル経由で実装
- ハードウェアフィルタ: センサー電源ラインへのデカップリングコンデンサ強化
他技術との比較
MEMS加速度計の方式比較
| 方式 | 原理 | 感度 | 帯域 | 用途 |
|---|---|---|---|---|
| 容量式(Capacitive) | 電極間容量変化 | 高 | 中(〜数kHz) | スマートフォン・IMU |
| 圧電式(Piezoelectric) | 圧電素子の電荷 | 中 | 高(〜100kHz) | 振動計測・衝撃検知 |
| 圧抵抗式(Piezoresistive) | シリコン抵抗変化 | 中 | 高(〜数kHz) | 産業用加速度計 |
| 熱対流式(Thermal) | 熱流体の偏り | 低 | 低(〜50Hz) | 超低周波・地震計 |
デジタルIMU vs アナログ加速度センサー
| 比較項目 | デジタルIMU(I2C/SPI) | アナログ加速度センサー |
|---|---|---|
| 代表例 | MPU-6050, LSM6DSO | ADXL335, 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 |
| 耐衝撃性 | 5000g | 2000g |
| 価格 | 数百〜数千円 | 数万〜数十万円 |
| 用途 | スマートフォン・ドローン | 産業ロボット・測量機器 |