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).

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

Read Source Pages · Document Crosswalk and Differences

Category overview · All setup guides