Paparazzi UAS
v5.12_stable-4-g9b43e9b
Paparazzi is a free software Unmanned Aircraft System.
|
Quaternion complementary filter (fixed-point). More...
#include "subsystems/ahrs.h"
#include "subsystems/gps.h"
#include "std.h"
#include "math/pprz_algebra_int.h"
#include "math/pprz_orientation_conversion.h"
Go to the source code of this file.
Data Structures | |
struct | AhrsIntCmplQuat |
Ahrs implementation specifc values. More... | |
Enumerations | |
enum | AhrsICQStatus { AHRS_ICQ_UNINIT, AHRS_ICQ_RUNNING } |
Functions | |
void | ahrs_icq_init (void) |
void | ahrs_icq_set_body_to_imu (struct OrientationReps *body_to_imu) |
void | ahrs_icq_set_body_to_imu_quat (struct FloatQuat *q_b2i) |
bool | ahrs_icq_align (struct Int32Rates *lp_gyro, struct Int32Vect3 *lp_accel, struct Int32Vect3 *lp_mag) |
void | ahrs_icq_propagate (struct Int32Rates *gyro, float dt) |
void | ahrs_icq_update_accel (struct Int32Vect3 *accel, float dt) |
void | ahrs_icq_update_mag (struct Int32Vect3 *mag, float dt) |
void | ahrs_icq_update_gps (struct GpsState *gps_s) |
void | ahrs_icq_update_heading (int32_t heading) |
Update yaw based on a heading measurement. More... | |
void | ahrs_icq_realign_heading (int32_t heading) |
Hard reset yaw to a heading. More... | |
void | ahrs_icq_set_accel_gains (void) |
update pre-computed inv_kp and inv_ki gains from acc_omega and acc_zeta More... | |
static void | ahrs_int_cmpl_quat_SetAccelOmega (float omega) |
static void | ahrs_int_cmpl_quat_SetAccelZeta (float zeta) |
void | ahrs_icq_set_mag_gains (void) |
update pre-computed kp and ki gains from mag_omega and mag_zeta More... | |
static void | ahrs_int_cmpl_quat_SetMagOmega (float omega) |
static void | ahrs_int_cmpl_quat_SetMagZeta (float zeta) |
Variables | |
struct AhrsIntCmplQuat | ahrs_icq |
Default Rate filter Low pass. More... | |
Quaternion complementary filter (fixed-point).
Estimate the attitude, heading and gyro bias.
Definition in file ahrs_int_cmpl_quat.h.
struct AhrsIntCmplQuat |
Ahrs implementation specifc values.
Definition at line 48 of file ahrs_int_cmpl_quat.h.
Data Fields | ||
---|---|---|
uint16_t | accel_cnt | number of propagations since last accel update |
float | accel_inv_ki | |
float | accel_inv_kp | |
float | accel_omega |
filter cut-off frequency for correcting the attitude from accels. (pseudo-gravity measurement) only update through ahrs_int_cmpl_quat_SetAccelOmega |
float | accel_zeta |
filter damping for correcting the gyro-bias from accels. (pseudo-gravity measurement) only update through ahrs_int_cmpl_quat_SetAccelZeta |
struct OrientationReps | body_to_imu | |
bool | correct_gravity | enable gravity vector correction by removing centrifugal acceleration |
uint8_t | gravity_heuristic_factor |
sets how strongly the gravity heuristic reduces accel correction. Set to zero in order to disable gravity heuristic. |
struct Int32Rates | gyro_bias | |
bool | heading_aligned | |
struct Int64Rates | high_rez_bias | |
struct Int64Quat | high_rez_quat | |
struct Int32Rates | imu_rate | |
bool | is_aligned | |
struct Int32Quat | ltp_to_imu_quat | |
int32_t | ltp_vel_norm | |
bool | ltp_vel_norm_valid | |
uint16_t | mag_cnt | number of propagations since last mag update |
struct Int32Vect3 | mag_h | |
float | mag_ki | |
float | mag_kp | |
float | mag_omega |
filter cut-off frequency for correcting the attitude (heading) from magnetometer. only update through ahrs_int_cmpl_quat_SetMagOmega |
float | mag_zeta |
filter damping for correcting the gyro bias from magnetometer. only update through ahrs_int_cmpl_quat_SetMagZeta |
struct Int32Rates | rate_correction | |
enum AhrsICQStatus | status | status of the AHRS, AHRS_ICQ_UNINIT or AHRS_ICQ_RUNNING |
float | weight |
enum AhrsICQStatus |
Enumerator | |
---|---|
AHRS_ICQ_UNINIT | |
AHRS_ICQ_RUNNING |
Definition at line 40 of file ahrs_int_cmpl_quat.h.
bool ahrs_icq_align | ( | struct Int32Rates * | lp_gyro, |
struct Int32Vect3 * | lp_accel, | ||
struct Int32Vect3 * | lp_mag | ||
) |
Definition at line 158 of file ahrs_int_cmpl_quat.c.
References ahrs_icq, AHRS_ICQ_RUNNING, ahrs_int_get_quat_from_accel(), ahrs_int_get_quat_from_accel_mag(), AhrsIntCmplQuat::gyro_bias, AhrsIntCmplQuat::heading_aligned, AhrsIntCmplQuat::high_rez_bias, INT_RATES_LSHIFT, AhrsIntCmplQuat::is_aligned, AhrsIntCmplQuat::ltp_to_imu_quat, RATES_COPY, and AhrsIntCmplQuat::status.
Referenced by aligner_cb().
void ahrs_icq_init | ( | void | ) |
Definition at line 115 of file ahrs_int_cmpl_quat.c.
References AhrsIntCmplQuat::accel_cnt, AhrsIntCmplQuat::accel_omega, AhrsIntCmplQuat::accel_zeta, AHRS_ACCEL_OMEGA, AHRS_ACCEL_ZETA, AHRS_GRAVITY_HEURISTIC_FACTOR, ahrs_icq, ahrs_icq_set_accel_gains(), ahrs_icq_set_mag_gains(), AHRS_ICQ_UNINIT, AHRS_MAG_OMEGA, AHRS_MAG_ZETA, AhrsIntCmplQuat::correct_gravity, AhrsIntCmplQuat::gravity_heuristic_factor, AhrsIntCmplQuat::gyro_bias, AhrsIntCmplQuat::heading_aligned, AhrsIntCmplQuat::high_rez_bias, AhrsIntCmplQuat::imu_rate, int32_quat_identity(), INT_RATES_ZERO, AhrsIntCmplQuat::is_aligned, AhrsIntCmplQuat::ltp_to_imu_quat, AhrsIntCmplQuat::ltp_vel_norm_valid, MAG_BFP_OF_REAL, AhrsIntCmplQuat::mag_cnt, AhrsIntCmplQuat::mag_h, AhrsIntCmplQuat::mag_omega, AhrsIntCmplQuat::mag_zeta, AhrsIntCmplQuat::rate_correction, AhrsIntCmplQuat::status, and VECT3_ASSIGN.
Referenced by ahrs_icq_register().
void ahrs_icq_propagate | ( | struct Int32Rates * | gyro, |
float | dt | ||
) |
Definition at line 187 of file ahrs_int_cmpl_quat.c.
References AhrsIntCmplQuat::accel_cnt, ahrs_icq, AhrsIntCmplQuat::gyro_bias, AhrsIntCmplQuat::high_rez_quat, AhrsIntCmplQuat::imu_rate, int32_quat_integrate_fi(), int32_quat_normalize(), INT_RATES_ZERO, AhrsIntCmplQuat::ltp_to_imu_quat, AhrsIntCmplQuat::mag_cnt, AhrsIntCmplQuat::rate_correction, RATES_ADD, RATES_COPY, RATES_DIFF, RATES_SDIV, and RATES_SMUL.
Referenced by gyro_cb().
void ahrs_icq_realign_heading | ( | int32_t | heading | ) |
Hard reset yaw to a heading.
Doesn't affect the bias. Sets ahrs_icq.heading_aligned to TRUE.
heading | Heading in body frame, radians (CW/north) with INT32_ANGLE_FRAC |
Definition at line 627 of file ahrs_int_cmpl_quat.c.
References ahrs_icq, AhrsIntCmplQuat::body_to_imu, AhrsIntCmplQuat::heading_aligned, int32_quat_comp(), int32_quat_comp_inv(), int32_quat_comp_norm_shortest(), int32_quat_inv_comp_norm_shortest(), int32_quat_normalize(), AhrsIntCmplQuat::ltp_to_imu_quat, orientationGetQuat_i(), PPRZ_ITRIG_COS, PPRZ_ITRIG_SIN, Int32Quat::qi, QUAT_COPY, Int32Quat::qx, Int32Quat::qy, and Int32Quat::qz.
Referenced by ahrs_icq_update_gps().
void ahrs_icq_set_accel_gains | ( | void | ) |
update pre-computed inv_kp and inv_ki gains from acc_omega and acc_zeta
Definition at line 220 of file ahrs_int_cmpl_quat.c.
References AhrsIntCmplQuat::accel_inv_ki, AhrsIntCmplQuat::accel_inv_kp, AhrsIntCmplQuat::accel_omega, AhrsIntCmplQuat::accel_zeta, and ahrs_icq.
Referenced by ahrs_icq_init(), ahrs_int_cmpl_quat_SetAccelOmega(), and ahrs_int_cmpl_quat_SetAccelZeta().
void ahrs_icq_set_body_to_imu | ( | struct OrientationReps * | body_to_imu | ) |
Definition at line 662 of file ahrs_int_cmpl_quat.c.
References ahrs_icq_set_body_to_imu_quat(), and orientationGetQuat_f().
void ahrs_icq_set_body_to_imu_quat | ( | struct FloatQuat * | q_b2i | ) |
Definition at line 667 of file ahrs_int_cmpl_quat.c.
References ahrs_icq, AhrsIntCmplQuat::body_to_imu, AhrsIntCmplQuat::is_aligned, AhrsIntCmplQuat::ltp_to_imu_quat, orientationGetQuat_i(), and orientationSetQuat_f().
Referenced by ahrs_icq_set_body_to_imu(), and body_to_imu_cb().
void ahrs_icq_set_mag_gains | ( | void | ) |
update pre-computed kp and ki gains from mag_omega and mag_zeta
Definition at line 401 of file ahrs_int_cmpl_quat.c.
References ahrs_icq, AhrsIntCmplQuat::mag_ki, AhrsIntCmplQuat::mag_kp, AhrsIntCmplQuat::mag_omega, and AhrsIntCmplQuat::mag_zeta.
Referenced by ahrs_icq_init(), ahrs_int_cmpl_quat_SetMagOmega(), and ahrs_int_cmpl_quat_SetMagZeta().
void ahrs_icq_update_accel | ( | struct Int32Vect3 * | accel, |
float | dt | ||
) |
Definition at line 241 of file ahrs_int_cmpl_quat.c.
References ACC_FROM_CROSS_FRAC, AhrsIntCmplQuat::accel_cnt, AhrsIntCmplQuat::accel_inv_ki, AhrsIntCmplQuat::accel_inv_kp, ACCELS_FLOAT_OF_BFP, ahrs_icq, AhrsIntCmplQuat::body_to_imu, COMPUTATION_FRAC, AhrsIntCmplQuat::correct_gravity, FIR_FILTER_SIZE, FLOAT_VECT3_NORM, AhrsIntCmplQuat::gravity_heuristic_factor, AhrsIntCmplQuat::gyro_bias, AhrsIntCmplQuat::high_rez_bias, AhrsIntCmplQuat::imu_rate, int32_rmat_of_quat(), int32_rmat_transp_ratemult(), int32_rmat_vmult(), INT32_VECT3_RSHIFT, INT_RATES_RSHIFT, AhrsIntCmplQuat::ltp_to_imu_quat, AhrsIntCmplQuat::ltp_vel_norm, AhrsIntCmplQuat::ltp_vel_norm_valid, orientationGetRMat_i(), Int32Rates::p, Int64Rates::p, Int32Rates::q, Int64Rates::q, Int32Rates::r, Int64Rates::r, AhrsIntCmplQuat::rate_correction, RMAT_ELMT, VECT3_ADD, VECT3_COPY, VECT3_CROSS_PRODUCT, VECT3_DIFF, VECT3_RATES_CROSS_VECT3, VECT3_SDIV, VECT3_SMUL, AhrsIntCmplQuat::weight, Int32Vect3::x, Int32Vect3::y, and Int32Vect3::z.
Referenced by accel_cb().
void ahrs_icq_update_gps | ( | struct GpsState * | gps_s | ) |
Definition at line 529 of file ahrs_int_cmpl_quat.c.
References AHRS_HEADING_UPDATE_GPS_MIN_SPEED, ahrs_icq, ahrs_icq_realign_heading(), ahrs_icq_update_heading(), course, GPS_FIX_3D, AhrsIntCmplQuat::heading_aligned, INT32_ANGLE_FRAC, AhrsIntCmplQuat::ltp_vel_norm, AhrsIntCmplQuat::ltp_vel_norm_valid, and SPEED_BFP_OF_REAL.
Referenced by gps_cb().
void ahrs_icq_update_heading | ( | int32_t | heading | ) |
Update yaw based on a heading measurement.
e.g. from GPS course
heading | Heading in body frame, radians (CW/north) with INT32_ANGLE_FRAC |
Definition at line 565 of file ahrs_int_cmpl_quat.c.
References AHRS_BIAS_UPDATE_HEADING_THRESHOLD, ahrs_icq, AhrsIntCmplQuat::body_to_imu, AhrsIntCmplQuat::gyro_bias, AhrsIntCmplQuat::high_rez_bias, INT32_ANGLE_FRAC, INT32_ANGLE_NORMALIZE, int32_quat_comp_inv(), int32_rmat_of_quat(), int32_rmat_vmult(), INT_RATES_RSHIFT, AhrsIntCmplQuat::ltp_to_imu_quat, orientationGetQuat_i(), Int32Rates::p, Int64Rates::p, PPRZ_ITRIG_COS, PPRZ_ITRIG_SIN, Int32Rates::q, Int64Rates::q, Int32Rates::r, Int64Rates::r, AhrsIntCmplQuat::rate_correction, RMAT_ELMT, TRIG_BFP_OF_REAL, Int32Vect2::x, Int32Vect3::x, Int32Vect2::y, Int32Vect3::y, and Int32Vect3::z.
Referenced by ahrs_icq_update_gps().
void ahrs_icq_update_mag | ( | struct Int32Vect3 * | mag, |
float | dt | ||
) |
Definition at line 384 of file ahrs_int_cmpl_quat.c.
References ahrs_icq, ahrs_icq_update_mag_2d(), ahrs_icq_update_mag_full(), and AhrsIntCmplQuat::mag_cnt.
Referenced by mag_cb().
|
inlinestatic |
Definition at line 136 of file ahrs_int_cmpl_quat.h.
References AhrsIntCmplQuat::accel_omega, ahrs_icq, and ahrs_icq_set_accel_gains().
|
inlinestatic |
Definition at line 142 of file ahrs_int_cmpl_quat.h.
References AhrsIntCmplQuat::accel_zeta, ahrs_icq, and ahrs_icq_set_accel_gains().
|
inlinestatic |
Definition at line 151 of file ahrs_int_cmpl_quat.h.
References ahrs_icq, ahrs_icq_set_mag_gains(), and AhrsIntCmplQuat::mag_omega.
|
inlinestatic |
Definition at line 157 of file ahrs_int_cmpl_quat.h.
References ahrs_icq, ahrs_icq_set_mag_gains(), and AhrsIntCmplQuat::mag_zeta.
struct AhrsIntCmplQuat ahrs_icq |
Default Rate filter Low pass.
Definition at line 110 of file ahrs_int_cmpl_quat.c.
Referenced by accel_cb(), ahrs_icq_align(), ahrs_icq_init(), ahrs_icq_propagate(), ahrs_icq_realign_heading(), ahrs_icq_set_accel_gains(), ahrs_icq_set_body_to_imu_quat(), ahrs_icq_set_mag_gains(), ahrs_icq_update_accel(), ahrs_icq_update_gps(), ahrs_icq_update_heading(), ahrs_icq_update_mag(), ahrs_icq_update_mag_2d(), ahrs_icq_update_mag_full(), ahrs_int_cmpl_quat_SetAccelOmega(), ahrs_int_cmpl_quat_SetAccelZeta(), ahrs_int_cmpl_quat_SetMagOmega(), ahrs_int_cmpl_quat_SetMagZeta(), aligner_cb(), geo_mag_cb(), gyro_cb(), mag_cb(), send_bias(), send_euler(), send_filter_status(), send_geo_mag(), send_quat(), and set_body_state_from_quat().