Difference between revisions of "Subsystem/imu"
(added BODY_TO_IMU and default calib in table) |
|||
Line 5: | Line 5: | ||
{| class="wikitable" style="text-align:center" border="1" | {| class="wikitable" style="text-align:center" border="1" | ||
! type !! architectures !! firmwares !! notes | ! type !! architectures !! firmwares !! defaults<sup>'''1'''</sup> !! notes | ||
|- | |- | ||
|''aspirin_v1.0'' || stm32 || all || [[AspirinIMU]] via SPI with DMA | |''aspirin_v1.0'' || stm32 || all || yes || [[AspirinIMU]] via SPI with DMA | ||
|- | |- | ||
|''aspirin_v1.5'' || stm32 || all || [[AspirinIMU]] via SPI with DMA | |''aspirin_v1.5'' || stm32 || all || yes || [[AspirinIMU]] via SPI with DMA | ||
|- | |- | ||
|''aspirin_v2.1'' || stm32 || all || [[AspirinIMU]] via SPI with DMA | |''aspirin_v2.1'' || stm32 || all || yes || [[AspirinIMU]] via SPI with DMA | ||
|- | |- | ||
|''aspirin_i2c'' || lpc21 || fw || [[AspirinIMU]] via I2C | |''aspirin_i2c'' || lpc21 || fw || no || [[AspirinIMU]] via I2C | ||
|- | |- | ||
|''aspirin2_i2c'' || lpc21 || fw || [[AspirinIMU]] via I2C | |''aspirin2_i2c'' || lpc21 || fw || no || [[AspirinIMU]] via I2C | ||
|- | |- | ||
|''b2_v1.0'' || all || all || | |''b2_v1.0'' || all || all || no || | ||
|- | |- | ||
|''b2_v1.1'' || all || all || | |''b2_v1.1'' || all || all || no || | ||
|- | |- | ||
|''b2_v1.2'' || all || all || | |''b2_v1.2'' || all || all || no || | ||
|- | |- | ||
|''umarim'' || lpc21 || all || mounted on the [[Umarim_v10|Umarim autpilot board]] | |''umarim'' || lpc21 || all || yes ||mounted on the [[Umarim_v10|Umarim autpilot board]] | ||
|- | |- | ||
|''yai'' || || || | |''yai'' || || || no || | ||
|- | |- | ||
|''crista'' || || || | |''crista'' || || || no || | ||
|- | |- | ||
|''crista_hmc5843'' || || || | |''crista_hmc5843'' || || || no || | ||
|- | |- | ||
|''analog'' || || || | |''analog'' || || || no || | ||
|- | |- | ||
|''ppzuav'' || lpc21 || fw || | |''ppzuav'' || lpc21 || fw || no || | ||
|} | |} | ||
'''1.''' Has default ''GYRO_x'' and ''ACCEL_x'' values from datasheet. | |||
Add the ''imu'' subsystem with the appropriate ''type'' to your firmware section: | |||
{{Box Code|conf/airframes/myplane.xml| | {{Box Code|conf/airframes/myplane.xml| | ||
<source lang="xml"> | <source lang="xml"> | ||
Line 46: | Line 47: | ||
</source> | </source> | ||
}} | }} | ||
Other IMUs can be used through modules or you can just add a subsystem makefile for your own. | |||
== Defining the calibration == | |||
In the IMU section the [[ImuCalibration|IMU calibration]] is defined and | In the IMU section the [[ImuCalibration|IMU calibration]] is defined.<br> | ||
'''Some IMUs (see table above) have defaults defined. You may leave out the ''GYRO_x'' and ''ACCEL_x'' defines to use the datasheet values.''' | |||
=== Magnetometer === | |||
The magnetometer always needs to be [[ImuCalibration#Calibrating_the_Magnetometer|calibrated]] (Unless you want to disable it).<br> | |||
Here is a resulting minimal example: | |||
{{Box Code|conf/airframes/myplane.xml| | {{Box Code|conf/airframes/myplane.xml| | ||
<source lang="xml"> | <source lang="xml"> | ||
<section name="IMU" prefix="IMU_"> | <section name="IMU" prefix="IMU_"> | ||
<define name="MAG_X_SENS" value="3.17378921476" integer="16"/> | <define name="MAG_X_SENS" value="3.17378921476" integer="16"/> | ||
<define name="MAG_Y_SENS" value="3.14663275967" integer="16"/> | <define name="MAG_Y_SENS" value="3.14663275967" integer="16"/> | ||
Line 78: | Line 69: | ||
</source> | </source> | ||
}} | }} | ||
==== 45deg Mag hack ==== | ==== 45deg Mag hack ==== | ||
If your magnetometer axes are rotated by 45deg around z. (e.g. with external mag on booz imu v1.0) | If your magnetometer axes are rotated by 45deg around z. (e.g. with external mag on booz imu v1.0) | ||
Line 98: | Line 85: | ||
}} | }} | ||
=== Defining the orientation of the IMU | === Gyro and Accel === | ||
See the [[ImuCalibration]] page for the actual calibration instructions. Defining them will override any defaults. | |||
{{Box Code|conf/airframes/myplane.xml| | |||
<source lang="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"/> | |||
... | |||
</section> | |||
</source> | |||
}} | |||
== Defining the orientation of the IMU == | |||
Paparazzi has parameters to define the orientation of the IMU with respect to the body of the vehicle. | Paparazzi has parameters 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 [https://github.com/paparazzi/paparazzi/issues/93 issue on github]. | '''Important''' Not all algorithms properly deal with any BODY_TO_IMU orientation. See the notes for the respective implementation at [[Subsystem/ahrs]] and the [https://github.com/paparazzi/paparazzi/issues/93 issue on github]. | ||
For the algorithms not supporting that, 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.) | |||
[[Image:Quad-top.png|240px]] | |||
Not defining these values is the same as setting them to zero | Not defining these values is the same as setting them to zero. | ||
{{Box Code|conf/airframes/myplane.xml| | {{Box Code|conf/airframes/myplane.xml| | ||
<source lang="xml"> | <source lang="xml"> | ||
Line 115: | Line 130: | ||
</source> | </source> | ||
}} | }} | ||
'''Note: Angles are always defined in radians, but by setting ''unit="deg"'' you can [[Units|define them in degrees and they are automatically converted to rad]].''' | '''Note: Angles are always defined in radians, but by setting ''unit="deg"'' you can [[Units|define them in degrees and they are automatically converted to rad]].''' | ||
* The positive 90 degree offset, parallel mount example: | |||
[[Image:Quad-top_IMU-90.png|240px]] | |||
Configured as: | |||
{{Box Code|conf/airframes/myplane.xml| | |||
<source lang="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="90.0" unit="deg"/> | |||
</section> | |||
</source> | |||
}} | |||
===In Flight Tuning=== | |||
* Switch to AHRS telemetry mode and look for the fields that are prefixed with imu_ | |||
[[Image:AHRS telemetry.png|240px]] | |||
90 degree positive offset example | |||
* Open a Real_time plotter from the paparazzi console tools tab and drag int32 body_phi and int32 body_theta into the plotter box. | |||
* Hover rotorcraft (preferably indoors) to record data. | |||
* Copy the (best fit) recorded values into the airframe BODY_TO_IMU defines: | |||
{{Box Code|conf/airframes/myplane.xml| | |||
<pre> | |||
<define name="BODY_TO_IMU_PHI" value="1.5" unit="deg"/> | |||
<define name="BODY_TO_IMU_THETA" value="-0.5" unit="deg"/> | |||
<define name="BODY_TO_IMU_PSI" value="90." unit="deg"/> | |||
</pre> | |||
}} | |||
* Ignore 'on the ground' resting values as depicted in the above image. They will change once the vehicle is in flight. The aim is to get the 'in flight' values of "int32 body_phi" & "int32 body_theta" as close to zero as possible. | |||
[[Category:User_Documentation]] [[Category:Subsystems]] | [[Category:User_Documentation]] [[Category:Subsystems]] |
Revision as of 00:34, 11 June 2012
Currently possible IMU subsystems are
type | architectures | firmwares | defaults1 | notes |
---|---|---|---|---|
aspirin_v1.0 | stm32 | all | yes | AspirinIMU via SPI with DMA |
aspirin_v1.5 | stm32 | all | yes | AspirinIMU via SPI with DMA |
aspirin_v2.1 | stm32 | all | yes | AspirinIMU via SPI with DMA |
aspirin_i2c | lpc21 | fw | no | AspirinIMU via I2C |
aspirin2_i2c | lpc21 | fw | no | AspirinIMU via I2C |
b2_v1.0 | all | all | no | |
b2_v1.1 | all | all | no | |
b2_v1.2 | all | all | no | |
umarim | lpc21 | all | yes | mounted on the Umarim autpilot board |
yai | no | |||
crista | no | |||
crista_hmc5843 | no | |||
analog | no | |||
ppzuav | lpc21 | fw | no |
1. Has default GYRO_x and ACCEL_x values from datasheet.
Add the imu subsystem with the appropriate type to your firmware section:
File: conf/airframes/myplane.xml |
<firmware name="fixedwing or rotorcraft">
...
<subsystem name="imu" type="aspirin_v1.5"/>
</firmware>
|
Other IMUs can be used through modules or you can just add a subsystem makefile for your own.
Defining the calibration
In the IMU section the IMU calibration is defined.
Some IMUs (see table above) have defaults defined. You may leave out the GYRO_x and ACCEL_x defines to use the datasheet values.
Magnetometer
The magnetometer always needs to be calibrated (Unless you want to disable it).
Here is a resulting minimal example:
File: conf/airframes/myplane.xml |
<section name="IMU" prefix="IMU_">
<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>
|
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>
|
Gyro and Accel
See the ImuCalibration page for the actual calibration instructions. Defining them will override any defaults.
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"/>
...
</section>
|
Defining the orientation of the IMU
Paparazzi has parameters 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. For the algorithms not supporting that, 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>
|
Note: Angles are always defined in radians, but by setting unit="deg" you can define them in degrees and they are automatically converted to rad.
- The positive 90 degree offset, parallel mount example:
Configured as:
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="90.0" unit="deg"/>
</section>
|
In Flight Tuning
- Switch to AHRS telemetry mode and look for the fields that are prefixed with imu_
90 degree positive offset example
- Open a Real_time plotter from the paparazzi console tools tab and drag int32 body_phi and int32 body_theta into the plotter box.
- Hover rotorcraft (preferably indoors) to record data.
- Copy the (best fit) recorded values into the airframe BODY_TO_IMU defines:
File: conf/airframes/myplane.xml |
<define name="BODY_TO_IMU_PHI" value="1.5" unit="deg"/> <define name="BODY_TO_IMU_THETA" value="-0.5" unit="deg"/> <define name="BODY_TO_IMU_PSI" value="90." unit="deg"/> |
- Ignore 'on the ground' resting values as depicted in the above image. They will change once the vehicle is in flight. The aim is to get the 'in flight' values of "int32 body_phi" & "int32 body_theta" as close to zero as possible.