mirror of https://github.com/ArduPilot/ardupilot
Plane: ask flight mode if min/max throttle limits should be applied
This commit is contained in:
parent
17fb9455a9
commit
01c8717308
|
@ -1095,6 +1095,7 @@ private:
|
||||||
// servos.cpp
|
// servos.cpp
|
||||||
void set_servos_idle(void);
|
void set_servos_idle(void);
|
||||||
void set_servos();
|
void set_servos();
|
||||||
|
float apply_throttle_limits(float throttle_in);
|
||||||
void set_throttle(void);
|
void set_throttle(void);
|
||||||
void set_takeoff_expected(void);
|
void set_takeoff_expected(void);
|
||||||
void set_servos_old_elevons(void);
|
void set_servos_old_elevons(void);
|
||||||
|
|
|
@ -258,3 +258,35 @@ void Mode::output_rudder_and_steering(float val)
|
||||||
SRV_Channels::set_output_scaled(SRV_Channel::k_rudder, val);
|
SRV_Channels::set_output_scaled(SRV_Channel::k_rudder, val);
|
||||||
SRV_Channels::set_output_scaled(SRV_Channel::k_steering, val);
|
SRV_Channels::set_output_scaled(SRV_Channel::k_steering, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// true if throttle min/max limits should be applied
|
||||||
|
bool Mode::use_throttle_limits() const
|
||||||
|
{
|
||||||
|
#if AP_SCRIPTING_ENABLED
|
||||||
|
if (plane.nav_scripting_active()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (this == &plane.mode_stabilize ||
|
||||||
|
this == &plane.mode_training ||
|
||||||
|
this == &plane.mode_acro ||
|
||||||
|
this == &plane.mode_fbwa ||
|
||||||
|
this == &plane.mode_autotune) {
|
||||||
|
// a manual throttle mode
|
||||||
|
return !plane.g.throttle_passthru_stabilize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_guided_mode() && plane.guided_throttle_passthru) {
|
||||||
|
// manual pass through of throttle while in GUIDED
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if HAL_QUADPLANE_ENABLED
|
||||||
|
if (quadplane.in_vtol_mode()) {
|
||||||
|
return quadplane.allow_forward_throttle_in_vtol_mode();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -135,6 +135,8 @@ public:
|
||||||
// true if is taking
|
// true if is taking
|
||||||
virtual bool is_taking_off() const;
|
virtual bool is_taking_off() const;
|
||||||
|
|
||||||
|
// true if throttle min/max limits should be applied
|
||||||
|
bool use_throttle_limits() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
|
@ -495,11 +495,11 @@ void Plane::throttle_watt_limiter(int8_t &min_throttle, int8_t &max_throttle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // #if AP_BATTERY_WATT_MAX_ENABLED
|
#endif // #if AP_BATTERY_WATT_MAX_ENABLED
|
||||||
|
|
||||||
/*
|
/*
|
||||||
setup output channels all non-manual modes
|
Apply min/max limits to throttle
|
||||||
*/
|
*/
|
||||||
void Plane::set_throttle(void)
|
float Plane::apply_throttle_limits(float throttle_in)
|
||||||
{
|
{
|
||||||
// convert 0 to 100% (or -100 to +100) into PWM
|
// convert 0 to 100% (or -100 to +100) into PWM
|
||||||
int8_t min_throttle = aparm.throttle_min.get();
|
int8_t min_throttle = aparm.throttle_min.get();
|
||||||
|
@ -531,7 +531,6 @@ void Plane::set_throttle(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// compensate for battery voltage drop
|
// compensate for battery voltage drop
|
||||||
g2.fwd_batt_cmp.update();
|
|
||||||
g2.fwd_batt_cmp.apply_min_max(min_throttle, max_throttle);
|
g2.fwd_batt_cmp.apply_min_max(min_throttle, max_throttle);
|
||||||
|
|
||||||
#if AP_BATTERY_WATT_MAX_ENABLED
|
#if AP_BATTERY_WATT_MAX_ENABLED
|
||||||
|
@ -539,6 +538,15 @@ void Plane::set_throttle(void)
|
||||||
throttle_watt_limiter(min_throttle, max_throttle);
|
throttle_watt_limiter(min_throttle, max_throttle);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return constrain_float(throttle_in, min_throttle, max_throttle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
setup output channels all non-manual modes
|
||||||
|
*/
|
||||||
|
void Plane::set_throttle(void)
|
||||||
|
{
|
||||||
|
|
||||||
if (!arming.is_armed_and_safety_off()) {
|
if (!arming.is_armed_and_safety_off()) {
|
||||||
// Always set 0 scaled even if overriding to zero pwm.
|
// Always set 0 scaled even if overriding to zero pwm.
|
||||||
// This ensures slew limits and other functions using the scaled value pick up in the correct place
|
// This ensures slew limits and other functions using the scaled value pick up in the correct place
|
||||||
|
@ -571,6 +579,9 @@ void Plane::set_throttle(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update voltage scaling
|
||||||
|
g2.fwd_batt_cmp.update();
|
||||||
|
|
||||||
#if AP_SCRIPTING_ENABLED
|
#if AP_SCRIPTING_ENABLED
|
||||||
if (nav_scripting_active()) {
|
if (nav_scripting_active()) {
|
||||||
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, plane.nav_scripting.throttle_pct);
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, plane.nav_scripting.throttle_pct);
|
||||||
|
@ -588,8 +599,7 @@ void Plane::set_throttle(void)
|
||||||
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, get_throttle_input(true));
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, get_throttle_input(true));
|
||||||
} else {
|
} else {
|
||||||
// get throttle, but adjust center to output TRIM_THROTTLE if flight option set
|
// get throttle, but adjust center to output TRIM_THROTTLE if flight option set
|
||||||
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle,
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, get_adjusted_throttle_input(true));
|
||||||
constrain_int16(get_adjusted_throttle_input(true), min_throttle, max_throttle));
|
|
||||||
}
|
}
|
||||||
} else if (control_mode->is_guided_mode() &&
|
} else if (control_mode->is_guided_mode() &&
|
||||||
guided_throttle_passthru) {
|
guided_throttle_passthru) {
|
||||||
|
@ -600,17 +610,22 @@ void Plane::set_throttle(void)
|
||||||
float fwd_thr = 0;
|
float fwd_thr = 0;
|
||||||
// if enabled ask quadplane code for forward throttle
|
// if enabled ask quadplane code for forward throttle
|
||||||
if (quadplane.allow_forward_throttle_in_vtol_mode()) {
|
if (quadplane.allow_forward_throttle_in_vtol_mode()) {
|
||||||
fwd_thr = constrain_float(quadplane.forward_throttle_pct(), min_throttle, max_throttle);
|
fwd_thr = quadplane.forward_throttle_pct();
|
||||||
}
|
}
|
||||||
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, fwd_thr);
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, fwd_thr);
|
||||||
#endif // HAL_QUADPLANE_ENABLED
|
#endif // HAL_QUADPLANE_ENABLED
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Apply min/max limits and voltage compensation to throttle output from flight mode
|
// Apply voltage compensation to throttle output from flight mode
|
||||||
const float throttle = g2.fwd_batt_cmp.apply_throttle(SRV_Channels::get_output_scaled(SRV_Channel::k_throttle));
|
const float throttle = g2.fwd_batt_cmp.apply_throttle(SRV_Channels::get_output_scaled(SRV_Channel::k_throttle));
|
||||||
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, constrain_float(throttle, min_throttle, max_throttle));
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, throttle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (control_mode->use_throttle_limits()) {
|
||||||
|
// Apply min/max throttle limits
|
||||||
|
const float limited_throttle = apply_throttle_limits(SRV_Channels::get_output_scaled(SRV_Channel::k_throttle));
|
||||||
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, limited_throttle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue