Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 

    BNO055 Home Robot Tips

    BNO055 Home Robot Tips

    GoPiGoCARL
    Member

    I have a BNO055 mounted to my GoPiGo3 / Raspberry Pi based robot and am looking for tips to maximize the performance and heading reliability.

    Carl_IMU_Quarter_View.jpg

    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 hours5-6 degree drift in 24 hours

     

    1 REPLY 1

    Vincent
    Community Moderator
    Community Moderator

    Some hint or suggest for the setup:

    1. the big current (2A wiring) and magnetic is too close to the sensor which will cause big distortion of magnetic including soft iron and hard iron. 

    2. those distortion will affect the heading output.  that is the major reason of big deviation under NDoF mode than IMUPLUS mode.

    3. switching between IMUPLUS mode and NDoF mode is not a good idea.  the magnetic sensor needs to calibration with movement to estimate the magnetic environment change.   This means,  it is better to keep NDoF mode running all the time to keep the magnetic calibration running in background.

    4.  i suggest you to adding two BNO055 on the board,  one runs in IMUPLUS mode, one runs in NDoF mode.  then you can compensate from different modes output can get the accurate output.

    Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist