AHRS using MLKF filter.
Multiplicative Linearized Kalman Filter in quaternion formulation. Estimates the gyro bias and needs magnetometer to update all 3 axes. Not suitable for fixedwings! Suitable for rotorcraft. The magnetometer is used and needs to be well calibrated. Estimates attitude and heading. Does not use GPS.
Example for airframe file
Add to your firmware section: This example contains all possible configuration options, not all of them are mandatory!
<module name="ahrs_float_mlkf">
b'<define name="AHRS_MAG_UPDATE_ALL_AXES" value="FALSE|TRUE" />\n '
b'<define name="AHRS_MLKF_IMU_ID" value="ABI_BROADCAST" />\n '
b'<define name="AHRS_MLKF_MAG_ID" value="ABI_BROADCAST" />\n '
b'<configure name="AHRS_MLKF_TYPE" value="AHRS_PRIMARY|AHRS_SECONDARY" />\n '
b'<configure name="AHRS_ALIGNER_LED" value="1" />\n '
</module>
Module configuration options
Configure Options
- name:
AHRS_MLKF_TYPE
value: AHRS_PRIMARY|AHRS_SECONDARY
Description: set if the AHRS is the primary source (default) or one of the secondary sources
- name:
AHRS_ALIGNER_LED
value: 1
Description: LED number to indicate AHRS alignment, none to disable (default is board dependent)
Define Options
- name:
AHRS_MAG_UPDATE_ALL_AXES
value: FALSE|TRUE
Description: Use magnetometer to update all axes and not only yaw
- name:
AHRS_MLKF_IMU_ID
value: ABI_BROADCAST
Description: ABI sender id of IMU to use
- name:
AHRS_MLKF_MAG_ID
value: ABI_BROADCAST
Description: ABI sender id of magnetometer to use
Files
Source Files
Raw ahrs_float_mlkf.xml file:
<!DOCTYPE module SYSTEM "module.dtd">
<module name="ahrs_float_mlkf" dir="ahrs" task="estimation">
<doc>
<description>
AHRS using MLKF filter.
Multiplicative Linearized Kalman Filter in quaternion formulation.
Estimates the gyro bias and needs magnetometer to update all 3 axes.
Not suitable for fixedwings!
Suitable for rotorcraft. The magnetometer is used and needs to be well calibrated. Estimates attitude and heading. Does not use GPS.
</description>
<configure name="AHRS_MLKF_TYPE" value="AHRS_PRIMARY|AHRS_SECONDARY" description="set if the AHRS is the primary source (default) or one of the secondary sources"/>
<configure name="AHRS_ALIGNER_LED" value="1" description="LED number to indicate AHRS alignment, none to disable (default is board dependent)"/>
<define name="AHRS_MAG_UPDATE_ALL_AXES" value="FALSE|TRUE" description="Use magnetometer to update all axes and not only yaw"/>
<define name="AHRS_MLKF_IMU_ID" value="ABI_BROADCAST" description="ABI sender id of IMU to use"/>
<define name="AHRS_MLKF_MAG_ID" value="ABI_BROADCAST" description="ABI sender id of magnetometer to use"/>
</doc>
<settings>
<dl_settings>
<dl_settings NAME="AHRS MLKF">
<dl_setting var="ahrs_mlkf_enable" min="0" step="1" max="1" module="modules/ahrs/ahrs_float_mlkf_wrapper" values="DISABLE|ENABLE" handler="enable"/>
<dl_setting var="ahrs_mlkf.mag_noise.x" min="0.0" step="0.02" max="1.0" module="modules/ahrs/ahrs_float_mlkf" shortname="mag_noise_x" param="AHRS_MAG_NOISE_X" type="float" persistent="true"/>
<dl_setting var="ahrs_mlkf.mag_noise.y" min="0.0" step="0.02" max="1.0" module="modules/ahrs/ahrs_float_mlkf" shortname="mag_noise_y" param="AHRS_MAG_NOISE_Y" type="float" persistent="true"/>
<dl_setting var="ahrs_mlkf.mag_noise.z" min="0.0" step="0.02" max="1.0" module="modules/ahrs/ahrs_float_mlkf" shortname="mag_noise_z" param="AHRS_MAG_NOISE_Z" type="float" persistent="true"/>
</dl_settings>
</dl_settings>
</settings>
<dep>
<depends>ahrs_common,@imu,@mag</depends>
<provides>ahrs</provides>
</dep>
<makefile target="!sim|fbw">
<configure name="AHRS_MLKF_TYPE" default="AHRS_PRIMARY"/>
<define name="AHRS_MLKF_TYPE" value="$(AHRS_MLKF_TYPE)"/>
<configure name="USE_MAGNETOMETER" default="1"/>
<define name="USE_MAGNETOMETER" cond="ifeq (,$(findstring $(USE_MAGNETOMETER),0 FALSE))"/>
<file name="ahrs_float_mlkf.c"/>
<file name="ahrs_float_mlkf_wrapper.c"/>
<test>
<define name="AHRS_MLKF_TYPE" value="AHRS_PRIMARY"/>
</test>
</makefile>
</module>