2. Data Output¶
For IMU600-V2 / firmware 0.11.2 / GUI v1.6.1.
Follows chapter 2, pages 4–10 of Protocol v1.1. Field numbering starts after the message name. <...> denotes a placeholder and *XX an XOR checksum. Each actual line ends with CRLF (\r\n).
- 2.1 $SPNVIMURAW: individual IMU (3 lines per batch)
- 2.2 $SPNVIMU: fused IMU data
- 2.3 $SPNVBARO: barometer data
- 2.4 $SPNVAHRS: attitude data
- 2.5 Output modes and bandwidth
Continuous mode follows RATE, default 50 Hz (one batch every 20 ms). RAW is calibrated individual-sensor data; FUSED combines usable IMUs. In external-trigger mode the first EXT_TRIGGER rising edge establishes the origin; each subsequent edge generates a batch.
Body axes are FRD: +X forward, +Y right, +Z down. At rest and level, az is about −9.79 m/s². IMU ts_us is the integration endpoint since boot (u64, µs), not host receipt time.
2.1 $SPNVIMURAW — Individual IMU Data (3 Lines per Batch)¶
$SPNVIMURAW,<id>,<ts_us>,<gx>,<gy>,<gz>,<ax>,<ay>,<az>,<temp>,<n>,<status>,<dthx>,<dthy>,<dthz>,<dvx>,<dvy>,<dvz>,<dt>*XX
| # | Field | Type / Decimal Places | Unit | Description |
|---|---|---|---|---|
| 1 | id |
Integer | — | IMU identifier 1, 2 or 3. |
| 2 | ts_us |
u64 | µs | End of this measurement interval; identical for all three RAW records and FUSED in a batch. |
| 3–5 | gx / gy / gz |
Float, 4 decimals | °/s | Three-axis angular rate calculated from this interval’s raw samples (nominal 1475 Hz). |
| 6–8 | ax / ay / az |
Float, 4 decimals | m/s² | Mean specific force in this interval, including the accelerometer response to gravity. |
| 9 | temp |
Float, 2 decimals | °C | Internal temperature of this IMU. |
| 10 | n |
Integer | — | Raw sample count: about 14–15 at 100 Hz, 29–30 at 50 Hz and 295 at 5 Hz. |
| 11 | status |
Integer (bits) | — | Bitwise OR of all sample states in this interval; 0 means no errors and no PPS marker. See 2.1.1. |
| 12–14 | dthx / dthy / dthz |
Float, 7 decimals | rad | Accumulated rotation vector Δθ; trapezoidal integration with second-order coning compensation. |
| 15–17 | dvx / dvy / dvz |
Float, 6 decimals | m/s | Accumulated velocity increment Δv with rotation and sculling compensation; at rest dvz ≈ −9.79 × dt. |
| 18 | dt |
Float, 6 decimals | s | Actual integration duration, about 1/RATE. dth/dt is rad/s (multiply by 180/π for °/s); dv/dt is mean specific force. |
2.1.1 Interpreting status¶
Each raw sample requires seven internal SPI response frames. At 50 Hz, one RAW record contains about 30 samples / 210 responses. Any flag seen is retained, so status describes the entire interval, not just its final sample.
| Bit / Value | Name / Source | Meaning / Data Validity | Cause / Action |
|---|---|---|---|
| bit0 / 1 | SPI_CRC | Device-side CRC-8 failure on a 48-bit SPI response or register-address mismatch. Affected values become zero, distorting averages. | Normally zero; crc_err also increases. Check internal sensor-link noise, SCK rate and CS timing. |
| bit1 / 2 | CE · frame CE | Sensor command error: read-only write, undefined address or write after EOI. Data itself remains valid. | Unexpected in normal operation; report for firmware investigation. Fusion still rejects according to the error mask. |
| bit2 / 4 | IDS · frame IDS | Internal Data Status: internal sensor error; data is suspect. | Usually accompanies S_ERROR (bit3). |
| bit3 / 8 | S_ERROR · S[1:0]=01 | Power, clock, temperature or self-test fault; data is unreliable. | If persistent, use REINIT,1; inspect the sensor hardware if it does not recover. |
| bit4 / 16 | S_SAT · S[1:0]=10 | Any axis exceeds ±300 °/s or ±156.9 m/s², including prefilter peaks. Δθ / Δv can be underestimated. | Often caused by impact, violent motion or excessive vibration; unexpected at rest or in ordinary flight. |
| bit5 / 32 | S_INIT · S[1:0]=11 | Sensor initialization, usually within about 250 ms of power-on/reset; data is unreliable. | Should be transient after startup or REINIT. |
| bit7 / 128 | PPS · fw 0.8.0 | ts_us matches a GPS PPS rising edge, once per second while aligned; not an error. | Mask with status & 0x7F before checking for errors. |
- One response has one S[1:0] state, prioritized initialization > error > saturation > normal. OR across a batch can set bits 3 / 4 / 5 together. The PDF does not assign bit6.
- An IMU with (status & 0x7F) ≠ 0 is normally excluded; status=128 remains usable. If all three have errors, firmware falls back to all three for FUSED; check RAW as described in 3.1.1.
- Common values: 0 normal; 1 SPI checksum/address issue; 16 saturation; 12 (8+4) sensor error; 32 or 44 initialization; 128 PPS only.
Sampling clocks can differ, for example 1470 Hz versus 1461 Hz. At a shared output boundary, n can differ by one: 30 samples may cover 20.4 ms while another sensor’s 29 cover 19.8 ms. Shared ts_us does not imply perfectly synchronized raw sampling.
50 Hz stationary example (PDF values, with XOR recalculated for the complete single line):
$SPNVIMURAW,1,12345680,0.0123,-0.0456,0.0089,0.0210,-0.0150,-9.7912,31.25,30,0,0.0000043,-0.0000159,0.0000031,0.000420,-0.000300,-0.195824,0.020000*0F
2.2 $SPNVIMU — Fused Data from Three IMUs (1 Line per Batch)¶
$SPNVIMU,<ts_us>,<gx>,<gy>,<gz>,<ax>,<ay>,<az>,<temp>,<dthx>,<dthy>,<dthz>,<dvx>,<dvy>,<dvz>,<dt>,<n_used>,<flags>*XX
| # | Field | Type / Decimal Places | Unit | Description |
|---|---|---|---|---|
| 1 | ts_us |
u64 | µs | Same ts_us as this batch’s RAW records. |
| 2–4 | gx / gy / gz |
Float, 4 decimals | °/s | Fused three-axis angular rate. |
| 5–7 | ax / ay / az |
Float, 4 decimals | m/s² | Fused three-axis specific force. |
| 8 | temp |
Float, 2 decimals | °C | Mean temperature of participating IMUs. |
| 9–11 | dthx / dthy / dthz |
Float, 7 decimals | rad | Fused rotation vector Δθ. |
| 12–14 | dvx / dvy / dvz |
Float, 6 decimals | m/s | Fused velocity increment Δv. |
| 15 | dt |
Float, 6 decimals | s | Mean dt of participating IMUs. |
| 16 | n_used |
Integer | — | Number of participating IMUs, 1–3. |
| 17 | flags |
Integer (bits) | — | Fusion state; bits may coexist. Zero means all three are healthy and used, without a PPS marker. |
| Bit / Value | Name | Description |
|---|---|---|
| bit0 / 1 | IMU1_REJECTED | IMU1 excluded due to (status & 0x7F) ≠ 0 or persistent deviation meeting the rejection condition. |
| bit1 / 2 | IMU2_REJECTED | IMU2 excluded under the same conditions. |
| bit2 / 4 | IMU3_REJECTED | IMU3 excluded under the same conditions. |
| bit3 / 8 | SPREAD_WARN | Deviation exceeds half the effective threshold, including full-threshold exceedance not yet persistent enough for exclusion. |
| bit4 / 16 | DEGRADED | Fewer than two usable IMUs; only one used for this output. |
| bit5 / 32 | INCOMPLETE | Not all ready IMUs supplied data for this batch. |
| bit6 / 64 | SATURATED | Since fw 0.5.0: at least one S_SAT. Clipped motion cannot be fully measured; INS should downweight it or increase estimated uncertainty. |
| bit7 / 128 | PPS | Since fw 0.8.0: ts_us matches GPS PPS rising edge; timing marker, not error. |
2.3 $SPNVBARO — Barometer Data¶
$SPNVBARO,<ts_us>,<press_hpa>,<temp_c>,<alt_m>,<status>*XX
| # | Field | Type / Decimal Places | Unit | Description |
|---|---|---|---|---|
| 1 | ts_us |
u64 | µs | Forced mode: conversion trigger time. Normal mode: time fresh data readiness is detected. |
| 2 | press_hpa |
Float, 4 decimals | hPa (= mbar) | Pressure with IIR coefficient 3, same unit as ArduPilot SCALED_PRESSURE.press_abs. Multiply by 100 for Pa. Display resolution 0.0001 hPa = 0.01 Pa is not accuracy. See SPNVINIT,B osr_p. |
| 3 | temp_c |
Float, 2 decimals | °C | Barometer chip temperature, closer to board temperature than ambient air. |
| 4 | alt_m |
Float, 2 decimals | m | Standard-atmosphere altitude: 44330.77 × (1 − (p/1013.25)^0.190263). Useful for changes/plots; weather affects it, so it is not accurate absolute elevation and can be negative. |
| 5 | status |
Integer (bits) | — | 0 normal; bit0=1 records an I2C NACK / bus collision recovered by retry before this sample. |
Since fw 0.5.0, default is Forced mode at 50 Hz. BARO and IMU share a boot-time clock; 50 Hz starts a conversion every 20000 µs. BARO ts_us marks conversion start; IMU ts_us marks integration end. Completion follows after conversion time (SPNVINIT,B conv_us), so equal timestamps do not mean equal measurement intervals.
| BRATE | Pressure OSR | Temperature OSR | IIR |
|---|---|---|---|
| 10 / 25 Hz | 16× | 2× | 3 |
| 50 Hz | 8× | 2× | 3 |
| 100 Hz | 4× | 1× | 3 |
Firmware selects OSR to keep conversion within the period minus 3 ms. BARO,0 / BARO,1 disables/enables output; BRATE,10 / 25 / 50 / 100 sets rate (prefix commands with $SPNVCMD,). Monitor SPNVSYS baro_samples, baro_i2c_err, baro_timeouts and baro_stale.
$SPNVBARO,9651290,1017.3040,44.14,-33.69,0*20
2.4 $SPNVAHRS — Attitude Data¶
$SPNVAHRS,<ts_us>,<roll>,<pitch>,<yaw>,<q0>,<q1>,<q2>,<q3>,<align>,<flags>,<bgx>,<bgy>,<bgz>,<zb_s>*XX
| # | Field | Type / Decimal Places | Unit | Description |
|---|---|---|---|---|
| 1 | ts_us |
u64 | µs | Same as this batch’s SPNVIMU. |
| 2 | roll |
Float, 3 decimals | deg | Roll −180…180, right bank positive; FRD/NED with ZYX Euler angles. |
| 3 | pitch |
Float, 3 decimals | deg | Pitch −90…90, nose-up positive. |
| 4 | yaw |
Float, 3 decimals | deg | Yaw 0…360, clockwise viewed from above. At align=1 it is relative, starting at zero, and drifts. |
| 5–8 | q0 / q1 / q2 / q3 |
Float, 6 decimals | — | Body-to-NED Hamilton quaternion, scalar q0: v_n = R(q) · v_b. |
| 9 | align |
Integer | — | Alignment state, below. |
| 10 | flags |
Integer (bits) | — | Attitude computation status, below. |
| 11–13 | bgx / bgy / bgz |
Float, 4 decimals | °/s | Estimated runtime three-axis gyro bias in body coordinates, for diagnostics. |
| 14 | zb_s |
Float, 1 decimals | s | fw 0.9.2: continuous stillness, 0–10 s. Motion resets it; at 10 s bias is applied and BIAS_CAL set. Fixed at zero with AZB,0. |
| align | Name | Suggested GUI Display | Description |
|---|---|---|---|
| 0 | INIT | Aligning… | First second after startup / AHRS,reset collects stationary data; roll, pitch and yaw are unavailable. |
| 1 | LEVELED | Heading: NOT ALIGNED | Roll/pitch usable. Yaw lacks an external reference, starts at zero and drifts with gyro integration. |
| 2 | ALIGNED | Heading: aligned (manual) | Heading reference set; currently only manual HDG is supported, indicated by flags. |
| Bit / Value | Name | Description |
|---|---|---|
| bit0 / 1 | HIGH_DYN | Specific-force magnitude differs from g by >0.5 m/s², angular-rate magnitude >50 °/s, or gravity-direction error >5°. Kp drops to 0.2 to reduce accelerometer correction. |
| bit1 / 2 | BIAS_FROZEN | Dynamic state, angular rate >5 °/s, or force magnitude differs from g by >0.2 m/s². Bias learning pauses; attitude continues updating. |
| bit2 / 4 | HDG_MANUAL | Heading manually set through $SPNVCMD,HDG. |
| bit3 / 8 | ACC_REJECT | Force magnitude differs from g by >3 m/s²; this update uses only gyro, without accelerometer correction. |
| bit4 / 16 | INIT_MOVING | Motion during the initial second prevented bias estimation and reduced leveling accuracy; hold still and repeat AHRS,reset. |
| bit5 / 32 | BIAS_CAL | fw 0.9.1: three-axis bias, including Z, estimated from at least 10 s stillness. Completion status, not a warning; heading-drift specifications apply afterward. |
| bit6 / 64 | STATIC | fw 0.9.1: the last 10 seconds were judged stationary; bias is being updated. |
Stationary bias estimation (AZB) is enabled at the factory; control it with $SPNVCMD,AZB,0 / 1. Every 10 s it checks each gyro-axis standard deviation <0.1 °/s, acceleration criterion <0.1 m/s² and no dynamic flag. Gyro means then estimate bias; the first estimate is applied directly and sets BIAS_CAL. A GUI can show “Calibrating x / 10 s; keep still.”
Attitude uses FUSED Δθ for quaternion updates and Δv/dt to observe gravity. Related commands: AHRS,0 / AHRS,1 / AHRS,reset, HDG,<deg>, AKP / AKI; see command syntax. ASCII AHRS is about 120 B per line.
2.5 Output Modes and Bandwidth¶
$SPNVCMD,OUT,raw|fused|both|none selects IMU output, default both; send one selected value. UART1 at 460800 bps, 8N1 carries about 46 kB/s.
| Setting | Traffic | Result |
|---|---|---|
| 50 Hz both + BARO 50 Hz + AHRS 50 Hz | ≈38 kB/s | Default; within bandwidth. |
| 100 Hz fused + AHRS | ≈26 kB/s | Within bandwidth; the PDF recommends this for operational use. |
| 100 Hz raw | ≈45 kB/s | Near capacity; occasional whole-line drops. |
| 100 Hz both | ≈59 kB/s | Exceeds capacity; whole-line drops occur. |
For 200 / 400 / 500 / 1000 Hz use binary and higher baud; see binary bandwidth. The 200 / 400 / 500 Hz rates require fw 0.10.3+. For SPI3-only integration, OUT,none disables UART IMU data. OUT selects IMU content; AHRS and BARO have separate controls. Watch SPNVSYS uart_drop for sustained increases.
Source document:IMU600-V2 Communication Protocol v1.1 · PDF pages 4–10