Browse Source

geofence: add counter threshold for subsequent detections

sbg
Thomas Gubler 11 years ago
parent
commit
81adc52671
  1. 22
      src/modules/navigator/geofence.cpp
  2. 6
      src/modules/navigator/geofence.h
  3. 11
      src/modules/navigator/geofence_params.c

22
src/modules/navigator/geofence.cpp

@ -64,7 +64,9 @@ Geofence::Geofence() :
_verticesCount(0), _verticesCount(0),
_param_geofence_on(this, "ON"), _param_geofence_on(this, "ON"),
_param_altitude_mode(this, "ALTMODE"), _param_altitude_mode(this, "ALTMODE"),
_param_source(this, "SOURCE") _param_source(this, "SOURCE"),
_param_counter_threshold(this, "COUNT"),
_outside_counter(0)
{ {
/* Load initial params */ /* Load initial params */
updateParams(); updateParams();
@ -107,6 +109,24 @@ bool Geofence::inside(const struct vehicle_global_position_s &global_position,
} }
bool Geofence::inside(double lat, double lon, float altitude) bool Geofence::inside(double lat, double lon, float altitude)
{
bool inside_fence = inside_polygon(lat, lon, altitude);
if (inside_fence) {
_outside_counter = 0;
return inside_fence;
} {
_outside_counter++;
if(_outside_counter > _param_counter_threshold.get()) {
return inside_fence;
} else {
return true;
}
}
}
bool Geofence::inside_polygon(double lat, double lon, float altitude)
{ {
/* Return true if geofence is disabled */ /* Return true if geofence is disabled */
if (_param_geofence_on.get() != 1) if (_param_geofence_on.get() != 1)

6
src/modules/navigator/geofence.h

@ -77,9 +77,10 @@ public:
*/ */
bool inside(const struct vehicle_global_position_s &global_position); bool inside(const struct vehicle_global_position_s &global_position);
bool inside(const struct vehicle_global_position_s &global_position, float baro_altitude_amsl); bool inside(const struct vehicle_global_position_s &global_position, float baro_altitude_amsl);
bool inside(double lat, double lon, float altitude);
bool inside(const struct vehicle_global_position_s &global_position, bool inside(const struct vehicle_global_position_s &global_position,
const struct vehicle_gps_position_s &gps_position,float baro_altitude_amsl); const struct vehicle_gps_position_s &gps_position,float baro_altitude_amsl);
bool inside(double lat, double lon, float altitude);
bool inside_polygon(double lat, double lon, float altitude);
int clearDm(); int clearDm();
@ -112,6 +113,9 @@ private:
control::BlockParamInt _param_geofence_on; control::BlockParamInt _param_geofence_on;
control::BlockParamInt _param_altitude_mode; control::BlockParamInt _param_altitude_mode;
control::BlockParamInt _param_source; control::BlockParamInt _param_source;
control::BlockParamInt _param_counter_threshold;
uint8_t _outside_counter;
}; };

11
src/modules/navigator/geofence_params.c

@ -83,3 +83,14 @@ PARAM_DEFINE_INT32(GF_ALTMODE, 0);
* @group Geofence * @group Geofence
*/ */
PARAM_DEFINE_INT32(GF_SOURCE, 0); PARAM_DEFINE_INT32(GF_SOURCE, 0);
/**
* Geofence counter limit
*
* Set how many subsequent position measurements outside of the fence are needed before geofence violation is triggered
*
* @min -1
* @max 10
* @group Geofence
*/
PARAM_DEFINE_INT32(GF_COUNT, -1);

Loading…
Cancel
Save