> This page is for Firmware, version 4.0 (default).
> For other versions, use one of these documentation indexes:
> - 4.0 (default): https://docs.ouster.com/sensor-docs/firmware/4.0/llms.txt
> - 3.2: https://docs.ouster.com/sensor-docs/firmware/3.2/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ouster.com/sensor-docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ouster.com/sensor-docs/_mcp/server.

# IMU Data

> IMU UDP packet profiles, packet structure, and configurable scale ranges for Ouster sensors.

![](/sensor-docs/_fern-files/ouster.docs.buildwithfern.com/b321fb1acf5c6ffac4b489d350647b7eee3817c74c366115fa73c549d5d40338/assets/firmware/packets/packet-renderer.html)

IMU output is selected with `udp_profile_imu`. Supported values are:

* `LEGACY` - legacy IMU packet format. See [IMU Data Legacy](/sensor-docs/firmware/3.2/imu-data-legacy).
* `ACCEL32_GYRO32_NMEA` - column-correlated IMU packet format for synchronous IMU output.

IMU packets are little-endian. By default, IMU UDP data is forwarded to port `7503`; configure `udp_port_imu` to change the destination port or set it to `0` to disable IMU packet transmission.

### ACCEL32_GYRO32_NMEA IMU Profile

> **Note**
>
> Supported in firmware v3.2 or later.

The `ACCEL32_GYRO32_NMEA` profile is intended for synchronous IMU output. It reports 32-bit accelerometer and gyroscope values with timing fields that correlate the IMU sample to lidar column/frame context.

Configure packet cadence with `imu_packets_per_frame`. Valid values are `1`, `2`, `4`, and `8`; the resulting IMU packet rate depends on lidar frame rate and the selected value. The number of IMU Data Blocks in each packet is reported by `imu_measurements_per_packet` in [`GET /api/v1/sensor/metadata/imu_data_format`](/sensor-docs/firmware/api-reference/ouster-http-api/sensor-metadata/get-imu-data-format).

Each `ACCEL32_GYRO32_NMEA` packet contains a Packet Header, an NMEA Block, `imu_measurements_per_packet` IMU Data Blocks, and a Packet Footer. Each IMU Data Block contains one column-correlated IMU measurement.

#### ACCEL32_GYRO32_NMEA Packet Header

The packet header is 256 bits (8 words). It identifies the packet as IMU data and carries frame, initialization, serial number, alert, and thermal/shot-limiting status fields.

```mermaid
packet-beta
+16: "Packet Type"
+16: "Frame ID Low"
+24: "Init ID"
+8: "Serial No Low"
+32: "Serial No High"
+8: "Alert Flags"
+24: "Reserved"
+8: "Thermal Shutdown Countdown"
+8: "Shot Limiting Countdown"
+8: "Thermal Shutdown State"
+8: "Shot Limiting Level"
+96: "Reserved"
```

| Word |       Bits | Field                      | Description                                                                                                                |
| :--: | ---------: | -------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|   0  |    \[15:0] | Packet Type                | `0x02` for IMU packets.                                                                                                    |
|   0  |   \[31:16] | Frame ID Low               | Low 16 bits of the lidar frame ID associated with the packet.                                                              |
|   1  |   \[55:32] | Init ID                    | Updates on every reinit or reboot. Also available via the [sensor-info endpoint](/sensor-docs/firmware/api-reference#sensor-metadata). |
|   1  |   \[63:56] | Serial No Low              | Low 8 bits of sensor serial number.                                                                                        |
|   2  |   \[95:64] | Serial No High             | High 32 bits. Combined with Serial No Low = 40-bit serial number.                                                          |
|   3  |  \[103:96] | Alert Flags                | `bits[5:0]` alert_cursors; `bit[6]` cursor_overflow; `bit[7]` alerts_active.                                               |
|   3  | \[127:104] | Reserved                   | —                                                                                                                          |
|   4  | \[135:128] | Thermal Shutdown Countdown | Seconds to thermal shutdown (30 when imminent, 0 otherwise).                                                               |
|   4  | \[143:136] | Shot Limiting Countdown    | Seconds to shot limiting onset (30 when imminent, 0 otherwise).                                                            |
|   4  | \[151:144] | Thermal Shutdown State     | `0` = normal; `1` = shutdown imminent.                                                                                     |
|   4  | \[159:152] | Shot Limiting Level        | `0x00` = normal; `0x01` = imminent; `0x02`–`0x09` = active levels.                                                         |
|  5–7 | \[255:160] | Reserved                   | —                                                                                                                          |

#### ACCEL32_GYRO32_NMEA NMEA Block

The 100-byte NMEA Block carries an 8-byte timestamp, 88 bytes of timestamped NMEA sentence payload, and a 4-byte lock-status word. If no NMEA measurement is available for a packet, the NMEA sentence fields are zero-padded.

| Word |       Bits | Field           | Description                                |
| :--: | ---------: | --------------- | ------------------------------------------ |
|   0  |    \[31:0] | Timestamp Low   | Low 32 bits of NMEA timestamp              |
|   1  |   \[63:32] | Timestamp High  | Upper 32 bits of NMEA timestamp            |
| 2–23 |  \[767:64] | NMEA Words 0–21 | 22 words (88 bytes) of NMEA sentence bytes |
|  24  |     \[768] | PPS Lock        | PPS lock status                            |
|  24  |     \[769] | NMEA Lock       | NMEA lock status                           |
|  24  | \[799:770] | Reserved        | Reserved                                   |

#### ACCEL32_GYRO32_NMEA IMU Data Block

The IMU Data Block contains:

* **Timestamp** \[64 bit unsigned int] - timestamp for the IMU packet on the sensor time base.
* **Correlated Column ID** \[12 bit unsigned int] - lidar column ID associated with the IMU sample.
* **Result Valid** \[1 bit unsigned int] - indicates whether the correlated column/frame fields are valid.
* **Frame ID** \[8 bit unsigned int] - low 8 bits of the lidar frame ID.
* **Acceleration in X/Y/Z-axis** \[32 bit float] - acceleration in g.
* **Angular Velocity about X/Y/Z-axis** \[32 bit float] - angular velocity in degrees per second.

```mermaid
packet-beta
+32: "Timestamp L"
+32: "Timestamp H"
+12: "Column ID"
+4: "Reserved"
+1: "Valid"
+8: "Frame ID"
+7: "Reserved"
+32: "Accel X"
+32: "Accel Y"
+32: "Accel Z"
+32: "Gyro X"
+32: "Gyro Y"
+32: "Gyro Z"
```

#### ACCEL32_GYRO32_NMEA Packet Footer

| Word |       Bits | Field      | Description                   |
| :--: | ---------: | ---------- | ----------------------------- |
|  0–5 |   \[191:0] | Reserved   | Reserved                      |
|   6  | \[223:192] | CRC64 Low  | Low 32 bits of packet CRC64   |
|   7  | \[255:224] | CRC64 High | Upper 32 bits of packet CRC64 |

### Configurable IMU Scale

The full-scale range (`fsr`) of the accelerometer and gyroscope is configurable. Toggle each between the default `NORMAL` and the wider `EXTENDED` range via the Web UI or by issuing `POST /api/v1/sensor/config` with `accel_fsr` and/or `gyro_fsr` in the body. Query the current value with [`GET /api/v1/sensor/metadata/imu_data_format`](/sensor-docs/firmware/api-reference#sensor-metadata). See the [API reference](/sensor-docs/firmware/api-reference#sensor-metadata) for full schemas.

* **`accel_fsr`** — accelerometer measurement range.
  * `NORMAL` (default): X/Y/Z measurement range ± 2 g.
  * `EXTENDED`: X/Y/Z measurement range ± 16 g.

* **`gyro_fsr`** — gyroscope measurement range.
  * `NORMAL` (default): X/Y/Z measurement range ± 250 dps (°/sec).
  * `EXTENDED`: X/Y/Z measurement range ± 2000 dps (°/sec).

> **Note**
>
> Switching to `EXTENDED` does not change the unit of measurements in IMU packets, but can result in a slight loss of measurement precision. Full IMU specifications are in the [Sensor Datasheet](https://ouster.com/downloads).