mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-09 09:28:31 -04:00
Plane: store auto land slope
- also changed order of landing slope calc but is functionally the same
This commit is contained in:
parent
034cd2413e
commit
f048aafb76
@ -507,6 +507,9 @@ private:
|
|||||||
// time stamp of when we start flying while in auto mode in milliseconds
|
// time stamp of when we start flying while in auto mode in milliseconds
|
||||||
uint32_t started_flying_in_auto_ms;
|
uint32_t started_flying_in_auto_ms;
|
||||||
|
|
||||||
|
// calculated approach slope during auto-landing: ((prev_WP_loc.alt - next_WP_loc.alt)*0.01f - aparm.land_flare_sec * sink_rate) / get_distance(prev_WP_loc, next_WP_loc)
|
||||||
|
float land_slope;
|
||||||
|
|
||||||
// barometric altitude at start of takeoff
|
// barometric altitude at start of takeoff
|
||||||
float baro_takeoff_alt;
|
float baro_takeoff_alt;
|
||||||
|
|
||||||
|
@ -393,6 +393,8 @@ void Plane::do_land(const AP_Mission::Mission_Command& cmd)
|
|||||||
auto_state.takeoff_pitch_cd = 1000;
|
auto_state.takeoff_pitch_cd = 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto_state.land_slope = 0;
|
||||||
|
|
||||||
#if RANGEFINDER_ENABLED == ENABLED
|
#if RANGEFINDER_ENABLED == ENABLED
|
||||||
// zero rangefinder state, start to accumulate good samples now
|
// zero rangefinder state, start to accumulate good samples now
|
||||||
memset(&rangefinder_state, 0, sizeof(rangefinder_state));
|
memset(&rangefinder_state, 0, sizeof(rangefinder_state));
|
||||||
|
@ -196,12 +196,6 @@ void Plane::adjust_landing_slope_for_rangefinder_bump(void)
|
|||||||
*/
|
*/
|
||||||
void Plane::setup_landing_glide_slope(void)
|
void Plane::setup_landing_glide_slope(void)
|
||||||
{
|
{
|
||||||
Location loc = next_WP_loc;
|
|
||||||
|
|
||||||
// project a point 500 meters past the landing point, passing
|
|
||||||
// through the landing point
|
|
||||||
const float land_projection = 500;
|
|
||||||
int32_t land_bearing_cd = get_bearing_cd(prev_WP_loc, next_WP_loc);
|
|
||||||
float total_distance = get_distance(prev_WP_loc, next_WP_loc);
|
float total_distance = get_distance(prev_WP_loc, next_WP_loc);
|
||||||
|
|
||||||
// If someone mistakenly puts all 0's in their LAND command then total_distance
|
// If someone mistakenly puts all 0's in their LAND command then total_distance
|
||||||
@ -239,6 +233,14 @@ void Plane::setup_landing_glide_slope(void)
|
|||||||
aim_height = g.land_flare_alt*2;
|
aim_height = g.land_flare_alt*2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// calculate slope to landing point
|
||||||
|
bool is_first_calc = is_zero(auto_state.land_slope);
|
||||||
|
auto_state.land_slope = (sink_height - aim_height) / total_distance;
|
||||||
|
if (is_first_calc) {
|
||||||
|
gcs_send_text_fmt(MAV_SEVERITY_INFO, "Landing glide slope %.1f degrees", (double)degrees(atanf(auto_state.land_slope)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// time before landing that we will flare
|
// time before landing that we will flare
|
||||||
float flare_time = aim_height / SpdHgt_Controller->get_land_sinkrate();
|
float flare_time = aim_height / SpdHgt_Controller->get_land_sinkrate();
|
||||||
|
|
||||||
@ -251,17 +253,20 @@ void Plane::setup_landing_glide_slope(void)
|
|||||||
flare_distance = total_distance/2;
|
flare_distance = total_distance/2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// project a point 500 meters past the landing point, passing
|
||||||
|
// through the landing point
|
||||||
|
const float land_projection = 500;
|
||||||
|
int32_t land_bearing_cd = get_bearing_cd(prev_WP_loc, next_WP_loc);
|
||||||
|
|
||||||
// now calculate our aim point, which is before the landing
|
// now calculate our aim point, which is before the landing
|
||||||
// point and above it
|
// point and above it
|
||||||
|
Location loc = next_WP_loc;
|
||||||
location_update(loc, land_bearing_cd*0.01f, -flare_distance);
|
location_update(loc, land_bearing_cd*0.01f, -flare_distance);
|
||||||
loc.alt += aim_height*100;
|
loc.alt += aim_height*100;
|
||||||
|
|
||||||
// calculate slope to landing point
|
|
||||||
float land_slope = (sink_height - aim_height) / total_distance;
|
|
||||||
|
|
||||||
// calculate point along that slope 500m ahead
|
// calculate point along that slope 500m ahead
|
||||||
location_update(loc, land_bearing_cd*0.01f, land_projection);
|
location_update(loc, land_bearing_cd*0.01f, land_projection);
|
||||||
loc.alt -= land_slope * land_projection * 100;
|
loc.alt -= auto_state.land_slope * land_projection * 100;
|
||||||
|
|
||||||
// setup the offset_cm for set_target_altitude_proportion()
|
// setup the offset_cm for set_target_altitude_proportion()
|
||||||
target_altitude.offset_cm = loc.alt - prev_WP_loc.alt;
|
target_altitude.offset_cm = loc.alt - prev_WP_loc.alt;
|
||||||
|
Loading…
Reference in New Issue
Block a user