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