IMU モジュールを MicroDuck で使う
本モジュールは MicroDuck の胴体 IMU —— サーボバス上に載っている imu_to_dxl ボード —— を、I²C 接続の本モジュールに置き換えられます。
状態
| IMU データ経路:サンプリング・デコード・観測スロット | 実機で検証済み |
MicroDuck ランタイム(robotd)への組み込み | 統合フェーズで対応予定 |
位置づけ:外付け I²C モジュールは過渡的な構成です。最終形態では IMU をロボット本体のハードウェアとメインコントローラに統合します。本ページの配線、座標系、キャリブレーション方法は統合後もそのまま使えます。
完全なガイドとコード:Juxi-Technology/imu-displace-microduck
あちらのリポジトリが本ページの正式版です。正確な配線、キャリブレーション手順、受け入れチェックリスト、実測値はすべてそこにあります。本ページは入口にすぎません。
配線
| モジュール | ICM-42670-P、I²C スレーブ 0x23 |
| ピン | GND / 3V3 / SDA / SCL |
| 電源 | 3V3。5V は不可(ホストの I/O は 3.3 V) |
| バス(公式 HAT) | /dev/i2c-pihat = /dev/i2c-3。J6 の R18/R19 を R16/R17 に移すと /dev/i2c-4 |
| アドレス衝突 | 同じバスに 0x18(オーディオ)、0x19/0x68 または 0x6A(オンボード IMU)、0x29(ToF)が既にありますが、0x23 はどれとも衝突しません |
sudo apt install -y i2c-tools
sudo i2cdetect -y -r <バス番号> # 23 が見えるはずDynamixel ID 200 にならない理由
ID 200 はサーボバス上のデバイス番号です(1 本の半二重 TTL、1 Mbps、Dynamixel Protocol V2)。本モジュールが話すのは I²C(2 線、レジスタ読み書き)です。HAT の I²C ヘッダに繋いでも ID 200 にはなりません。ホストは 2 つのバスを別々に読み、1 つのセンササンプルに統合します。
検証(モジュールのみ、サーボ不要)
cargo run -p duck-control --example imu_probe -- /dev/i2c-7 20
cargo run -p duck-control --example imu_to_observation -- /dev/i2c-7 20| 期待値 | |
|---|---|
| サンプルレート | 約 100 Hz、読み取り失敗ゼロ |
| 2 つ目のコマンド | obs[0..3](ジャイロ)、obs[3..6](重力)、関節ブロックの不一致ゼロ |
Jetson Orin Nano + /dev/i2c-7 での実測:99.4 Hz、1 サンプル 0.92 ms、読み取り失敗ゼロ。
参考取り付け
モジュールの 3 軸を胴体の軸に一致させます —— X 前 / Y 左 / Z 上 —— 物理的には部品面を上、Type-C を後方に向けます。このとき mount 回転は単位クォータニオンになります。
モジュール自身の座標系(直交する 3 姿勢で実測):部品面を上にして平置きすると重力は [0, 0, -1]、Type-C を上にすると [1, 0, 0]、部品面を右に向けて側立すると [0, 1, 0]。
今後の予定
- モジュールを
robotdランタイムに統合する:バスパス、IMU ソース、mount を設定可能にする。 - IMU 専用の取得スレッドと共有スロットを用意し、I²C 読み取りが制御 tick を占有しないようにする。
- 実際の 15 サーボバスと歩行ポリシーで機体全体を検証する。最終形態では IMU を機体ハードウェアとメインコントローラに統合する。

