ジャイロスコープは、デバイスの3軸における回転の角速度を測定するセンサーです。線形加速度を測定する加速度センサーとは異なり、ジャイロスコープは空間における回転と方向を検出します。STMicroelectronics, 2024によれば、現代のMEMSジャイロスコープは毎秒0.01度までの精度を達成し、ナビゲーション、画像定位、ARアプリでの利用を可能にしています。
ポイント
スマートフォンのジャイロスコープは、デバイスの回転の角速度を測定するマイクロ電子機械センサー (MEMS) です。航空機で使用される機械式ジャイロスコープとは異なり、MEMSジャイロスコープはフォンのマザーボードに搭載された2×2×1mmのシリコンチップです。
現代のスマートフォンは、振動型のMEMSジャイロスコープ (チューニングフォーク型やリングデザイン型) を専用しています。回転部を持たず、連続動作で10年の耐久性が保証されます。主なメーカーはBosch Sensortec (BMIシリーズ)、STMicroelectronics (L3G、A3Gシリーズ)、InvenSense (ICMシリーズ)です。
一般的なMEMSジャイロスコープの測定範囲は±125~±2000°/s、サンプリングレートは最大32kHz、消費電流は3~6mAです。Bosch Sensortec BMI160 (2023)によれば、±125°/sの範囲でのノイズレベルは0.007°/s/√Hzであり、精確な回転追跡に十分です。
| パラメータ | 値 |
|---|---|
| 技術 | MEMS (振動型) |
| 範囲 | ±125 — ±2000 °/s |
| 消費電流 | 3–6 mA |
| サイズ | 2×2×1 mm |
| ノイズ | 0.007 °/s/√Hz |
MEMSジャイロスコープの動作原理はコリオリ効果に基づいています。チップ内部には、特定の周波数 (15~30kHz) で振動するシリコン質量があります。デバイスが回転すると、コリオリ力が振動する質量に作用し、これが角速度に比例します。
MEMSジャイロスコープの主な要素は、振動を生成するドライブ電極と、位移を検出するセンス電極です。研究論文「MEMS Gyroscopes for Consumer Electronics」 (IEEE, 2023) によれば、一般的な設計には、中央の質量の周りに対称に配置された4~8つの梳状構造が含まれます。
現代のジャイロスコープは、I²CまたはSPIバスを経由してデータを送信します。スマートフォンのコントローラは、3軸 (X: Pitch、Y: Roll、Z: Yaw) の角速度値を受け取ります。内蔵のADCが電容信号をデジタル値 (16~24ビット分解能) に変換します。ゲーモードでの更新レートは最大400Hzに達します。
加速度センサーは線形加速度――軸に沿った物体の速度変化――を測定します。ジャイロスコープは回転――角度の変化率――を測定します。これらのセンサーは互いに補完的です。加速度センサーは重力ベクトルに対する方向を提供しますが、倾きと直線運動を区別できません。ジャイロスコープは重力に依存せずに回転を追跡できますが、ドリフトの影響を受けます。
実際のアプリケーションではSensor Fusion――ジャイロスコープ、加速度センサー、地磁気センサーのデータを組み合わせるアルゴリズム――が使用されます。マホニフィルタや補完フィルタは、2度 (静止時) および5度 (動的時) の精度で方向四元数を計算します。Androidはフレームワークレベルで仮想センサーTYPE_ROTATION_VECTORを提供しています。
val rotationVector = sensorManager
.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)
val callback = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
val quat = FloatArray(4)
SensorManager.getQuaternionFromVector(quat, event.values)
// quat[0..3] — 方向四元数
}
}
Androidは2種類のジャイロスコープセンサーを提供しています: TYPE_GYROSCOPE (カリブレーション済み、ドリフトなし) と TYPE_GYROSCOPE_UNCALIBRATED (素のデータとドリフト推定値)。SensorManager.getDefaultSensor()からアクセスできます。データはrad/s (ラジアン毎秒) で返されます。
ジャイロスコープのリスナーを登録するには、遅延を指定する必要があります: ゲーム用SENSOR_DELAY_GAME (20ms)、UI用SENSOR_DELAY_UI (67ms)、最高周波数用SENSOR_DELAY_FASTEST (0ms)。onPause()で登録を解除しないと、バッテリーが2~3時間で消耗されます。
class GyroActivity : AppCompatActivity() {
private lateinit var sensorManager: SensorManager
private var gyroscope: Sensor? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
gyroscope = sensorManager.getDefaultSensor(
Sensor.TYPE_GYROSCOPE
)
}
override fun onResume() {
super.onResume()
gyroscope?.let { sensor ->
sensorManager.registerListener(
this, sensor, SensorManager.SENSOR_DELAY_GAME
)
}
}
}
event.values[0..2]からの素のデータは、X、Y、Zの角速度に対応します。回転角を求めるには、角速度を時間積分する必要があります。50Hzでの積分誤差は約1度/分であり、ゲームでは受け入れられますが、修正なしのナビゲーションには不十分です。
ゼロレートドリフト (バイアスドリフト) は、MEMSジャイロスコープの主な問題です。静止時でも、センサーが非ゼロの角速度 (0.1~2°/s) を示すことがあります。原因は、シリコン構造の温度変化と機械応力です。メーカーはハードウェアレベルでこの効果を補正しています。
Androidシステムは、初回起動時または温度変化時にジャイロスコープを自動カリブレーションします。手順は10~30秒で、ユーザーが何もする必要はありません――静止した面にフォンを置くだけです。calibrate()メソッドはすべてのデバイスで利用できるとは限りません。強制カリブレーションでは、TYPE_GYROSCOPE_UNCALIBRATEDを使用し、event.values[3..5]を経由してバイアスオフセットを取得します。
private fun handleUncalibratedGyro(event: SensorEvent) {
val rawX = event.values[0] // 未カリブレーションのrad/s
val biasX = event.values[3] // X軸バイアス
val calibratedX = rawX - biasX
applyCalibrationToFusion(
calibratedX,
event.values[1] - event.values[4],
event.values[2] - event.values[5]
)
}
ジャイロスコープは、カメラの振れ止めからGoogle CardboardのようなVRヘッドセットまで、多くのシナリオで使用されています。AppleのARKitやGoogleのARCoreは、頭の回転追跡の主センサーとしてジャイロスコープを使用しています。Apple ARKit Technical Specification (2024) によれば、加速度センサーと組み合わせたジャイロスコープは、追跡精度が最大0.5度です。
消費者向け電子機器以外では、ジャイロスコープはロボティクスやUAVで使用されています。Android ThingsやROS (Robot Operating System) をベースとしたモバイルロボットは、MEMSジャイロスコープを用いて運動定位とオドメトリーを行います。IEEEの研究「MEMS IMU in Robotics」 (2024) によれば、ジャイロスコープを備えたモバイルロボットの位置測定精度は、車輪オドメトリーだけの場合と比べて、特に滑りやすい地面で3~5倍も高くなります。消費者向けドローンでは、気圧計と組み合わせたジャイロスコープが、風速最大10m/sの環境で0.5mの精度で飛行高度を維持します。
ARアプリケーションでは、ジャイロスコープが主センサーとなり、現実世界に対する仮想オブジェクトの位置を決定します。Google ARCoreは1000Hz (内部サンプリングにより、APIレートとは独立) でデバイス運動追跡にジャイロスコープを使用しています。AppleのARKitは、運動時には0.5度の位置測定精度を達成し、現実のシーンに仮想家具やゲームのキャラクターを重ねるのに十分です。
次世代の6軸IMU (InvenSense ICM-42688, 2024) は、ジャイロスコープと加速度センサーを単一チップに統合し、低消費電力モードでの消費電流は0.45mAです。モバイルデバイス用の勾配計や原子ジャイロスコープの開発は、まだ実験室レベルのプロトタイプ段階です。0.001°/sの精度を持つ商用グレードのMEMSジャイロスコープは、2028年までに登場すると予想されています。
よくある質問
ジャイロスコープは、空間におけるデバイスの回転と方向を検出します。これがなければ、VRモード、倾きによる自動回転、動画定位、ARアプリは不可能です。現代のフォンはジャイロスコープなしでは機能しません。
加速度センサーは線形加速度 (重力に対する運動と倾き) を測定します。ジャイロスコープは角速度 (回転) を測定します。加速度センサーはデバイスの回転と直線運動を区別できませんが、ジャイロスコープがこの問題を解決します。
Androidは自動カリブレーションを使用しています。手動カリブレーションには、“GPS Status & Toolbox”などのアプリをダウンロードして、フォンを平な面に置き、TYPE_GYROSCOPE_UNCALIBRATEDを使ってカリブレーションします。
これはゼロレートドリフトで、MEMSセンサーの自然な特性です。高価なジャイロスコープでも、静止時に0.1~2°/sのオフセットがあります。カリブレーションはこのオフセットを削陛します。ドリフトが5°/sを超える場合、センサーは故障しています。
SensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)を使用し、SensorEventListenerを登録します。データは3軸でrad/sで届きます。ゲームにはSENSOR_DELAY_GAME (20ms)を、バックグラウンドにはSENSOR_DELAY_UI (67ms)を使用します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。