ホスト解析と統合例

対象: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

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

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