diff --git a/conf/settings/nps.xml b/conf/settings/nps.xml index fd58df0a73..fbd42226ea 100644 --- a/conf/settings/nps.xml +++ b/conf/settings/nps.xml @@ -7,6 +7,8 @@ + + diff --git a/sw/simulator/nps/nps_autopilot.h b/sw/simulator/nps/nps_autopilot.h index ce18596952..c25b66b2ae 100644 --- a/sw/simulator/nps/nps_autopilot.h +++ b/sw/simulator/nps/nps_autopilot.h @@ -27,6 +27,7 @@ struct NpsAutopilot { double commands[NPS_COMMANDS_NB]; bool_t launch; + bool_t datalink_enabled; }; extern struct NpsAutopilot autopilot; diff --git a/sw/simulator/nps/nps_autopilot_fixedwing.c b/sw/simulator/nps/nps_autopilot_fixedwing.c index 0e1bc09855..9271269d0d 100644 --- a/sw/simulator/nps/nps_autopilot_fixedwing.c +++ b/sw/simulator/nps/nps_autopilot_fixedwing.c @@ -52,6 +52,9 @@ // for launch #include "firmwares/fixedwing/autopilot.h" +// for datalink_time hack +#include "subsystems/datalink/datalink.h" + struct NpsAutopilot autopilot; bool_t nps_bypass_ahrs; bool_t nps_bypass_ins; @@ -72,6 +75,7 @@ bool_t nps_bypass_ins; void nps_autopilot_init(enum NpsRadioControlType type_rc, int num_rc_script, char* rc_dev) { autopilot.launch = FALSE; + autopilot.datalink_enabled = TRUE; nps_radio_control_init(type_rc, num_rc_script, rc_dev); nps_electrical_init(); @@ -169,6 +173,10 @@ PRINT_CONFIG_VAR(COMMAND_YAW) if (!launch) autopilot.commands[COMMAND_THROTTLE] = 0; + // hack to reset datalink_time, since we don't use actual dl_parse_msg + if (autopilot.datalink_enabled) { + datalink_time = 0; + } } void sim_overwrite_ahrs(void) { diff --git a/sw/simulator/nps/nps_autopilot_rotorcraft.c b/sw/simulator/nps/nps_autopilot_rotorcraft.c index d93dd90b88..6eb5a71f00 100644 --- a/sw/simulator/nps/nps_autopilot_rotorcraft.c +++ b/sw/simulator/nps/nps_autopilot_rotorcraft.c @@ -42,6 +42,9 @@ #include "messages.h" #include "subsystems/datalink/downlink.h" +// for datalink_time hack +#include "subsystems/datalink/datalink.h" + struct NpsAutopilot autopilot; bool_t nps_bypass_ahrs; bool_t nps_bypass_ins; @@ -60,6 +63,7 @@ bool_t nps_bypass_ins; void nps_autopilot_init(enum NpsRadioControlType type_rc, int num_rc_script, char* rc_dev) { autopilot.launch = TRUE; + autopilot.datalink_enabled = TRUE; nps_radio_control_init(type_rc, num_rc_script, rc_dev); nps_electrical_init(); @@ -134,6 +138,10 @@ void nps_autopilot_run_step(double time) { for (uint8_t i=0; i < NPS_COMMANDS_NB; i++) autopilot.commands[i] = (double)motor_mixing.commands[i]/MAX_PPRZ; + // hack to reset datalink_time, since we don't use actual dl_parse_msg + if (autopilot.datalink_enabled) { + datalink_time = 0; + } } diff --git a/sw/simulator/nps/nps_ivy_common.c b/sw/simulator/nps/nps_ivy_common.c index 5ef6f19d7b..9c5fdf76a4 100644 --- a/sw/simulator/nps/nps_ivy_common.c +++ b/sw/simulator/nps/nps_ivy_common.c @@ -87,6 +87,13 @@ static void on_DL_SETTING(IvyClientPtr app __attribute__ ((unused)), if (atoi(argv[1]) != AC_ID) return; + /* HACK: + * we actually don't want to allow changing settings if datalink is disabled, + * but since we currently change this variable via settings we have to allow it + */ + //if (!autopilot.datalink_enabled) + // return; + uint8_t index = atoi(argv[2]); float value = atof(argv[3]); DlSetting(index, value); @@ -99,6 +106,8 @@ static void on_DL_GET_SETTING(IvyClientPtr app __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { if (atoi(argv[1]) != AC_ID) return; + if (!autopilot.datalink_enabled) + return; uint8_t index = atoi(argv[2]); float value = settings_get_value(index); @@ -109,6 +118,9 @@ static void on_DL_GET_SETTING(IvyClientPtr app __attribute__ ((unused)), static void on_DL_PING(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { + if (!autopilot.datalink_enabled) + return; + DOWNLINK_SEND_PONG(DefaultChannel, DefaultDevice); } @@ -117,6 +129,8 @@ static void on_DL_BLOCK(IvyClientPtr app __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]){ if (atoi(argv[2]) != AC_ID) return; + if (!autopilot.datalink_enabled) + return; int block = atoi(argv[1]); nav_goto_block(block); @@ -127,6 +141,9 @@ static void on_DL_BLOCK(IvyClientPtr app __attribute__ ((unused)), static void on_DL_RC_3CH(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]){ + if (!autopilot.datalink_enabled) + return; + uint8_t throttle_mode = atoi(argv[2]); int8_t roll = atoi(argv[3]); int8_t pitch = atoi(argv[4]); @@ -139,6 +156,8 @@ static void on_DL_RC_4CH(IvyClientPtr app __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]){ if (atoi(argv[1]) != AC_ID) return; + if (!autopilot.datalink_enabled) + return; uint8_t mode = atoi(argv[2]); uint8_t throttle = atoi(argv[3]); diff --git a/sw/simulator/nps/nps_ivy_fixedwing.c b/sw/simulator/nps/nps_ivy_fixedwing.c index f94e099a05..cbd617bc07 100644 --- a/sw/simulator/nps/nps_ivy_fixedwing.c +++ b/sw/simulator/nps/nps_ivy_fixedwing.c @@ -8,6 +8,7 @@ #include "math/pprz_algebra_double.h" #include "subsystems/ins.h" #include "subsystems/navigation/common_nav.h" +#include "nps_autopilot.h" /* fixedwing specific Datalink Ivy functions */ void on_DL_MOVE_WP(IvyClientPtr app __attribute__ ((unused)), @@ -33,6 +34,8 @@ void nps_ivy_init(char* ivy_bus) { void on_DL_MOVE_WP(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; if (atoi(argv[2]) == AC_ID) { uint8_t wp_id = atoi(argv[1]); diff --git a/sw/simulator/nps/nps_ivy_mission_commands.c b/sw/simulator/nps/nps_ivy_mission_commands.c index 1e6e64416d..968202fbb6 100644 --- a/sw/simulator/nps/nps_ivy_mission_commands.c +++ b/sw/simulator/nps/nps_ivy_mission_commands.c @@ -93,6 +93,9 @@ void nps_ivy_mission_commands_init(void) { static void on_DL_MISSION_GOTO_WP(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; + uint8_t i = 0; float dummy; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id @@ -109,6 +112,9 @@ static void on_DL_MISSION_GOTO_WP(IvyClientPtr app __attribute__ ((unused)), static void on_DL_MISSION_GOTO_WP_LLA(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; + uint8_t i = 0; float dummy; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id @@ -125,6 +131,9 @@ static void on_DL_MISSION_GOTO_WP_LLA(IvyClientPtr app __attribute__ ((unused)), static void on_DL_MISSION_CIRCLE(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; + uint8_t i = 0; float dummy; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id @@ -141,6 +150,9 @@ static void on_DL_MISSION_CIRCLE(IvyClientPtr app __attribute__ ((unused)), static void on_DL_MISSION_CIRCLE_LLA(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; + uint8_t i = 0; float dummy; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id @@ -157,6 +169,9 @@ static void on_DL_MISSION_CIRCLE_LLA(IvyClientPtr app __attribute__ ((unused)), static void on_DL_MISSION_SEGMENT(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; + uint8_t i = 0; float dummy; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id @@ -173,6 +188,9 @@ static void on_DL_MISSION_SEGMENT(IvyClientPtr app __attribute__ ((unused)), static void on_DL_MISSION_SEGMENT_LLA(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; + uint8_t i = 0; float dummy; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id @@ -189,6 +207,9 @@ static void on_DL_MISSION_SEGMENT_LLA(IvyClientPtr app __attribute__ ((unused)), static void on_DL_MISSION_PATH(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; + uint8_t i = 0; float dummy; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id @@ -206,6 +227,9 @@ static void on_DL_MISSION_PATH(IvyClientPtr app __attribute__ ((unused)), static void on_DL_MISSION_PATH_LLA(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; + uint8_t i = 0; float dummy; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id @@ -223,6 +247,8 @@ static void on_DL_MISSION_PATH_LLA(IvyClientPtr app __attribute__ ((unused)), static void on_DL_GOTO_MISSION(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id dl_buffer[3] = (uint8_t)(atoi(argv[2])); //mission_id @@ -233,6 +259,8 @@ static void on_DL_GOTO_MISSION(IvyClientPtr app __attribute__ ((unused)), static void on_DL_NEXT_MISSION(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id @@ -242,6 +270,8 @@ static void on_DL_NEXT_MISSION(IvyClientPtr app __attribute__ ((unused)), static void on_DL_END_MISSION(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; dl_buffer[2] = (uint8_t)(atoi(argv[1])); //ac_id diff --git a/sw/simulator/nps/nps_ivy_rotorcraft.c b/sw/simulator/nps/nps_ivy_rotorcraft.c index 9ab8dfc3b0..c3b7935309 100644 --- a/sw/simulator/nps/nps_ivy_rotorcraft.c +++ b/sw/simulator/nps/nps_ivy_rotorcraft.c @@ -41,6 +41,9 @@ void nps_ivy_init(char* ivy_bus) { static void on_DL_MOVE_WP(IvyClientPtr app __attribute__ ((unused)), void *user_data __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[]) { + if (!autopilot.datalink_enabled) + return; + if (atoi(argv[2]) == AC_ID) { uint8_t wp_id = atoi(argv[1]); diff --git a/sw/simulator/nps/nps_sensor_accel.c b/sw/simulator/nps/nps_sensor_accel.c index 7a4a2256d5..d75427962d 100644 --- a/sw/simulator/nps/nps_sensor_accel.c +++ b/sw/simulator/nps/nps_sensor_accel.c @@ -7,27 +7,28 @@ #include NPS_SENSORS_PARAMS #include "math/pprz_algebra_int.h" -void nps_sensor_accel_init(struct NpsSensorAccel* accel, double time) +void nps_sensor_accel_init(struct NpsSensorAccel *accel, double time) { FLOAT_VECT3_ZERO(accel->value); accel->min = NPS_ACCEL_MIN; accel->max = NPS_ACCEL_MAX; FLOAT_MAT33_DIAG(accel->sensitivity, - NPS_ACCEL_SENSITIVITY_XX, NPS_ACCEL_SENSITIVITY_YY, NPS_ACCEL_SENSITIVITY_ZZ); + NPS_ACCEL_SENSITIVITY_XX, NPS_ACCEL_SENSITIVITY_YY, NPS_ACCEL_SENSITIVITY_ZZ); VECT3_ASSIGN(accel->neutral, - NPS_ACCEL_NEUTRAL_X, NPS_ACCEL_NEUTRAL_Y, NPS_ACCEL_NEUTRAL_Z); + NPS_ACCEL_NEUTRAL_X, NPS_ACCEL_NEUTRAL_Y, NPS_ACCEL_NEUTRAL_Z); VECT3_ASSIGN(accel->noise_std_dev, - NPS_ACCEL_NOISE_STD_DEV_X, NPS_ACCEL_NOISE_STD_DEV_Y, NPS_ACCEL_NOISE_STD_DEV_Z); + NPS_ACCEL_NOISE_STD_DEV_X, NPS_ACCEL_NOISE_STD_DEV_Y, NPS_ACCEL_NOISE_STD_DEV_Z); VECT3_ASSIGN(accel->bias, - NPS_ACCEL_BIAS_X, NPS_ACCEL_BIAS_Y, NPS_ACCEL_BIAS_Z); + NPS_ACCEL_BIAS_X, NPS_ACCEL_BIAS_Y, NPS_ACCEL_BIAS_Z); accel->next_update = time; accel->data_available = FALSE; } -void nps_sensor_accel_run_step(struct NpsSensorAccel* accel, double time, struct DoubleRMat* body_to_imu) +void nps_sensor_accel_run_step(struct NpsSensorAccel *accel, double time, struct DoubleRMat *body_to_imu) { - if (time < accel->next_update) + if (time < accel->next_update) { return; + } /* transform to imu frame */ struct DoubleVect3 accelero_imu; @@ -44,7 +45,7 @@ void nps_sensor_accel_run_step(struct NpsSensorAccel* accel, double time, struct /* white noise */ double_vect3_add_gaussian_noise(&accelero_error, &accel->noise_std_dev); /* scale */ - struct DoubleVect3 gain = {NPS_ACCEL_SENSITIVITY_XX, NPS_ACCEL_SENSITIVITY_YY, NPS_ACCEL_SENSITIVITY_ZZ}; + struct DoubleVect3 gain = {accel->sensitivity.m[0], accel->sensitivity.m[4], accel->sensitivity.m[8]}; VECT3_EW_MUL(accelero_error, accelero_error, gain); /* add error */ VECT3_ADD(accel->value, accelero_error); diff --git a/sw/simulator/nps/nps_sensor_accel.h b/sw/simulator/nps/nps_sensor_accel.h index 4262e01f31..4f555b1d6d 100644 --- a/sw/simulator/nps/nps_sensor_accel.h +++ b/sw/simulator/nps/nps_sensor_accel.h @@ -19,7 +19,7 @@ struct NpsSensorAccel { }; -extern void nps_sensor_accel_init(struct NpsSensorAccel* accel, double time); -extern void nps_sensor_accel_run_step(struct NpsSensorAccel* accel, double time, struct DoubleRMat* body_to_imu); +extern void nps_sensor_accel_init(struct NpsSensorAccel *accel, double time); +extern void nps_sensor_accel_run_step(struct NpsSensorAccel *accel, double time, struct DoubleRMat *body_to_imu); #endif /* NPS_SENSOR_ACCEL_H */ diff --git a/sw/simulator/nps/nps_sensor_baro.c b/sw/simulator/nps/nps_sensor_baro.c index 22ca9f9a4c..5a10267614 100644 --- a/sw/simulator/nps/nps_sensor_baro.c +++ b/sw/simulator/nps/nps_sensor_baro.c @@ -8,24 +8,29 @@ #include "nps_random.h" #include NPS_SENSORS_PARAMS +#ifndef NPS_BARO_NOISE_STD_DEV +#define NPS_BARO_NOISE_STD_DEV 0. +#endif - -void nps_sensor_baro_init(struct NpsSensorBaro* baro, double time) { +void nps_sensor_baro_init(struct NpsSensorBaro *baro, double time) +{ baro->value = 0.; + baro->noise_std_dev = NPS_BARO_NOISE_STD_DEV; baro->next_update = time; baro->data_available = FALSE; } -void nps_sensor_baro_run_step(struct NpsSensorBaro* baro, double time) { - - if (time < baro->next_update) +void nps_sensor_baro_run_step(struct NpsSensorBaro *baro, double time) +{ + if (time < baro->next_update) { return; + } /* pressure in Pascal */ baro->value = pprz_isa_pressure_of_altitude(fdm.hmsl); /* add noise with std dev Pascal */ - baro->value += get_gaussian_noise() * NPS_BARO_NOISE_STD_DEV; + baro->value += get_gaussian_noise() * baro->noise_std_dev; baro->next_update += NPS_BARO_DT; baro->data_available = TRUE; diff --git a/sw/simulator/nps/nps_sensor_baro.h b/sw/simulator/nps/nps_sensor_baro.h index 0a07c4a04c..a781adb20f 100644 --- a/sw/simulator/nps/nps_sensor_baro.h +++ b/sw/simulator/nps/nps_sensor_baro.h @@ -8,12 +8,13 @@ struct NpsSensorBaro { double value; ///< pressure in Pascal + double noise_std_dev; ///< noise standard deviation double next_update; bool_t data_available; }; -extern void nps_sensor_baro_init(struct NpsSensorBaro* baro, double time); -extern void nps_sensor_baro_run_step(struct NpsSensorBaro* baro, double time); +extern void nps_sensor_baro_init(struct NpsSensorBaro *baro, double time); +extern void nps_sensor_baro_run_step(struct NpsSensorBaro *baro, double time); #endif /* NPS_SENSOR_BARO_H */ diff --git a/sw/simulator/nps/nps_sensor_gps.c b/sw/simulator/nps/nps_sensor_gps.c index 9a63423a32..cd10957c65 100644 --- a/sw/simulator/nps/nps_sensor_gps.c +++ b/sw/simulator/nps/nps_sensor_gps.c @@ -7,22 +7,23 @@ #include "nps_sensors_utils.h" #include NPS_SENSORS_PARAMS -void nps_sensor_gps_init(struct NpsSensorGps* gps, double time) { +void nps_sensor_gps_init(struct NpsSensorGps *gps, double time) +{ FLOAT_VECT3_ZERO(gps->ecef_pos); FLOAT_VECT3_ZERO(gps->ecef_vel); gps->hmsl = 0.0; gps->pos_latency = NPS_GPS_POS_LATENCY; gps->speed_latency = NPS_GPS_SPEED_LATENCY; VECT3_ASSIGN(gps->pos_noise_std_dev, - NPS_GPS_POS_NOISE_STD_DEV, NPS_GPS_POS_NOISE_STD_DEV, NPS_GPS_POS_NOISE_STD_DEV); + NPS_GPS_POS_NOISE_STD_DEV, NPS_GPS_POS_NOISE_STD_DEV, NPS_GPS_POS_NOISE_STD_DEV); VECT3_ASSIGN(gps->speed_noise_std_dev, - NPS_GPS_SPEED_NOISE_STD_DEV, NPS_GPS_SPEED_NOISE_STD_DEV, NPS_GPS_SPEED_NOISE_STD_DEV); + NPS_GPS_SPEED_NOISE_STD_DEV, NPS_GPS_SPEED_NOISE_STD_DEV, NPS_GPS_SPEED_NOISE_STD_DEV); VECT3_ASSIGN(gps->pos_bias_initial, - NPS_GPS_POS_BIAS_INITIAL_X, NPS_GPS_POS_BIAS_INITIAL_Y, NPS_GPS_POS_BIAS_INITIAL_Z); + NPS_GPS_POS_BIAS_INITIAL_X, NPS_GPS_POS_BIAS_INITIAL_Y, NPS_GPS_POS_BIAS_INITIAL_Z); VECT3_ASSIGN(gps->pos_bias_random_walk_std_dev, - NPS_GPS_POS_BIAS_RANDOM_WALK_STD_DEV_X, - NPS_GPS_POS_BIAS_RANDOM_WALK_STD_DEV_Y, - NPS_GPS_POS_BIAS_RANDOM_WALK_STD_DEV_Z); + NPS_GPS_POS_BIAS_RANDOM_WALK_STD_DEV_X, + NPS_GPS_POS_BIAS_RANDOM_WALK_STD_DEV_Y, + NPS_GPS_POS_BIAS_RANDOM_WALK_STD_DEV_Z); FLOAT_VECT3_ZERO(gps->pos_bias_random_walk_value); gps->next_update = time; gps->data_available = FALSE; @@ -35,10 +36,12 @@ void nps_sensor_gps_init(struct NpsSensorGps* gps, double time) { * */ -void nps_sensor_gps_run_step(struct NpsSensorGps* gps, double time) { +void nps_sensor_gps_run_step(struct NpsSensorGps *gps, double time) +{ - if (time < gps->next_update) + if (time < gps->next_update) { return; + } /* @@ -79,7 +82,7 @@ void nps_sensor_gps_run_step(struct NpsSensorGps* gps, double time) { */ /* convert current ecef reading to lla */ struct LlaCoor_d cur_lla_reading; - lla_of_ecef_d(&cur_lla_reading, (struct EcefCoor_d*) &cur_pos_reading); + lla_of_ecef_d(&cur_lla_reading, (struct EcefCoor_d *) &cur_pos_reading); /* store that for later and retrieve a previously stored data */ UpdateSensorLatency(time, &cur_lla_reading, &gps->lla_history, gps->pos_latency, &gps->lla_pos); diff --git a/sw/simulator/nps/nps_sensor_gps.h b/sw/simulator/nps/nps_sensor_gps.h index f632ea9abd..598bd30830 100644 --- a/sw/simulator/nps/nps_sensor_gps.h +++ b/sw/simulator/nps/nps_sensor_gps.h @@ -22,16 +22,16 @@ struct NpsSensorGps { struct DoubleVect3 pos_bias_random_walk_value; double pos_latency; double speed_latency; - GSList* hmsl_history; - GSList* pos_history; - GSList* lla_history; - GSList* speed_history; + GSList *hmsl_history; + GSList *pos_history; + GSList *lla_history; + GSList *speed_history; double next_update; bool_t data_available; }; -extern void nps_sensor_gps_init(struct NpsSensorGps* gps, double time); -extern void nps_sensor_gps_run_step(struct NpsSensorGps* gps, double time); +extern void nps_sensor_gps_init(struct NpsSensorGps *gps, double time); +extern void nps_sensor_gps_run_step(struct NpsSensorGps *gps, double time); #endif /* NPS_SENSOR_GPS_H */ diff --git a/sw/simulator/nps/nps_sensor_gyro.c b/sw/simulator/nps/nps_sensor_gyro.c index 623234fbb0..1bf66296f7 100644 --- a/sw/simulator/nps/nps_sensor_gyro.c +++ b/sw/simulator/nps/nps_sensor_gyro.c @@ -6,36 +6,39 @@ #include "math/pprz_algebra_int.h" #include "nps_random.h" -void nps_sensor_gyro_init(struct NpsSensorGyro* gyro, double time) { +void nps_sensor_gyro_init(struct NpsSensorGyro *gyro, double time) +{ FLOAT_VECT3_ZERO(gyro->value); gyro->min = NPS_GYRO_MIN; gyro->max = NPS_GYRO_MAX; FLOAT_MAT33_DIAG(gyro->sensitivity, - NPS_GYRO_SENSITIVITY_PP, NPS_GYRO_SENSITIVITY_QQ, NPS_GYRO_SENSITIVITY_RR); + NPS_GYRO_SENSITIVITY_PP, NPS_GYRO_SENSITIVITY_QQ, NPS_GYRO_SENSITIVITY_RR); VECT3_ASSIGN(gyro->neutral, - NPS_GYRO_NEUTRAL_P, NPS_GYRO_NEUTRAL_Q, NPS_GYRO_NEUTRAL_R); + NPS_GYRO_NEUTRAL_P, NPS_GYRO_NEUTRAL_Q, NPS_GYRO_NEUTRAL_R); VECT3_ASSIGN(gyro->noise_std_dev, - NPS_GYRO_NOISE_STD_DEV_P, NPS_GYRO_NOISE_STD_DEV_Q, NPS_GYRO_NOISE_STD_DEV_R); + NPS_GYRO_NOISE_STD_DEV_P, NPS_GYRO_NOISE_STD_DEV_Q, NPS_GYRO_NOISE_STD_DEV_R); VECT3_ASSIGN(gyro->bias_initial, - NPS_GYRO_BIAS_INITIAL_P, NPS_GYRO_BIAS_INITIAL_Q, NPS_GYRO_BIAS_INITIAL_R); + NPS_GYRO_BIAS_INITIAL_P, NPS_GYRO_BIAS_INITIAL_Q, NPS_GYRO_BIAS_INITIAL_R); VECT3_ASSIGN(gyro->bias_random_walk_std_dev, - NPS_GYRO_BIAS_RANDOM_WALK_STD_DEV_P, - NPS_GYRO_BIAS_RANDOM_WALK_STD_DEV_Q, - NPS_GYRO_BIAS_RANDOM_WALK_STD_DEV_R); + NPS_GYRO_BIAS_RANDOM_WALK_STD_DEV_P, + NPS_GYRO_BIAS_RANDOM_WALK_STD_DEV_Q, + NPS_GYRO_BIAS_RANDOM_WALK_STD_DEV_R); FLOAT_VECT3_ZERO(gyro->bias_random_walk_value); gyro->next_update = time; gyro->data_available = FALSE; } -void nps_sensor_gyro_run_step(struct NpsSensorGyro* gyro, double time, struct DoubleRMat* body_to_imu) { +void nps_sensor_gyro_run_step(struct NpsSensorGyro *gyro, double time, struct DoubleRMat *body_to_imu) +{ - if (time < gyro->next_update) + if (time < gyro->next_update) { return; + } /* transform body rates to IMU frame */ - struct DoubleVect3* rate_body = (struct DoubleVect3*)(&fdm.body_inertial_rotvel); + struct DoubleVect3 *rate_body = (struct DoubleVect3 *)(&fdm.body_inertial_rotvel); struct DoubleVect3 rate_imu; - MAT33_VECT3_MUL(rate_imu, *body_to_imu, *rate_body ); + MAT33_VECT3_MUL(rate_imu, *body_to_imu, *rate_body); /* compute gyros readings */ MAT33_VECT3_MUL(gyro->value, gyro->sensitivity, rate_imu); VECT3_ADD(gyro->value, gyro->neutral); @@ -44,10 +47,10 @@ void nps_sensor_gyro_run_step(struct NpsSensorGyro* gyro, double time, struct Do VECT3_COPY(gyro_error, gyro->bias_initial); double_vect3_add_gaussian_noise(&gyro_error, &gyro->noise_std_dev); double_vect3_update_random_walk(&gyro->bias_random_walk_value, &gyro->bias_random_walk_std_dev, - NPS_GYRO_DT, 5.); + NPS_GYRO_DT, 5.); VECT3_ADD(gyro_error, gyro->bias_random_walk_value); - struct DoubleVect3 gain = {NPS_GYRO_SENSITIVITY_PP, NPS_GYRO_SENSITIVITY_QQ, NPS_GYRO_SENSITIVITY_RR}; + struct DoubleVect3 gain = {gyro->sensitivity.m[0], gyro->sensitivity.m[4], gyro->sensitivity.m[8]}; VECT3_EW_MUL(gyro_error, gyro_error, gain); VECT3_ADD(gyro->value, gyro_error); @@ -60,6 +63,3 @@ void nps_sensor_gyro_run_step(struct NpsSensorGyro* gyro, double time, struct Do gyro->next_update += NPS_GYRO_DT; gyro->data_available = TRUE; } - - - diff --git a/sw/simulator/nps/nps_sensor_gyro.h b/sw/simulator/nps/nps_sensor_gyro.h index 55490e9447..ddb33703da 100644 --- a/sw/simulator/nps/nps_sensor_gyro.h +++ b/sw/simulator/nps/nps_sensor_gyro.h @@ -21,8 +21,8 @@ struct NpsSensorGyro { }; -extern void nps_sensor_gyro_init(struct NpsSensorGyro* gyro, double time); -extern void nps_sensor_gyro_run_step(struct NpsSensorGyro* gyro, double time, struct DoubleRMat* body_to_imu); +extern void nps_sensor_gyro_init(struct NpsSensorGyro *gyro, double time); +extern void nps_sensor_gyro_run_step(struct NpsSensorGyro *gyro, double time, struct DoubleRMat *body_to_imu); #endif /* NPS_SENSOR_GYRO_H */ diff --git a/sw/simulator/nps/nps_sensor_mag.c b/sw/simulator/nps/nps_sensor_mag.c index 08e3c40026..a34589c2ea 100644 --- a/sw/simulator/nps/nps_sensor_mag.c +++ b/sw/simulator/nps/nps_sensor_mag.c @@ -5,27 +5,30 @@ #include NPS_SENSORS_PARAMS #include "math/pprz_algebra_int.h" -void nps_sensor_mag_init(struct NpsSensorMag* mag, double time) { +void nps_sensor_mag_init(struct NpsSensorMag *mag, double time) +{ VECT3_ASSIGN(mag->value, 0., 0., 0.); mag->min = NPS_MAG_MIN; mag->max = NPS_MAG_MAX; FLOAT_MAT33_DIAG(mag->sensitivity, - NPS_MAG_SENSITIVITY_XX, NPS_MAG_SENSITIVITY_YY, NPS_MAG_SENSITIVITY_ZZ); + NPS_MAG_SENSITIVITY_XX, NPS_MAG_SENSITIVITY_YY, NPS_MAG_SENSITIVITY_ZZ); VECT3_ASSIGN(mag->neutral, - NPS_MAG_NEUTRAL_X, NPS_MAG_NEUTRAL_Y, NPS_MAG_NEUTRAL_Z); + NPS_MAG_NEUTRAL_X, NPS_MAG_NEUTRAL_Y, NPS_MAG_NEUTRAL_Z); VECT3_ASSIGN(mag->noise_std_dev, - NPS_MAG_NOISE_STD_DEV_X, NPS_MAG_NOISE_STD_DEV_Y, NPS_MAG_NOISE_STD_DEV_Z); + NPS_MAG_NOISE_STD_DEV_X, NPS_MAG_NOISE_STD_DEV_Y, NPS_MAG_NOISE_STD_DEV_Z); struct DoubleEulers imu_to_sensor_eulers = - { NPS_MAG_IMU_TO_SENSOR_PHI, NPS_MAG_IMU_TO_SENSOR_THETA, NPS_MAG_IMU_TO_SENSOR_PSI }; + { NPS_MAG_IMU_TO_SENSOR_PHI, NPS_MAG_IMU_TO_SENSOR_THETA, NPS_MAG_IMU_TO_SENSOR_PSI }; DOUBLE_RMAT_OF_EULERS(mag->imu_to_sensor_rmat, imu_to_sensor_eulers); mag->next_update = time; mag->data_available = FALSE; } -void nps_sensor_mag_run_step(struct NpsSensorMag* mag, double time, struct DoubleRMat* body_to_imu) { +void nps_sensor_mag_run_step(struct NpsSensorMag *mag, double time, struct DoubleRMat *body_to_imu) +{ - if (time < mag->next_update) + if (time < mag->next_update) { return; + } /* transform magnetic field to body frame */ struct DoubleVect3 h_body; @@ -33,11 +36,11 @@ void nps_sensor_mag_run_step(struct NpsSensorMag* mag, double time, struct Doubl /* transform to imu frame */ struct DoubleVect3 h_imu; - MAT33_VECT3_MUL(h_imu, *body_to_imu, h_body ); + MAT33_VECT3_MUL(h_imu, *body_to_imu, h_body); /* transform to sensor frame */ struct DoubleVect3 h_sensor; - MAT33_VECT3_MUL(h_sensor, mag->imu_to_sensor_rmat, h_imu ); + MAT33_VECT3_MUL(h_sensor, mag->imu_to_sensor_rmat, h_imu); /* compute magnetometer reading */ MAT33_VECT3_MUL(mag->value, mag->sensitivity, h_sensor); diff --git a/sw/simulator/nps/nps_sensor_mag.h b/sw/simulator/nps/nps_sensor_mag.h index ab0fdeb849..d1cf6f1356 100644 --- a/sw/simulator/nps/nps_sensor_mag.h +++ b/sw/simulator/nps/nps_sensor_mag.h @@ -19,7 +19,7 @@ struct NpsSensorMag { }; -extern void nps_sensor_mag_init(struct NpsSensorMag* mag, double time); -extern void nps_sensor_mag_run_step(struct NpsSensorMag* mag, double time, struct DoubleRMat* body_to_imu); +extern void nps_sensor_mag_init(struct NpsSensorMag *mag, double time); +extern void nps_sensor_mag_run_step(struct NpsSensorMag *mag, double time, struct DoubleRMat *body_to_imu); #endif /* NPS_SENSOR_MAG_H */ diff --git a/sw/simulator/nps/nps_sensor_sonar.c b/sw/simulator/nps/nps_sensor_sonar.c index 3d17a3f41c..ea33050888 100644 --- a/sw/simulator/nps/nps_sensor_sonar.c +++ b/sw/simulator/nps/nps_sensor_sonar.c @@ -50,22 +50,27 @@ #endif -void nps_sensor_sonar_init(struct NpsSensorSonar* sonar, double time) { +void nps_sensor_sonar_init(struct NpsSensorSonar *sonar, double time) +{ sonar->value = 0.; + sonar->offset = NPS_SONAR_OFFSET; + sonar->noise_std_dev = NPS_SONAR_NOISE_STD_DEV; sonar->next_update = time; sonar->data_available = FALSE; } -void nps_sensor_sonar_run_step(struct NpsSensorSonar* sonar, double time) { +void nps_sensor_sonar_run_step(struct NpsSensorSonar *sonar, double time) +{ - if (time < sonar->next_update) + if (time < sonar->next_update) { return; + } /* agl in meters */ - sonar->value = fdm.agl + NPS_SONAR_OFFSET; + sonar->value = fdm.agl + sonar->offset; /* add noise with std dev meters */ - sonar->value += get_gaussian_noise() * NPS_SONAR_NOISE_STD_DEV; + sonar->value += get_gaussian_noise() * sonar->noise_std_dev; sonar->next_update += NPS_SONAR_DT; sonar->data_available = TRUE; diff --git a/sw/simulator/nps/nps_sensor_sonar.h b/sw/simulator/nps/nps_sensor_sonar.h index 30df64e90e..cdae3ae3e5 100644 --- a/sw/simulator/nps/nps_sensor_sonar.h +++ b/sw/simulator/nps/nps_sensor_sonar.h @@ -35,13 +35,15 @@ #include "std.h" struct NpsSensorSonar { - double value; ///< sonar reading in meters - double next_update; - bool_t data_available; + double value; ///< sonar reading in meters + double offset; ///< offset in meters + double noise_std_dev; ///< noise standard deviation + double next_update; + bool_t data_available; }; -extern void nps_sensor_sonar_init(struct NpsSensorSonar* sonar, double time); -extern void nps_sensor_sonar_run_step(struct NpsSensorSonar* sonar, double time); +extern void nps_sensor_sonar_init(struct NpsSensorSonar *sonar, double time); +extern void nps_sensor_sonar_run_step(struct NpsSensorSonar *sonar, double time); #endif /* NPS_SENSOR_SONAR_H */ diff --git a/sw/simulator/nps/nps_sensors.c b/sw/simulator/nps/nps_sensors.c index 497a6237a3..1c9209a071 100644 --- a/sw/simulator/nps/nps_sensors.c +++ b/sw/simulator/nps/nps_sensors.c @@ -5,10 +5,11 @@ struct NpsSensors sensors; -void nps_sensors_init(double time) { +void nps_sensors_init(double time) +{ struct DoubleEulers body_to_imu_eulers = - { NPS_BODY_TO_IMU_PHI, NPS_BODY_TO_IMU_THETA, NPS_BODY_TO_IMU_PSI }; + { NPS_BODY_TO_IMU_PHI, NPS_BODY_TO_IMU_THETA, NPS_BODY_TO_IMU_PSI }; DOUBLE_RMAT_OF_EULERS(sensors.body_to_imu_rmat, body_to_imu_eulers); nps_sensor_gyro_init(&sensors.gyro, time); @@ -20,7 +21,8 @@ void nps_sensors_init(double time) { } -void nps_sensors_run_step(double time) { +void nps_sensors_run_step(double time) +{ nps_sensor_gyro_run_step(&sensors.gyro, time, &sensors.body_to_imu_rmat); nps_sensor_accel_run_step(&sensors.accel, time, &sensors.body_to_imu_rmat); nps_sensor_mag_run_step(&sensors.mag, time, &sensors.body_to_imu_rmat); @@ -30,7 +32,8 @@ void nps_sensors_run_step(double time) { } -bool_t nps_sensors_gyro_available(void) { +bool_t nps_sensors_gyro_available(void) +{ if (sensors.gyro.data_available) { sensors.gyro.data_available = FALSE; return TRUE; @@ -38,7 +41,8 @@ bool_t nps_sensors_gyro_available(void) { return FALSE; } -bool_t nps_sensors_mag_available(void) { +bool_t nps_sensors_mag_available(void) +{ if (sensors.mag.data_available) { sensors.mag.data_available = FALSE; return TRUE; @@ -46,7 +50,8 @@ bool_t nps_sensors_mag_available(void) { return FALSE; } -bool_t nps_sensors_baro_available(void) { +bool_t nps_sensors_baro_available(void) +{ if (sensors.baro.data_available) { sensors.baro.data_available = FALSE; return TRUE; @@ -54,7 +59,8 @@ bool_t nps_sensors_baro_available(void) { return FALSE; } -bool_t nps_sensors_gps_available(void) { +bool_t nps_sensors_gps_available(void) +{ if (sensors.gps.data_available) { sensors.gps.data_available = FALSE; return TRUE; @@ -62,7 +68,8 @@ bool_t nps_sensors_gps_available(void) { return FALSE; } -bool_t nps_sensors_sonar_available(void) { +bool_t nps_sensors_sonar_available(void) +{ if (sensors.sonar.data_available) { sensors.sonar.data_available = FALSE; return TRUE; diff --git a/sw/simulator/nps/nps_sensors_utils.c b/sw/simulator/nps/nps_sensors_utils.c index 0911fed2eb..684ffc12d9 100644 --- a/sw/simulator/nps/nps_sensors_utils.c +++ b/sw/simulator/nps/nps_sensors_utils.c @@ -3,44 +3,47 @@ //#include #include "math/pprz_algebra.h" -void UpdateSensorLatency(double time, gpointer cur_reading, GSList **history, double latency, gpointer sensor_reading) { +void UpdateSensorLatency(double time, gpointer cur_reading, GSList **history, double latency, gpointer sensor_reading) +{ /* add new reading */ - struct BoozDatedSensor* cur_read = g_new(struct BoozDatedSensor, 1); + struct BoozDatedSensor *cur_read = g_new(struct BoozDatedSensor, 1); cur_read->time = time; - cur_read->value = (struct DoubleVect3*) g_memdup(cur_reading, sizeof(struct DoubleVect3)); + cur_read->value = (struct DoubleVect3 *) g_memdup(cur_reading, sizeof(struct DoubleVect3)); *history = g_slist_prepend(*history, cur_read); /* remove old readings */ - GSList* last = g_slist_last(*history); - while (last && ((struct BoozDatedSensor*)last->data)->time < time - latency) { + GSList *last = g_slist_last(*history); + while (last && ((struct BoozDatedSensor *)last->data)->time < time - latency) { *history = g_slist_remove_link(*history, last); - g_free(((struct BoozDatedSensor*)last->data)->value); - g_free((struct BoozDatedSensor*)last->data); + g_free(((struct BoozDatedSensor *)last->data)->value); + g_free((struct BoozDatedSensor *)last->data); g_slist_free_1(last); last = g_slist_last(*history); } /* update sensor */ //g_memmove((gpointer)sensor_reading, (gpointer)((struct BoozDatedSensor*)last->data)->value, sizeof(struct DoubleVect3)); - VECT3_COPY(*((struct DoubleVect3*)sensor_reading), *((struct BoozDatedSensor*)last->data)->value); + VECT3_COPY(*((struct DoubleVect3 *)sensor_reading), *((struct BoozDatedSensor *)last->data)->value); } -void UpdateSensorLatency_Single(double time, gpointer cur_reading, GSList **history, double latency, gpointer sensor_reading) { +void UpdateSensorLatency_Single(double time, gpointer cur_reading, GSList **history, double latency, + gpointer sensor_reading) +{ /* add new reading */ - struct BoozDatedSensor_Single* cur_read = g_new(struct BoozDatedSensor_Single, 1); + struct BoozDatedSensor_Single *cur_read = g_new(struct BoozDatedSensor_Single, 1); cur_read->time = time; - cur_read->value = (double*) g_memdup(cur_reading, sizeof(double)); + cur_read->value = (double *) g_memdup(cur_reading, sizeof(double)); *history = g_slist_prepend(*history, cur_read); /* remove old readings */ - GSList* last = g_slist_last(*history); - while (last && ((struct BoozDatedSensor_Single*)last->data)->time < time - latency) { + GSList *last = g_slist_last(*history); + while (last && ((struct BoozDatedSensor_Single *)last->data)->time < time - latency) { *history = g_slist_remove_link(*history, last); - g_free(((struct BoozDatedSensor_Single*)last->data)->value); - g_free((struct BoozDatedSensor_Single*)last->data); + g_free(((struct BoozDatedSensor_Single *)last->data)->value); + g_free((struct BoozDatedSensor_Single *)last->data); g_slist_free_1(last); last = g_slist_last(*history); } /* update sensor */ //g_memmove((gpointer)sensor_reading, (gpointer)((struct BoozDatedSensor*)last->data)->value, sizeof(struct DoubleVect3)); - *((double*)sensor_reading) = *(((struct BoozDatedSensor_Single*)last->data)->value); + *((double *)sensor_reading) = *(((struct BoozDatedSensor_Single *)last->data)->value); } diff --git a/sw/simulator/nps/nps_sensors_utils.h b/sw/simulator/nps/nps_sensors_utils.h index 74b8545b3a..3193cf7316 100644 --- a/sw/simulator/nps/nps_sensors_utils.h +++ b/sw/simulator/nps/nps_sensors_utils.h @@ -5,21 +5,21 @@ #include "math/pprz_algebra_double.h" struct BoozDatedSensor { - struct DoubleVect3* value; + struct DoubleVect3 *value; double time; }; struct BoozDatedSensor_Single { - double* value; + double *value; double time; }; /* cur_reading and sensor_reading must be of a type that can be cast to DoubleVect3* */ extern void UpdateSensorLatency(double time, gpointer cur_reading, GSList **history, - double latency, gpointer sensor_reading); + double latency, gpointer sensor_reading); /* ...and the same for single double values */ extern void UpdateSensorLatency_Single(double time, gpointer cur_reading, GSList **history, - double latency, gpointer sensor_reading); + double latency, gpointer sensor_reading); #endif /* NPS_SENSORS_UTILS_H */