ホスト解析と統合例¶
対象:IMU600-V2/FW 0.11.2/GUI v1.6.1。
典型的な出力順序¶
出荷設定では電源投入から約1秒以内に50 Hz出力を開始します。1組はRAW 3行、FUSED 1行、AHRS 1行。BAROは独立した変換完了時に初期値50行/s、統計は1組/sです。下の省略記号・XXは形式例で、有効チェックサムの実データではありません。
$SPNVIMURAW,1,...*XX
$SPNVIMURAW,2,...*XX
$SPNVIMURAW,3,...*XX
$SPNVIMU,...*XX
$SPNVAHRS,...*XX
$SPNVBARO,...*XX
$SPNVSTAT,1,...*XX
$SPNVSTAT,2,...*XX
$SPNVSTAT,3,...*XX
$SPNVFUS,...*XX
$SPNVSYS,...*XX
INFO,1の主要順序はACK → BOOT → RESET → AUTH → INIT,1/2/3 → INIT,Bで、設定・校正・インターフェース情報を含む場合もあります。read()単位が必ず1行/1パケットとは仮定しないでください。
ASCIIチェックサムと解析例¶
シリアルバイトを完全な行に蓄積してからこの関数へ渡します。Noneは形式/チェックサム不正で、有効データは先頭の名前で分類します。
def spnv_checksum(body: str) -> str:
value = 0
for byte in body.encode("ascii"):
value ^= byte
return f"{value:02X}"
def parse_line(line: str):
line = line.rstrip("\r\n")
if not line.startswith("$") or "*" not in line:
return None
body, checksum = line[1:].rsplit("*", 1)
if len(checksum) != 2:
return None
try:
if spnv_checksum(body) != checksum.upper():
return None
except UnicodeEncodeError:
return None
return body.split(",")
body = "SPNVCMD,RATE,100"
command = f"${body}*{spnv_checksum(body)}\r\n".encode("ascii")
# ser.write(command)
Binaryのstruct文字列とは¶
<BBHQ3f3ff3f3ffはPython structの配置記述で、IMUへ送るコマンドではありません。<はlittle-endian・ネイティブ整列余白なし、Bは1 byte符号なし、Hは2 bytes、Qは8 bytes、fは4 bytes浮動小数、3fは3個連続です。合計68 bytesです。
import struct
RAW_FORMAT = "<BBHQ3f3ff3f3ff"
assert struct.calcsize(RAW_FORMAT) == 68
def decode_raw_payload(payload: bytes):
if len(payload) != 68:
raise ValueError("IMU_RAW payload must be 68 bytes")
v = struct.unpack(RAW_FORMAT, payload)
return {
"imu_id": v[0], "status": v[1], "n": v[2], "ts_us": v[3],
"gyro_deg_s": v[4:7], "acc_m_s2": v[7:10], "temp_c": v[10],
"dth_rad": v[11:14], "dv_m_s": v[14:17], "dt_s": v[17],
}
この関数はpayloadのみを解釈します。先に全D6 44フレームのID・長さ・CRCをBinary仕様に従い検証し、計7 bytesのヘッダー/CRCはunpackへ含めません。RAW seqはID 0x01単位で3個のセンサー共通です。
ASCII帯域と速度誤差¶
| ASCII設定 | 概算流量 | 460800 bpsでの判定 |
|---|---|---|
| 50 Hz both + BARO + AHRS | 38 kB/s | 使用可、drop確認 |
| 100 Hz fused + AHRS | 26 kB/s | 帯域内 |
| 100 Hz raw | 45 kB/s | 上限付近、行破棄の可能性 |
| 100 Hz both | 59 kB/s | 上限超過 |
| 設定速度 | 資料の実速度 | 誤差の絶対値 |
|---|---|---|
| 460800 | 458716 | 0.45% |
| 921600 | 925926 | 0.47% |
| 1500000 | 1515152 | 1.0% |
| 2000000 | 2000000 | 0% |
誤差は資料のUART分周値で、すべてのホストアダプターの仕様ではありません。ホストの対応速度を確認し、高速時は配線・GND・受信エラーを確認して旧速度ACK後に切り替えます。
メーカーホストツール¶
資料のtools/spnv_parser.pyはASCII/binary、検証、欠落統計に対応し、SpnvParser.feed(bytes)は(kind, name, dict)のリストを返します。以下はツール入手済み環境向けです。本サイトにはメーカープログラムを同梱せず、ethan@robotlab.com.twへ申請してください。
python3 spnv_parser.py COM5 460800 --binary --cmd RATE,100 --cmd OUT,fused
python3 spnv_parser.py --file capture.bin
原資料:IMU600-V2 Communication Protocol v1.1 · PDFページ 4–28