主機解析與整合範例¶
適用於 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