主機解析與整合範例

適用於 IMU600-V2/韌體 0.11.2/GUI v1.6.1。

典型輸出順序

出廠設定約在上電後 1 秒內開始 50 Hz 輸出。每批三行 RAW、一行 FUSED、一行 AHRS;BARO 依自己的量測完成時間送出,每秒預設 50 行。統計每秒一組。下例的省略號與 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() 可能只讀到部分資料,也可能一次讀到多行或多包,接收程式需要先累積資料,分出完整的一行或一包,再進行解析。

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=連續三個浮點數。此格式合計 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 協定。交給 unpack 的內容只需 payload,請先移除合計 7 bytes 的封包標頭與 CRC。RAW 的 seq 由訊息 ID 0x01 計數,三顆 RAW 共用這一類的序列。

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 分頻結果,不代表所有主機轉接器的誤差。主機必須支援所選鮑率;提高速度時確認線材、共地與接收錯誤,並遵循「收到舊鮑率 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

原文件逐頁閱讀 · 三份文件逐章對照與差異說明

回到本分類總覽 · 全部設定指南