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資料の章対応と相違点
このカテゴリの概要 · 設定ガイド一覧