Calibration of the IMU

There have been some questions about how to properly calibrate the IMU on the OpenROV. I wanted to make this quick tutorial to let you know how the system works.

Just like a smartphone that needs to be calibrated before the compass works, the ROV needs to be moved around in order to be calibrated.

Before Calibration: BNO055.CALIB_SYS 0

Moving ROV around

After Calibration: BNO055.CALIB_SYS 3

The compass also uses two different systems in order to remain accurate. The compass uses both a magnetometer as well as a gyro. After the system is calibrated it has a magnetometer value. When the motors are running there is interference between the magnetometer and the motors so the compass switches into a gyro mode. This eliminates the interference. The problem with gyro based compasses is that they drift over time. In order to counteract this when the motors are turned off for more than 5 seconds, the system re-engages the magnetometer and pulls a true value. When the motors start running, it switches back to the gyro mode. This eliminates the drift associated with long period of gyro usage.

In the video you can see the BNO055.CALIB_MAG go from 0 (not calibrated) to 3 (calibrated)

You should calibrate the IMU using this procedure every time the ROV is turned on.


Excellent, this is very helpful! I do however have the issue that the value of BNO055.CALIB_SYS does not stay at 3 but it changes between 2 and 3. Why is this? And what is the impact on the IMU?

You will see this under normal operation. A value of 2 and a value of 3 is fine for the system. The number changes based on different calibration states. Your IMU will work in either state.

1 Like

So…this may be something obvious that I’m not seeing…but is there something I have to click on to initiate the calibration? Or does it just wait to be calibrated as soon as the ROV is powered on? My line for calib_sys is in its own folder, and had a value of 3 right away without doing anything.

Hi Brian,
I can’t even get BNO to show up on my screen. I upadated to the latest flash 30.0.3 and still nothing. Is there a way I can find out if my IMU module itself is bad?

I’m kind of in dire need of help with this.


You might try updating the Arduino firmware from the Cockpit and see if that helps.

Has the IMU ever worked or is this your first time booting up after installing it? Is the depth working (they share the same I2C bus so this will give a clue as to where the issue is).