Skip to main content
Firmware Version 0.2

Configuration & Operation

Firmware Version:

The NIMU can be controlled via either the CAN bus interface or the onboard USB-C port. USB communication for configuration and control using the NMotion CLI Tool and the NMotion Transport Library is supported both through the NLink Adapter, enabling multi-device management, and directly via the onboard USB-C port for standalone operation with a single device.

API functions for interacting with the NIMU are available in the NIMU API Documentation.

CAN Bus Configuration

info

This is not necessary when NIMU is connected via USB-C and used as a standalone device.

The NIMU device utilizes a daisy chainable CAN bus for control. If multiple devices are present on the CAN bus, ensure that a unique CAN Node ID is assigned to the device. The allowable values of CAN Node ID is in the range of 0 to 127. The default CAN Node ID is 0 and must be modified to avoid communication conflicts.

info

Setting the CAN Node ID causes the driver to automatically disconnect and reconnect, and to retain the new ID after a device reboot, you must save the configuration.

The API functions involved in this configuration are as follows:

Data Configuration

The NIMU’s output data streams can be selectively enabled or disabled using dedicated API functions. This allows users to optimize bandwidth and processing based on application needs. These functions allow fine-grained control over which sensor fusion outputs are transmitted over CAN and made available via the SDK.

All data streams can be managed individually, including:

  • Linear Acceleration
  • Acceleration
  • Rotation Vector
  • Euler Angles
  • Gravity Vector
  • Gyroscope (Calibrated / Uncalibrated)
  • Magnetometer
  • Raw Sensor Data from Accelerometer, Gyroscope and Magnetometer

Configuration changes take effect immediately and persist until the device is reset or disabled via corresponding API function.

info

Raw data streams are accessible only after they have been explicitly enabled.

The API functions involved in this configuration are as follows:

IMU Calibration

The BNO085 integrates MEMS sensors that require individual calibration for optimal performance. Each individual sensor is different, so each unique device must be calibrated individually. The device performs continuous dynamic calibration, updating sensor offsets and accuracy every 5 seconds and storing them in RAM. Calibration data can be saved to the sensor's non-volatile memory preserving offsets across reboots and improving startup performance. Dynamic calibration can be selectively enabled or stopped while preserving collected data. Dynamic calibration data (DCD) can be cleared to reset the sensor and record new calibration data.

startCalibration() initiates dynamic calibration for selected sensors (accelerometer, gyroscope, magnetometer, planar accelerometer); ensure the sensors are enabled before starting. getCalibrationStatus() returns false if any calibration process is stuck, and stopCalibration() halts calibration while preserving collected data.

info

Calibration progress and quality are indicated by the accuracy field with each sensor get commands.

Accuracy values: 0 – Uncalibrated 1 – Low 2 – Medium 3 – High

Calibration Procedure

To calibrate the NIMU, place it in a clean magnetic environment and monitor the accuracy field for each sensor using get commands. Calibrate the accelerometer by positioning the device in 4–6 unique orientations, holding each stable for about one second — think of the device as a cube and set it on different faces. Calibrate the gyroscope by keeping the device stationary on a flat surface for 2–3 seconds so it can auto-calibrate. For the magnetometer, rotate the device in a figure-eight (∞) pattern or smoothly about all three axes, roughly 180° and back. Finally, run saveCalibration() to store the calibration data in the BNO085’s flash memory, ensuring it is retained across power cycles.

info

The magnetometer requires at least 50Hz report rate to get proper calibration.

warning

Sometimes, when stopCalibration() and clearDCD() are called simultaneously, the sensor may stop outputting data. Re-enable the sensor to resume normal data flow.

The API functions involved with calibration are as follows:

Operation

Getting Datapoints

The NIMU provides real-time access to a range of motion and orientation parameters. These values are updated continuously and transmitted over the CAN bus, making them accessible to control systems, real-time algorithms, or logging frameworks. Sensor data from the NIMU can be accessed by first enabling the desired data stream using the corresponding enable function (e.g., enableEulerAngles(), enableAccelerometer()..etc), after which the relevant API function (such as getEulerAngles(), getLinearAcceleration(), etc.) can be used to retrieve the data. For raw sensor outputs like getRawGyroscope(), the corresponding base stream (e.g., enableGyroscope()) must be enabled first to ensure proper data flow.

The API functions involved in this configuration are as follows:

Tare

The Tare function redefines the orientation of the sensor, aligning its outputs with the physical mounting of the device. This allows all sensor outputs to correspond to the user’s chosen reference orientation.

Tare can be applied selectively across axes as needed. tareAll() resets all axes (yaw, pitch, roll) to the current orientation, while tareYaw() resets only the heading (Z-axis), leaving pitch and roll unchanged. saveConfigurations() saves the current Tare orientation as the default, preserving it across power cycles so the device automatically starts with the user-defined reference.

info

Tare does not affect sensor calibration, it only re-orients the output reference frame. It is recommended to calibrate the sensor before performing a Tare.

When using the NIMU on multiple devices with a standard mounting, many units will share the same sensor orientation. Instead of taring each device individually, you can use a reference unit’s orientation and apply it to all devices with the setOrientation() function. Place a reference unit in the standard mounting, read its rotation vector (quaternion) data using getRotationVectorData() command, and apply those values to setOrientation() on each device to update their runtime orientation. Finally, run saveConfigurations() to persist the orientation across power cycles.

The API functions involved with tare operation are as follows:

  NMotionTM  is a sub-brand of Nawe Robotics
Copyright © 2025 Nawe Robotics Private Limited