diff --git a/sw/airborne/booz_ahrs.c b/sw/airborne/booz_ahrs.c new file mode 100644 index 0000000000..2ed34ca10d --- /dev/null +++ b/sw/airborne/booz_ahrs.c @@ -0,0 +1,19 @@ +#include "booz_ahrs.h" + +uint8_t booz_ahrs_status; + +float booz_ahrs_phi; +float booz_ahrs_theta; +float booz_ahrs_psi; + +float booz_ahrs_p; +float booz_ahrs_q; +float booz_ahrs_r; + +float booz_ahrs_bp; +float booz_ahrs_bq; +float booz_ahrs_br; + +float booz_ahrs_measure_phi; +float booz_ahrs_measure_theta; +float booz_ahrs_measure_psi; diff --git a/sw/airborne/booz_nav_hover.c b/sw/airborne/booz_nav_hover.c new file mode 100644 index 0000000000..1a6f401119 --- /dev/null +++ b/sw/airborne/booz_nav_hover.c @@ -0,0 +1,157 @@ +#include "booz_nav.h" + +#include + +#include "booz_estimator.h" +#include "booz_control.h" +#include "radio_control.h" + +#ifndef DISABLE_NAV +float booz_nav_hover_x_sp; +float booz_nav_hover_y_sp; +float booz_nav_hover_z_sp; +float booz_nav_hover_psi_sp; + +float booz_nav_hover_h_max_err; +float booz_nav_hover_h_pgain; +float booz_nav_hover_h_dgain; +float booz_nav_hover_v_max_err; +float booz_nav_hover_v_pgain; +float booz_nav_hover_v_dgain; + +float booz_nav_hover_phi_command; +float booz_nav_hover_theta_command; +float booz_nav_hover_power_command; + +#define BOOZ_NAV_HOVER_H_MAX_ERR 10. +/* rad / m */ +#define BOOZ_NAV_HOVER_H_PGAIN (RadOfDeg(20.) / BOOZ_NAV_HOVER_H_MAX_ERR) +/* rad / (ms-1) */ +#define BOOZ_NAV_HOVER_H_DGAIN (RadOfDeg(5.)) + +#define BOOZ_NAV_HOVER_MAX_PHI_COMMAND RadOfDeg(30.) +#define BOOZ_NAV_HOVER_MAX_THETA_COMMAND RadOfDeg(30.) + +#define BOOZ_NAV_HOVER_V_MAX_ERR 10. +#define BOOZ_NAV_HOVER_V_PGAIN 0.12 +#define BOOZ_NAV_HOVER_V_DGAIN 0.15 +#define BOOZ_NAV_HOVER_V_HOVER_POWER 0.65 + +static void booz_nav_hover_vertical_loop_run(void); +static void booz_nav_hover_horizontal_loop_run(void); +#endif + + +void booz_nav_hover_init(void) { +#ifndef DISABLE_NAV + + booz_nav_hover_x_sp = 0.; + booz_nav_hover_y_sp = 0.; + booz_nav_hover_z_sp = 0.; + booz_nav_hover_psi_sp = 0.; + + booz_nav_hover_h_max_err = BOOZ_NAV_HOVER_H_MAX_ERR; + booz_nav_hover_h_pgain = BOOZ_NAV_HOVER_H_PGAIN; + booz_nav_hover_h_dgain = BOOZ_NAV_HOVER_H_DGAIN; + booz_nav_hover_v_max_err = BOOZ_NAV_HOVER_V_MAX_ERR; + booz_nav_hover_v_pgain = BOOZ_NAV_HOVER_V_PGAIN; + booz_nav_hover_v_dgain = BOOZ_NAV_HOVER_V_DGAIN; + + booz_nav_hover_phi_command = 0.; + booz_nav_hover_theta_command = 0.; + booz_nav_hover_power_command = 0.; + +#endif +} + +void booz_nav_hover_run(void) { +#ifndef DISABLE_NAV + booz_nav_hover_vertical_loop_run(); + booz_nav_hover_horizontal_loop_run(); +#endif +} + +#define STICK_ABSOLUTE_POS 0 +#define STICK_ABSOLUTE_SPEED 1 +#define STICK_RELATIVE_SPEED 2 +#define STICK_MODE STICK_RELATIVE_SPEED +#define DT_READ_SETPOINTS 0.004 +void booz_nav_hover_read_setpoints_from_rc(void) { +#ifndef DISABLE_NAV + booz_nav_hover_z_sp = -1. - 10. / MAX_PPRZ * (float)rc_values[RADIO_THROTTLE]; + booz_nav_hover_psi_sp = -RadOfDeg(30.) / MAX_PPRZ * (float)rc_values[RADIO_YAW]; +#if defined STICK_MODE && STICK_MODE == STICK_ABSOLUTE_POS + booz_nav_horizontal_x_sp = -20. / MAX_PPRZ * (float)rc_values[RADIO_PITCH]; /* +/- 20m */ + booz_nav_horizontal_y_sp = -20. / MAX_PPRZ * (float)rc_values[RADIO_ROLL]; /* warning RC roll negativ to the right !! +/- 20m */ + booz_nav_horizontal_u_sp = 0.; + booz_nav_horizontal_v_sp = 0.; +#elif defined STICK_MODE && STICK_MODE == STICK_ABSOLUTE_SPEED + booz_nav_horizontal_x_sp += -5. * DT_READ_SETPOINTS / MAX_PPRZ * (float)rc_values[RADIO_PITCH]; /* +/-5 m/s */ + booz_nav_horizontal_y_sp += 5. * DT_READ_SETPOINTS / MAX_PPRZ * (float)rc_values[RADIO_ROLL]; /* +/-5 m/s */ + booz_nav_horizontal_u_sp = 0.; + booz_nav_horizontal_v_sp = 0.; +#elif defined STICK_MODE && STICK_MODE == STICK_RELATIVE_SPEED + float booz_nav_hover_dx_bod = -5. / MAX_PPRZ * (float)rc_values[RADIO_PITCH]; + float booz_nav_hover_dy_bod = -5. / MAX_PPRZ * (float)rc_values[RADIO_ROLL]; /* warning RC roll negativ to the right !! +/- 5m/s */ + /* convert vector to earth frame ( use transpose of DCM ) */ + float booz_nav_hover_dx_earth = booz_nav_hover_dx_bod * booz_estimator_dcm[AXIS_X][AXIS_X] + + booz_nav_hover_dy_bod * booz_estimator_dcm[AXIS_Y][AXIS_X]; + float booz_nav_hover_dy_earth = booz_nav_hover_dx_bod * booz_estimator_dcm[AXIS_X][AXIS_Y] + + booz_nav_hover_dx_bod * booz_estimator_dcm[AXIS_Y][AXIS_Y]; + booz_nav_hover_x_sp += (booz_nav_hover_dx_earth * DT_READ_SETPOINTS); + booz_nav_hover_y_sp += (booz_nav_hover_dy_earth * DT_READ_SETPOINTS); +#endif /* STICK_MODE */ +#endif /* DISABLE_NAV */ +} + + + +#ifndef DISABLE_NAV + +/* fisrt a vertical loop */ +static void booz_nav_hover_vertical_loop_run(void) { + float vertical_err = booz_estimator_z - booz_nav_hover_z_sp; + Bound(vertical_err, -booz_nav_hover_v_max_err, booz_nav_hover_v_max_err); + float bank_coef = 1. / fabs(cos(booz_estimator_phi)*cos(booz_estimator_theta)); + float adjusted_hover_power = BOOZ_NAV_HOVER_V_HOVER_POWER * bank_coef; + // printf("hover power command %f %f\n", bank_coef, adjusted_hover_power); + booz_nav_hover_power_command = adjusted_hover_power + + /* BOOZ_NAV_HOVER_V_HOVER_POWER + */ + booz_nav_hover_v_pgain * vertical_err + + booz_nav_hover_v_dgain * booz_estimator_vz; + + Bound(booz_nav_hover_power_command, 0., 1.); +} + +/* now a horizontal hovering loop */ +static void booz_nav_hover_horizontal_loop_run(void) { + + /* get a position error vector */ + float x_error = booz_estimator_x - booz_nav_hover_x_sp; + float y_error = booz_estimator_y - booz_nav_hover_y_sp; + // printf("earth pos error %f %f\n", x_error, y_error); + /* get norm and unit position error vector */ + float norm_error = sqrt(x_error*x_error+ y_error*y_error); + float unit_x_error = x_error / norm_error; + float unit_y_error = y_error / norm_error; + // printf("earth pos error %f %f %f\n", unit_x_error, unit_y_error, norm_error); + /* bound the error in amplitude */ + Bound(norm_error, 0., booz_nav_hover_h_max_err); + /* convert unit error vector to body frame */ + float x_unit_err_body = unit_x_error * booz_estimator_dcm[AXIS_X][AXIS_X] + + unit_y_error * booz_estimator_dcm[AXIS_X][AXIS_Y]; + float y_unit_err_body = unit_x_error * booz_estimator_dcm[AXIS_Y][AXIS_X] + + unit_y_error * booz_estimator_dcm[AXIS_Y][AXIS_Y]; + // printf("body pos error %f %f\n", x_unit_err_body, y_unit_err_body); + /* */ + + booz_nav_hover_phi_command = - booz_nav_hover_h_pgain * y_unit_err_body * norm_error + + - booz_nav_hover_h_dgain * booz_estimator_v; + booz_nav_hover_theta_command = booz_nav_hover_h_pgain * x_unit_err_body * norm_error + + booz_nav_hover_h_dgain * booz_estimator_u; + + Bound(booz_nav_hover_phi_command, -BOOZ_NAV_HOVER_MAX_PHI_COMMAND, BOOZ_NAV_HOVER_MAX_PHI_COMMAND); + Bound(booz_nav_hover_theta_command, -BOOZ_NAV_HOVER_MAX_THETA_COMMAND, BOOZ_NAV_HOVER_MAX_THETA_COMMAND); + +} +#endif diff --git a/sw/airborne/booz_nav_hover.h b/sw/airborne/booz_nav_hover.h new file mode 100644 index 0000000000..83fefae5e6 --- /dev/null +++ b/sw/airborne/booz_nav_hover.h @@ -0,0 +1,28 @@ +#ifndef BOOZ_NAV_HOVER_H +#define BOOZ_NAV_HOVER_H + + +#ifndef DISABLE_NAV +extern float booz_nav_hover_x_sp; +extern float booz_nav_hover_y_sp; +extern float booz_nav_hover_z_sp; +extern float booz_nav_hover_psi_sp; + +extern float booz_nav_hover_h_max_err; +extern float booz_nav_hover_h_pgain; +extern float booz_nav_hover_h_dgain; +extern float booz_nav_hover_v_max_err; +extern float booz_nav_hover_v_pgain; +extern float booz_nav_hover_v_dgain; + +extern float booz_nav_hover_phi_command; +extern float booz_nav_hover_theta_command; +extern float booz_nav_hover_power_command; +#endif + +extern void booz_nav_hover_init(void); +extern void booz_nav_hover_run(void); +extern void booz_nav_hover_read_setpoints_from_rc(void); + + +#endif /* BOOZ_NAV_HOVER_H */ diff --git a/sw/airborne/sim/micromag_hw.c b/sw/airborne/sim/micromag_hw.c new file mode 100644 index 0000000000..c0ac397185 --- /dev/null +++ b/sw/airborne/sim/micromag_hw.c @@ -0,0 +1,12 @@ +#include "micromag.h" + +#include "../../simulator/booz_sensors_model.h" + +void micromag_hw_init( void ) {} + + +void micromag_read( void ) { + micromag_values[0] = bsm.mag->ve[AXIS_X]; + micromag_values[1] = bsm.mag->ve[AXIS_Y]; + micromag_values[2] = bsm.mag->ve[AXIS_Z]; +} diff --git a/sw/airborne/sim/micromag_hw.h b/sw/airborne/sim/micromag_hw.h new file mode 100644 index 0000000000..2a278e9612 --- /dev/null +++ b/sw/airborne/sim/micromag_hw.h @@ -0,0 +1,8 @@ +#ifndef MICROMAG_HW_H +#define MICROMAG_HW_H + + + + + +#endif /* MICROMAG_HW_H */