Difference between revisions of "Subsystem/ahrs"

From PaparazziUAV
Jump to navigation Jump to search
(add basic info about mlkf)
Line 8: Line 8:
* ''[[Subsystem/ahrs#DCM_.28floating_point.29|float_dcm]]''
* ''[[Subsystem/ahrs#DCM_.28floating_point.29|float_dcm]]''
* ''[[Subsystem/ahrs#Complementary_Euler_.28fixed_point.29|int_cmpl_euler]]''
* ''[[Subsystem/ahrs#Complementary_Euler_.28fixed_point.29|int_cmpl_euler]]''
int_cmpl_quad
* ''[[Subsystem/ahrs#Kalman_Filter_Quaternion|float_mlkf]]''
* ''[[Subsystem/ahrs#Kalman_Filter_Quaternion|float_mlkf]]''
* ''[[Subsystem/ahrs#Infrared|infrared]]''
* ''[[Subsystem/ahrs#Infrared|infrared]]''

Revision as of 16:47, 1 September 2013

AHRS subsystem

The Attitude and Heading Reference System subsystem specifies which attitude estimation filter you are using.

Currently possible AHRS subsystem types are

int_cmpl_quad

e.g. for the latest complementary filter:

File: conf/airframes/myplane.xml
  <firmware name="fixedwing or rotorcraft">
     ...
    <subsystem name="ahrs" type="int_cmpl_quat"/>
  </firmware>

Implementations

There is a test program ( sw/airborne/test/ahrs/compare_ahrs.py ) to compare different AHRS implementations on simple test cases.

Please also see issue 93 about proper handling of BODY_TO_IMU in all AHRS algorithms.

Complementary Quaternion (fixed point)

  • Estimates the gyro bias.
  • By default uses magnetometer for heading.
  • In v3.9 and later:
    • Compensation of centrifugal force via GPS speed (to fly in circles with a fixedwing).
      Enabled with AHRS_GRAVITY_UPDATE_COORDINATED_TURN which is set by default for a fixedwing firmware.
    • GPS based heading estimation: https://github.com/paparazzi/paparazzi/issues/130

Other flags of interest are:

  • AHRS_PROPAGATE_LOW_PASS_RATES : apply a low pass filter on rotational velocity
  • AHRS_MAG_UPDATE_ALL_AXES : available since v3.9 use mag to also update roll/pitch and not only yaw (not recommended in most cases)
  • AHRS_MAG_UPDATE_YAW_ONLY : removed in v3.9, default behaviour since only update the yaw instead of all axes


File: conf/airframes/myplane.xml
  <firmware name="fixedwing or rotorcraft">
     ...
    <subsystem name="ahrs" type="int_cmpl_quat"/>
  </firmware>

  <section name="AHRS" prefix="AHRS_">
    <define name="H_X" value=" 0.51562740288882"/>
    <define name="H_Y" value="-0.05707735220832"/>
    <define name="H_Z" value=" 0.85490967783446"/>
  </section>

Also see the Local Magnetic Field section.

Complementary Quaternion/Rotation Matrix (floating point)

  • Estimates the gyro bias.
  • By default uses magnetometer for heading.
  • You need to define either AHRS_PROPAGATE_RMAT or AHRS_PROPAGATE_QUAT (select if the propagation is done in rotation matrix or quaternion representation).
  • In v3.9 and later:
    • Compensation of centrifugal force via GPS speed (to fly in circles with a fixedwing).
      Enabled with AHRS_GRAVITY_UPDATE_COORDINATED_TURN which is set by default for a fixedwing firmware.
    • GPS based heading estimation: https://github.com/paparazzi/paparazzi/issues/130

Other flags of interest are:

  • AHRS_PROPAGATE_LOW_PASS_RATES : apply a low pass filter on rotational velocity
  • AHRS_MAG_UPDATE_ALL_AXES : use mag to also update roll/pitch and not only yaw (not recommended in most cases)
  • AHRS_GRAVITY_UPDATE_NORM_HEURISTIC: lower the gain of the gravity update based on a acceleration norm heuristic (e.g. good for bungee takeoff)


File: conf/airframes/myplane.xml
  <firmware name="rotorcraft or fixedwing">
     ...
    <subsystem name="ahrs" type="float_cmpl_rmat">
      <define name="AHRS_PROPAGATE_QUAT"/>
    </subsystem>
  </firmware>

  <section name="AHRS" prefix="AHRS_">
    <define name="H_X" value=" 0.51562740288882"/>
    <define name="H_Y" value="-0.05707735220832"/>
    <define name="H_Z" value=" 0.85490967783446"/>
  </section>

Also see the Local Magnetic Field section.


DCM (floating point)

  • No direct gyro bias estimation, but also compensates for attitude drift.
  • Uses GPS speed for heading.
  • Compensation of centrifugal force via GPS speed (to fly in circles with a fixedwing).
  • Careful, it doesn't handle all BODY_TO_IMU rotations (mounting positions) correctly!

The algorithm was developed by William Premerlani and Paul Bizard. The theory can be found here: DCMDraft2.pdf The algorithm is also used in the AHRS systems of the AdruIMU. The name DCM for the algorithm is really a misnomer, as that just means that the orientation is represented as a DirectionCosineMatrix (rotation matrix). But since people already know it under that name, we kept it.

Other flags of interest are:

  • USE_MAGNETOMETER : use magnetometer to update yaw (untested ? The magnetometer code has to be improved, since ferromagnetic materials affect the magnetic field. This is currently not implemented.)


File: conf/airframes/myplane.xml
  <firmware name="rotorcraft or fixedwing">
     ...
    <subsystem name="ahrs" type="float_dcm"/>
  </firmware>


Complementary Euler (fixed point)

  • Not recommended for fixedwings, as this filter doesn't compensate for centrifugal force when flying turns.
  • Magnetometer is always only used for heading (yaw).
  • Does not handle the accel and mag updates correctly if BODY_TO_IMU is used for more than just adjustment by a few degrees.
  • In general, rather use int_cmpl_quat

Optional flags/defines are:

  • FACE_REINJ_1 : defaults to 1024
  • IMU_MAG_OFFSET : offset to subtract from the heading calculated by the magnetometer
  • USE_NOISE_FILTER : apply a simple filter on the rate and accel inputs
  • USE_NOISE_CUT : cut rate input at 1 rad/s and accel input at 20m/s²


File: conf/airframes/myplane.xml
  <firmware name="fixedwing or rotorcraft">
     ...
    <subsystem name="ahrs" type="int_cmpl_euler"/>
  </firmware>

  <section name="MISC">
    <define name="FACE_REINJ_1" value="1024"/> <!-- optional, defaults to 1024 -->
  </section>


Kalman Filter Quaternion

Multiplicative Linearized Kalman Filter in quaternion formulation

  • Available in v5.0 and later
  • Estimates the gyro bias.
  • Uses magnetometer to update all 3 axes.
File: conf/airframes/myplane.xml
  <firmware name="rotorcraft">
     ...
    <subsystem name="ahrs" type="float_mlkf"/>
  </firmware>

  <section name="AHRS" prefix="AHRS_">
    <define name="H_X" value=" 0.51562740288882"/>
    <define name="H_Y" value="-0.05707735220832"/>
    <define name="H_Z" value=" 0.85490967783446"/>
  </section>

Also see the Local Magnetic Field section.

Infrared

For use with infrared sensors that detect aircraft attitude and the infrared module.

Local Magnetic Field

If you are using a magnetometer, calculate the normalised local magnetic field by inserting your location coordinates hereand clicking calculate.

Copy the north(x), east(y), and vertical(z) component values into scilab and execute "X/norm(X)" or run this in ipython:

from scipy import *
from numpy.linalg import norm
x = array([20875.1, 8480.2, -51279.8])
x/norm(x)

or enter this into Wolfram Alpha:

{20875.1, 8480.2, -51279.8}/Norm[{20875.1, 8480.2, -51279.8}]

Lastly, enter the results into your airframe file as H_X, H_Y, and H_Z:


File: conf/airframes/myplane.xml
  <section name="AHRS" prefix="AHRS_">
    <define name="H_X" value="0.372692"/>
    <define name="H_Y" value="0.151401"/>
    <define name="H_Z" value="-0.915521"/>
  </section>