Piksi® Multi OEM board includes a Bosch BMI160 IMU and a Bosch BMM150 Magnetometer sensors. As of firmware release v1.0.11, it is possible to stream raw IMU values from the BMI160. 


  • Piksi Multi and Duro receivers can output only raw IMU data, unfiltered, and unaligned IMU information directly from the MEMS IMU chip. This feature is NOT a blended GNSS/INS position or attitude solution.

  • Piksi Multi Inertial and Duro Inertial receivers provide GNSS/INS fusion algorithm, which combines GNSS and inertial measurements into an unified solution.

Enabling IMU Sensors

In order to enable the IMU data, it is necessary to configure the following firmware settings.

Settings GroupSetting NameDescriptionNotes
imuimu_raw_outputEnable / Disable raw IMU output
imu_rateThe rate of IMU raw measurementsA max of 25 Hz is recommended for UART communication at 115200 bps. Use only USB or Ethernet interfaces for higher data rates. 200 Hz is not recommended.
acc_rangeaccelerometer data range
gyro_rangegyroscope data range
mag raw outputEnable / Disable raw magnetometer output
mag ratemagnetometer output rate

Consult the firmware settings document for more information and the IMU datasheet for more information.

When the "imu_raw_output" setting is set to True, Swift Binary Protocol (SBP) messages with the IMU information are sent from the device through any interface configured to transmit these messages. The messages that are sent include MSG_IMU_RAW (sbp message type 0x0900 hex or 2304 decimal) and MSG_IMU_AUX (sbp message type 0x0901 hex or 2305 decimal).

The raw imu data is communicated directly as tics from the BOSCH sensor and the units depends on the configuration of the underlying sensor. As such, it is necessary to know how the IMU range is configured in order to determine how to map the raw values to more familiar units. The Bosch sensor configuration is a direct reflection of the register interface in the Bosch device and it is communicated by Piksi Mulit and/or Duro periodically in MSG_IMU_AUX. With both the MSG_IMU_AUX message and the MSG_IMU_RAW in our SBP protocol, it is sufficient to understand everything about the raw_imu data stream and how to convert it into familiar units.

As an example of how to convert the raw tics from the MSG_IMU_RAW into more familiar units, let us take the accelerometer raw values. The maximum range of a signed 16 bit integer will correspond to the configured maximum range. For instance, if the accelerometer range is configured as +/- 8 g's, it means that 2^15 (32768) tics are equivalent to 8g's. Thus in software a user should take the raw value, multiply by the configured maximum range in g's (or m/s^2 or ft/s^2 as required), and divide by the number of "tics" of resolution the sensor has (32768) to convert into g's. The user can determine the configured range through the fields of MSG_IMU_AUX. Consult the SBP message protocol documentation for more information.

For example, to output IMU messages from the UART0 port a default enabled_sbp_messages settings needs to be changed as shown below:

Viewing IMU Data In The Console

The Swift Console reads IMU messages and displays on a line chart. Navigate to the Advanced > IMU tab of the console to see the data as shown below.

IMU Orientation

Consult the axis illustration on the top of Piksi Multi board for a hands on depiction of the IMU orientation with respect to the board. For Duro, consult the Duro documentation.

Piksi Multi BMM150 Magnetometer Orientation Errata

There is a 180 degree rotation about the Piksi Multi Z axis between the SBP raw magnetometer output and the markings on the Piksi Multi board for any firmware up to and including v2.3. This may be fixed in a future firmware version. 

The Y axis of the BMM150 is pointed down, and the y axis of the chip is equivalent to the - x axis of PIksi Multi, while the x axis of the chip is equivalent to the y axis of Piksi Multi.

In software for all releases up to and including v2.3 firmware, the following rotation is applied to the raw magnetometer signals. This takes the raw magnetometer y axis, and sets it to the SBP output X axis, and the raw magnetometer x axis and sets it to the negative SBP y axis. As such, there is a 180 degree rotation between the SBP output for the magnetometer.