@@ -25,6 +25,8 @@ void NavEKF3_core::readRangeFinder(void)
25
25
if (_rng == nullptr ) {
26
26
return ;
27
27
}
28
+
29
+ // update global range-on-ground, used for all rangefinders
28
30
rngOnGnd = MAX (_rng->ground_clearance_orient (ROTATION_PITCH_270), 0 .05f );
29
31
30
32
// limit update rate to maximum allowed by data buffers
@@ -35,23 +37,35 @@ void NavEKF3_core::readRangeFinder(void)
35
37
36
38
// store samples and sample time into a ring buffer if valid
37
39
// use data from two range finders if available
38
-
40
+ float range_distance = 0 . 0f ;
39
41
for (uint8_t sensorIndex = 0 ; sensorIndex < ARRAY_SIZE (rngMeasIndex); sensorIndex++) {
40
42
const auto *sensor = _rng->get_backend (sensorIndex);
41
43
if (sensor == nullptr ) {
42
44
continue ;
43
45
}
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;
51
56
} else {
57
+ // ignore out-of-range data
52
58
continue ;
53
59
}
54
60
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
+
55
69
// check for three fresh samples
56
70
bool sampleFresh[DOWNWARD_RANGEFINDER_MAX_INSTANCES][3 ] = {};
57
71
for (uint8_t index = 0 ; index <= 2 ; index++) {
@@ -91,18 +105,6 @@ void NavEKF3_core::readRangeFinder(void)
91
105
92
106
// indicate we have updated the measurement
93
107
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
-
106
108
}
107
109
}
108
110
}
0 commit comments