ON THIS PAGE

  • IMU
  • How to place it
  • Inputs and Outputs
  • Limitations
  • IMU sensor frequencies
  • Usage
  • IMU sensors
  • Examples of functionality
  • Reference

IMU

IMU (inertial measurement unit) node can be used to receive data from the IMU chip on the device. Our OAK devices use either:
  • BNO085 (datasheet here) 9-axis sensor, combining accelerometer, gyroscope, and magnetometer. It also does sensor fusion on the (IMU) chip itself. We have efficiently integrated this driver into the DepthAI.
  • BMI270 6-axis sensor, combining accelerometer and gyroscope.
The IMU chip is connected to the RVC over SPI. See OAK Hardware documentation to check whether your OAK camera has IMU integrated.

How to place it

Python
C++
Python
1pipeline = dai.Pipeline()
2imu = pipeline.create(dai.node.IMU)

Inputs and Outputs

Command Line
1/
2  ┌──────────────┐
3  │              │
4  │              │      out
5  │     IMU      ├─────────►
6  │              │
7  │              │
8  └──────────────┘
Message types

Limitations

  • For BNO086, gyroscope frequency above 400Hz can produce some jitter from time to time due to sensor HW limitation.

IMU sensor frequencies

Below are the discrete stable frequencies available for each (raw) IMU sensor. Some maximum IMU frequencies are higher, eg. for BNO086, maximum frequency for gyroscope is 1000Hz, but up to 400Hz is stable (due to driver limitation).BNO086:Note that BNO IMU "rounds up" the input frequency to the next available frequency. For example, if you set the frequency to 101 it will round it to 200Hz.
  • Accelerometer: 15Hz, 31Hz, 62Hz, 125Hz, 250Hz 500Hz
  • Gyroscope: 25Hz, 33Hz, 50Hz, 100Hz, 200Hz, 400Hz
  • Magnetometer: 100Hz
BNO086 max frequency:
BNO086 Sensor Max Frequency
ACCELEROMETER_RAW 512 Hz
ACCELEROMETER 512 Hz
LINEAR_ACCELERATION 400 Hz
GRAVITY 400 Hz
GYROSCOPE_RAW 1000 Hz
GYROSCOPE_CALIBRATED / GYROSCOPE_UNCALIBRATED 100 Hz
MAGNETOMETER_RAW 100 Hz
MAGNETOMETER_CALIBRATED / MAGNETOMETER_UNCALIBRATED 100 Hz
ROTATION_VECTOR 400 Hz
GAME_ROTATION_VECTOR 400 Hz
GEOMAGNETIC_ROTATION_VECTOR 100 Hz
ARVR_STABILIZED_ROTATION_VECTOR 100 Hz
ARVR_STABILIZED_GAME_ROTATION_VECTOR 100 Hz
BMI270:Note that BMI279 "rounds down" the input frequency to the next available frequency. For example, if you set the frequency to 99 it will round it to 50Hz. Additionally, the current max frequency of ~250 Hz is set when the input is >400Hz.
  • Accelerometer: 25Hz, 50Hz, 100Hz, 200Hz, 250Hz
  • Gyroscope: 25Hz, 50Hz, 100Hz, 200Hz, 250Hz

Usage

Python
C++
Python
1pipeline = dai.Pipeline()
2imu = pipeline.create(dai.node.IMU)
3
4# enable ACCELEROMETER_RAW and GYROSCOPE_RAW at 100 hz rate
5imu.enableIMUSensor([dai.IMUSensor.ACCELEROMETER_RAW, dai.IMUSensor.GYROSCOPE_RAW], 100)
6# above this threshold packets will be sent in batch of X, if the host is not blocked and USB bandwidth is available
7imu.setBatchReportThreshold(1)
8# maximum number of IMU packets in a batch, if it's reached device will block sending until host can receive it
9# if lower or equal to batchReportThreshold then the sending is always blocking on device
10# useful to reduce device's CPU load  and number of lost packets, if CPU load is high on device side due to multiple nodes
11imu.setMaxBatchReports(10)

IMU sensors

When enabling the IMU sensors (imu.enableIMUSensor()), you can select between the following sensors:
  • ACCELEROMETER_RAW
  • ACCELEROMETER
  • LINEAR_ACCELERATION
  • GRAVITY
  • GYROSCOPE_RAW
  • GYROSCOPE_CALIBRATED
  • GYROSCOPE_UNCALIBRATED
  • MAGNETOMETER_RAW
  • MAGNETOMETER_CALIBRATED
  • MAGNETOMETER_UNCALIBRATED
  • ROTATION_VECTOR
  • GAME_ROTATION_VECTOR
  • GEOMAGNETIC_ROTATION_VECTOR
  • ARVR_STABILIZED_ROTATION_VECTOR
  • ARVR_STABILIZED_GAME_ROTATION_VECTOR
Here are descriptions of all sensors:

Examples of functionality

Reference

class

depthai.node.IMU(depthai.Node)

method
method
method
getBatchReportThreshold(self) -> int: int
Above this packet threshold data will be sent to host, if queue is not blocked
method
getMaxBatchReports(self) -> int: int
Maximum number of IMU packets in a batch report
method
setBatchReportThreshold(self, batchReportThreshold: int)
Above this packet threshold data will be sent to host, if queue is not blocked
method
setMaxBatchReports(self, maxBatchReports: int)
Maximum number of IMU packets in a batch report
property
out
Outputs IMUData message that carries IMU packets.

Need assistance?

Head over to Discussion Forum for technical support or any other questions you might have.