ASCII 資料、狀態與指令

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

通訊格式完整章節:2. 資料輸出(2.1–2.5) · 3. 狀態與統計資料(3.1–3.4)。各訊息均附完整格式與逐欄說明。

格式與時間戳

$<body>*<XX>\r\n

body 第一欄為 SPNV 訊息名稱,其餘欄位以逗號分隔。XX 為 $ 與 * 之間全部 ASCII 位元組 XOR 的兩位十六進位值。接收程式先找到 $,再讀取完整的一行;如果校驗失敗,就丟棄該行。校驗通過後,依訊息名稱選擇解析方式,並容許未來版本在尾端增加欄位。

ts_us 是 64-bit 時間戳,開機時歸零,單位為微秒。在 IMU 資料中,它表示這筆資料量測時段的結束時間;同一批三顆 RAW 與 fused 的時間戳相同。它不是 UTC 時間。陀螺單位 °/s、加速度比力 m/s²;Δθ 是 rad,Δv 是 m/s,dt 是 s。請使用實際 dt,不要一律以 1/RATE 代替。

def spnv_checksum(body: str) -> str:
    value = 0
    for byte in body.encode("ascii"):
        value ^= byte
    return f"{value:02X}"

body = "SPNVCMD,RATE,100"
command = f"${body}*{spnv_checksum(body)}\r\n".encode("ascii")
# ser.write(command)

主要資料欄位

以下為訊息名稱之後的欄位順序;實際行另含 $、訊息名稱、*XX 與 CRLF。

SPNVIMURAW:
id,ts_us,gx,gy,gz,ax,ay,az,temp,n,status,dthx,dthy,dthz,dvx,dvy,dvz,dt

SPNVIMU:
ts_us,gx,gy,gz,ax,ay,az,temp,dthx,dthy,dthz,dvx,dvy,dvz,dt,n_used,flags

SPNVBARO:
ts_us,press_hpa,temp_c,alt_m,status

SPNVAHRS:
ts_us,roll,pitch,yaw,q0,q1,q2,q3,align,flags,bgx,bgy,bgz,zb_s

SPNVPPS:
ts_us,edges,captures,state,err_ppm,age_ms,align

SPNVSTAT:
id,dry,out,crc_err,frame_err,spi_timeout,dropped,dcnt_skip,dry_timeout,dry_kicks,dry_pin,isr_us_max,isr_us_last,isr_cpu,resync[,read_retry,read_bad]

SPNVFUS:
outputs,rej1,rej2,rej3,incomplete,degraded,gth,ath
  • RAW 每批三行,id = 1/2/3;n 是累積原始樣本數,50 Hz 時約 29–30。Δθ/Δv 已包含 coning/sculling 補償。
  • fused 每批一行,n_used 為採用顆數;used_mask 僅存在 binary 資料。BARO 為 hPa/°C/ISA 高度 m,僅供相對高度參考,status = 0 正常。
  • AHRS 角度為 deg、q 為 body FRD → NED(q0 純量)、bg 為 °/s、zb_s 是 0–10 秒的靜止零偏校正進度。STAT 為每顆 1 Hz 統計,FUS 是合併統計;SYS 的 uart_drop/u2_drop 增加表示對應 UART 頻寬不足。

IMU status

status 是這段量測期間所有原始樣本旗標做 OR 運算後的結果。品質判斷使用 status & 0x7F;一般情況下,合併器排除這個值非零的 IMU;若三顆皆有錯誤旗標,會退回使用三顆資料,不能只靠 FUSED 是否持續輸出判定正常。bit7 的 PPS 標記須另外判讀。

Bit Value Name 意義
0 1 SPI_CRC 內部通訊錯誤;不可信
1 2 CE 無效請求;原始資料仍有效,但合併會排除
2 4 IDS 感測器內部資料狀態異常;可疑
3 8 S_ERROR 感測器自我診斷錯誤;不可信
4 16 S_SAT 超出量程,數值截頂
5 32 S_INIT 初始化中(約 250 ms);不可信
7 128 PPS ts_us 對到 PPS 上升緣;不是錯誤

常見值:0 正常;16 飽和;12 感測器錯誤;32/44 開機初始化。

合併 flags

Bit Value 意義
0–2 1 / 2 / 4 IMU 1/2/3 被排除
3 8 SPREAD_WARN
4 16 DEGRADED:可用顆數 <2
5 32 INCOMPLETE:本批資料尚未收齊
6 64 SATURATED:至少一顆飽和
7 128 PPS:時間標記

AHRS 對準與 flags

align 狀態
0 初始對準中;靜置約 1 秒
1 roll/pitch 有效,yaw 為相對角
2 已使用 HDG 手動給定航向
Bit 意義
0 動態中
1 零偏估計暫停
2 航向來自 HDG
3 本筆不使用加速度計
4 對準時移動;靜置後 AHRS,reset
5 已完成 ≥10 秒靜止零偏估計;狀態,非警告
6 最近 10 秒判定為靜止;狀態

設定指令

UART1 指令始終使用 ASCII,格式 $SPNVCMD,<key>,<value>[*XX],以 CRLF 結尾。手動輸入可省略校驗;不分大小寫。成功回覆 $SPNVACK,<key>,<實際值>,失敗回覆 $SPNVNAK,<key>,<原因>。一般指令只改 RAM,永久保存須 SAVE。

Key Value 出廠值 功能
RATE 5 / 10 / 25 / 50 / 100 / 200 / 400 / 500 / 1000 50 IMU 輸出率 Hz
OUT raw / fused / both / none both UART1 IMU 內容
BARO 0 / 1 1 UART1 氣壓資料開關
BRATE 10 / 25 / 50 / 100 50 氣壓輸出率 Hz
AHRS 0 / 1 / reset 1 姿態輸出;reset 後靜置 1 秒
HDG −360 … 360 — 手動航向 deg;需 align ≥1
AKP / AKI 0 … 50 2.0 / 0.05 AHRS 比例/積分增益
GTH / ATH 0 < v ≤100 0.5 / 0.5 合併剔除門檻 °/s/m/s²
STAT 0 / 1 / now 1 1 Hz 統計;now 立即送一組
HB 0 / 1 0 診斷心跳 SPNVHB
MODE ascii / binary ascii UART1 格式;ACK 使用舊格式
BAUD 460800 / 921600 / 1500000 / 2000000 460800 UART1 鮑率;收到舊鮑率 ACK 後切換
U2OUT raw + fused + ahrs + baro + stat; none; all raw 以 + 組合 UART2 輸出
U2MODE ascii / binary binary UART2 格式
U2BAUD 115200 / 230400 / 460800 / 921600 / 1500000 / 2000000 460800 UART2 鮑率
PPS 0 / 1 1 GPS PPS 時間格對齊
TRIG 0 / 1 0 0 連續;1 外部觸發
AZB 0 / 1 1 AHRS 靜止 10 秒零偏估計,含 Z 軸
SPI off / ardupilot / stream off SPI3 輸出用途
SPIOUT raw + fused + ahrs + baro + stat; none; all none SPI stream 內容
SPIMODE ascii / binary binary SPI stream 格式
SPICK 3 / 0 3 SPI Mode 3/Mode 0
SAVE 1 — 設定寫入 flash;暫停輸出
FACTORY 1 — 還原設定,不清校正;回 460800 ASCII
CFG 1 — 讀回 SPNVCFG、SPNVU2、SPNVSPI
INFO 1 — 版本、重置原因、序號、初始化結果
REINIT 1 — 重新初始化三顆 IMU
PING 任意字串 — 原樣回傳測試
BOOT 1 — 重開機並載入已存設定
CAL 1 — 讀回校正 SPNVCAL
ACAL <imu>,<bx>,<by>,<bz>,<kx>,<ky>,<kz> — a = (a_raw − b) × k;|b| ≤2、0.95 ≤k ≤1.05
FWGT g / a,<w1>,<w2>,<w3> 1,1,1 陀螺/加速度相對權重;0 < w ≤100
CALSAVE 1 — 校正與權重另存 flash
CALCLR 1 — 清除校正
DBG 1 — 完整裝置資訊;ACK 後 BOOT/RESET/AUTH/INIT/DBG 等。

FWGT 的第一個值擇一使用 g 或 a,例如 FWGT,g,1,1,1。出貨韌體不會主動顯示開機資訊;INFO 可查 POR(上電)、EXTR(MCLR)、SWR(軟體重置)、WDTO(看門狗)等重置原因。

最小設定範例

下列為無校驗手動指令,每行以 CRLF 傳送;將輸出改為 100 Hz fused 後保存。

$SPNVCMD,CFG,1
$SPNVCMD,RATE,100
$SPNVCMD,OUT,fused
$SPNVCMD,SAVE,1
$SPNVCMD,CFG,1

RAW 與 FUSED 欄位詳解

欄位 ASCII 精度/單位 定義
id integer RAW 的 IMU 編號 1–3
ts_us u64 · µs IMU 積分終點;同批 RAW/FUSED 共用時鐘與時間邊界
gx / gy / gz 小數 4 位 · °/s 將本次輸出期間收集到的原始資料進行運算,得到角速度。每顆 IMU 每秒約取樣 1475 次;dth/dt 為 rad/s,需乘 180/π 才是 °/s
ax / ay / az 小數 4 位 · m/s² 平均比力,靜置仍包含重力影響
temp 小數 2 位 · °C RAW 是單顆內溫;FUSED 是參與合併者的溫度平均
n integer RAW 原始樣本數:約 14–15 @100 Hz、29–30 @50 Hz、295 @5 Hz
dthx / dthy / dthz 小數 7 位 · rad 梯形積分與二階 coning 補償後的旋轉向量
dvx / dvy / dvz 小數 6 位 · m/s 含旋轉與 sculling 補償的速度增量;水平靜置 dvz ≈ −9.79 × dt
dt 小數 6 位 · s 實際積分時間;FUSED 為參與合併的 IMU 之 dt 平均值
n_used integer FUSED 實際使用的 IMU 數,1–3

三顆感測器的取樣時鐘略有差異,因此即使 ts_us 相同,樣本數 n 可能差 1,實際取樣涵蓋時間與 dt 也可能不同。相同的時間戳不代表各顆 IMU 在完全相同的瞬間取樣。

單次感測器回應的 S[1:0] 只能選一種狀態,優先序為初始化 > 錯誤 > 飽和 > 正常;整批 status 是 OR,因此可能同時含 bit3/4/5。SPI_CRC 也可能表示回應位址不符。SPREAD_WARN 表示差距超過有效門檻一半,或已超門檻但尚未達持續排除條件。

BARO:時間戳與量測延遲

Forced mode 的 ts_us 是啟動氣壓量測的時間,不是完成時間,也不是 IMU 積分終點。 Normal mode 則是偵測到新資料就緒的時間。即使 BARO 與 IMU 的 ts_us 相同,代表的量測時段仍不同;轉換時間見 SPNVINIT,B 的 conv_us。

BRATE OSR pressure / temperature IIR
10 / 25 Hz 16× / 2× 3
50 Hz 8× / 2× 3
100 Hz 4× / 1× 3

韌體會讓量測轉換時間比輸出週期至少短 3 ms。press_hpa 為 hPa(mbar),乘 100 轉 Pa;ASCII 4 位小數的顯示解析度為 0.01 Pa,不代表量測精度。temp_c 是晶片內溫。alt_m = 44330.77 × [1 − (p/1013.25)^0.190263],受天氣影響,可能為負值;status bit0 表示本筆取得前曾遇 I2C NACK/衝突,但重試已成功。

AHRS 詳細判讀

欄位/旗標 範圍或觸發條件
roll / pitch / yaw ASCII 3 位小數,deg;roll −180…180、pitch −90…90、yaw 0…360
q0…q3 ASCII 6 位小數;Hamilton 四元數,q0 純量,v_n = R(q) · v_b
bgx / bgy / bgz ASCII 4 位小數,°/s;機體座標零偏估計
zb_s ASCII 1 位小數,0–10 s;移動歸零,AZB=0 時固定 0
HIGH_DYN (bit0) 比力大小與 g 差 >0.5 m/s²、角速度大小 >50 °/s,或重力方向差 >5°;Kp 降為 0.2
BIAS_FROZEN (bit1) 動態中、角速度大小 >5 °/s,或比力大小與 g 差 >0.2 m/s²;只暫停零偏學習
ACC_REJECT (bit3) 比力大小與 g 差 >3 m/s²;該次只用陀螺更新

姿態以 FUSED 的 Δθ 更新四元數,以 Δv/dt 觀測重力方向。AZB 每 10 秒檢查靜止:各軸陀螺標準差 <0.1 °/s、加速度判定值 <0.1 m/s²,且無動態旗標;通過後以該段平均值估計三軸零偏,首次直接套用並設 BIAS_CAL。

指令補充與 NAK

指令行可用 CR 或 LF 結束(建議 CRLF),超過 127 字元整行丟棄;有校驗但錯誤時回 SPNVNAK,CMD,checksum。DBG,1 取得比 INFO 更完整的診斷資訊。BAUD 的 ACK 用舊鮑率送完後約 5 ms 切換;MODE 與 FACTORY 的 ACK 同樣先用舊格式/鮑率。

指令/回覆 說明
DBG,1 ACK 後回完整 BOOT/RESET/AUTH/INIT/DBG 等資訊
CFG saved=1 只代表 NVM 曾儲存設定,不表示目前 RAM 內容全已保存
BRATE 重設氣壓計最多占用約 15 ms,IMU 不受影響;OSR 會依新速率調整
SPI / TRIG SPI 亦可用 0/1/2;TRIG 亦可用 continuous/trigger
U2OUT / SPIOUT 內容可用 +、逗號或直線符號組合,建議使用 +

不需行尾的單字元捷徑:1–6 依序是 5/10/25/50/100/1000 Hz;s 立即送統計、r 重新初始化。200/400/500 Hz 需完整 RATE 指令。

checksum
not SPNVCMD
missing value
unknown key
range
osr/odr invalid
i2c error
i2c timeout
not leveled yet
nvm not available
write failed
no bootloader (dev build)

上方列出常見的 NAK 回覆。use ... 後面是可接受的選項,可對照完整指令表確認。HDG 需先完成調平;SAVE/CALSAVE 失敗時,先保留回覆供診斷。

本章通訊細節另依通訊協定 v1.1,第 4–21 頁整理;通訊協定總覽。

設定回讀與回覆格式

$SPNVCMD,<key>,<value>[*XX]\r\n
$SPNVACK,<key>,<actual_value>*XX
$SPNVNAK,<key>,<reason>*XX

上列為格式示意,CRLF 以字面 \r\n 表示。ACK 會回報實際套用的值。ACAL/FWGT 等回覆的值本身也含逗號,解析時需保留完整內容。CFG 用來讀取 RAM 中的目前設定,NVM 顯示已儲存的設定;CAL 則回傳三顆 IMU 各自的校正資料,再加一行 W 權重資料。

$SPNVCMD,CFG,1
$SPNVACK,CFG,1*XX
$SPNVCFG,baud=460800,mode=ascii,rate=50,out=3,stat=1,hb=0,baro=1,brate=50,ahrs=1,gth=0.500,ath=0.500,akp=2.000,aki=0.0500,saved=1,fw=0.11.2,trig=0,azb=1*XX
$SPNVU2,out=raw,mode=binary,baud=460800,drop=0,pps=1,pps_state=1,pps_err_ppm=0.000*XX
$SPNVSPI,mode=off,out=none,fmt=binary,ck=3,txn=0,ok=0,short=0,delivered=0,drop=0,...*XX

原始文件:IMU600-V2 User Manual v1.1 · PDF 頁 17–25

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

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