Bosch Sensortec Community

    Showing results for 
    Search instead for 
    Did you mean: 

    BHI160B and BMM150 9-DOF application check

    BHI160B and BMM150 9-DOF application check



    We are not necessarily planning on using 9-DOF (or even magnetometer) in our current devices, but I would like clarification and assurance that our understanding of their setup is correct. I'd greatly appreciate you review this process and point out any mistakes ijn our understanding.

    If we ever want 9-DOF with all the bells and whistles, we’ll need to

    1. Find orientation matrix of BHI and mag sensor relative to layout on the board. Ensure this gets uploaded to the Fuser Core at production
      • This should allow us to receive back correct ENU convention quaternions, euler angles etc.
    2. Run a calibation routine at production for the ENU convention data and flash to BHI. The calibration routine involves some very particular movements, like doing a figure 8 with the unit, rotating at 90 degree increments... all explained in a Bosch youtube video
      • We have, after this point, a 9-DOF calibrated ENU space device that can output quaternions, game vectors etc... assuming we have also flashed the correct firmware on to it at each startup
    3. Boardunit is then fit to an end system sturdily once, in a near-arbitrary manner by end user e.g. ENU coordinates are almost never going to be aligned with system movement coordinates
    4. The user is instructed to ensure the system as a whole is as near perfectly level as possible, which we have means of allowing them to do. They press a calibrate button and we use the current output stream to manually generate a transformation matrix of our own
    5. Note that the orientation matrix isn’t for telling the Bosch sensors how they exist in 3d space, but instead how they are laid out with respect to each other on a board. For the case where, for example, the board unit has been fit to an end system with Zboard as some arbitrary vector in the ENU X,Y,Z convention, we will then have to conduct our own transformations with the previously determined transfromation matrix on the output data so the standard read out of pitch, roll and yaw are then mapped to actual system pitch, roll and yaw.

    Does this make sense? Have we got the right idea? We're especially not sure about step 4 and 5, and whether there is a way the Bosch sensors can be instantly remapped that can replace the steps. Or do I always have to provide a means to perform a calibration step after installation so that we can convert the yaw, pitch and roll in ENU space to yaw, pitch and roll in system space?

    1 REPLY 1

    Community Moderator
    Community Moderator


    Thanks for your inquiry. Sorry for the late response.

    I am not sure about your application. But the process for BHI160B + BMM150 should be like below,

    1. Design your own PCB so that BHI160B x/y/z are aligned with BMM150 x/y/z which means that they are orthogonal.

    2. Install your PCB into your casing where you define your casing X/Y/Z body axes and make sure sensors' x/y/z are parallel to X/Y/Z axes.

    3. Determine the axis remapping matrix for accel, gyro and mag with respect to casing X/Y/Z axes.

    4. Input the remapping matrix to BHI160B every time after it is powered on.

    5. BHI160B + BMM150 9DOF sensor fusion ENU is with respect to the casing body Y axis. As long as the axis remapping matrix are correct the sensor fusion results such as Euler angles, rotation vector, etc. from BHI160B + BMM!50 9DOF should be always correct for ENU.

    6. In your MCU firmware you can always check the sensor calibration status. There are two bits for accel, gyro and mag respectively. 0b00 means that sensor is not calibrated. 0b01 and 0b10 mean that sensor is being calibrated. 0b03 means that sensor is fully calibrated and ready to go. Therefore, your MCU knows if the accel, or gyro, or mag needs to be calibrated or not. If yes, then your system can notify the user to perform figure-8 motion to calibrate the mag for example.

    7. Repeat step 6.