Binaryパケットと帯域

対象:IMU600-V2/FW 0.11.2/GUI v1.6.1。

MODE,binaryでUART1出力を切り替えます。コマンドはASCIIのまま、ACK/NAK/INFO応答は0x7F TEXTです。UART2は出荷時binaryで、単位・status/flagsはASCIIと共通です。

フレームとCRC

D6 44 | id (1) | len (1) | seq (1) | payload (len) | crc16 (2)
フィールド 規則
sync 0xD6 0x44
id / len ID/payload長0–255 bytes
seq ID・UART別の8-bit循環カウンター
payload Little-endian、f32 = IEEE-754単精度
crc16 CRC-16/CCITT-FALSE:poly 0x1021、init 0xFFFF、反転なし、xorout 0。id/len/seq/payloadが対象、CRCはLE格納
def crc16_ccitt(data: bytes) -> int:
    crc = 0xFFFF
    for byte in data:
        crc ^= byte << 8
        for _ in range(8):
            crc = ((crc << 1) ^ 0x1021) & 0xFFFF if crc & 0x8000 else (crc << 1) & 0xFFFF
    return crc

assert crc16_ccitt(b"123456789") == 0x29B1

def frame_crc_ok(frame: bytes) -> bool:
    if len(frame) < 7 or frame[:2] != b"\xd6\x44":
        return False
    size = frame[3]
    return (len(frame) == size + 7 and
            crc16_ccitt(frame[2:5 + size]) ==
            int.from_bytes(frame[5 + size:7 + size], "little"))

メッセージ一覧

ID Name Payload bytes Python struct
0x01 IMU_RAW 68 <BBHQ3f3ff3f3ff
0x02 IMU (fused) 68 <Q3f3ff3f3ffBBBB
0x03 BARO 24 <QfffB3x
0x04 AHRS 52 <Q4f3f3fBBH
0x05 PPS 24 <QIIiBBH
0x10 STAT 44 <BBBB9IHH
0x11 FUS 32 <6Iff
0x12 SYS 48 <7IHBBBBBBIII
0x7F TEXT 可変 ASCII文字列、$と*XXなし

Payloadフィールド順

0x01 IMU_RAW:
imu_id:u8, status:u8, n:u16, ts_us:u64,
gyro[3]:f32, acc[3]:f32, temp:f32, dth[3]:f32, dv[3]:f32, dt:f32

0x02 IMU:
ts_us:u64, gyro[3]:f32, acc[3]:f32, temp:f32,
dth[3]:f32, dv[3]:f32, dt:f32,
n_used:u8, flags:u8, used_mask:u8, reserved:u8

0x03 BARO:
ts_us:u64, press_hpa:f32, temp_c:f32, alt_m:f32, status:u8, reserved[3]:u8

0x04 AHRS:
ts_us:u64, q[4]:f32, roll:f32, pitch:f32, yaw:f32,
gyro_bias[3]:f32, align:u8, flags:u8, zb_ds:u16

0x05 PPS:
ts_us:u64, edges:u32, captures:u32, err_ppb:i32, state:u8, align:u8, age_ms:u16

0x10 STAT:
imu_id:u8, dry_timeout:u8, dry_pin:u8, isr_cpu_pct:u8,
dry:u32, out:u32, crc_err:u32, frame_err:u32, spi_timeout:u32,
dropped:u32, dcnt_skip:u32, dry_kicks:u32, resync:u32,
isr_us_max:u16, isr_us_last:u16

0x11 FUS:
outputs:u32, rej[3]:u32, incomplete:u32, degraded:u32,
gyro_thresh:f32, acc_thresh:f32

0x12 SYS:
uart_drop:u32, loops_per_s:u32, uart_resets:u32, pps_cnt:u32,
baro_samples:u32, baro_i2c_err:u32, baro_timeouts:u32,
rate_hz:u16, isr_cpu_total_pct:u8, out_mode:u8, baro_stale:u8,
baro_hz:u8, proto_mode:u8, pps_state:u8, u2_drop:u32, trig_cnt:u32, trig_rej:u32
  • AHRS binaryは四元数が先、オイラー角が後でASCIIと異なります。zb_dsは0.1 s単位、ASCIIのzb_sは秒です。
  • PPS binaryはerr_ppb、ASCIIはerr_ppmで、正はローカルクロックが速いことを示します。
  • used_maskのbit nはIMU n+1採用を示します。SYS out_modeは0 none/1 raw/2 fused/3 both、proto_modeは0 ascii/1 binaryです。SYSはlenにより48 bytes(本版)、40(fw 0.8.0)、旧36を識別します。

帯域設計

8N1は1 byteに10 bitを使うため460800 bpsで約46 kB/sです。以下は資料のbinary概算で、コマンドと統計の余裕を確保します。ASCIIは通常およそ2倍の帯域が必要です。

構成 概算流量 必要速度
50 Hz both + AHRS + BARO 19 kB/s 460800
100 Hz both + AHRS + BARO 37 kB/s 460800
200 Hz fused + AHRS 27 kB/s 460800
400 Hz fused + AHRS 54 kB/s 921600
500 Hz fused + AHRS 67 kB/s 921600
1000 Hz RAW 1個(計算基準) 75 kB/s 921600
1000 Hz fused + AHRS 134 kB/s 1500000 / 2000000

rawは実際には3個すべてを送り、1000 Hzで約225 kB/sとなり2000000 bpsの約200 kB/s上限を超えます。fused化またはRATE低下が必要です。UARTバッファ満杯時は行/フレーム単位で破棄し、uart_drop/u2_dropで確認します。UART破棄だけではSPI損失を意味しません。

Payloadバイトオフセット

以下offsetはpayloadのbyte 0からで、先頭5 bytesのsync/id/len/seqを含みません。UART総長はpayload + 7、SPI全パケットoffsetとも別です。

0x01 IMU_RAW · 68 / 75 bytes

Offset フィールド Type
0 imu_id u8
1 status u8
2 n u16
4 ts_us u64
12 gyro[3] f32 ×3
24 acc[3] f32 ×3
36 temp f32
40 dth[3] f32 ×3
52 dv[3] f32 ×3
64 dt f32

0x02 IMU · 68 / 75 bytes

Offset フィールド Type
0 ts_us u64
8 gyro[3] f32 ×3
20 acc[3] f32 ×3
32 temp f32
36 dth[3] f32 ×3
48 dv[3] f32 ×3
60 dt f32
64 n_used u8
65 flags u8
66 used_mask u8
67 reserved u8

0x03 BARO · 24 / 31 bytes

Offset フィールド Type
0 ts_us u64
8 press_hpa f32
12 temp_c f32
16 alt_m f32
20 status u8
21 reserved[3] u8 ×3

0x04 AHRS · 52 / 59 bytes

Offset フィールド Type
0 ts_us u64
8 q[4] f32 ×4
24 roll / pitch / yaw f32 ×3
36 gyro_bias[3] f32 ×3
48 align u8
49 flags u8
50 zb_ds u16

0x05 PPS · 24 / 31 bytes

Offset フィールド Type
0 ts_us u64
8 edges u32
12 captures u32
16 err_ppb i32
20 state u8
21 align u8
22 age_ms u16

0x10 STAT · 44 / 51 bytes

Offset フィールド Type
0 imu_id u8
1 dry_timeout u8
2 dry_pin u8
3 isr_cpu_pct u8
4 dry u32
8 out u32
12 crc_err u32
16 frame_err u32
20 spi_timeout u32
24 dropped u32
28 dcnt_skip u32
32 dry_kicks u32
36 resync u32
40 isr_us_max u16
42 isr_us_last u16

0x11 FUS · 32 / 39 bytes

Offset フィールド Type
0 outputs u32
4 rej[3] u32 ×3
16 incomplete u32
20 degraded u32
24 gyro_thresh f32
28 acc_thresh f32

0x12 SYS · 48 / 55 bytes

Offset フィールド Type
0 uart_drop u32
4 loops_per_s u32
8 uart_resets u32
12 pps_cnt u32
16 baro_samples u32
20 baro_i2c_err u32
24 baro_timeouts u32
28 rate_hz u16
30 isr_cpu_total_pct u8
31 out_mode u8
32 baro_stale u8
33 baro_hz u8
34 proto_mode u8
35 pps_state u8
36 u2_drop u32
40 trig_cnt u32
44 trig_rej u32

見出しの長さはpayload/全フレームです。旧SYS 36/40 bytesは存在する末尾だけを読み、STATのread_retry/read_badはASCIIのみです。PPS age_msは最大65535、align=1はPPS整列。AHRS zb_dsは0.1 s単位、fw 0.9.2以前は0です。

0x7F TEXTは$・*XX・CRLFを含まないASCII body(例SPNVACK,RATE,100)で、全フレーム最大262 bytesです。ACK/NAKやBOOT/RESET/DBG/AUTH/INIT/HB/STALL/TRAP等を運びます。

通信詳細はプロトコルv1.1、21–26ページにも基づきます。プロトコル概要を参照。


原資料:IMU600-V2 User Manual v1.1 · PDFページ 25–28

原ページを読む · 3資料の章対応と相違点

このカテゴリの概要 · 設定ガイド一覧