1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-23 16:25:26 +03:00

attempt to determine max. useful rangefinder distance

This commit is contained in:
Pawel Spychalski (DzikuVx) 2017-07-22 21:40:59 +02:00
parent 4318707700
commit 48e84e608b
4 changed files with 62 additions and 2 deletions

View file

@ -51,5 +51,6 @@ typedef enum {
DEBUG_NAV_LANDING_DETECTOR, DEBUG_NAV_LANDING_DETECTOR,
DEBUG_FW_CLIMB_RATE_TO_ALTITUDE, DEBUG_FW_CLIMB_RATE_TO_ALTITUDE,
DEBUG_RANGEFINDER, DEBUG_RANGEFINDER,
DEBUG_RANGEFINDER_QUALITY,
DEBUG_COUNT DEBUG_COUNT
} debugType_e; } debugType_e;

View file

@ -330,7 +330,8 @@ static const char * const lookupTableDebug[DEBUG_COUNT] = {
"NOTCH", "NOTCH",
"NAV_LANDING", "NAV_LANDING",
"FW_ALTITUDE", "FW_ALTITUDE",
"RANGEFINDER" "RFIND",
"RFIND_Q"
}; };
#ifdef TELEMETRY_LTM #ifdef TELEMETRY_LTM

View file

@ -55,6 +55,9 @@ rangefinder_t rangefinder;
#define RANGEFINDER_HARDWARE_TIMEOUT_MS 500 // Accept 500ms of non-responsive sensor, report HW failure otherwise #define RANGEFINDER_HARDWARE_TIMEOUT_MS 500 // Accept 500ms of non-responsive sensor, report HW failure otherwise
#define RANGEFINDER_DYNAMIC_THRESHOLD 600 //Used to determine max. usable rangefinder disatance
#define RANGEFINDER_DYNAMIC_FACTOR 75
#ifdef USE_RANGEFINDER #ifdef USE_RANGEFINDER
PG_REGISTER_WITH_RESET_TEMPLATE(rangefinderConfig_t, rangefinderConfig, PG_RANGEFINDER_CONFIG, 0); PG_REGISTER_WITH_RESET_TEMPLATE(rangefinderConfig_t, rangefinderConfig, PG_RANGEFINDER_CONFIG, 0);
@ -151,6 +154,9 @@ bool rangefinderInit(void)
rangefinder.calculatedAltitude = RANGEFINDER_OUT_OF_RANGE; rangefinder.calculatedAltitude = RANGEFINDER_OUT_OF_RANGE;
rangefinder.maxTiltCos = cos_approx(DECIDEGREES_TO_RADIANS(rangefinder.dev.detectionConeExtendedDeciDegrees / 2.0f)); rangefinder.maxTiltCos = cos_approx(DECIDEGREES_TO_RADIANS(rangefinder.dev.detectionConeExtendedDeciDegrees / 2.0f));
rangefinder.lastValidResponseTimeMs = millis(); rangefinder.lastValidResponseTimeMs = millis();
rangefinder.snrThresholdReached = false;
rangefinder.dynamicDistanceThreshold = 0;
rangefinder.snr = 0;
return true; return true;
} }
@ -214,6 +220,34 @@ timeDelta_t rangefinderUpdate(void)
return rangefinder.dev.delayMs * 1000; // to microseconds return rangefinder.dev.delayMs * 1000; // to microseconds
} }
bool isSurfaceAltitudeValid() {
/*
* Preconditions: raw and calculated altidude > 0
* SNR lower than threshold
*/
if (
rangefinder.calculatedAltitude > 0 &&
rangefinder.rawAltitude > 0 &&
rangefinder.snr < RANGEFINDER_DYNAMIC_THRESHOLD
) {
/*
* When critical altitude was determined, distance reported by rangefinder
* has to be lower than it to assume healthy readout
*/
if (rangefinder.snrThresholdReached) {
return (rangefinder.rawAltitude < rangefinder.dynamicDistanceThreshold);
} else {
return true;
}
} else {
return false;
}
}
/** /**
* Get the last distance measured by the sonar in centimeters. When the ground is too far away, RANGEFINDER_OUT_OF_RANGE is returned. * Get the last distance measured by the sonar in centimeters. When the ground is too far away, RANGEFINDER_OUT_OF_RANGE is returned.
*/ */
@ -237,7 +271,27 @@ void rangefinderProcess(float cosTiltAngle)
rangefinder.rawAltitude = RANGEFINDER_HARDWARE_FAILURE; rangefinder.rawAltitude = RANGEFINDER_HARDWARE_FAILURE;
} }
DEBUG_SET(DEBUG_RANGEFINDER, 3, computePseudoSnr(distance)); rangefinder.snr = computePseudoSnr(distance);
if (rangefinder.snrThresholdReached == false && rangefinder.rawAltitude > 0) {
if (rangefinder.snr < RANGEFINDER_DYNAMIC_THRESHOLD && rangefinder.dynamicDistanceThreshold < rangefinder.rawAltitude) {
rangefinder.dynamicDistanceThreshold = rangefinder.rawAltitude * RANGEFINDER_DYNAMIC_FACTOR / 100;
}
if (rangefinder.snr >= RANGEFINDER_DYNAMIC_THRESHOLD) {
rangefinder.snrThresholdReached = true;
}
}
DEBUG_SET(DEBUG_RANGEFINDER, 3, rangefinder.snr);
DEBUG_SET(DEBUG_RANGEFINDER_QUALITY, 0, rangefinder.rawAltitude);
DEBUG_SET(DEBUG_RANGEFINDER_QUALITY, 1, rangefinder.snrThresholdReached);
DEBUG_SET(DEBUG_RANGEFINDER_QUALITY, 2, rangefinder.dynamicDistanceThreshold);
DEBUG_SET(DEBUG_RANGEFINDER_QUALITY, 3, isSurfaceAltitudeValid());
} }
else { else {
// Bad configuration // Bad configuration

View file

@ -40,6 +40,10 @@ typedef struct rangefinder_s {
int32_t rawAltitude; int32_t rawAltitude;
int32_t calculatedAltitude; int32_t calculatedAltitude;
timeMs_t lastValidResponseTimeMs; timeMs_t lastValidResponseTimeMs;
bool snrThresholdReached;
int32_t dynamicDistanceThreshold;
int16_t snr;
} rangefinder_t; } rangefinder_t;
extern rangefinder_t rangefinder; extern rangefinder_t rangefinder;