mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-05 23:49:00 +08:00
run hff at a lower frequency (default 32Hz). define HFF_PRESCALER=<prescaler> in airframe file to change
This commit is contained in:
@@ -205,7 +205,7 @@
|
|||||||
include $(CFG_BOOZ)/subsystems/booz2_ahrs_cmpl.makefile
|
include $(CFG_BOOZ)/subsystems/booz2_ahrs_cmpl.makefile
|
||||||
|
|
||||||
#enable horizontal filter
|
#enable horizontal filter
|
||||||
ap.CFLAGS += -DUSE_HFF
|
ap.CFLAGS += -DUSE_HFF -DHFF_PRESCALER=16
|
||||||
|
|
||||||
</makefile>
|
</makefile>
|
||||||
|
|
||||||
|
|||||||
@@ -132,7 +132,6 @@ ap.srcs += $(SRC_BOOZ)/booz2_ins.c
|
|||||||
ap.srcs += math/pprz_geodetic_int.c math/pprz_geodetic_float.c
|
ap.srcs += math/pprz_geodetic_int.c math/pprz_geodetic_float.c
|
||||||
# horizontal filter float version
|
# horizontal filter float version
|
||||||
ap.srcs += $(SRC_BOOZ)/ins/booz2_hf_float.c
|
ap.srcs += $(SRC_BOOZ)/ins/booz2_hf_float.c
|
||||||
ap.CFLAGS += -DDT_HFILTER="(1./512)"
|
|
||||||
# vertical filter float version
|
# vertical filter float version
|
||||||
ap.srcs += $(SRC_BOOZ)/ins/booz2_vf_float.c
|
ap.srcs += $(SRC_BOOZ)/ins/booz2_vf_float.c
|
||||||
ap.CFLAGS += -DUSE_VFF -DDT_VFILTER="(1./512.)" -DFLOAT_T=float
|
ap.CFLAGS += -DUSE_VFF -DDT_VFILTER="(1./512.)" -DFLOAT_T=float
|
||||||
|
|||||||
@@ -68,6 +68,11 @@ struct EnuCoor_i booz_ins_enu_pos;
|
|||||||
struct EnuCoor_i booz_ins_enu_speed;
|
struct EnuCoor_i booz_ins_enu_speed;
|
||||||
struct EnuCoor_i booz_ins_enu_accel;
|
struct EnuCoor_i booz_ins_enu_accel;
|
||||||
|
|
||||||
|
#ifdef USE_HFF
|
||||||
|
/* counter for hff propagation*/
|
||||||
|
uint8_t b2_hff_ps_counter;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void booz_ins_init() {
|
void booz_ins_init() {
|
||||||
#ifdef USE_NAV_INS_INIT
|
#ifdef USE_NAV_INS_INIT
|
||||||
@@ -109,19 +114,12 @@ void booz_ins_propagate() {
|
|||||||
INT32_RMAT_TRANSP_VMULT(accel_body, booz_imu.body_to_imu_rmat, booz_imu.accel);
|
INT32_RMAT_TRANSP_VMULT(accel_body, booz_imu.body_to_imu_rmat, booz_imu.accel);
|
||||||
struct Int32Vect3 accel_ltp;
|
struct Int32Vect3 accel_ltp;
|
||||||
INT32_RMAT_TRANSP_VMULT(accel_ltp, booz_ahrs.ltp_to_body_rmat, accel_body);
|
INT32_RMAT_TRANSP_VMULT(accel_ltp, booz_ahrs.ltp_to_body_rmat, accel_body);
|
||||||
#ifdef USE_HFF
|
#ifndef USE_HFF
|
||||||
float x_accel_float = ACCEL_FLOAT_OF_BFP(accel_ltp.x);
|
|
||||||
float y_accel_float = ACCEL_FLOAT_OF_BFP(accel_ltp.y);
|
|
||||||
#else
|
|
||||||
booz_ins_ltp_accel.x = accel_ltp.x;
|
booz_ins_ltp_accel.x = accel_ltp.x;
|
||||||
booz_ins_ltp_accel.y = accel_ltp.y;
|
booz_ins_ltp_accel.y = accel_ltp.y;
|
||||||
#endif
|
#endif
|
||||||
float z_accel_float = ACCEL_FLOAT_OF_BFP(accel_ltp.z);
|
float z_accel_float = ACCEL_FLOAT_OF_BFP(accel_ltp.z);
|
||||||
#else /* BOOZ_INS_UNTILT_ACCELS */
|
#else /* BOOZ_INS_UNTILT_ACCELS */
|
||||||
#ifdef USE_HFF
|
|
||||||
float x_accel_float = ACCEL_FLOAT_OF_BFP(booz_imu.accel.x);
|
|
||||||
float y_accel_float = ACCEL_FLOAT_OF_BFP(booz_imu.accel.y);
|
|
||||||
#endif
|
|
||||||
float z_accel_float = ACCEL_FLOAT_OF_BFP(booz_imu.accel.z);
|
float z_accel_float = ACCEL_FLOAT_OF_BFP(booz_imu.accel.z);
|
||||||
#endif /* BOOZ_INS_UNTILT_ACCELS */
|
#endif /* BOOZ_INS_UNTILT_ACCELS */
|
||||||
|
|
||||||
@@ -139,14 +137,29 @@ void booz_ins_propagate() {
|
|||||||
#endif /* USE_VFF */
|
#endif /* USE_VFF */
|
||||||
|
|
||||||
#ifdef USE_HFF
|
#ifdef USE_HFF
|
||||||
if (booz_ahrs.status == BOOZ_AHRS_RUNNING && booz_gps_state.fix == BOOZ2_GPS_FIX_3D && booz_ins_ltp_initialised ) {
|
if (b2_hff_ps_counter == HFF_PRESCALER) {
|
||||||
b2_hff_propagate(x_accel_float, y_accel_float);
|
b2_hff_ps_counter = 1;
|
||||||
booz_ins_ltp_accel.x = ACCEL_BFP_OF_REAL(b2_hff_xdotdot);
|
if (booz_ahrs.status == BOOZ_AHRS_RUNNING && booz_ins_ltp_initialised ) {
|
||||||
booz_ins_ltp_accel.y = ACCEL_BFP_OF_REAL(b2_hff_ydotdot);
|
/* compute float ltp mean acceleration */
|
||||||
booz_ins_ltp_speed.x = SPEED_BFP_OF_REAL(b2_hff_xdot);
|
booz_ahrs_compute_accel_mean(HFF_PRESCALER);
|
||||||
booz_ins_ltp_speed.y = SPEED_BFP_OF_REAL(b2_hff_ydot);
|
struct Int32Vect3 mean_accel_body;
|
||||||
booz_ins_ltp_pos.x = POS_BFP_OF_REAL(b2_hff_x);
|
INT32_RMAT_TRANSP_VMULT(mean_accel_body, booz_imu.body_to_imu_rmat, booz_ahrs_accel_mean);
|
||||||
booz_ins_ltp_pos.y = POS_BFP_OF_REAL(b2_hff_y);
|
struct Int32Vect3 mean_accel_ltp;
|
||||||
|
float x_accel_mean_f = ACCEL_FLOAT_OF_BFP(mean_accel_ltp.x);
|
||||||
|
float y_accel_mean_f = ACCEL_FLOAT_OF_BFP(mean_accel_ltp.y);
|
||||||
|
INT32_RMAT_TRANSP_VMULT(mean_accel_ltp, booz_ahrs.ltp_to_body_rmat, mean_accel_body);
|
||||||
|
/* propagate horizontal filter */
|
||||||
|
b2_hff_propagate(x_accel_mean_f, y_accel_mean_f);
|
||||||
|
/* update ins state from horizontal filter */
|
||||||
|
booz_ins_ltp_accel.x = ACCEL_BFP_OF_REAL(b2_hff_xdotdot);
|
||||||
|
booz_ins_ltp_accel.y = ACCEL_BFP_OF_REAL(b2_hff_ydotdot);
|
||||||
|
booz_ins_ltp_speed.x = SPEED_BFP_OF_REAL(b2_hff_xdot);
|
||||||
|
booz_ins_ltp_speed.y = SPEED_BFP_OF_REAL(b2_hff_ydot);
|
||||||
|
booz_ins_ltp_pos.x = POS_BFP_OF_REAL(b2_hff_x);
|
||||||
|
booz_ins_ltp_pos.y = POS_BFP_OF_REAL(b2_hff_y);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
b2_hff_ps_counter++;
|
||||||
}
|
}
|
||||||
#endif /* USE_HFF */
|
#endif /* USE_HFF */
|
||||||
INT32_VECT3_ENU_OF_NED(booz_ins_enu_pos, booz_ins_ltp_pos);
|
INT32_VECT3_ENU_OF_NED(booz_ins_enu_pos, booz_ins_ltp_pos);
|
||||||
@@ -155,7 +168,6 @@ void booz_ins_propagate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void booz_ins_update_baro() {
|
void booz_ins_update_baro() {
|
||||||
|
|
||||||
#ifdef USE_VFF
|
#ifdef USE_VFF
|
||||||
if (booz2_analog_baro_status == BOOZ2_ANALOG_BARO_RUNNING) {
|
if (booz2_analog_baro_status == BOOZ2_ANALOG_BARO_RUNNING) {
|
||||||
if (!booz_ins_baro_initialised) {
|
if (!booz_ins_baro_initialised) {
|
||||||
|
|||||||
@@ -31,14 +31,21 @@ X_y = [ y ydot ybias ]
|
|||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* horizontal filter propagation frequency */
|
||||||
|
#define HFF_FREQ 512./HFF_PRESCALER
|
||||||
|
#define DT_HFILTER 1./HFF_FREQ
|
||||||
|
|
||||||
/* initial covariance diagonal */
|
/* initial covariance diagonal */
|
||||||
#define INIT_PXX 1.
|
#define INIT_PXX 1.
|
||||||
/* process noise (is the same for x and y)*/
|
/* process noise (is the same for x and y)*/
|
||||||
#define ACCEL_NOISE 0.5
|
#define ACCEL_NOISE 0.5
|
||||||
#define Q ACCEL_NOISE/512./512./2.
|
#define Q ACCEL_NOISE*DT_HFILTER*DT_HFILTER/2.
|
||||||
#define Qdotdot ACCEL_NOISE/512.
|
#define Qdotdot ACCEL_NOISE*DT_HFILTER
|
||||||
#define Qbiasbias 1e-7
|
#define Qbiasbias 1e-7*HFF_PRESCALER
|
||||||
#define R 1.
|
//TODO: proper measurement noise
|
||||||
|
#define Rpos 1.
|
||||||
|
#define Rspeed 1.
|
||||||
|
|
||||||
float b2_hff_x;
|
float b2_hff_x;
|
||||||
float b2_hff_xbias;
|
float b2_hff_xbias;
|
||||||
@@ -206,7 +213,7 @@ static inline void b2_hff_update_x(float x_meas) {
|
|||||||
b2_hff_x_meas = x_meas;
|
b2_hff_x_meas = x_meas;
|
||||||
|
|
||||||
const float y = x_meas - b2_hff_x;
|
const float y = x_meas - b2_hff_x;
|
||||||
const float S = b2_hff_xP[0][0] + R;
|
const float S = b2_hff_xP[0][0] + Rpos;
|
||||||
const float K1 = b2_hff_xP[0][0] * 1/S;
|
const float K1 = b2_hff_xP[0][0] * 1/S;
|
||||||
const float K2 = b2_hff_xP[1][0] * 1/S;
|
const float K2 = b2_hff_xP[1][0] * 1/S;
|
||||||
const float K3 = b2_hff_xP[2][0] * 1/S;
|
const float K3 = b2_hff_xP[2][0] * 1/S;
|
||||||
@@ -241,7 +248,7 @@ static inline void b2_hff_update_y(float y_meas) {
|
|||||||
b2_hff_y_meas = y_meas;
|
b2_hff_y_meas = y_meas;
|
||||||
|
|
||||||
const float y = y_meas - b2_hff_y;
|
const float y = y_meas - b2_hff_y;
|
||||||
const float S = b2_hff_yP[0][0] + R;
|
const float S = b2_hff_yP[0][0] + Rpos;
|
||||||
const float K1 = b2_hff_yP[0][0] * 1/S;
|
const float K1 = b2_hff_yP[0][0] * 1/S;
|
||||||
const float K2 = b2_hff_yP[1][0] * 1/S;
|
const float K2 = b2_hff_yP[1][0] * 1/S;
|
||||||
const float K3 = b2_hff_yP[2][0] * 1/S;
|
const float K3 = b2_hff_yP[2][0] * 1/S;
|
||||||
@@ -296,7 +303,7 @@ void b2_hff_update_v(float xspeed, float yspeed) {
|
|||||||
|
|
||||||
static inline void b2_hff_update_xdot(float v) {
|
static inline void b2_hff_update_xdot(float v) {
|
||||||
const float yd = v - b2_hff_xdot;
|
const float yd = v - b2_hff_xdot;
|
||||||
const float S = b2_hff_xP[1][1] + R;
|
const float S = b2_hff_xP[1][1] + Rspeed;
|
||||||
const float K1 = b2_hff_xP[0][1] * 1/S;
|
const float K1 = b2_hff_xP[0][1] * 1/S;
|
||||||
const float K2 = b2_hff_xP[1][1] * 1/S;
|
const float K2 = b2_hff_xP[1][1] * 1/S;
|
||||||
const float K3 = b2_hff_xP[2][1] * 1/S;
|
const float K3 = b2_hff_xP[2][1] * 1/S;
|
||||||
@@ -329,7 +336,7 @@ static inline void b2_hff_update_xdot(float v) {
|
|||||||
|
|
||||||
static inline void b2_hff_update_ydot(float v) {
|
static inline void b2_hff_update_ydot(float v) {
|
||||||
const float yd = v - b2_hff_ydot;
|
const float yd = v - b2_hff_ydot;
|
||||||
const float S = b2_hff_yP[1][1] + R;
|
const float S = b2_hff_yP[1][1] + Rspeed;
|
||||||
const float K1 = b2_hff_yP[0][1] * 1/S;
|
const float K1 = b2_hff_yP[0][1] * 1/S;
|
||||||
const float K2 = b2_hff_yP[1][1] * 1/S;
|
const float K2 = b2_hff_yP[1][1] * 1/S;
|
||||||
const float K3 = b2_hff_yP[2][1] * 1/S;
|
const float K3 = b2_hff_yP[2][1] * 1/S;
|
||||||
|
|||||||
@@ -26,6 +26,10 @@
|
|||||||
|
|
||||||
#define B2_HFF_STATE_SIZE 3
|
#define B2_HFF_STATE_SIZE 3
|
||||||
|
|
||||||
|
#ifndef HFF_PRESCALER
|
||||||
|
#define HFF_PRESCALER 16
|
||||||
|
#endif
|
||||||
|
|
||||||
#define B2_HFF_UPDATE_SPEED
|
#define B2_HFF_UPDATE_SPEED
|
||||||
#define B2_HFF_UPDATE_POS
|
#define B2_HFF_UPDATE_POS
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user