通訊協定 v1.1 原文件逐頁閱讀¶
適用於 IMU600-V2/韌體 0.11.2/GUI v1.6.1。
本頁收錄原文件的所有頁面,包括封面、目錄、修訂紀錄(如有)、正文與圖表。原文為繁體中文。點選圖片可以放大;展開圖片下方的文字即可複製。查看表格時,請以原頁圖片的欄位排列為準。
這裡保留原文件的文字與圖片。兩份文件記載不同或另有操作補充的地方,已整理在上方的對照說明中,也可在對應的設定指南查閱。
1 · 2 · 3 · 4 · 5 · 6 · 7 · 8 · 9 · 10 · 11 · 12 · 13 · 14 · 15 · 16 · 17 · 18 · 19 · 20 · 21 · 22 · 23 · 24 · 25 · 26 · 27 · 28 · 29 · 30 · 31 · 32 · 33
第 1 頁¶
展開本頁文字(可複製)
SparkNavi 向成電子有限公司 XIANG CHENG Electronic Co., Ltd. InertiaX core IMU600-V2 通訊協定說明 Communication Protocol Specification 使用者版 資料格式、指令與系統整合說明 對應韌體 Firmware 0.11.2 發行日期 2026 年 10 月 16 日 文件版號 1.1 XIANG CHENG Electronic Co., Ltd. (向成電子有限公司) No. 41, Wenxian 1st Rd., North Dist., Tainan City 704, Taiwan (R.O.C.) Tel +886-6-3586207 Fax +886-6-3581363 ethan@robotlab.com.tw · sparknavi.com © 2026 XIANG CHENG Electronic Co., Ltd. All rights reserved.
第 2 頁¶
展開本頁文字(可複製)
目錄
1. 基本規則 ................................................................................................................................................................... 4
2. 資料輸出 ................................................................................................................................................................... 4
2.1 $SPNVIMURAW — 單顆 IMU 資料(每批 3 行) ............................................................................................. 5
2.2 $SPNVIMU — 三顆 IMU 的合併資料(每批 1 行) .......................................................................................... 7
2.3 $SPNVBARO — 氣壓計資料 ..................................................................................................................................... 8
2.4 $SPNVAHRS — 姿態資料 .......................................................................................................................................... 9
2.5 輸出模式與頻寬 ...........................................................................................................................................................10
3. 狀態與統計資料 .................................................................................................................................................... 10
3.1 $SPNVSTAT — 每顆 IMU 統計 (每顆一行) ............................................................................................................11
3.2 $SPNVFUS — 合併統計 ..............................................................................................................................................13
3.3 $SPNVSYS — 系統統計 ..............................................................................................................................................13
3.4 $SPNVHB — 診斷心跳..............................................................................................................................................14
4. 開機資訊與事件訊息 ............................................................................................................................................ 14
5. 操作指令(主機送給裝置) ................................................................................................................................ 16
5.1 校正流程 (fw 0.5.0) .....................................................................................................................................................20
6. 典型輸出序列 ........................................................................................................................................................ 20
7. 校驗計算範例 (Python) ...................................................................................................................................... 21
8. Binary 模式 (D6 44) ............................................................................................................................................ 21
8.1 封包結構.........................................................................................................................................................................21
8.2 訊息表 .............................................................................................................................................................................22
8.3 二進位輸出的資料量與頻寬......................................................................................................................................25
8.4 鮑率設定與實際誤差 ...................................................................................................................................................26
8.5 主機端工具 ....................................................................................................................................................................26
9. 韌體更新 ................................................................................................................................................................ 26
10. GPS PPS 時間對齊(fw 0.8.0) ...................................................................................................................... 26
11. UART2 第二輸出埠(fw 0.8.0)..................................................................................................................... 27
12. EXT_TRIGGER 外部觸發(fw 0.9.0) ............................................................................................................ 28
13. SPI3 從機輸出(fw 0.10.0 起) ...................................................................................................................... 29
13.1 SPI 封包結構(128 bytes,little-endian).....................................................................................................29
13.2 飛控讀取建議 .............................................................................................................................................................30
13.3 實機驗證結果 (Blue2 + ArduPilot 4.7.1,2026-10-15) ..............................................................................31
13.4 $SPNVSPI 欄位 ..........................................................................................................................................................31
14. ArduPilot 4.7.1 驅動 (AP_InertialSensor_SparkNavi) ......................................................................... 31
SparkNavi-IMU600-V2 通訊協定說明 第2頁第 3 頁¶
展開本頁文字(可複製)
修訂紀錄
版號 日期 內容 編輯者
建立使用者版通訊協定文件,對應韌體 0.11.2;新增封面、目錄與修訂
1.0 2026-10-16 Ethan
紀錄。
修飾全文說明,統一用語並拆解長句;釐清時間戳、狀態旗標及設定保
1.1 2026-10-16 —
存方式,更新目錄。
SparkNavi-IMU600-V2 通訊協定說明 第3頁第 4 頁¶
展開本頁文字(可複製)
SparkNavi-IMU600-V2 $SPNV* 通訊協定說明 (使用者版,
fw 0.11.2,2026-10-16)
本文件說明 IMU600-V2 的資料格式、操作指令,以及與主機或飛控連接時需要注意的事項。對應韌體
版本為 0.11.2。
1. 基本規則
第 2–7 節介紹 ASCII 文字格式,第 8 節介紹 D6 44 二進位格式(binary)。兩種格式的對應欄位代表相
同資料,實際排列方式請看各節欄位表。可用 $SPNVCMD,MODE,binary 切換輸出格式;主機送給裝置
的指令一律使用 ASCII 文字。
項目 規格
介面 UART1,預設 460800 bps;8 個資料位元、無同位檢查、1 個停止位元(8N1),無流量控制。
$<body>*<XX>\r\n
行格式
校驗 XX 將 $ 與 * 之間的所有字元逐位元組做 XOR 運算,再寫成 2 位大寫十六進位數字。計算方式與
NMEA 0183 相同。
分隔 各欄位用逗號 , 分隔。body 的第一欄是訊息名稱,名稱都以 SPNV 開頭。
數值 數值以十進位文字表示。浮點數保留固定的小數位數(見各欄位表),負數前加 -,整數不帶小數
點。
單位 角速度 °/s、比力 m/s²、溫度 °C、Δθ rad、Δv m/s、氣壓 hPa (= mbar,同 ArduPilot)、時間 µs 或 s
座標 採用機體 FRD 座標:+X 向前、+Y 向右、+Z 向下。裝置水平靜置時,az 約為 −9.79 m/s²。
時間戳 從開機開始計時,開機時為 0,單位為微秒(µs),以 64-bit 無號整數表示。對 IMU 資料而言,
ts_us
ts_us 是這一筆資料所涵蓋時段的結束時間,不是資料送到主機的時間。同一批三顆 IMU 的 RAW
資料與 FUSED 合併資料,ts_us 完全相同。氣壓計的時間定義另見第 2.3 節。
行長 每行少於 320 字元。傳送緩衝區滿時會丟棄整行,不會只送半行;累計丟棄數可查看 $SPNVSYS
第 1 欄。
解析建議 先找 $ 作為一行的起點,再以 * 分開資料與校驗碼。校驗失敗就丟棄整行;校驗通過後,依第一欄
的訊息名稱處理。新版韌體可能在行尾新增欄位,解析程式應允許多出的欄位。
2. 資料輸出
連續模式依 RATE 定時輸出 IMU 資料,預設為 50 Hz,也就是每 20 ms 一批。本文的「輸出週期」指每批資料
所涵蓋的取樣時段,原文件也稱為時間格或視窗。RAW 是三顆 IMU 各自的資料(已套用校正);FUSED 是將
可用 IMU 資料合併後的結果。外部觸發模式的第一個 EXT_TRIGGER 上升緣只建立起點,之後每個上升緣產生一
批,見第 12 節。
SparkNavi-IMU600-V2 通訊協定說明 第4頁第 5 頁¶
展開本頁文字(可複製)
2.1 $SPNVIMURAW — 單顆 IMU 資料(每批 3 行)
$SPNVIMURAW,<id>,<ts_us>,<gx>,<gy>,<gz>,<ax>,<ay>,<az>,<temp>,<n>,<status>,<dthx>,<dthy>,<dthz>,<dvx>,<
dvy>,<dvz>,<dt>*XX
型別 / 小
# 欄位 數 單位 說明
id
1 整數 – IMU 編號 1、2、3
ts_us
2 整數 u64 µs 這筆資料所涵蓋時段的結束時間。
gx gy gz
3–5 浮點 4 位 °/s 將本次輸出週期內的原始取樣值(1475 Hz)演算處理後,得到三軸角
速度。
ax ay az
6–8 浮點 4 位 m/s² 本次輸出週期內的平均比力,即加速度計量到的值,包含重力的影響。
temp
9 浮點 2 位 °C 這顆 IMU 的內部溫度。
n
10 整數 – 這筆資料包含的原始樣本數。100 Hz 時約 14–15 筆,50 Hz 時約 29–
30 筆,5 Hz 時約 295 筆。
status
11 整數 (bit) – 記錄本次輸出週期內曾出現的狀態。所有樣本的狀態旗標會逐位元合併
(OR);任一次出現的旗標都會保留。0 表示未偵測到錯誤,也沒有
PPS 標記。見第 2.1.1 節。
dthx dthy
12–14 浮點 7 位 rad 這段時間累積的旋轉向量 Δθ,採梯形積分,並加入二階圓錐運動
dthz
(coning)補償。
dvx dvy
15–17 浮點 6 位 m/s 這段時間累積的速度變化量 Δv,包含旋轉與划槳運動(sculling)補
dvz
償。靜置時 dvz ≈ −9.79 × dt。
dt
18 浮點 6 位 s 這筆資料實際積分的時間長度,約為 1/輸出率。以 dth/dt、dv/dt 可
換算出對應的平均角速度與比力。
2.1.1 如何判讀 status
status 記錄的是「這一段取樣時間內,曾經出現哪些狀態」。每個原始樣本要讀取 7 個 SPI 回應封包(frame);
50 Hz 輸出時,一筆資料約包含 30 個樣本、共約 210 個回應封包。韌體會把它們的狀態逐位元合併(OR):只
要其中一次出現某個旗標,輸出的對應位元就會是 1。
因此,status 反映整段時間的紀錄,不只代表最後一個樣本。status = 0 表示這段時間內未偵測到 CRC 或位址
錯誤,感測器均回報正常狀態 S[1:0] = 00,也沒有 CE、IDS 或 PPS 旗標。
SparkNavi-IMU600-V2 通訊協定說明 第5頁第 6 頁¶
展開本頁文字(可複製)
位元 值 名稱 來源 意義 資料可信度 常見原因 / 處置
bit0 1 SPI_CRC 裝置端檢查 48-bit SPI 回應封包的 受影響的暫存 檢查線路雜訊、SCK 速度及
CRC-8 校驗失敗,或回 器值以 0 代 CS 時序;$SPNVSTAT 的
應的暫存器位址與請求 入,會使平均 crc_err 也會增加。正常應為
不符。 值偏離實際 0。
值。
bit1 2 CE 感測器 frame 命令錯誤(Command 資料本身仍有 正常操作不應出現。若出
CE 位 Error):感測器收到無 效 現,請回報原廠檢查韌體指
效請求,例如寫入唯讀 令。
暫存器、使用未定義位
址,或在 EOI 後寫入。
bit2 4 IDS 感測器 frame 內部資料狀態 可疑 通常與 bit3 同時出現
IDS 位 (Internal Data
Status):感測器回報
內部錯誤,與 S=01 表
示的錯誤狀態相互對
應。
bit3 8 S_ERROR 感測器 frame 感測器自我診斷發現異 不可信 若持續出現,先用
S[1:0] = 01 常,可能涉及電源、時 $SPNVCMD,REINIT,1 重新
脈、溫度或自我測試。 初始化;仍未恢復時,檢查
該顆 IMU 的硬體。
bit4 16 S_SAT 感測器 frame 超出量測範圍(飽 超出量程的部 常見於劇烈運動、撞擊或振
S[1:0] = 10 和):任一軸角速度超 分無法完整量 動過大。正常靜置或一般飛
過 ±300 °/s,或加速度 到,可能使 行時不應出現。
超過 ±156.9 m/s²。感 Δθ/Δv 偏
測器內部濾波前的瞬間 小。
峰值也會觸發。
bit5 32 S_INIT 感測器 frame 感測器尚未完成初始 不可信 只應在開機或 REINIT 後的前幾
S[1:0] = 11 化,通常出現在上電或 筆出現
重置後約 250 ms 內。
bit7 128 PPS (fw 0.8.0) 裝置 PPS 時間標記:這筆 此位元本身不 判斷錯誤時,請先以 status
ts_us 對應 GPS PPS 的 代表錯誤。 & 0x7F 排除 PPS 位元,再
上升緣。對齊期間每秒 檢查結果是否為 0。
有一筆,見第 10 節。
• 在單一 SPI 回應封包中,S[1:0] 一次只能表示一種狀態,因此對應的 bit3、bit4、bit5 最多只有一個為 1。
但一筆輸出會合併多個回應封包;若這段時間先後出現不同狀態,輸出的 status 就可能同時包含這幾個
位元。
• 感測器同時遇到多種狀況時,回報優先順序為:初始化 11 > 錯誤 01 > 飽和 10 > 正常 00。例如,同時
發生錯誤與飽和時,該次回應只回報錯誤。
SparkNavi-IMU600-V2 通訊協定說明 第6頁第 7 頁¶
展開本頁文字(可複製)
• 合併資料時,先檢查 (status & 0x7F) 是否為 0。若不為 0,該顆 IMU 的這筆資料會被排除,並在
$SPNVIMU 的 flags 標示。bit7 的 PPS 標記不影響採用,因此 status = 128 不代表資料有錯。三顆都
出現錯誤旗標時的處理方式,見第 3.1.1 節。
• 常見數值:0 = 正常;1 = SPI 校驗或位址問題;16 = 超出量程;12(8+4)= 感測器錯誤;32 或 44 =
開機初始化期間的狀態;128 = 只有 PPS 標記。
三顆 IMU 的取樣時脈可能略有差異,例如 1470 Hz 與 1461 Hz。因此,即使它們使用相同的輸出時間邊界,每
筆包含的樣本數 n 仍可能差 1。原始樣本所涵蓋的時間也可能略有差異,例如一顆以 30 個樣本涵蓋 20.4 ms,
另一顆以 29 個樣本涵蓋 19.8 ms。
以下為 50 Hz 輸出、裝置靜置時的格式範例:
$SPNVIMURAW,1,12345680,0.0123,-0.0456,0.0089,0.0210,-0.0150,-9.7912,31.25,30,0,0.0000043,-0.0000159,0.0
000031,0.000420,-0.000300,-0.195824,0.020000*0F
2.2 $SPNVIMU — 三顆 IMU 的合併資料(每批 1 行)
$SPNVIMU,<ts_us>,<gx>,<gy>,<gz>,<ax>,<ay>,<az>,<temp>,<dthx>,<dthy>,<dthz>,<dvx>,<dvy>,<dvz>,<dt>,<n_us
ed>,<flags>*XX
# 欄位 型別 / 小數 單位 說明
ts_us
1 整數 u64 µs 與同一批 RAW 資料的 ts_us 相同。
gx gy gz
2–4 浮點 4 位 °/s 合併後角速度
ax ay az
5–7 浮點 4 位 m/s² 合併後比力
temp
8 浮點 2 位 °C 實際參與合併的 IMU 溫度平均值。
dthx dthy dthz
9–11 浮點 7 位 rad 合併後 Δθ
dvx dvy dvz
12–14 浮點 6 位 m/s 合併後 Δv
dt
15 浮點 6 位 s 實際參與合併的 IMU 之 dt 平均值。
n_used
16 整數 – 這筆合併結果實際使用的 IMU 顆數,範圍為 1–
3。
flags
17 整數 (bit) – 合併狀態,見下表。0 表示三顆都正常且都參與
合併,也沒有 PPS 標記。
flags 的各位元代表以下狀態;多種狀態可同時出現:
位元 值 名稱 意義
bit0 1 IMU1_REJECTED 本次未採用 IMU1。原因為 (status & 0x7F) ≠ 0,或量測值持續偏離比
較基準、達到排除條件。
bit1 2 IMU2_REJECTED 本次未採用 IMU2,排除條件同 IMU1。
bit2 4 IMU3_REJECTED 本次未採用 IMU3,排除條件同 IMU1。
bit3 8 SPREAD_WARN 某顆 IMU 與比較基準的差距超過有效門檻的一半。這是提醒旗標;也
包含已超過完整門檻、但持續時間尚不足以排除的情況。
bit4 16 DEGRADED 可用 IMU 少於 2 顆,這筆結果只使用 1 顆 IMU。
bit5 32 INCOMPLETE 本次未收到所有已就緒 IMU 的資料。
SparkNavi-IMU600-V2 通訊協定說明 第7頁第 8 頁¶
展開本頁文字(可複製)
位元 值 名稱 意義
bit6 64 SATURATED (fw 0.5.0)至少一顆 IMU 超出量程,出現 S_SAT。超出量程的角速度
及旋轉量無法完整量到;接收端的慣性導航系統(INS)應降低這段資
料的權重,或提高估計誤差。
bit7 128 PPS (fw 0.8.0)這筆 ts_us 對應 GPS PPS 上升緣,見第 10 節。此位元是
時間標記,不代表錯誤。
2.3 $SPNVBARO — 氣壓計資料
氣壓計預設每秒輸出 50 筆,可用 BRATE 修改。其量測時機與 IMU 的時間戳定義不同,說明如下。
fw 0.5.0 起,氣壓計預設使用 Forced mode:由裝置按固定週期啟動一次量測,輸出率可設為 10、25、
50 或 100 Hz。它與 IMU 使用相同時鐘及開機起點;50 Hz 時,每隔 20000 µs 啟動一次,ts_us 也落在
這些時間點上。
氣壓計的 ts_us 代表「觸發量測的時間」。量測在觸發後才開始,約經過一個轉換時間才完成;可查看
$SPNVINIT,B 的 conv_us。因此,BARO 與 IMU 即使 ts_us 相同,代表的量測時段也不同。
韌體會依輸出率自動選擇過取樣倍率(OSR),讓轉換時間不超過輸出週期減 3 ms:10/25 Hz 使用
16x/2x、50 Hz 使用 8x/2x、100 Hz 使用 4x/1x。Forced mode 仍使用係數為 3 的 IIR 濾波。
$SPNVBARO,<ts_us>,<press_hpa>,<temp_c>,<alt_m>,<status>*XX
# 欄位 型別 / 小數 單位 說明
ts_us
1 整數 u64 µs Forced mode:啟動這次量測的時間。Normal mode:裝置偵測
到新資料已準備好的時間。
press_
2 浮點 4 位 hPa (= mbar) 濾波後的氣壓值,IIR 係數為 3。單位與 ArduPilot 的
hpa
SCALED_PRESSURE.press_abs 相同,乘以 100 可換成 Pa。輸出
解析度為 0.0001 hPa(0.01 Pa);目前 OSR 可查看 $SPNVINIT,B
的 osr_p。
temp_c
3 浮點 2 位 °C 氣壓計晶片的內部溫度,較接近板上溫度,不是外界氣溫。
alt_m
4 浮點 2 位 m 依標準大氣公式 44330.77×(1−(p/1013.25)^0.190263) 換算的高
度,適合觀察高度變化或繪圖。數值會受天氣影響,不宜直接當作
準確海拔;氣壓較高時也可能出現負值。
status
5 整數 (bit) – 0 = 正常;bit0(值為 1)= 取得這筆資料前曾遇到 I2C NACK 或匯
流排衝突,但重試後已成功。
範例:
$SPNVBARO,9651290,1017.3040,44.14,-33.69,0*XX
用 $SPNVCMD,BARO,0|1 關閉或開啟氣壓資料輸出;用 $SPNVCMD,BRATE,10|25|50|100 設定輸出率,預設
為 50 Hz。要檢查氣壓計狀態,可查看 $SPNVSYS 的 baro_samples、baro_i2c_err、baro_timeouts、
baro_stale;初始化結果則見 $SPNVINIT,B(第 4 節)。
SparkNavi-IMU600-V2 通訊協定說明 第8頁第 9 頁¶
展開本頁文字(可複製)
2.4 $SPNVAHRS — 姿態資料
此訊息提供姿態角、四元數及陀螺零偏估計,與同一批合併 IMU 資料使用相同的 ts_us。
$SPNVAHRS,<ts_us>,<roll>,<pitch>,<yaw>,<q0>,<q1>,<q2>,<q3>,<align>,<flags>,<bgx>,<bgy>,<bgz>,<zb_s>*XX
型別 / 小
# 欄位 數 單位 說明
ts_us
1 整數 u64 µs 與同一批 $SPNVIMU 資料的 ts_us 相同。
roll
2 浮點 3 位 deg 滾轉角,向右傾斜為正,範圍 −180..180。使用 FRD/NED 座標與 ZYX 歐
拉角順序。
pitch
3 浮點 3 位 deg 俯仰角,抬頭為正,範圍 −90..90。
yaw
4 浮點 3 位 deg 航向角,由上往下看,順時鐘為正,範圍 0..360。align=1 時為相對角
度,從 0 起算,會隨時間產生漂移。
q0 q1 q2
5–8 浮點 6 位 – 將機體座標轉到 NED(北、東、下)座標的四元數,採 Hamilton 定義,
q3
q0 為純量部分:v_n = R(q)·v_b。
align
9 整數 – 對準狀態,見下表
flags
10 整數 (bit) – 見下表
bgx bgy
11–13 浮點 4 位 °/s 運作中估計的三軸陀螺零偏,使用機體座標,供診斷使用。
bgz
zb_s
14 浮點 1 位 s (fw 0.9.2)目前已連續靜止的秒數,範圍 0–10。有移動就歸零,滿 10 s
後套用零偏估計,並標示 BIAS_CAL。AZB,0 時固定為 0。GUI 可顯示
「校正中 x / 10 s,請保持靜止」。
align 表示姿態與航向的對準進度:
值 名稱 GUI 顯示建議 意義
0 INIT "Aligning…" 開機或執行 AHRS,reset 後的前 1 s。裝置收集靜置資料以判斷水平
姿態,此時 roll、pitch、yaw 尚不可用。
1 LEVEL "Heading: NOT ALIGNED" roll 與 pitch 已可使用。航向尚無外部參考,yaw 從 0 起算,靠陀
ED 螺累積角度,因此會漂移。
2 ALIG "Heading: aligned 已設定航向參考,來源由 flags 表示;目前僅支援透過 HDG 指令手
NED (manual)" 動設定。
flags 表示姿態計算的目前狀態:
位元 值 名稱 意義
bit0 1 HIGH_DYN 偵測到較大動態:比力大小 |f| 與 g 的差超過 0.5 m/s²、|ω| 超過 50 °/s,
或量測重力方向與估計方向相差超過 5°。此時 Kp 降為 0.2,減少加速度計
對姿態修正的影響。
bit1 2 BIAS_FROZEN 暫停更新陀螺零偏。觸發條件為動態狀態、|ω| > 5 °/s,或 ||f|−g| > 0.2
m/s²。此時姿態仍持續更新,只是暫停學習零偏。
bit2 4 HDG_MANUAL 目前航向由 $SPNVCMD,HDG 手動設定。
SparkNavi-IMU600-V2 通訊協定說明 第9頁第 10 頁¶
展開本頁文字(可複製)
位元 值 名稱 意義
bit3 8 ACC_REJECT 比力大小 |f| 與 g 的差超過 3 m/s²。這次姿態更新只使用陀螺,不使用加
速度計修正。
bit4 16 INIT_MOVING 初始對準的 1 s 內偵測到移動,因此未取得零偏,水平姿態的準確度也會
較差。請將裝置靜置後,再執行 AHRS,reset。
bit5 32 BIAS_CAL (fw 0.9.1)已利用至少 10 s 的靜止資料估計三軸陀螺零偏,包含 Z 軸。
這是完成狀態,不是警告;航向漂移規格以完成此步驟後為準。
bit6 64 STATIC (fw 0.9.1)最近 10 s 判定為靜止,正在更新零偏估計。
靜止零偏估計:fw 0.9.1 起提供此功能,出廠預設開啟,可用 $SPNVCMD,AZB,0|1 控制。裝置每 10 s 檢查一次
靜止條件:各軸陀螺標準差 < 0.1 °/s、加速度判定值 < 0.1 m/s²,且沒有動態旗標。通過判定後,會用這段時間
的陀螺平均值估計零偏。第一次估計會直接套用,完成時 flags 出現 BIAS_CAL。
姿態計算方式:以 $SPNVIMU 的 Δθ 更新四元數,並以 Δv/dt 提供重力方向的觀測值。
相關指令為 AHRS 0|1|reset、HDG <deg> 與 AKP/AKI。ASCII 姿態資料每行約 120 B。
2.5 輸出模式與頻寬
用 $SPNVCMD,OUT,raw|fused|both|none 選擇輸出的 IMU 資料,預設為 both。UART1 設為 460800 bps 時,
每秒約可傳送 46 kB;各種設定的資料量如下。
設定 流量 結果
50 Hz both (預設) + BARO 50 Hz + AHRS 50 Hz ≈ 38 kB/s OK
100 Hz fused + AHRS ≈ 26 kB/s 頻寬足夠,建議正式使用。
100 Hz raw ≈ 45 kB/s 接近傳輸上限,偶爾會丟棄資料
行。
100 Hz both ≈ 59 kB/s 超出傳輸上限,會丟棄資料行。
200、400、500、1000 Hz 的 binary 資料量見第 8.3 節,其中 200/400/500 Hz 自 fw 0.10.3 起支援。
在這些較高輸出率下,460800 bps 無法負荷 ASCII 資料,請改用 binary 並提高鮑率。若只透過 SPI3 連
接飛控,可設 OUT,none 關閉 UART 的 IMU 資料輸出,見第 13 節。
3. 狀態與統計資料
預設每秒提供一組統計,包括 3 行 STAT、1 行 FUS 與 1 行 SYS。fw 0.4.3 起,裝置先在同一時間記錄全
部數值,再於後續主迴圈逐行送出,順序為 STAT1、STAT2、STAT3、FUS、SYS、HB。雖然傳送時間
不同,這組統計仍代表同一個時間點。
SparkNavi-IMU600-V2 通訊協定說明 第 10 頁第 11 頁¶
展開本頁文字(可複製)
3.1 $SPNVSTAT — 每顆 IMU 統計 (每顆一行)
$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>]*XX
# 欄位 說明 正常值
id
1 IMU 編號 1~3
dry
2 從開機起累計的 DRY(資料就緒)中斷次數,對應原始樣本數。 每秒增加 ≈
1470
out
3 從開機起累計的資料輸出筆數。 每秒增加 = 輸
出率
crc_err
4 SPI 回應 CRC 錯誤累計 0
frame_err
5 SPI 回應中帶有感測器狀態旗標的封包數,旗標包括 S1:S0≠00、CE 或 0 (正常使用下
IDS。此欄統計感測器回報的狀態;通訊問題則看 crc_err、spi_timeout。 不增加)
見第 3.1.1 節。
spi_timeo
6 SPI 通訊逾時的累計次數。fw 0.10.6 的逾時設定為 100 µs,交換資料期間 0
ut
會暫時遮蔽中斷。
dropped
7 因緩衝區或輸出佇列已滿而丟棄的累計數。 0
dcnt_skip
8 感測器樣本計數器不連續的累計次數,表示可能漏讀或重複讀取。 0
dry_timeo
9 目前是否已超過 100 ms 未收到 DRY:0 = 否,1 = 是。 0
ut
dry_kicks
10 為解除 DRY 腳持續維持高電位而進行的額外讀取次數。 開機後固定 1
dry_pin
11 DRY 腳目前的電位:0 = 低,1 = 高。 多為 0
isr_us_ma
12 DRY 中斷處理程式(ISR)最長執行時間,單位 µs。 約 100 µs 以內
x
isr_us_la
13 最近一次 DRY 中斷處理的執行時間,單位 µs。 同上
st
isr_cpu
14 最近 1 s 內,這顆 IMU 的 DRY 中斷處理占用 CPU 的百分比,以整數表 約 13
示。
resync
15 重新對齊輸出週期時間邊界的累計次數。 0
read_retr
16 (fw 0.10.6,僅 ASCII)第一次讀取遇到 CRC 錯誤後,立即重讀的累計次 0
y
數。
read_bad
17 (fw 0.10.6,僅 ASCII)重讀仍失敗,因而丟棄的原始樣本數。 0
3.1.1 frame_err 增加時如何排查
GUI 將 frame_err 顯示為「感測器旗標」。它記錄 IMU 晶片在 SPI 回應中回報的狀態,不直接表示線路品質。
要檢查通訊是否異常,請看 crc_err、spi_timeout,或 GUI 的「SPI 錯誤」。
frame_err 的計數單位是「帶有旗標的 SPI 回應封包」,不是異常事件次數。讀取一個原始樣本需要 7 個封包,
分別取得三軸角速度、三軸加速度及溫度。感測器出現異常時,這 7 個封包通常都會帶有旗標,因此一次樣本可
能讓計數增加 7。下列實測中,約 5 ms 的劇烈甩動使計數增加 52,不代表發生了 52 次獨立事件。
在未超出量程、也沒有感測器異常的一般運動、振動與溫度變化下,這個計數不應持續增加。
SparkNavi-IMU600-V2 通訊協定說明 第 11 頁第 12 頁¶
展開本頁文字(可複製)
板上測試紀錄(fw 0.4.3,2026-10-08):
測試 SPI 錯誤 (crc_err/spi_timeout) 感測器旗標 (frame_err)
靜置 0,不累加 0,不累加
緩和搖晃 (未超過量程) 0,不累加 0,不累加
劇烈甩動 (角速度峰值 > 300 °/s) 0,不累加 三顆同時 +52 (飽和)
若計數增加,可依下表檢查原因:
對應
status 資料可
原因 位元 何時發生 三顆同時? 信度 處置
量程飽 S_SAT 任一軸超出量程:角速度超過 通常會,因 超出 撞擊、掉落或劇烈甩動時,可能因
和 (16) ±300 °/s,或加速度超過 ±156.9 為三顆承受 量程 超出量程而觸發,這不一定是硬體
m/s²。判定包含內部濾波前的訊 相同運動。 的部 故障,但受影響的資料仍須留意。
號,因此即使輸出平均值未超 分無 若一般運轉時持續增加,請檢查馬
標,瞬間峰值仍可能觸發。 法完 達、螺旋槳或引擎的高頻振動及減
整量 振安裝。若角速度經常超過 300
到, °/s,應評估較大量程的陀螺。
可能
使
Δθ/Δ
v偏
小。
初始化 S_INIT 上電、$SPNVCMD,REINIT,1 後約 250 是 不可信 若只在開機後短暫增加,之後固定
中 (32) ms 內 不變,通常屬正常初始化。運轉中
再次出現時,請檢查是否因電源壓
降造成感測器重置。
感測器 S_ERRO 感測器內部診斷發現供電電壓、 三顆同時出 不可信 檢查 3.3 V / VDDIO 的電源雜訊、
自我診 R (8), 時脈、溫度或自我測試異常。 現:先查共 壓降及工作溫度。執行 REINIT,1 後
斷錯誤 常伴隨
用電源與溫 若仍持續出現,請檢查該顆 IMU 的
IDS (4)
度。只有一 焊接與硬體狀況。
顆出現:先
查該顆元
件。
命令錯 CE (2) 感測器收到無效請求,例如寫入 — 資料仍 正常操作不應出現;請回報原廠檢
誤 唯讀暫存器、使用未定義位址, 有效 查韌體。
或在 EOI 後寫入。
排查步驟
1. 先看 GUI 的「SPI 錯誤」。若它也持續增加,請先檢查通訊線路及時序。
2. 再看是三顆一起增加,還是只有一顆增加。三顆一起出現時,先查運動、振動、共用電源與溫度。
SparkNavi-IMU600-V2 通訊協定說明 第 12 頁第 13 頁¶
展開本頁文字(可複製)
3. 設定 OUT,raw,查看 $SPNVIMURAW 的 status,確認是 16(飽和)、32(初始化),或 8/12(感測
器錯誤)。位元定義見第 2.1.1 節。
4. 合併時,有錯誤旗標的 IMU 會被排除,判斷式為 (status & 0x7F) ≠ 0;PPS 標記不算錯誤。若三顆同時
出現錯誤旗標,韌體會退回使用三顆資料產生合併輸出。此時不能只因為仍有合併資料,就認定量測正
常;請同時查看 RAW 的 status。
3.2 $SPNVFUS — 合併統計
$SPNVFUS,<outputs>,<rej1>,<rej2>,<rej3>,<incomplete>,<degraded>,<gth>,<ath>*XX
# 欄位 說明
outputs
1 合併輸出累計筆數
rej1 rej2 rej3
2–4 IMU1、IMU2、IMU3 各自被排除的累計輸出週期數。原因可能是錯誤旗標,或量測
偏差已達持續排除條件;PPS 標記不列入。正常使用,包括一般手持擺動,不應增
加。
incomplete
5 尚未收齊三顆 IMU 資料就產生合併結果的累計次數。
degraded
6 可用 IMU 少於 2 顆的累計次數。
gth
7 目前設定的陀螺排除門檻,單位 °/s,保留 3 位小數。
ath
8 目前設定的加速度排除門檻,單位 m/s²,保留 3 位小數。
3.3 $SPNVSYS — 系統統計
$SPNVSYS,<uart_drop>,<loops_per_s>,<isr_cpu_total>,<rate_hz>,<out_mode>,<uart_resets>,<pps_cnt>,<baro_s
amples>,<baro_i2c_err>,<baro_timeouts>,<baro_stale>,<baro_hz>,<proto_mode>,<baud>,<pps_state>,<u2_drop
>,<trig_cnt>,<trig_rej>*XX
# 欄位 說明
uart_drop
1 傳送緩衝區已滿,因而丟棄整行資料的累計數。持續增加通常表示輸出資料量超過
UART 頻寬。
loops_per_s
2 最近 1 s 內主迴圈的執行次數,約 77000 次。
isr_cpu_total
3 三顆 IMU 中斷處理合計占用 CPU 的百分比,以整數表示,約為 40%。
rate_hz
4 目前輸出率
out_mode
5 none / raw / fused / both
uart_resets
6 UART 傳送停止回應後,自動重置以恢復運作的次數,正常應為 0。
pps_cnt
7 PPS 上升緣的原始擷取次數,包含後續被排除的雜訊。通過條件檢查的次數請看
$SPNVPPS 的 edges。
baro_samples
8 成功讀到的氣壓樣本累計數;預設 50 Hz 時,每秒約增加 50。
baro_i2c_err
9 I2C 未收到確認(NACK)或匯流排衝突的累計次數,正常應為 0。
baro_timeouts
10 因 I2C 通訊逾時而重新初始化模組的累計次數,正常應為 0。
baro_stale
11 目前是否已超過 200 ms 沒有新氣壓資料:0 = 否,1 = 是。
SparkNavi-IMU600-V2 通訊協定說明 第 13 頁第 14 頁¶
展開本頁文字(可複製)
# 欄位 說明
baro_hz
12 氣壓計目前輸出率
proto_mode
13 ascii / binary
baud
14 目前 UART1 鮑率
pps_state
15 (fw 0.8.0) 0 OFF / 1 NO_SIGNAL / 2 ACQUIRING / 3 LOCKED / 4 HOLDOVER (§10)
u2_drop
16 (fw 0.8.0)UART2 傳送緩衝區滿,因而丟棄整筆資料的累計數。
trig_cnt
17 (fw 0.9.0)外部觸發模式下,已接受的 EXT_TRIGGER 上升緣累計數。連續輸出模式
不累計。
trig_rej
18 (fw 0.9.0)被排除的 EXT_TRIGGER 邊緣累計數。原因包括與前一次間隔小於 0.5 ms
(視為毛刺或彈跳),或主迴圈忙碌造成觸發事件緩衝區溢位。
3.4 $SPNVHB — 診斷心跳
此訊息預設每秒輸出一次,以 key=value 格式提供原廠診斷資訊。一般應用的解析程式可直接略過;不需要時,
用 $SPNVCMD,HB,0 關閉。
4. 開機資訊與事件訊息
出廠預設設定下,裝置開機後直接輸出資料,不主動輸出開機資訊。需要查看資訊時,可送出
$SPNVCMD,INFO,1 取得精簡內容,或 $SPNVCMD,DBG,1 取得完整內容。
例外情況會主動回報:裝置驗證失敗時送出 $SPNVHALT,IMU 或氣壓計初始化失敗時送出
$SPNVINIT,n,FAIL,…。若已保存不同的 BAUD 或 MODE,開機時也會先送出救援提示,詳見下表
$SPNVNVM,boot。
訊息 格式 說明
$SPNVBOOT $SPNVBOOT,SparkNavi-IMU600-
V2,fw=<ver>,imus=3,frame=body-
產品名稱、韌體版本、座標系、通訊格式與鮑率。fw
FRD,proto=ascii-xor8|d644- 0.7.0 起增加建置旗標:rel = 出貨版、bl = 含
crc16,baud=<n>,build=rel=<0/1>,bl=<0/1
>,auth=<0/1>,halt=<0/1>,bind=<0/1>*XX bootloader,auth / halt / bind 與裝置驗證有關;出
貨版皆為 1。請以 key=value 解析,例如
build=rel=1 的 key 是 build,值是 rel=1。新版可能
在尾端新增欄位。
$SPNVRESET $SPNVRESET,rcon=0x<8hex>[,POR][,BOR][,
WDTO][,SWR][,EXTR(MCLR)][,CM(config 上次重置原因,由 RCON 暫存器解碼。正常上電通常
mismatch)]...*XX 為 POR,BOR;EXTR(MCLR) 表示重置按鍵或燒錄器
造成的重置。
$SPNVDBG $SPNVDBG,<自由文字>*XX 只在 DBG 模式輸出,供原廠診斷。一般解析程式可
略過。
$SPNVAUTH / $SPNVAUTH,auth=<0/1>,sn=<18hex>*XX; 裝置驗證資訊,執行 INFO 時也會回報。auth=1、
$SPNVBIND / $SPNVBIND、$SPNVPUB 為 key=value 行 ok=1 表示正常;sn 是 18 位十六進位裝置序號,可
$SPNVPUB
作為產品序號。其他欄位供原廠診斷,一般應用可略
過。
SparkNavi-IMU600-V2 通訊協定說明 第 14 頁第 15 頁¶
展開本頁文字(可複製)
訊息 格式 說明
$SPNVINIT
精簡:$SPNVINIT,<id>,OK*XX;完整 各顆 IMU 的初始化結果,sn 是該顆 IMU 的序號。
(DBG): FAIL 時可查看 rc:−2 = 無回應(MISO 全為 0 或
$SPNVINIT,<id>,OK,sn=<str>,…*XX;失敗
1)、−3 = CRC 錯誤、−4 = 位址錯誤、−5 = 寫入
(一律印):
$SPNVINIT,<id>,FAIL,rc=<rc>,crc_err=<n
驗證失敗、−6 = 啟動後狀態異常、−7 = 其他錯誤。
>*XX 完整格式的其他欄位供原廠診斷。
$SPNVINIT,B
精簡: 氣壓計初始化結果。conv_us 的實測值是從觸發到資
$SPNVINIT,B,OK,odr=<hz>,mode=forced|no
料就緒(DRDY)的時間,包含 1 ms 輪詢間隔的影
rmal*XX;完整:
$SPNVINIT,B,OK,chip=0x..,rev=0x..,odr= 響。overruns 表示上次量測尚未完成、下次觸發時間
<hz>,osr_p=<n>,osr_t=<n>,iir=3,i2c_err
=0,bus_recover=0,heals=0,mode=forced,c 就已到達的次數;該次會跳過量測,正常應為 0。
onv_us=<估計>/<上一筆實測>/<實測最大 rc:−1 = I2C NACK、−2 = I2C 逾時、−3 = 晶片識
>,overruns=<n>*XX;失敗 (一律印):
別不符、−4 = NVM 錯誤、−5 = OSR/ODR 組合無
$SPNVINIT,B,FAIL,rc=<rc>,chip=0x..,i2c
_err=,timeouts=*XX 效。
$SPNVNVM $SPNVNVM,saved=1,baud=,mode=,rate=,out
=,stat=,hb=,baro=,brate=,ahrs=,nvm_err 執行 INFO 或 DBG 時,回報非揮發性記憶體
=*XX / $SPNVNVM,saved=0 (factory (NVM)是否存有設定,以及保存的內容。
defaults),nvm_err=*XX /
$SPNVNVM,backend=none*XX
$SPNVCAL $SPNVCAL,<imu>,ab=<bx>/<by>/<bz>,ak=<k
(fw 0.5.0)回應 CAL,1,INFO/DBG 也會提供。內
x>/<ky>/<kz>*XX ×3 +
$SPNVCAL,W,g=<w1>/<w2>/<w3>,a=<w1>/<w2 容包括各顆 IMU 六面加速度校正的零偏(m/s²,5
>/<w3>,saved=<0/1>,lever=<0/1>*XX
位小數)、比例係數(6 位小數)、合併權重,以及
校正是否已保存至 NVM。lever=1 表示安裝位置差
補償正在作用。
$SPNVCFG $SPNVCFG,baud=<n>,mode=ascii|binary,ra
te=<hz>,out=<0- 回應 $SPNVCMD,CFG,1,列出目前正在使用的設
3>,stat=<0/1>,hb=<0/1>,baro=<0/1>,brat 定。out:0 = none、1 = raw、2 = fused、3 =
e=<hz>,ahrs=<0/1>,gth=<f3>,ath=<f3>,ak
p=<f3>,aki=<f4>,saved=<0/1>,fw=<ver>*X both。saved=1 只表示 NVM 曾保存設定,不表示所
X
有目前設定都已保存。fw 0.9.0 起附加 trig=0|1
(IMU 輸出模式);fw 0.9.1 起附加 azb=0|1(靜止
零偏估計)。GUI 參數頁利用此訊息讀回裝置設定
(fw 0.4.2 起)。
$SPNVNVM,boot $SPNVNVM,boot,baud=<n>,mode=<m>,factor
y_window_ms=500*XX 若保存的 BAUD 或 MODE 與出廠值不同,開機會先
以 460800 bps、ASCII 格式送出此訊息,並等待 500
ms。此時可送 $SPNVCMD,FACTORY,1 恢復預設;
等待結束後才切到保存的格式與鮑率。未保存設定,
或保存值與預設相同時,不會送出此行,也不會等
待。
$SPNVHALT
$SPNVHALT,<原因>*XX,之後每 2~3 s 重複 裝置驗證未通過時,IMU、氣壓計與 AHRS 不啟動,
一行 也不輸出量測資料;仍接受 INFO、BOOT(更新韌
體)及 FACTORY。若只是暫時讀不到 IMU,例如飛
控 5 V 電源波動,裝置約每 3 s 自動重試,恢復後會
自動開始輸出。若持續出現,請洽原廠。
SparkNavi-IMU600-V2 通訊協定說明 第 15 頁第 16 頁¶
展開本頁文字(可複製)
訊息 格式 說明
$SPNVHEAL $SPNVHEAL,imu_reinit,mask=<bit0..2 =
(fw 0.10.1)自動恢復紀錄。若任一顆 IMU 的 SPI
IMU1..3>,n=<累計次數>*XX
錯誤(CRC 加逾時)連續 3 s 達到每秒 100 次以上,
或某顆初始化失敗,裝置會重新初始化三顆 IMU,作
用與 REINIT,1 相同。兩次自動初始化至少間隔 30
s。正常使用不應出現;飛控重開機或 5 V 電源波動後
可能觸發。
$SPNVSTALL $SPNVSTALL,main stuck at
where=<w>(<name>) for >300ms*XX DRY 中斷處理偵測到主迴圈超過 300 ms 未繼續執
行。正常運作不應出現。
$SPNVTRAP $SPNVTRAP,code=<n>,<name>,INTCON3=0x…,
INTCON4=0x…,INTCON5=0x…,halted*XX CPU 發生位址、堆疊或數學運算等例外錯誤
(trap);回報後停止運作。正常運作不應出現。
5. 操作指令(主機送給裝置)
不論資料輸出使用 ASCII 或 binary,主機送出的指令都必須是 ASCII 格式的 $SPNVCMD。binary 模式
的指令回覆會包在 0x7F TEXT 封包內。
執行指令後,設定會先套用在 RAM;若未保存,重開機後會載入先前保存的設定,沒有保存紀錄時才使
用出廠預設。要保留目前設定,請送 SAVE,1;要清除使用者設定並恢復出廠值,請送 FACTORY,1。
$SPNVCMD,<key>,<value>[*XX]\r\n
• 可省略校驗碼 *XX,方便用終端機手動輸入。若有附上校驗碼,裝置就會檢查;錯誤時回覆
$SPNVNAK,CMD,checksum。
• key 與 value 不分大小寫。行尾可用 \r 或 \n;單行超過 127 字元時,整行指令會被丟棄。
• 指令成功時回覆 $SPNVACK,<key>,<value>*XX,value 是實際套用的值;失敗時回覆
$SPNVNAK,<key>,<reason>*XX,reason 說明原因。
key value 作用 ACK 回覆
RATE 5 10 25 50 100 200 $SPNVACK,RATE,100
400 500 1000 設定 IMU 輸出率,單位 Hz;三顆 RAW 與合併
資料會一起切換。200/400/500 Hz 自 fw
0.10.3 起支援。連接 ArduPilot 時請設 1000
Hz,見第 13、14 節。
OUT raw fused both none $SPNVACK,OUT,fused
選擇 IMU 資料:raw = 三顆個別資料;fused =
合併資料;both = 兩者皆輸出;none = 關閉
這兩類輸出。
STAT 0 1 now $SPNVACK,STAT,1
0 = 關閉每秒統計;1 = 開啟;now = 立即送出
一組 STAT/FUS/SYS。
HB 01 $SPNVACK,HB,0
診斷心跳 $SPNVHB 關/開
BARO 01 $SPNVACK,BARO,1
$SPNVBARO 輸出關/開 (預設開)
AHRS 0 1 reset $SPNVACK,AHRS,reset
0/1 = 關閉/開啟姿態資料輸出;reset = 重新進
行初始對準,請保持靜止 1 s。
SparkNavi-IMU600-V2 通訊協定說明 第 16 頁第 17 頁¶
展開本頁文字(可複製)
key value 作用 ACK 回覆
HDG
浮點 deg 手動設定航向 heading,roll 與 pitch 保持不 $SPNVACK,HDG,123.5;尚未調平
$SPNVNAK,HDG,not leveled yet
(−360..360) 變。成功後 align=2,並設定 HDG_MANUAL
旗標。
$SPNVACK,AKP,1.5
AKP / 浮點 0..50 設定 AHRS 演算法的 Kp / Ki,預設分別為 2.0 /
AKI
0.05。
SAVE 1
將目前使用者設定寫入 NVM,供下次開機載 $SPNVACK,SAVE,1;
$SPNVNAK,SAVE,nvm not
入。包含 available|write failed
RATE/OUT/STAT/HB/BARO/BRATE/AHRS/GT
H/ATH/AKP/AKI/MODE/BAUD,以及本表後
方列出的 UART2、PPS、觸發與 SPI 設定。寫
入期間 IMU 會短暫停止,再重新啟動。校正資
料另用 CALSAVE 保存。
FACTOR 1 $SPNVACK,FACTORY,1
Y 清除 NVM 的使用者設定,並立即恢復出廠值,
包含 MODE/BAUD。fw 0.5.0 起不會清除
ACAL/FWGT 校正資料。ACK 會先用原本的格
式與鮑率送出,主機收到後,請切回 460800
bps、ASCII。裝置在 HALT 狀態或開機救援等
待期間也接受此指令。
CFG 1
回報目前設定,主要訊息為 $SPNVCFG,見第 $SPNVACK,CFG,1 後接 $SPNVCFG,…
4 節。fw 0.4.2 起支援;附加訊息見表後說明。
INFO 1
索取精簡裝置資訊,包括 BOOT、RESET、 $SPNVACK,INFO,1 後接各行
AUTH 及 4 行 INIT。出廠預設開機不主動輸出
這些資訊。
DBG 1
索取完整裝置資訊。在 INFO 的內容之外,增加 $SPNVACK,DBG,1 後接各行
$SPNVDBG 診斷資料,以及 AUTH/INIT 的完
整欄位。
MODE ascii binary $SPNVACK,MODE,binary
切換資料輸出格式。ACK 先用原格式送出,之
後的訊息才改用新格式。
BAUD 460800 921600 $SPNVACK,BAUD,921600
1500000 2000000 設定 UART1 鮑率。裝置先用原鮑率送出 ACK,
等待傳送完成,再切到新鮑率,間隔約 5 ms;
主機收到 ACK 後再調整自己的串列埠。要保留
請送 SAVE,1。若保存值不是預設,開機時會先
以 460800 bps 提供 500 ms 的 FACTORY 救援
等待時間。
BRATE 10 25 50 100
設定氣壓計輸出率,單位 Hz。重設感測器最多 $SPNVACK,BRATE,100;失敗
$SPNVNAK,BRATE,osr/odr
占用 15 ms,IMU 不受影響。若原過取樣倍率 invalid|i2c error|i2c timeout
(OSR)來不及在新週期內完成,韌體會自動降
低倍率,例如 16x、8x、4x。
SparkNavi-IMU600-V2 通訊協定說明 第 17 頁第 18 頁¶
展開本頁文字(可複製)
key value 作用 ACK 回覆
GTH $SPNVACK,GTH,0.8
浮點 0 < v ≤ 100 設定合併時判斷陀螺偏差的基本門檻,單位
°/s,預設 0.5;動態時的有效門檻見第 2.2 節。
ATH $SPNVACK,ATH,1.0
浮點 0 < v ≤ 100 設定合併時判斷加速度偏差的基本門檻,單位
m/s²,預設 0.5;動態時的有效門檻見第 2.2
節。
REINIT 1 $SPNVACK,REINIT,1
停止取樣,重新初始化三顆 IMU,再恢復取
樣;會回報 3 行 $SPNVINIT。
PING $SPNVACK,PING,<value>
任意字串 連線測試
ACAL <imu>,<bx>,<by>,<b
z>,<kx>,<ky>,<kz> (fw 0.5.0)設定指定 IMU 的加速度校正,使用 $SPNVACK,ACAL,<原字串>;
$SPNVNAK,ACAL,range (...)
機體座標:a = (a_raw − b) · k、Δv = (Δv −
b·dt) · k。範圍為 |b| ≤ 2 m/s²、0.95 ≤ k ≤
1.05。設定先套用於 RAM,需送 CALSAVE,1
才保存。RAW 與合併輸出都會套用此校正。
FWGT g|a,<w1>,<w2>,<w3> $SPNVACK,FWGT,g,1,1,2
(fw 0.5.0)設定三顆 IMU 的合併權重:g 用於
角速度與 Δθ,a 用於加速度與 Δv。權重為相對
值,範圍 0 < w ≤ 100。設定先套用於 RAM,
需送 CALSAVE,1 才保存。
CAL 1
以 $SPNVCAL 回報目前校正值與合併權重。 $SPNVACK,CAL,1 後接 4 行
CALSAV 1
E 將目前 ACAL/FWGT 寫入 NVM。校正資料與使 $SPNVACK,CALSAVE,1;
$SPNVNAK,CALSAVE,nvm not
用者設定分開保存,不受 FACTORY 影響。寫入 available|write failed
期間 IMU 會短暫停止。
CALCLR 1 $SPNVACK,CALCLR,1
清除 RAM 與 NVM 中的校正資料,恢復為無校
正、三顆等權重。
U2OUT raw fused ahrs baro
(fw 0.8.0)選擇 UART2 輸出內容,出廠為 $SPNVACK,U2OUT,raw+baro (正規化後
stat 用 + , | 組合;
raw。stat 包含 STAT×3、FUS、SYS 與 PPS; 的組合)
none;all
一般統計每秒一組,PPS 的送出時機見第 10
節。
U2MODE ascii binary $SPNVACK,U2MODE,binary
(fw 0.8.0) UART2 協定,格式與 UART1 相同。出廠
binary
U2BAUD 115200 230400 $SPNVACK,U2BAUD,921600
(fw 0.8.0) UART2 鮑率,出廠 460800。UART2 只輸
460800 921600
1500000 2000000 出、不收指令
SPI off ardupilot $SPNVACK,SPI,ardupilot
(fw 0.10.0)選擇 SPI3 功能,見第 13 節。off
stream (或 0 1 2)
= 關閉、ardupilot = 飛控 IMU 封包、stream
= 資料串流。出廠為 off,此時 SDO 為高阻
抗。
SPIOUT $SPNVACK,SPIOUT,fused+ahrs
同 U2OUT (fw 0.10.0)選擇 SPI stream 模式的輸出內
容,出廠為 none。
SPIMOD ascii binary $SPNVACK,SPIMODE,binary
(fw 0.10.0) stream 模式的格式。出廠 binary
E
SparkNavi-IMU600-V2 通訊協定說明 第 18 頁第 19 頁¶
展開本頁文字(可複製)
key value 作用 ACK 回覆
SPICK 30 $SPNVACK,SPICK,3
(fw 0.10.0) SPI 時脈模式 (CPOL/CPHA)。出廠 3
PPS 01 $SPNVACK,PPS,1
(fw 0.8.0)控制 IMU 輸出週期是否與 GPS
PPS 對齊,見第 10 節。出廠為 1;設為 0 時,
以開機時間為基準自行定時。
AZB 01 $SPNVACK,AZB,1
(fw 0.9.1)控制 AHRS 的靜止零偏估計,包含
Z 軸航向零偏,見第 2.4 節。出廠為 1,可用
SAVE,1 保存。
TRIG $SPNVACK,TRIG,1
0 1 (別名 continuous (fw 0.9.0)0 = 依 RATE 連續輸出,忽略
trigger) EXT_TRIGGER;1 = 由外部上升緣觸發輸出。
觸發模式的第一個上升緣只建立起點,之後才逐
次輸出,見第 12 節。出廠為 0,可用 SAVE,1
保存。
BOOT 1
(fw 0.6.0)進入韌體更新程式 bootloader。裝 $SPNVACK,BOOT,1;
$SPNVNAK,BOOT,no bootloader (dev
置回覆 ACK 後重啟,在 460800 bps 等待更新 build)|use BOOT,1
工具的 HELLO 封包約 1.5 s;未收到時回到應用
韌體。見第 9 節。出貨韌體皆支援,HALT 狀態
也可使用。
NAK 原因字串:checksum、not SPNVCMD、missing value、unknown key、use 5|10|25|50|100|200|400|500|1000、
use raw|fused|both|none、use 10|25|50|100、range、osr/odr invalid、i2c error、i2c timeout、not leveled
yet、use ascii|binary、use 460800|921600|1500000|2000000、use raw+fused+ahrs+baro+stat|none|all、use
115200|230400|460800|921600|1500000|2000000、use 0|1。
SAVE,1 也會保存 U2OUT / U2MODE / U2BAUD / PPS / TRIG / AZB / SPI / SPIOUT / SPIMODE / SPICK;
FACTORY,1 會將這些設定恢復為出廠值。
執行 CFG,1 或 INFO,1 時,裝置會額外回報 UART2 狀態:$SPNVU2,out=<組合
>,mode=<ascii|binary>,baud=<n>,drop=<n>,pps=<0|1>,pps_state=<n>,pps_err_ppm=<x>。fw 0.10.0
起也會回報 $SPNVSPI,mode=…,out=…,fmt=…,ck=…,txn=…,ok=…,short=…,delivered=…,drop=…,詳見第
13.4 節。這些訊息的尾端可能新增診斷欄位,請用 key=value 方式解析。
裝置也支援不需要行尾的單字元指令:1–6 依序對應 5/10/25/50/100/1000 Hz,回覆為
$SPNVACK,RATE,<hz>;s 表示立即送出統計,r 表示重新初始化。200/400/500 Hz 必須使用完整的 RATE 指
令。
SparkNavi-IMU600-V2 通訊協定說明 第 19 頁第 20 頁¶
展開本頁文字(可複製)
5.1 校正流程 (fw 0.5.0)
對應設
項目 做法 定
加速度六面 將板子分別以 +X、−X、+Y、−Y、+Z、−Z 朝上,各靜置數秒,順序不限。記錄三顆 ACAL (每
校正 IMU 的平均比力,再逐顆、逐軸計算:b = (a_up + a_down) / 2、k = 2g / (a_up − 顆)
a_down)。GUI「參數設定 → 校正」提供操作精靈,完成後會送出 3 組 ACAL 與
CALSAVE。
Allan 將板子放在遠離鍵盤、風扇等振動源的位置,靜置至少 30 min。設定 RATE,100、 FWGT,g /
FWGT,a
deviation OUT,both 並錄製資料;分析必須有 RAW,both 可同時評估合併結果。原廠 Allan
加權
deviation 工具支援 ASCII 與 binary 錄檔,會使用最長的連續資料段,計算各顆各軸的
ARW/VRW(τ=1 s)與零偏不穩定性,再依 w = 1/σ² 正規化權重,產生建議的 FWGT
指令。
安裝位置 三顆 IMU 中心相對參考點的位置 (x, y, z) 是出廠固定值,無法透過指令修改。 出廠設定
差補償
(lever-
arm)
六面校正只修正零偏與比例係數,不包含各軸之間的正交誤差。陀螺零偏由 AHRS 在運作中估計,不屬於這項六
面校正。
6. 典型輸出序列
使用出廠預設設定時,裝置上電後約 1 s 內開始輸出 50 Hz 資料,不先送出開機資訊。若要查看資訊,可送
$SPNVCMD,INFO,1;主要回覆順序為 $SPNVACK,INFO,1、$SPNVBOOT、$SPNVRESET、$SPNVAUTH、
$SPNVINIT,1..3、$SPNVINIT,B。
$SPNVIMURAW,1,…*XX
$SPNVIMURAW,2,…*XX
$SPNVIMURAW,3,…*XX
$SPNVIMU,…*XX
$SPNVAHRS,…*XX
$SPNVBARO,…*XX
…(預設每 20 ms 輸出 5 行 IMU/AHRS;BARO 依自己的量測完成時間輸出,每秒 50 行)…
$SPNVSTAT,1,…*XX $SPNVSTAT,2,… $SPNVSTAT,3,… $SPNVFUS,… $SPNVSYS,… $SPNVHB,… (每 1 s)
SparkNavi-IMU600-V2 通訊協定說明 第 20 頁第 21 頁¶
展開本頁文字(可複製)
7. 校驗計算範例 (Python)
def spnv_checksum(body: str) -> str:
cs = 0
for ch in body.encode('ascii'):
cs ^= ch
return f"{cs:02X}"
def parse_line(line: str):
line = line.strip()
if not line.startswith('$') or '*' not in line:
return None
body, cs = line[1:].rsplit('*', 1)
if spnv_checksum(body) != cs.upper():
return None # 校驗錯,整行丟
return body.split(',') # f[0] = 'SPNVIMU' 等
# 送指令
cmd = "SPNVCMD,RATE,100"
ser.write(f"${cmd}*{spnv_checksum(cmd)}\r\n".encode())
8. Binary 模式 (D6 44)
送出 $SPNVCMD,MODE,binary 後,裝置傳給主機的訊息會改用二進位封包。主機送出的指令仍使用 ASCII 格
式的 $SPNVCMD。送 MODE,ascii 可切回文字輸出;出廠預設為 ascii。
8.1 封包結構
D6 44 | id(1) | len(1) | seq(1) | payload(len) | crc16(2)
偏移 欄位 說明
0–1 sync 0xD6 0x44
2 id 訊息類別
3 len 資料內容(payload)的長度,範圍為 0–255 bytes。
4 seq 各訊息類別 id 分別計數;每送一筆加 1,超過 255 後回到 0。GUI 可用序號判斷是否漏收封
包。
5… paylo 多位元組數值採 little-endian(低位元組在前);f32 為 IEEE-754 32-bit 浮點數。ts_us 為
ad u64,單位 µs,數值與 ASCII 相同。
末2 crc16 CRC-16/CCITT-FALSE:poly 0x1021、init 0xFFFF、不反射、無 xorout。CRC 以低位元組在
前的順序存放。計算範圍從 byte 2 到 payload 最後一個位元組,包含 id、len、seq、
payload。測試字串 "123456789" 的結果為 0x29B1。
SparkNavi-IMU600-V2 通訊協定說明 第 21 頁第 22 頁¶
展開本頁文字(可複製)
8.2 訊息表
id 名稱 對應 ASCII 內容長度 總長度
$SPNVIMURAW
0x01 IMU_RAW 68 75
$SPNVIMU
0x02 IMU 68 75
$SPNVBARO
0x03 BARO 24 31
$SPNVAHRS
0x04 AHRS 52 59
0x05 PPS $SPNVPPS (fw 0.8.0) 24 31
$SPNVSTAT
0x10 STAT 44 51
$SPNVFUS
0x11 FUS 32 39
$SPNVSYS
0x12 SYS 48 (fw 0.8.0: 55
40;fw ≤
0.7.0:36)
0x7F TEXT 其他所有 可變 ≤ 262
(BOOT/RESET/DBG/AUTH/INIT/HB/ACK/NAK/STALL/TRAP)
上表的長度單位為位元組(bytes)。各欄位的單位與狀態位元定義,與對應的 ASCII 訊息相同。下方列出欄位
偏移、型別與 Python struct 格式;參考程式見 tools/spnv_parser.py。
0x01 IMU_RAW (68) — <BBHQ3f3ff3f3ff
偏移 欄位 型別
0 imu_id u8
1 status u8
2 n u16
4 ts_us u64
12 gyro[3] f32×3 °/s
24 acc[3] f32×3 m/s²
36 temp f32 °C
40 dth[3] f32×3 rad
52 dv[3] f32×3 m/s
64 dt f32 s
SparkNavi-IMU600-V2 通訊協定說明 第 22 頁第 23 頁¶
展開本頁文字(可複製)
0x02 IMU (68) — <Q3f3ff3f3ffBBBB
偏移 欄位 型別
0 ts_us u64
8 gyro[3] f32×3
20 acc[3] f32×3
32 temp f32
36 dth[3] f32×3
48 dv[3] f32×3
60 dt f32
64 n_used u8
65 flags u8
66 used_mask u8;bit0、bit1、bit2 分別表示是否採用 IMU1、IMU2、
IMU3。
67 reserved u8
0x03 BARO (24) — <QfffB3x
偏移 欄位 型別
0 ts_us u64
8 press_hpa f32
12 temp_c f32
16 alt_m f32
20 status u8
21 reserved[3] u8
0x04 AHRS (52) — <Q4f3f3fBBH
偏移 欄位 型別
0 ts_us u64
8 q[4] f32×4 (q0 q1 q2 q3, body➔NED)
24 roll, pitch, yaw f32×3 deg
36 gyro_bias[3] f32×3 °/s
48 align u8
49 flags u8
50 zb_ds u16;fw 0.9.2 起表示連續靜止時間,單位為 0.1 s;舊版固定為 0。
SparkNavi-IMU600-V2 通訊協定說明 第 23 頁第 24 頁¶
展開本頁文字(可複製)
0x10 STAT (44) — <BBBB9IHH
偏移 欄位 型別
0 imu_id u8
1 dry_timeout u8
2 dry_pin u8
3 isr_cpu_pct u8
4 dry u32
8 out u32
12 crc_err u32
16 frame_err u32
20 spi_timeout u32
24 dropped u32
28 dcnt_skip u32
32 dry_kicks u32
36 resync u32
40 isr_us_max u16
42 isr_us_last u16
0x11 FUS (32) — <6Iff
偏移 欄位 型別
0 outputs u32
4 rej[3] u32×3
16 incomplete u32
20 degraded u32
24 gyro_thresh f32
28 acc_thresh f32
0x05 PPS (24) — <QIIiBBH (fw 0.8.0)
偏移 欄位 型別
0 ts_us:最近一次通過條件檢查的 PPS 上升緣時間,與 IMU 使用相同時間基準。 u64
8 edges:通過條件檢查的 PPS 邊緣累計數。 u32
12 captures:原始擷取次數,包含雜訊。 u32
16 err_ppb:本地晶振相對 PPS 的頻率偏差;正值表示本地時鐘較快。 i32
20 state (0 OFF / 1 NO_SIGNAL / 2 ACQUIRING / 3 LOCKED / 4 HOLDOVER) u8
21 align:1 表示輸出週期的時間邊界已與 PPS 對齊。 u8
22 age_ms:距離最近一次合格 PPS 邊緣的時間,上限為 65535 ms。 u16
SparkNavi-IMU600-V2 通訊協定說明 第 24 頁第 25 頁¶
展開本頁文字(可複製)
0x12 SYS (48) — <7IHBBBBBBIII (fw 0.8.0 為 40 byte、fw ≤ 0.7.0 為 36 byte,尾端欄位不存在)
偏移 欄位 型別
0 uart_drop u32
4 loops_per_s u32
8 uart_resets u32
12 pps_cnt u32
16 baro_samples u32
20 baro_i2c_err u32
24 baro_timeouts u32
28 rate_hz u16
30 isr_cpu_total_pct u8
31 out_mode u8 (0 none/1 raw/2 fused/3 both)
32 baro_stale u8
33 baro_hz u8
34 proto_mode u8 (0 ascii/1 binary)
35 pps_state u8 (fw 0.8.0;舊版為 reserved 0)
36 u2_drop u32 (fw 0.8.0)
40 trig_cnt u32 (fw 0.9.0)
44 trig_rej u32 (fw 0.9.0)
解析 SYS 時,請先依 len 判斷版本:可能為 36、40 或 48 bytes。各版本共用的前段欄位排列相同;只有長度足
夠時,才讀取後方新增的欄位。
0x7F TEXT
TEXT 的 payload 是 ASCII 訊息中 $ 與 *XX 之間的文字,不包含 $、*XX 或行尾 CRLF。例如,ACK 訊息的內容
為 SPNVACK,RATE,100。GUI 可直接顯示,也可用逗號分隔各欄位。
8.3 二進位輸出的資料量與頻寬
設定 流量 460800 (46 kB/s) 921600 (92 kB/s)
50 Hz both + AHRS + BARO 19 kB/s OK OK
100 Hz both + AHRS + BARO 37 kB/s OK OK
200 Hz fused + AHRS 27 kB/s OK OK
400 Hz fused + AHRS 54 kB/s 超過 OK
500 Hz fused + AHRS 67 kB/s 超過 OK
1000 Hz 單顆 raw 75 kB/s 超過 OK
1000 Hz fused + AHRS 134 kB/s 超過 超出上限,請用 1.5M
或 2M。
SparkNavi-IMU600-V2 通訊協定說明 第 25 頁第 26 頁¶
展開本頁文字(可複製)
設定 流量 460800 (46 kB/s) 921600 (92 kB/s)
1000 Hz 三顆 raw 225 kB/s 超過 超出上限,請改用
SPI3。
8.4 鮑率設定與實際誤差
用 $SPNVCMD,BAUD,<n> 設定 UART1 鮑率。設定值、實際鮑率與誤差如下:
鮑率 實際 誤差
460800 458716 0.45%
921600 925926 0.47%
1500000 1515152 1.0%
2000000 2000000 0%
8.5 主機端工具
原廠參考解析器 tools/spnv_parser.py 可處理 ASCII 與 binary 資料,檢查校驗碼或 CRC,並統計漏收封包。
python3 spnv_parser.py COM5 460800 --binary --cmd RATE,100 --cmd OUT,fused
python3 spnv_parser.py --file capture.bin
程式介面 SpnvParser.feed(bytes) 會回傳一個列表,每筆結果的格式為 (kind, name, dict)。
9. 韌體更新
• 在 SparkNavi IMU600 GUI 選擇「韌體更新」,並載入原廠發布、適用本產品的 .spfw 檔案。更新檔經
過加密與驗證;格式或產品不符的檔案不會被接受。
• 更新流程:GUI 送出 $SPNVCMD,BOOT,1;裝置回覆 ACK 後重新啟動,進入更新程式 bootloader;
GUI 接著傳送並驗證檔案,完成後自動啟動新韌體。bootloader 不輸出文字訊息,會以 460800 bps、
8N1 等待更新連線約 1.5 s;若沒有收到更新要求,就回到原有應用韌體。
• 使用者設定與六面校正資料存放在獨立區域,更新韌體不會清除。
• 若更新途中斷電、線材脫落或驗證失敗,裝置會停留在 bootloader 等待重新更新。請在 GUI 使用「救
援更新」重新傳送。若開機時發現應用韌體異常,也會進入相同的等待狀態。
• 韌體更新使用的通訊格式不在本文件公開。如需把更新功能整合到自有工具,請洽原廠。
10. GPS PPS 時間對齊(fw 0.8.0)
將 GPS 或其他準確的 1 Hz 參考訊號接到 GPS_PPS_IN,裝置就能讓 IMU 的輸出週期對齊 PPS 上升緣。這條訊
號只提供「整秒邊界」,不包含日期或 GPS 時間資料。
• 鎖定後,相鄰兩個 PPS 上升緣之間會輸出 RATE 筆資料。其中一筆的 ts_us 等於 PPS 上升緣的時間,並
在 RAW 的 status bit7、合併資料的 flags bit7 標記為 1。主機可將這筆資料與 GPS 提供的整秒時間配
對。
SparkNavi-IMU600-V2 通訊協定說明 第 26 頁第 27 頁¶
展開本頁文字(可複製)
• 裝置每秒量測實際 PPS 間隔,再將這段間隔分成 RATE 等份,作為下一秒的輸出時間點。這樣可補償本
地 50 MHz 晶振數十 ppm 的頻率偏差,避免對齊誤差逐秒累積。$SPNVPPS 的 err_ppm 表示量到的晶
振偏差。
• ts_us 仍以裝置的本地 50 MHz 時鐘計算,從開機起算,不會變成 GPS 或 UTC 時間。PPS 的作用是決定
每筆 IMU 資料的取樣時段在哪個時間點結束。
• 接線規格:3.3 V CMOS,上升緣有效,輸入端有內部下拉。脈衝寬度至少 1 µs;一般 GPS 約為 100
ms。輸入電壓不可超過 3.3 V。
• PPS 的相鄰上升緣間隔須在 1 s ± 1000 ppm 內,也就是約 0.999–1.001 s。連續 2 次間隔合格後才進入
鎖定。過短的間隔(小於 1 s − 1000 ppm)視為毛刺並忽略;其他不合格間隔會讓裝置回到
ACQUIRING。若只是漏掉 1–9 個脈衝,而下一次間隔仍符合 k s ± k × 1000 ppm,則可沿用原本的對
齊基準。擷取解析度為 20 ns。
以 MCU 軟體延遲或一般訊號產生器產生的 1 Hz 訊號,可能達不到精度要求,請用示波器確認。例如標
示 1 Hz、實測卻為 993.83 mHz 時,偏差約 6200 ppm;此時 pps_cnt 仍會增加,但無法進入 LOCKED。
• $SPNVPPS 只在接受合格邊緣,或 PPS 狀態改變時送出。若一直停在 ACQUIRING,且收到的間隔都不
合格,不會每秒送一行。此時請查看 $SPNVSYS 的 pps_cnt(第 7 欄)與 pps_state(第 15 欄)。
PPS 狀態可從 $SPNVPPS 第 4 欄、$SPNVSYS 第 15 欄,或 $SPNVU2 的 pps_state 查看:
值 狀態 說明
0 OFF PPS 功能已關閉(PPS,0)。裝置從開機起,每隔 1/RATE 自行決定輸出時間。
1 NO_SIG 尚未收到合格的 PPS,例如未接線;輸出仍按裝置自己的時鐘運作。
NAL
2 ACQUIRI 已收到邊緣,但尚未連續取得 2 個符合 1 s ± 1000 ppm 的間隔。
NG
3 LOCKED 已鎖定 PPS,輸出時間邊界持續與 PPS 對齊。
4 HOLDOV 先前已鎖定,但超過 1.5 s 未收到 PPS。裝置暫時沿用最後量到的間隔繼續輸出。PPS 恢復
ER 且符合整數秒間隔時,立即回到 LOCKED;若邊緣時間已偏離原本的整秒基準,則回到
ACQUIRING 重新對齊。
$SPNVPPS 格式如下。每接受一個合格邊緣或每次狀態改變時送出一行;UART1 須開啟 STAT,UART2 則須在
U2OUT 中包含 stat。
$SPNVPPS,<ts_us>,<edges>,<captures>,<state>,<err_ppm>,<age_ms>,<align>*XX
$SPNVPPS,1234000000,58,58,3,12.345,0,1*XX
• 間隔小於 1 s − 1000 ppm 的邊緣視為雜訊或毛刺,直接忽略,不改變目前狀態。captures − edges 可
用來查看未被採用的擷取次數。
• 剛進入 LOCKED 時,輸出時間邊界會調整一次,幅度最多為一個輸出週期。因此,該筆 dt 可能較短或
較長;完成調整後會持續連續輸出。
11. UART2 第二輸出埠(fw 0.8.0)
• UART2 使用 U2TX、U2RX 腳位,電氣規格為 3.3 V TTL、8N1。目前只透過 U2TX 輸出資料,U2RX 不
接收指令。
SparkNavi-IMU600-V2 通訊協定說明 第 27 頁第 28 頁¶
展開本頁文字(可複製)
• UART2 的設定都由 UART1 下指令:U2OUT 選擇資料內容、U2MODE 選擇格式、U2BAUD 設定鮑率,
再用 SAVE,1 保存。出廠值為 binary、raw(三顆 IMU)、460800 bps。
• UART2 的資料格式與 UART1 相同,可選 ASCII 或 D6 44 binary;binary 的 seq 由 UART2 獨立計數。
ACK、NAK、INFO 等文字回覆只從 UART1 送出。
• UART2 的輸出選項與 UART1 的 OUT、BARO、AHRS、STAT 互相獨立。例如,可讓 UART1 只送
fused 給 GUI,同時讓 UART2 送 raw 給飛控。
• 頻寬估算:binary 模式每批三顆 RAW 共 225 B。100 Hz 時約 22.5 kB/s,460800 bps 可負荷;1000
Hz 時約 225 kB/s,已超過 2000000 bps 約 200 kB/s 的上限,請改為只送 fused 或降低輸出率。緩衝
區滿時會丟棄整筆資料,累計數可查看 $SPNVSYS 第 16 欄或 $SPNVU2 的 drop。
12. EXT_TRIGGER 外部觸發(fw 0.9.0)
送出 $SPNVCMD,TRIG,1,或在 GUI 將「IMU 輸出模式」改為「外部觸發」後,裝置依下列規則運作:
• 進入此模式後,裝置先等待 EXT_TRIGGER(J2 pin 15)的上升緣,不主動送出 $SPNVIMURAW、
$SPNVIMU 或 $SPNVAHRS。若已保存此設定,開機後也會先等待觸發。
• 第一個上升緣只用來建立起點,不輸出資料。之後每個上升緣結束一段取樣時間,並產生一批資料;實
際送出的 RAW、合併及 AHRS 內容,仍依 OUT、AHRS、U2OUT 設定。持續輸入 100 Hz 觸發時,就
以每秒 100 批的速度輸出。
• 每筆 ts_us 記錄本次觸發上升緣的時間。EXT_TRIGGER 中斷的優先權高於取樣中斷,只讀取 50 MHz 計
時器,以保留觸發時間。Δθ 與 Δv 累計的是前一次到本次觸發之間的資料,dt 表示這段積分時間。
實際切分以原始樣本為單位,因此與精確觸發間隔的差小於 1 個樣本,約 0.68 ms。相鄰輸出的積分時
段會接續,不重複也不漏掉樣本;觸發頻率不必是 RATE 的倍數。
• 從觸發到輸出的延遲,約為等待 1 個原始樣本的時間(≤ 0.7 ms),再加上處理與傳輸時間。
• 此模式的 IMU 輸出速度由觸發訊號決定,RATE 設定會保留,供切回連續模式時使用。氣壓計仍依
BRATE 獨立輸出,統計資料仍每秒一組。PPS 對齊在此模式不作用,因為輸出時間邊界由
EXT_TRIGGER 決定。
• 建議觸發頻率為 1–1000 Hz。間隔小於 0.5 ms 的邊緣視為毛刺,會被忽略並累計至 trig_rej。若超過約
10 s 沒有觸發,會放棄該段資料,下一個上升緣重新作為起點。若觸發間隔超過 1 s,仍輸出 RAW 與合
併資料,但 AHRS 不更新。傳輸頻寬請依實際觸發頻率估算,見第 2.5、8.3 節。
• 接線規格:3.3 V CMOS,上升緣有效,輸入端有內部下拉。觸發源請使用 3.3 V 推挽輸出,脈衝寬度至
少 1 µs,電壓不可超過 3.3 V。
• 送出 $SPNVCMD,TRIG,0 可回到連續模式,裝置改依 RATE 定時輸出,並忽略 EXT_TRIGGER 的邊緣。
• 目前模式可查看 $SPNVCFG 的 trig;接受與忽略的觸發次數,分別查看 $SPNVSYS 的 trig_cnt、
trig_rej(第 17、18 欄)。
舊版差異:fw ≤ 0.8.0 仍持續輸出,EXT_TRIGGER 只會額外再送出最新一筆資料。觸發頻率與 RATE 不
同時,可能重複或漏送同一筆,造成 Δθ/Δv 重複計算;當時腳位也沒有內部下拉。這項舊行為已移除。
SparkNavi-IMU600-V2 通訊協定說明 第 28 頁第 29 頁¶
展開本頁文字(可複製)
13. SPI3 從機輸出(fw 0.10.0 起)
IMU600 作為 SPI 從機,由飛控(主機)按固定週期讀取。這版硬體沒有資料就緒訊號 DRDY,因此飛控須用封
包序號與時間戳判斷是否重複讀取或漏收。
本節的通訊行為以 fw 0.10.8 為基準,並於 2026-10-15 與 ArduPilot 4.7.1 完成實機驗證。
J3 訊號
6 FC_SPI_CS,低電位有效。fw 0.10.1 起啟用內部上拉,避免飛控重開機或未上電時,CS 處於不確定
電位。
8 SCK3IN
10 SDI3(MOSI);此介面不使用輸入資料,飛控送 0 即可。
12 SDO3(MISO);設為 SPI,off 時為高阻抗。
• SPI 預設為 Mode 3,也可用 SPICK 改為 Mode 0;每個位元組先送最高位元(MSB first)。建議飛控
SPI 時脈設為 2 MHz,此設定已在 Blue2 + ArduPilot 4.7.1 驗證;8 MHz 尚未驗證。
• 每次將 CS 拉低後,應完整讀取 128 bytes,再將 CS 拉高。讀滿 128 bytes 才算完成這個封包;若未讀
滿,下次仍提供同一個封包。若讀取超過 128 bytes,多出的部分會回傳 0。
• CS 拉高後,IMU600 會準備下一個封包。飛控下次將 CS 拉低時,即可開始送出 SPI 時脈並讀取。
• 連接 ArduPilot 時,請設 RATE,1000,原因見第 14 節。SPI3 本身也支援其他 RATE 值
(5/10/25/50/100/200/400/500 Hz),但 ArduPilot 的主迴圈為 400 Hz 時,起飛前檢查要求陀螺資
料更新率至少為 720 Hz。因此,200/400/500 Hz 都無法通過這項檢查。
• 連接 ArduPilot 時,建議設 OUT,none、AHRS,0、U2OUT,none,關閉不需要的串列資料。三顆 IMU
在 1000 Hz 的 ASCII 資料量遠超過 921600 bps;即使在 400 Hz,OUT,both 也會塞滿 UART1,讓
uart_drop 持續增加。這會使 GUI 顯示的接收速率與「漏格」計數失準,但不影響 SPI3 輸出。
13.1 SPI 封包結構(128 bytes,little-endian)
offset 型別 內容
0 u8×2 0x53 0x4E ("SN")
2 u8 版本 = 1
3 u8 封包類型:0 = 空封包,沒有新資料;1 = IMU 資料;2 = 資料串流。
4 u16 seq:IMU 封包每產生一批輸出就加 1;串流封包則按分段計數。空封包沿用最後完成讀取的
seq。
6 u8 pending:本封包之後還有多少個封包等待讀取。大於 0 時,可立即再讀。
7 u8 IMU 封包:used_mask,bit0–2 分別表示 IMU1–3 是否參與合併。串流封包:payload 的有
效長度,範圍 0–118 bytes。
8..125 — 資料內容(payload),格式依封包類型而定。
126 u16 CRC-16/CCITT-FALSE,poly 0x1021、init 0xFFFF;計算範圍為 byte 0–125,演算法與
binary 模式相同。
SparkNavi-IMU600-V2 通訊協定說明 第 29 頁第 30 頁¶
展開本頁文字(可複製)
IMU 資料內容(類型 1,SPI,ardupilot):使用機體 FRD 座標,對應同一批 $SPNVIMU / $SPNVIMURAW 資
料。下表 offset 從整個封包的起點計算。
offset 型別 內容
8 u64 ts_us:這批資料所涵蓋時段的結束時間;PPS 與外部觸發的時間規則和 UART 相
同。
16 f32 dt (s)
20 f32×3 / 合併 Δθ (rad) / Δv (m/s)
f32×3
44 / 68 / 92 各 f32×6 依序為 IMU1、IMU2、IMU3 的 Δθ[3] 與 Δv[3]。若本次缺少某顆資料,該顆數值
全為 0,status 為 0xFF。
116 i16×3 IMU1..3 溫度 (0.01 °C)
122 u8×3 IMU1..3 status (同 $SPNVIMURAW,bit7 = PPS 標記)
125 u8 合併 flags (同 $SPNVIMU)
串流資料內容(類型 2,SPI,stream):從 byte 8 起讀取 len 個有效位元組,再將各封包內容依序接起來。得到
的格式與 UART2 相同,可直接交給既有的 ASCII 或 D6 44 解析程式。內容由 SPIOUT 選擇,格式由 SPIMODE
設定。
13.2 飛控讀取建議
• 建議讀取間隔為輸出週期的 0.9 倍。例如 RATE,1000 時,每 0.9 ms 讀取一次。若 pending > 0,立即
繼續讀取,但一次最多連讀 5 個封包。
• 每次先檢查固定識別碼 magic、版本與 CRC。類型 0 表示沒有新資料,可略過。若 seq 與上次相同
(gap = 0),也應略過,避免重複使用資料;fw 0.10.8 起,疑似未正常完成的交易可能重送同一個序
號。IMU 封包的 seq 應依序加 1;若 gap > 1,表示中間可能因佇列已滿或讀取失敗而漏收。
• 佇列最多保存 16 個封包,RATE,1000 時約相當於 16 ms 的資料。佇列滿時會丟棄最舊封包,累計至
$SPNVSPI 的 drop。飛控尚未開始讀取前,drop 增加屬於等待期間的結果;開始正常讀取後,就不應
持續增加。
• 若 CRC 檢查失敗,請丟棄這次讀到的內容,並在下次重新讀取。若此次未讀滿 128 bytes,裝置不會移
到下一個封包,下次仍會提供同一包資料。
SparkNavi-IMU600-V2 通訊協定說明 第 30 頁第 31 頁¶
展開本頁文字(可複製)
13.3 實機驗證結果 (Blue2 + ArduPilot 4.7.1,2026-10-15)
項目 結果
SPI 時脈 / 模式 2 MHz,Mode 3 (SPICK,3),飛控 SPI6 + 外部 CS
輸出率 1000 Hz;每秒完成讀取約 1000 個資料封包(delivered),SPI 交易約 1190 次/s
(txn)。
資料正確性 靜置時 Accel Z 約 −1000 mG,X/Y 約 0,與飛控 IMU1/2 一致。轉動方向一致,使
用 ROTATION_NONE;EKF3 啟用三顆 IMU(EK3_IMU_MASK=7)。
起飛前檢查 1000 Hz 通過陀螺資料更新率檢查,飛控顯示 Ready to Arm。
錯誤計數 (fw 0.10.8,7.6 short = 4;dmaerr = 0;drop 在飛控讀取期間不增加
分鐘)
飛控 MP 訊息 不再因偶發錯誤顯示 IMU600: x lost, y bad reads;偶發 bad read / lost 記錄於飛控
日誌 SNV6。
13.4 $SPNVSPI 欄位
送出 $SPNVCMD,CFG,1 或 INFO,1 後,裝置會回報以下 SPI 狀態:
$SPNVSPI,mode=ardupilot,out=none,fmt=binary,ck=3,txn=…,ok=…,short=…,delivered=…,drop=…,dma=1,dmaerr=0,…
*XX
欄位 說明 正常值 / 判讀
mode out fmt
SPI / SPIOUT / SPIMODE / SPICK 目前設定 —
ck
txn
SPI 交易的累計次數,以 CS 動作計 每秒增加約為輸出率的 1.2 倍。
數。
ok
讀滿 128 bytes 的次數 接近 txn
short
未讀滿 128 bytes 的累計次數;下次 測試中偶爾出現個位數。若持續增加,請檢查飛控 SCK
仍提供同一封包。 速度與 CS 時序。
delivered
已完整交付的資料封包累計數。 每秒增加量應接近輸出率。
drop
佇列已滿,因而丟棄最舊封包的累計 飛控開始正常讀取後不應持續增加。開機到飛控開始讀
數。 取前的累計值,可與運作期間的新增值分開判斷。
dmaerr
0/1,是否曾發生 DMA 錯誤 0
其他欄位(dma、lf、lt、ls、ks、kr、sp)供原廠診斷,一般解析程式可略過。新版韌體可能在訊息尾端增加欄
位。
14. ArduPilot 4.7.1 驅動 (AP_InertialSensor_SparkNavi)
IMU600 在飛控中登錄為第三組 SPI IMU(IMU3),原有兩顆內建 IMU 仍繼續使用。發行包 ArduPilot-4.7.1-
SparkNavi-IMU600.zip 包含驅動程式、修補檔(patch)、Blue2 專用板型 SparkNavi-Blue2-IMU600、測試
用 .apj 與 bootloader。
SparkNavi-IMU600-V2 通訊協定說明 第 31 頁第 32 頁¶
展開本頁文字(可複製)
需要完成的設定如下:
位置 設定
IMU600(用 GUI 或指 必要設定:SPI,ardupilot;SPICK,3;RATE,1000。另建議設 OUT,none、AHRS,0、
令設定,完成後送 U2OUT,none,關閉不需要的串列輸出。
SAVE,1)
飛控 hwdef SPIDEV imu600 SPI6 DEVID1 EXTERNAL_CS MODE3 2*MHZ 2*MHZ ;IMU SparkNavi SPI:imu600
ROTATION_NONE
飛控參數 EK3_IMU_MASK = 7;新板型的 defaults.parm 已設定。請再執行一次飛控的六面
加速度計校正,三組 IMU 一起校正。
RATE 必須設為 1000 Hz 的原因:ArduPilot 的起飛前檢查
AP_InertialSensor::pre_arm_check_gyro_backend_rate_hz 要求非串列介面陀螺的資料更新率,至少
為主迴圈的 1.8 倍。Copter 預設主迴圈為 400 Hz,因此最低要求為 720 Hz。若 IMU600 設為 400 Hz,
會出現 PreArm: Gyro 2 rate 400Hz < loop rate*1.8 720Hz,無法解鎖。請改用 1000 Hz,以符合檢查
條件。
驅動程式的處理方式:
• 開機偵測:讀取 128 bytes,檢查識別碼 SN、版本 1 與 CRC16。探測至少持續 500 ms,最晚等到飛控
開機後 5 s;取得 50 筆 IMU 封包後,以 dt 的中位數判定輸出率,並對應到標準速率。運作中每 2 s 再
核對一次。成功時 Mission Planner 的 Messages 顯示 IMU600 found, 1000 Hz;失敗時顯示 IMU600
probe: rd … hdr … crc …。未接 IMU600 時會略過,內建兩顆 IMU 不受影響。
• 模式檢查:若 IMU600 設為 SPI stream,會顯示 IMU600: SPI is in stream mode, set SPI ardupilot,
並且不將它加入飛控的 IMU 清單。請改設 SPI,ardupilot。
• 資料處理:將合併後的 Δθ、Δv(FRD 座標,含 coning/sculling 補償)交給
_notify_new_delta_angle/_velocity,並使用封包的 dt 換算。若 used_mask = 0 或資料出現 NaN,會
累計 gyro/accel 錯誤次數,不交給 INS 使用;SATURATED 會增加 accel clip 計數。溫度取三顆平均,
約每秒發布 10 次。
• 讀取方式:間隔為輸出週期的 0.9 倍。pending > 0 時立即再讀,一次最多 5 包。重複序號直接略過;
gap > 1 時累計 lost,CRC 錯誤時累計 bad。
• 錯誤紀錄:偶發的 bad read 或 lost 不直接顯示在地面站(GCS)。若最近 10 s 內有發生,就寫入
SNV6 日誌,欄位為 TimeUS、Lost、Bad、Pkts。只有 10 s 內 lost ≥ 20 或 bad ≥ 100,才在地面站顯
示 IMU600: SPI link errors (…)。驗證時可設 LOG_DISARMED=1,讓飛控在未解鎖時也錄製日誌,再
查看 SNV6。
ArduPilot 整合注意事項:
• Mission Planner 顯示的加速度單位為 mG,角速度單位為 mrad/s。SCALED_IMU2 與 SCALED_IMU3
分開傳送,因此運動中看到的兩組時間戳可能不同。
• IMU600 的 ACAL 與 ArduPilot 的 INS_ACCOFFS 是兩套校正。建議選定一套進行校正;若使用
ArduPilot 校正,IMU600 可維持 ACAL 預設值(零偏 0、比例 1.0)。若之後又透過 GUI 改動 IMU600
校正值,必須重新執行 ArduPilot 校正。
SparkNavi-IMU600-V2 通訊協定說明 第 32 頁第 33 頁¶
展開本頁文字(可複製)
• Blue2 飛控重開機時,IMU600 的 5 V 供電可能波動。Blue2 的 bootloader hwdef 需將 PE2/PE3 設為
OUTPUT HIGH。燒錄 .apj 後,還須在 Mission Planner 執行一次「Flash bootloader」,新的
bootloader 才會實際寫入。
SparkNavi-IMU600-V2 通訊協定說明 第 33 頁原始文件:Protocol v1.1 Source Pages · PDF 頁 1–33
































