INERTIAL GUIDE
CV7のMIP通信|ACK・測定データ・チェックサムの読み方
3DM-CV7のMIPパケット構造、ACK/NACK、測定データ、Field Length、Big-endian、Fletcherチェックサムの読み方を解説します。
MIPを自社ソフトウェアへ実装するときは、シリアルポートから受け取ったバイト列を「1回のread=1パケット」と考えないことが重要です。
コマンドへのACK/NACKと、連続して送信される測定データは同じ通信路を流れます。受信バッファへ蓄積し、MIPパケット単位へ切り出してから、Descriptor SetとField Descriptorに従って処理します。
このページでできること
- MIPパケットの基本構造を理解する
- ACK/NACKと測定データを区別する
- Field LengthとDescriptorから可変フィールドを読む
- Big-endianの数値を正しくデコードする
- Fletcherチェックサムで破損パケットを検出する
- 分割受信・複数パケット同時受信へ対応する
1. MIPパケットの構造
MIPパケットは概ね次の構造です。
| 部分 | 内容 |
|---|---|
| Sync | パケット開始を示す2 byte |
| Descriptor Set | パケットの種類 |
| Payload Length | Payload長 |
| Payload | 1個以上のField |
| Checksum | 2 byte Fletcher checksum |
各Fieldは、
Field Length → Field Descriptor → Field Data
で構成されます。
Field Lengthを使って次のField位置を決めるため、固定長の構造体だけで処理しない方が安全です。
2. ACK/NACKと測定データを区別する
コマンドを送信すると、デバイスはACK/NACKを返します。
ACK/NACK FieldのDescriptorは0xF1です。
一方、サンプリング中はIMU DataやFilter Dataなどの測定パケットが継続的に送られます。
したがって、
コマンドを送った直後に受信した最初のパケットが、そのコマンドのACKである
とは限りません。
実装では、受信したパケットごとにDescriptor SetとField Descriptorを確認し、目的のコマンドに対応するACK/NACKを探します。
コマンドによっては、ACK/NACK以外のResponse Data Fieldも同じ応答パケットに含まれます。
3. Syncから完全な1パケットを切り出す
シリアル通信やUSB通信では、1回のreadで受け取る単位とMIPパケットの境界が一致するとは限りません。
例えば、
- パケットの前半だけ届く
- 1回のreadに2パケット入る
- 不要なbyteの後に次のSyncが現れる
といった状況があります。
基本的な受信処理は、
- 受信byteをバッファへ追加する
- Sync列を探す
- ヘッダーからPayload Lengthを読む
- パケット全体が揃うまで待つ
- Checksumを検証する
- Descriptor Setと各Fieldを解析する
- 処理済みbyteをバッファから除く
という流れにします。
Checksum不一致や不正なLengthを検出した場合は、次の有効なSyncを探して再同期します。
4. 数値のbyte orderを確認する
MIPのData Communications Protocolでは、フィールド定義に従って数値を読みます。
複数byteの整数やIEEE-754浮動小数点値を扱うときは、仕様に記載されたbyte orderを使用します。
例えば3軸加速度がfloat×3なら、
- X:4 byte
- Y:4 byte
- Z:4 byte
として順番に読みます。
ホストCPUがlittle-endianでも、受信したbyte列をそのまま構造体へコピーして正しい値になるとは限りません。
MIP SDKを利用すると、このbyte変換やField解析を独自実装する量を減らせます。
5. Checksumを確認する
MIPパケット末尾には2 byteのFletcher checksumがあります。
受信側では、パケットの対象範囲からチェックサムを計算し、受信したChecksumと比較します。
一致しないパケットはそのまま測定値として採用せず、通信ログや破損数として記録します。
通信が不安定な場合に、
- Checksum error
- Length error
- 不明Descriptor
- 受信タイムアウト
を別々に数えておくと原因を切り分けやすくなります。
6. Command Resultと通信タイムアウトを分ける
プログラムでは、少なくとも次を分けて扱います。
- ACK:デバイスがコマンドを受理
- NACK:デバイスがコマンドを拒否
- ホスト側タイムアウト:期待した応答を期限内に受信できない
- 通信エラー:送受信処理自体が成立しない
NACKとタイムアウトは原因が異なります。
不正なパラメータでNACKになったのか、正しい応答をホストが受信できなかったのかを区別してください。
7. パーサを試験するときの項目
MIPパーサを実装したら、正常パケットだけでなく次の条件も試します。
- 1 byteずつ分割して入力
- 1回で複数パケットを入力
- パケット途中まで入力して続きは次回にする
- Checksumを故意に壊す
- 未知のField Descriptorを含める
- ACKと測定パケットを交互に入力
- 可変数のFieldを含める
通信ログには、元byte列と解析結果を対応付けて残すとデバッグしやすくなります。
8. MIP SDKを使う場合
最新のMicroStrain慣性製品向けにはMIP SDKが提供されています。
低レベルのパケット生成・解析をすべて独自実装する必要がない場合は、SDKを利用する方が保守しやすくなります。
ただし、アプリケーション側では依然として、
- どのデータを購読するか
- コマンドの成功・失敗をどう扱うか
- Timestampをどう使うか
- 再接続時に設定をどう復元するか
を設計する必要があります。
参考資料
- 3DM-CV7 Online Manual / MIP protocol
https://files.microstrain.com/CV7%20Online/ - HBK MicroStrain MIP SDK
https://github.com/HBK-MicroStrain/mip_sdk
原典リンク
既存の関連ページもあわせて確認
既存の技術解説・ソフトウェア説明と相互に参照できるよう、本番反映時に現在のURLへ接続します。
