bno055 related questions
I understand that the bno-055's internal autocalibration which runs in background cannot be switched off. I get massive heading drifting and after reading everything I could find about this I implemented my own routine to minimize this. I use the following steps in my algorithm:
1. Bno055 initialization
2. Calibration (in NDOF mode)
3. Write the calibration values (ACC, Gyro, Mag Offsets and Acc and Mag Radius bytes) in the microcontroller's (AVR) EEPROM for later use
4. find a stable position close to roll=0, pitch=0, yaw=0 on my table and log the readings
5. enter a loop where:
5.1. read the CALIB_STAT register and see if it is 0xFF (if not goto 5.1.1)
5.1.1. read EEPROM values of offsets and radii. Enter Bno055's ConfigMode. Write these saved calibration values. Reenter NDOF Mode. Blink a LED to indicate that the calib. values were reloaded.
5.2. read euler angles or raw data from sensors or whatever
I've noticed that whenever I write the offset and radius registers the CALIB_STAT register will show 0x00111111. This tells me according to the datasheet section 4.3.54 that the status of the Gyro, Acc and Mag is "calibrated" but the system's calibration status (bits 7:6) remains 0x00 "NOT CALIBRATED" . Why is that ?
What triggers the system's calibration ? According to the datasheet (same section) the status of the system calibration deppends on status of all other sensors. So why do I get 0x00111111 ? I used the value stored in this register as a trigger for reloading the initial calibration values. Eventually I made my condition: " is the current value <= Hex 3F ?" which ignores the bit 7 and 6. It works until now. But I still wanna know the reason for the described problem.
Also, would there be another method to detect when the offset and radius are getting messed up, instead of using the CALIB_Stat register ? I thought about reading only the MAG Offset and Radius cause obviously these are the most succeptible ones to distortions. This would mean only 8 read/compare/write operations instead of 22.
Another question: when going through the initial calibration process (NDOF Mode) I calibrate gyro first then the acc and the mag at the end of the routine. I'm using the calibration steps from the datasheet (and the youtoube video). After calibrating the gyro and the acc, the mag is almost always calibrated without having to do anymore movements (figure 8 or else).
If I wanna re-calibrate just one sensor, for instance the magnetometer, would this be possible ? Pause the data output, recalibrate, save the new offset/radius, resume data output.
Re: bno055 related questions
Based on my experience of using BNO055, below are some comments.
Regarding the point of heading error and drift, there are a lot of factors which could contribute to this, due to the simple fact that the magnetic field is superposition of the earth magnetic field and many other sources of disturbances which are both unpredicatible and inconsistent in space and time. The fusion algorithm is continuously monitoring discrepancies caused by the volatile disturbances and when any such situation is detected, the calibration status is downgraded to indicate a need for calibration which is typically done through the well-known butterfly or figure-8 motions. Luckily, the algoirthm on BNO055 has a so-called FMC (Fast Mag Calibration) feature which makes this calibration much easier by elimiating the need for full figure 8 motions which might be challenging to do in certain cases. And hopefully this clarifies why there is not an option to turn off the "background calibration".
In the 9DoF sensor fusion, to reach optimal accuracy of the heading, each sensor need to be calibrated properly, and you are right that the system calibration depends on the calibration status of each sensor before it becomes HIGH status too, but even if the status of all the 3 sensors isHIGH it's not enough to establish a HIGH for the system calibration automatically, and I think it's because what the system calibration means is it's trying to fuse all sensors to work in concert and figure out any discrepancies before it's confident to say everything is working fine. For example, you might have reached a perfect calibration status at one location outdoors where the disturbances are minimal, and the calibration profiles are saved to the NVM, and when you move indoors, the superposed magnetic environment has changed dramatically, when you load the old (stale) magnetic calibration profile which has a status of HIGH, the fusion module cann't trust that right away, instead it fuses sensor data from 3 sensors together to see if all sensors can now work in concert and agreement with each other before the system calibration status could be set to HIGH. To reach a HIGH status of the system calibration, my expereince was that one simply needs to do some more mild movements of the board and in most cases, the HIGH status should be coming pretty quickly.