Skip to content

Commit 6856467

Browse files
committed
AP_NavEKF3: ground clearance fusion fix
1 parent 511e8d8 commit 6856467

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

libraries/AP_NavEKF3/AP_NavEKF3_Measurements.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ void NavEKF3_core::readRangeFinder(void)
2525
if (_rng == nullptr) {
2626
return;
2727
}
28+
29+
// update global range-on-ground, used for all rangefinders
2830
rngOnGnd = MAX(_rng->ground_clearance_orient(ROTATION_PITCH_270), 0.05f);
2931

3032
// limit update rate to maximum allowed by data buffers
@@ -35,23 +37,35 @@ void NavEKF3_core::readRangeFinder(void)
3537

3638
// store samples and sample time into a ring buffer if valid
3739
// use data from two range finders if available
38-
40+
float range_distance = 0.0f;
3941
for (uint8_t sensorIndex = 0; sensorIndex < ARRAY_SIZE(rngMeasIndex); sensorIndex++) {
4042
const auto *sensor = _rng->get_backend(sensorIndex);
4143
if (sensor == nullptr) {
4244
continue;
4345
}
44-
if ((sensor->orientation() == ROTATION_PITCH_270) && (sensor->status() == AP_DAL_RangeFinder::Status::Good)) {
45-
rngMeasIndex[sensorIndex] ++;
46-
if (rngMeasIndex[sensorIndex] > 2) {
47-
rngMeasIndex[sensorIndex] = 0;
48-
}
49-
storedRngMeasTime_ms[sensorIndex][rngMeasIndex[sensorIndex]] = imuSampleTime_ms - 25;
50-
storedRngMeas[sensorIndex][rngMeasIndex[sensorIndex]] = sensor->distance();
46+
if (sensor->orientation() != ROTATION_PITCH_270) {
47+
// only consume downward facing rangefinder data
48+
continue;
49+
}
50+
if (sensor->status() == AP_DAL_RangeFinder::Status::Good) {
51+
// get the current range measurement
52+
range_distance = sensor->distance();
53+
} else if (onGround && sensor->status() == AP_DAL_RangeFinder::Status::OutOfRangeLow) {
54+
// use ground clearange range if on ground
55+
range_distance = rngOnGnd;
5156
} else {
57+
// ignore out-of-range data
5258
continue;
5359
}
5460

61+
// place distance in the range data buffer
62+
rngMeasIndex[sensorIndex]++;
63+
if (rngMeasIndex[sensorIndex] > 2) {
64+
rngMeasIndex[sensorIndex] = 0;
65+
}
66+
storedRngMeasTime_ms[sensorIndex][rngMeasIndex[sensorIndex]] = imuSampleTime_ms - 25;
67+
storedRngMeas[sensorIndex][rngMeasIndex[sensorIndex]] = range_distance;
68+
5569
// check for three fresh samples
5670
bool sampleFresh[DOWNWARD_RANGEFINDER_MAX_INSTANCES][3] = {};
5771
for (uint8_t index = 0; index <= 2; index++) {
@@ -91,18 +105,6 @@ void NavEKF3_core::readRangeFinder(void)
91105

92106
// indicate we have updated the measurement
93107
rngValidMeaTime_ms = imuSampleTime_ms;
94-
95-
} else if (onGround && ((imuSampleTime_ms - rngValidMeaTime_ms) > 200)) {
96-
// before takeoff we assume on-ground range value if there is no data
97-
rangeDataNew.time_ms = imuSampleTime_ms;
98-
rangeDataNew.rng = rngOnGnd;
99-
100-
// write data to buffer with time stamp to be fused when the fusion time horizon catches up with it
101-
storedRange.push(rangeDataNew);
102-
103-
// indicate we have updated the measurement
104-
rngValidMeaTime_ms = imuSampleTime_ms;
105-
106108
}
107109
}
108110
}

0 commit comments

Comments
 (0)