Plane: added rangefinder correction by terrain data

allows for landing approach with terrain changes
This commit is contained in:
Andrew Tridgell 2019-04-06 15:53:16 +11:00
parent c8b547a8e4
commit 1b775c96f5
2 changed files with 25 additions and 0 deletions

View File

@ -863,6 +863,7 @@ private:
float lookahead_adjustment(void);
float rangefinder_correction(void);
void rangefinder_height_update(void);
void rangefinder_terrain_correction(float &height);
void set_next_WP(const struct Location &loc);
void set_guided_WP(void);
void update_home();

View File

@ -576,6 +576,28 @@ float Plane::rangefinder_correction(void)
return rangefinder_state.correction;
}
/*
correct rangefinder data for terrain height difference between
NAV_LAND point and current location
*/
void Plane::rangefinder_terrain_correction(float &height)
{
#if AP_TERRAIN_AVAILABLE
if (!g.rangefinder_landing ||
flight_stage != AP_Vehicle::FixedWing::FLIGHT_LAND ||
g.terrain_follow == 0) {
return;
}
float terrain_amsl1, terrain_amsl2;
if (!terrain.height_amsl(current_loc, terrain_amsl1, false) ||
!terrain.height_amsl(next_WP_loc, terrain_amsl2, false)) {
return;
}
float correction = (terrain_amsl1 - terrain_amsl2);
height += correction;
#endif
}
/*
update the offset between rangefinder height and terrain height
*/
@ -592,6 +614,8 @@ void Plane::rangefinder_height_update(void)
// is cos(roll)*cos(pitch))
rangefinder_state.height_estimate = distance * ahrs.get_rotation_body_to_ned().c.z;
rangefinder_terrain_correction(rangefinder_state.height_estimate);
// we consider ourselves to be fully in range when we have 10
// good samples (0.2s) that are different by 5% of the maximum
// range from the initial range we see. The 5% change is to