diff --git a/conf/airframes/tudelft/bebop_autonomous_race_2018.xml b/conf/airframes/tudelft/bebop_autonomous_race_2018.xml index 6a5cea22fe..feb8126bed 100644 --- a/conf/airframes/tudelft/bebop_autonomous_race_2018.xml +++ b/conf/airframes/tudelft/bebop_autonomous_race_2018.xml @@ -13,6 +13,9 @@ + + + diff --git a/conf/modules/sonar_bebop.xml b/conf/modules/sonar_bebop.xml index fdb809d120..dac06d0acd 100644 --- a/conf/modules/sonar_bebop.xml +++ b/conf/modules/sonar_bebop.xml @@ -7,6 +7,9 @@ Reads an anlog sonar sensor and outputs sonar distance in [m] + + +
diff --git a/sw/airborne/modules/sonar/sonar_bebop.c b/sw/airborne/modules/sonar/sonar_bebop.c index 310035663f..522486b84a 100644 --- a/sw/airborne/modules/sonar/sonar_bebop.c +++ b/sw/airborne/modules/sonar/sonar_bebop.c @@ -36,6 +36,7 @@ #include "generated/airframe.h" #include "mcu_periph/adc.h" #include "mcu_periph/spi.h" +#include "mcu_periph/sys_time.h" #include "subsystems/abi.h" #include #include @@ -44,6 +45,7 @@ #include "filters/median_filter.h" struct MedianFilterFloat sonar_filt; +uint32_t sonar_bebop_spike_timer; #ifdef SITL #include "state.h" @@ -97,6 +99,7 @@ struct SonarBebop sonar_bebop; static struct spi_transaction sonar_bebop_spi_t; void *sonar_bebop_read(void *data); +static float sonar_filter_narrow_obstacles(float distance_sonar); void sonar_bebop_init(void) { @@ -121,6 +124,7 @@ void sonar_bebop_init(void) #endif init_median_filter_f(&sonar_filt, 5); + SysTimeTimerStart(sonar_bebop_spike_timer); } uint16_t adc_buffer[SONAR_BEBOP_ADC_BUFFER_SIZE]; @@ -174,6 +178,10 @@ void *sonar_bebop_read(void *data __attribute__((unused))) sonar_bebop.meas = first_peak - (stop_send - diff / 2); sonar_bebop.distance = update_median_filter_f(&sonar_filt, (float)sonar_bebop.meas * SONAR_BEBOP_INX_DIFF_TO_DIST); +#if SONAR_BEBOP_FILTER_NARROW_OBSTACLES + sonar_bebop.distance = sonar_filter_narrow_obstacles(sonar_bebop.distance); +#endif + // set sonar pulse mode for next pulse based on altitude if (mode == 0 && sonar_bebop.distance > SONAR_BEBOP_TRANSITION_LOW_TO_HIGH) { if (++pulse_transition_counter > SONAR_BEBOP_TRANSITION_COUNT) { @@ -208,3 +216,43 @@ void *sonar_bebop_read(void *data __attribute__((unused))) } return NULL; } + + +#if SONAR_BEBOP_FILTER_NARROW_OBSTACLES + +#ifndef SONAR_BEBOP_FILTER_NARROW_OBSTACLES_JUMP +#define SONAR_BEBOP_FILTER_NARROW_OBSTACLES_JUMP 0.4f +#endif +PRINT_CONFIG_VAR(SONAR_BEBOP_FILTER_NARROW_OBSTACLES_JUMP) + +#ifndef SONAR_BEBOP_FILTER_NARROW_OBSTACLES_TIME +#define SONAR_BEBOP_FILTER_NARROW_OBSTACLES_TIME 1.0f +#endif +PRINT_CONFIG_VAR(SONAR_BEBOP_FILTER_NARROW_OBSTACLES_TIME) + +static float sonar_filter_narrow_obstacles(float distance_sonar) +{ + static float previous_distance = 0; + static float z0 = 0; + bool obstacle_is_in_view = false; + float diff_pre_cur = distance_sonar - previous_distance; + if (diff_pre_cur < -SONAR_BEBOP_FILTER_NARROW_OBSTACLES_JUMP) { + z0 = previous_distance; + obstacle_is_in_view = true; + SysTimeTimerStart(sonar_bebop_spike_timer); + } + previous_distance = distance_sonar; + float time_since_reset = SysTimeTimer(sonar_bebop_spike_timer); + if ((diff_pre_cur > SONAR_BEBOP_FILTER_NARROW_OBSTACLES_JUMP) || (time_since_reset > USEC_OF_SEC(SONAR_BEBOP_FILTER_NARROW_OBSTACLES_TIME)) ) { + + obstacle_is_in_view = false; + } + + if (obstacle_is_in_view) { + return z0; + } else { + return distance_sonar; + } +} +#endif +