I have a BNO055 mounted to my GoPiGo3 / Raspberry Pi based robot and am looking for tips to maximize the performance and heading reliability. My current test case consists of: 1) With robot on dock, facing roughly South, and aligned with floor boards, the IMU is placed in IMUPlus mode. (Fusion using Gyros and Accellerometers only, no mags) 2) BNO055 is reset, axis_remap'd, and returned to operation mode (in IMUPlus mode). 3) A Python IMU logging program watches for wheel encoder motion to begin, recording the datetime and Euler heading, and then when wheel encoder motion ends, the program logs the datetime, final heading, total rotation (final heading - initial heading), duration of motion, and number of soft I2C errors. 4) The robot remains on the dock, charging at constant current 1A (8-12v) for three hours during which time the BNO055 is not accessed. 5) When the robot's charger switches to trickle charge mode at 12v, the robot drives "straight forward" off the dock 214mm. There is usually some perturbation of the robot's heading which the IMU logger will record as +1 to -4 degrees heading rotation. The robot will usually end aligned with the floor board or at most 4 degrees CCW (minus), and the IMU heading seems to start +/- 2 degrees from the robot's heading the first undocking. 6) The robot will sit motionless for about six hours, until the batteries reach 8.1v, during which time the BNO055 is not accessed. 7) The robot performs two consecutive 180 degree CW turns, (first to check the distance to the dock, second to set up for docking). These motions cause the IMU logger to record the two turns, and the IMU rotation values are usually less than 1 degree different than the wheel encoder values. The robot turns with +/- 3 degree alignment to the dock/floor board lines after the commanded turn. 8 ) The robot backs onto the dock, which forces the alignment of the robot back toward the zero degree heading. The IMU usually logs this straightening as +/- 2 degrees rotation/heading change. 9) and repeat: After 3 hours the robot will undock and the IMU will usually show a 3 degree CCW heading drift from the prior undocking. 2020-05-08 19:59|[logIMU.py.main]** resetIMU.py executed **
2020-05-08 22:35|[imulog.py.logMotionStop]heading: 2.2 rotation: 2.2 motion: 2.8 sec errors: 335
2020-05-09 04:46|[imulog.py.logMotionStop]heading: 181.0 rotation: 178.8 motion: 2.4 sec errors: 362
2020-05-09 04:47|[imulog.py.logMotionStop]heading: 1.4 rotation: 180.2 motion: 2.3 sec errors: 362
2020-05-09 04:47|[imulog.py.logMotionStop]heading: 356.9 rotation: -4.6 motion: 2.8 sec errors: 362
2020-05-09 04:47|[imulog.py.logMotionStop]heading: 356.9 rotation: 0.1 motion: 0.3 sec errors: 362
2020-05-09 04:47|[imulog.py.logMotionStop]heading: 357.2 rotation: 0.2 motion: 0.4 sec errors: 362
2020-05-09 04:47|[imulog.py.logMotionStop]heading: 357.2 rotation: 0.0 motion: 0.1 sec errors: 362
2020-05-09 06:11|[imulog.py.logMotionStop]heading: 357.8 rotation: 0.6 motion: 2.9 sec errors: 369
2020-05-09 09:13|[imulog.py.logMotionStop]heading: 178.1 rotation: 180.2 motion: 2.5 sec errors: 386
2020-05-09 09:13|[imulog.py.logMotionStop]heading: 358.8 rotation: 180.3 motion: 2.4 sec errors: 386
2020-05-09 09:14|[imulog.py.logMotionStop]heading: 355.1 rotation: -3.6 motion: 2.7 sec errors: 386
2020-05-09 09:14|[imulog.py.logMotionStop]heading: 355.2 rotation: 0.1 motion: 0.3 sec errors: 386
2020-05-09 09:14|[imulog.py.logMotionStop]heading: 355.4 rotation: 0.2 motion: 0.4 sec errors: 386
2020-05-09 09:14|[imulog.py.logMotionStop]heading: 355.4 rotation: 0.0 motion: 0.1 sec errors: 386
2020-05-09 12:01|[imulog.py.logMotionStop]heading: 356.1 rotation: 0.8 motion: 2.8 sec errors: 398
2020-05-09 18:11|[imulog.py.logMotionStop]heading: 174.6 rotation: 178.4 motion: 2.4 sec errors: 421
2020-05-09 18:12|[imulog.py.logMotionStop]heading: 352.3 rotation: 177.8 motion: 2.4 sec errors: 421
2020-05-09 18:12|[imulog.py.logMotionStop]heading: 352.1 rotation: -0.3 motion: 2.7 sec errors: 421
2020-05-09 18:12|[imulog.py.logMotionStop]heading: 352.2 rotation: 0.1 motion: 0.3 sec errors: 421
2020-05-09 18:12|[imulog.py.logMotionStop]heading: 352.4 rotation: 0.2 motion: 0.4 sec errors: 421
2020-05-09 21:01|[imulog.py.logMotionStop]heading: 354.0 rotation: 1.6 motion: 2.7 sec errors: 437 Some observations: - Single turn rotation/heading accuracy seems better in IMUPLUS mode (usually +/- 1, max +/- 2 deg) than in NDOF mode (usually +/- 1, max +/-10 deg) - Wheel encoder magnets, motor windings and magnets, and 12v 2A electrical wiring are within 3 inches of the chip. - When calibrating NDOF mode via in air, sloppy figure-8, the "north point" seemed to end up +/- 10 degrees from one calibration to the next. - I noticed (after reviewing 80 pages of quesions asked in the last year about the BNO055) comments to the effect: - Indoor application presents difficulty for mag consistency - Long periods of no motion allow drift - Using mags can counter drift - Suggestions that IMU(Plus) mode is best for home robot because motors and indoor use influence magnetic environment. - Forget about trying to use the IMU linear accellerometers for estimating linear motion (unless I get a Ph.D and figure out Kalman filtering with the wheel encoders.) I'm wondering if some sort of IMUPLUS mode when moving, and NDOF mode when standing still to "recalibrate/reset" heading, might work to self correct drift after sitting motionless for a while? Any other ideas how to maximize accuracy and minimize drift? ==== For reference - the matching wheel encoder log ==== 2020-05-08 22:35|[wheellog.py.logMotionStop]travel: 213.9 rotation: 0.6 motion: 2.8 sec
2020-05-09 04:46|[wheellog.py.logMotionStop]travel: 0.3 rotation: 179.3 motion: 2.4 sec
2020-05-09 04:47|[wheellog.py.logMotionStop]travel: 0.3 rotation: 178.7 motion: 2.3 sec
2020-05-09 04:47|[wheellog.py.logMotionStop]travel: -211.7 rotation: -1.7 motion: 2.7 sec
2020-05-09 04:47|[wheellog.py.logMotionStop]travel: -5.0 rotation: -0.6 motion: 0.3 sec
2020-05-09 04:47|[wheellog.py.logMotionStop]travel: -10.3 rotation: 0.3 motion: 0.5 sec
2020-05-09 04:47|[wheellog.py.logMotionStop]travel: 0.0 rotation: 0.0 motion: 0.1 sec
2020-05-09 06:11|[wheellog.py.logMotionStop]travel: 214.7 rotation: 0.8 motion: 2.9 sec
2020-05-09 09:13|[wheellog.py.logMotionStop]travel: 0.3 rotation: 179.3 motion: 2.4 sec
2020-05-09 09:13|[wheellog.py.logMotionStop]travel: 0.3 rotation: 178.7 motion: 2.3 sec
2020-05-09 09:14|[wheellog.py.logMotionStop]travel: -211.1 rotation: -1.1 motion: 2.7 sec
2020-05-09 09:14|[wheellog.py.logMotionStop]travel: -4.5 rotation: 0.0 motion: 0.3 sec
2020-05-09 09:14|[wheellog.py.logMotionStop]travel: -9.5 rotation: 0.0 motion: 0.4 sec
2020-05-09 09:14|[wheellog.py.logMotionStop]travel: 0.0 rotation: 0.0 motion: 0.1 sec
2020-05-09 12:01|[wheellog.py.logMotionStop]travel: 214.5 rotation: 0.6 motion: 2.8 sec
2020-05-09 18:11|[wheellog.py.logMotionStop]travel: 0.0 rotation: 179.0 motion: 2.3 sec
2020-05-09 18:12|[wheellog.py.logMotionStop]travel: 0.3 rotation: 179.3 motion: 2.3 sec
2020-05-09 18:12|[wheellog.py.logMotionStop]travel: -208.9 rotation: 0.0 motion: 2.7 sec
2020-05-09 18:12|[wheellog.py.logMotionStop]travel: -4.2 rotation: -0.3 motion: 0.3 sec
2020-05-09 18:12|[wheellog.py.logMotionStop]travel: -10.1 rotation: 0.0 motion: 0.4 sec
2020-05-09 21:01|[wheellog.py.logMotionStop]travel: 214.7 rotation: 0.8 motion: 2.8 sec Carl at roughly 0 degrees, IMU reading 354: 5-6 degree drift in 24 hours
... View more