Difference between revisions of "Subsystem/imu"

From PaparazziUAV
Jump to navigation Jump to search
m
(started to add some info about arch/firmware for the imu subsystems)
Line 1: Line 1:
<categorytree style="float:right; clear:right; margin-left:1ex; border: 1px solid gray; padding: 0.7ex;" mode=pages hideprefix=always>Subsystems</categorytree>
<categorytree style="float:right; clear:right; margin-left:1ex; border: 1px solid gray; padding: 0.7ex;" mode=pages hideprefix=always>Subsystems</categorytree>
Currently possible IMU subsystems are
Currently possible IMU subsystems are
* ''[[AspirinIMU|aspirin_v1.0]]<sup>'''1'''</sup>''
* ''[[AspirinIMU|aspirin_v1.5]]<sup>'''1'''</sup>''
* ''[[AspirinIMU|aspirin_v2.1]]<sup>'''1'''</sup>''
* ''[[AspirinIMU|aspirin_i2c]]''
* ''[[AspirinIMU|aspirin2_i2c]]''
* ''b2_v1.0''
* ''b2_v1.1''
* ''b2_v1.2''
* ''[[Umarim_v10|umarim]]''
* ''yai''
* ''crista''
* ''crista_hmc5843''
* ''analog''
* ''ppzuav''
Notes:
'''1.''' Use SPI with DMA, alternatively use i2c version for LPC21xx


{| class="wikitable" style="text-align:center" border="1"
! type !! architectures !! firmwares !! notes
|-
|''aspirin_v1.0'' || stm32 || all || [[AspirinIMU]] via SPI with DMA
|-
|''aspirin_v1.5'' || stm32 || all || [[AspirinIMU]] via SPI with DMA
|-
|''aspirin_v2.1'' || stm32 || all || [[AspirinIMU]] via SPI with DMA
|-
|''aspirin_i2c''  || lpc21 || fw || [[AspirinIMU]] via I2C
|-
|''aspirin2_i2c'' || lpc21 || fw || [[AspirinIMU]] via I2C
|-
|''b2_v1.0'' || all || all ||
|-
|''b2_v1.1'' || all || all ||
|-
|''b2_v1.2'' || all || all ||
|-
|''umarim'' || lpc21 || all || mounted on the [[Umarim_v10|Umarim autpilot board]]
|-
|''yai'' || || ||
|-
|''crista'' || || ||
|-
|''crista_hmc5843'' || || ||
|-
|''analog'' || || ||
|-
|''ppzuav'' || lpc21 || fw ||
|}





Revision as of 05:06, 4 June 2012

Currently possible IMU subsystems are

type architectures firmwares notes
aspirin_v1.0 stm32 all AspirinIMU via SPI with DMA
aspirin_v1.5 stm32 all AspirinIMU via SPI with DMA
aspirin_v2.1 stm32 all AspirinIMU via SPI with DMA
aspirin_i2c lpc21 fw AspirinIMU via I2C
aspirin2_i2c lpc21 fw AspirinIMU via I2C
b2_v1.0 all all
b2_v1.1 all all
b2_v1.2 all all
umarim lpc21 all mounted on the Umarim autpilot board
yai
crista
crista_hmc5843
analog
ppzuav lpc21 fw


Other IMUs can be used through modules or you can just add a subsystem makefile for your own. Also see the IMU calibration page.

File: conf/airframes/myplane.xml
  <firmware name="fixedwing or rotorcraft">
     ...
    <subsystem name="imu"       type="aspirin_v1.5"/>
  </firmware>

Defining the calibration

In the IMU section the IMU calibration is defined and looks something like this:

File: conf/airframes/myplane.xml
  <section name="IMU" prefix="IMU_">
    <define name="GYRO_P_NEUTRAL" value="32362" />
    <define name="GYRO_Q_NEUTRAL" value="32080" />
    <define name="GYRO_R_NEUTRAL" value="32096" />

    <define name="GYRO_P_SENS" value="1.1032765" integer="16" />
    <define name="GYRO_Q_SENS" value="1.1360802599" integer="16" />
    <define name="GYRO_R_SENS" value="1.1249874614" integer="16" />

    <define name="ACCEL_X_SENS" value="2.45932966" integer="16"/>
    <define name="ACCEL_Y_SENS" value="2.45106376" integer="16"/>
    <define name="ACCEL_Z_SENS" value="2.47825717" integer="16"/>

    <define name="ACCEL_X_NEUTRAL" value="31886"/>
    <define name="ACCEL_Y_NEUTRAL" value="32162"/>
    <define name="ACCEL_Z_NEUTRAL" value="32941"/>

    <define name="MAG_X_SENS" value="3.17378921476" integer="16"/>
    <define name="MAG_Y_SENS" value="3.14663275967" integer="16"/>
    <define name="MAG_Z_SENS" value="3.26531022727" integer="16"/>

    <define name="MAG_X_NEUTRAL" value="2059"/>
    <define name="MAG_Y_NEUTRAL" value="1944"/>
    <define name="MAG_Z_NEUTRAL" value="2099"/>
  </section>

Note that for the aspirin and umarim IMUs you may leave out the GYRO_x and ACCEL_x defines to use the default values from the datasheet.

See the IMU calibration page for the actual calibration instructions.

45deg Mag hack

If your magnetometer axes are rotated by 45deg around z. (e.g. with external mag on booz imu v1.0)

File: conf/airframes/myplane.xml
  <section name="IMU" prefix="IMU_">
    ...
    <define name="MAG_45_HACK" value="1" />
    <!--define name="MAG_X_SENS" value="5.14821844457 * sqrt(2)/2" integer="16"/-->
    <!--define name="MAG_Y_SENS" value="5.11810156597 * sqrt(2)/2" integer="16"/-->
    <define name="MAG_X_SENS" value="3.640340173" integer="16"/>
    <define name="MAG_Y_SENS" value="3.619044324" integer="16"/>
    <define name="MAG_Z_SENS" value="5.07618333556" integer="16"/>
  </section>

Defining the orientation of the IMU

Paparazzi has a parameter to define the orientation of the IMU with respect to the body of the vehicle.

Important Not all algorithms properly deal with any BODY_TO_IMU orientation. See the notes for the respective implementation at Subsystem/ahrs and the issue on github. Currently the only way to properly deal with 90deg rotations is to just change the sensors channels (e.g. so that what are normally the x-axis gyros and accels become the y-axis sensors, etc.)

Not defining these values is the same as setting them to zero:

File: conf/airframes/myplane.xml
  <section name="IMU" prefix="IMU_">
    ...
    <define name="BODY_TO_IMU_PHI"   value="0.0" unit="deg"/>
    <define name="BODY_TO_IMU_THETA" value="0.0" unit="deg"/>
    <define name="BODY_TO_IMU_PSI"   value="0.0" unit="deg"/>
  </section>