mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-23 16:23:56 -04:00
AC_AttitudeControl: move in throttle vs attitude prioritisation
Previously this prioritisation of throttle vs attitude was done in the AP_Motors library
This commit is contained in:
parent
0870ce9fc1
commit
1fb4c12cd0
@ -42,6 +42,12 @@
|
|||||||
|
|
||||||
#define AC_ATTITUDE_CONTROL_ALTHOLD_LEANANGLE_FILT_HZ 1.0f // filter (in hz) of throttle filter used to limit lean angle so that vehicle does not lose altitude
|
#define AC_ATTITUDE_CONTROL_ALTHOLD_LEANANGLE_FILT_HZ 1.0f // filter (in hz) of throttle filter used to limit lean angle so that vehicle does not lose altitude
|
||||||
|
|
||||||
|
#define AC_ATTITUDE_CONTROL_MIN_DEFAULT 0.1f // minimum throttle mix
|
||||||
|
#define AC_ATTITUDE_CONTROL_MID_DEFAULT 0.5f // manual throttle mix
|
||||||
|
#define AC_ATTITUDE_CONTROL_MAX_DEFAULT 0.5f // maximum throttle mix default
|
||||||
|
|
||||||
|
#define AC_ATTITUDE_CONTROL_THR_MIX_DEFAULT 0.5f // ratio controlling the max throttle output during competing requests of low throttle from the pilot (or autopilot) and higher throttle for attitude control. Higher favours Attitude over pilot input
|
||||||
|
|
||||||
class AC_AttitudeControl {
|
class AC_AttitudeControl {
|
||||||
public:
|
public:
|
||||||
AC_AttitudeControl( AP_AHRS &ahrs,
|
AC_AttitudeControl( AP_AHRS &ahrs,
|
||||||
@ -55,6 +61,8 @@ public:
|
|||||||
_angle_boost(0),
|
_angle_boost(0),
|
||||||
_att_ctrl_use_accel_limit(true),
|
_att_ctrl_use_accel_limit(true),
|
||||||
_throttle_in_filt(AC_ATTITUDE_CONTROL_ALTHOLD_LEANANGLE_FILT_HZ),
|
_throttle_in_filt(AC_ATTITUDE_CONTROL_ALTHOLD_LEANANGLE_FILT_HZ),
|
||||||
|
_throttle_rpy_mix_desired(AC_ATTITUDE_CONTROL_THR_MIX_DEFAULT),
|
||||||
|
_throttle_rpy_mix(AC_ATTITUDE_CONTROL_THR_MIX_DEFAULT),
|
||||||
_ahrs(ahrs),
|
_ahrs(ahrs),
|
||||||
_aparm(aparm),
|
_aparm(aparm),
|
||||||
_motors(motors)
|
_motors(motors)
|
||||||
@ -346,6 +354,9 @@ protected:
|
|||||||
// Filtered throttle input - used to limit lean angle when throttle is saturated
|
// Filtered throttle input - used to limit lean angle when throttle is saturated
|
||||||
LowPassFilterFloat _throttle_in_filt;
|
LowPassFilterFloat _throttle_in_filt;
|
||||||
|
|
||||||
|
float _throttle_rpy_mix_desired; // desired throttle_low_comp value, actual throttle_low_comp is slewed towards this value over 1~2 seconds
|
||||||
|
float _throttle_rpy_mix; // mix between throttle and hover throttle for 0 to 1 and ratio above hover throttle for >1
|
||||||
|
|
||||||
// References to external libraries
|
// References to external libraries
|
||||||
const AP_AHRS& _ahrs;
|
const AP_AHRS& _ahrs;
|
||||||
const AP_Vehicle::MultiCopter &_aparm;
|
const AP_Vehicle::MultiCopter &_aparm;
|
||||||
|
@ -120,6 +120,20 @@ const AP_Param::GroupInfo AC_AttitudeControl_Multi::var_info[] = {
|
|||||||
// @Units: Hz
|
// @Units: Hz
|
||||||
AP_SUBGROUPINFO(_pid_rate_yaw, "RAT_YAW_", 3, AC_AttitudeControl_Multi, AC_PID),
|
AP_SUBGROUPINFO(_pid_rate_yaw, "RAT_YAW_", 3, AC_AttitudeControl_Multi, AC_PID),
|
||||||
|
|
||||||
|
// @Param: THR_MIX_MIN
|
||||||
|
// @DisplayName: Throttle Mix Minimum
|
||||||
|
// @Description: Throttle vs attitude control prioritisation used when landing (higher values mean we prioritise attitude control over throttle)
|
||||||
|
// @Range: 0.1 0.25
|
||||||
|
// @User: Advanced
|
||||||
|
AP_GROUPINFO("THR_MIX_MIN", 4, AC_AttitudeControl_Multi, _thr_mix_min, AC_ATTITUDE_CONTROL_MIN_DEFAULT),
|
||||||
|
|
||||||
|
// @Param: THR_MIX_MAX
|
||||||
|
// @DisplayName: Throttle Mix Maximum
|
||||||
|
// @Description: Throttle vs attitude control prioritisation used during active flight (higher values mean we prioritise attitude control over throttle)
|
||||||
|
// @Range: 0.5 0.9
|
||||||
|
// @User: Advanced
|
||||||
|
AP_GROUPINFO("THR_MIX_MAX", 5, AC_AttitudeControl_Multi, _thr_mix_max, AC_ATTITUDE_CONTROL_MAX_DEFAULT),
|
||||||
|
|
||||||
AP_GROUPEND
|
AP_GROUPEND
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -153,12 +167,14 @@ void AC_AttitudeControl_Multi::set_throttle_out(float throttle_in, bool apply_an
|
|||||||
_throttle_in_filt.apply(throttle_in, _dt);
|
_throttle_in_filt.apply(throttle_in, _dt);
|
||||||
_motors.set_throttle_filter_cutoff(filter_cutoff);
|
_motors.set_throttle_filter_cutoff(filter_cutoff);
|
||||||
if (apply_angle_boost) {
|
if (apply_angle_boost) {
|
||||||
_motors.set_throttle(get_throttle_boosted(throttle_in));
|
// Apply angle boost
|
||||||
|
throttle_in = get_throttle_boosted(throttle_in);
|
||||||
}else{
|
}else{
|
||||||
_motors.set_throttle(throttle_in);
|
|
||||||
// Clear angle_boost for logging purposes
|
// Clear angle_boost for logging purposes
|
||||||
_angle_boost = 0.0f;
|
_angle_boost = 0.0f;
|
||||||
}
|
}
|
||||||
|
_motors.set_throttle(throttle_in);
|
||||||
|
_motors.set_throttle_ave_max(get_throttle_ave_max(throttle_in));
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns a throttle including compensation for roll/pitch angle
|
// returns a throttle including compensation for roll/pitch angle
|
||||||
@ -180,3 +196,24 @@ float AC_AttitudeControl_Multi::get_throttle_boosted(float throttle_in)
|
|||||||
_angle_boost = constrain_float(throttle_out - throttle_in,-1.0f,1.0f);
|
_angle_boost = constrain_float(throttle_out - throttle_in,-1.0f,1.0f);
|
||||||
return throttle_out;
|
return throttle_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns a throttle including compensation for roll/pitch angle
|
||||||
|
// throttle value should be 0 ~ 1
|
||||||
|
float AC_AttitudeControl_Multi::get_throttle_ave_max(float throttle_in)
|
||||||
|
{
|
||||||
|
return MAX(throttle_in, throttle_in*MAX(0.0f,1.0f-_throttle_rpy_mix)+_motors.get_throttle_hover()*_throttle_rpy_mix);
|
||||||
|
}
|
||||||
|
|
||||||
|
// update_throttle_rpy_mix - slew set_throttle_rpy_mix to requested value
|
||||||
|
void AC_AttitudeControl_Multi::update_throttle_rpy_mix()
|
||||||
|
{
|
||||||
|
// slew _throttle_rpy_mix to _throttle_rpy_mix_desired
|
||||||
|
if (_throttle_rpy_mix < _throttle_rpy_mix_desired) {
|
||||||
|
// increase quickly (i.e. from 0.1 to 0.9 in 0.4 seconds)
|
||||||
|
_throttle_rpy_mix += MIN(2.0f*_dt, _throttle_rpy_mix_desired-_throttle_rpy_mix);
|
||||||
|
} else if (_throttle_rpy_mix > _throttle_rpy_mix_desired) {
|
||||||
|
// reduce more slowly (from 0.9 to 0.1 in 1.6 seconds)
|
||||||
|
_throttle_rpy_mix -= MIN(0.5f*_dt, _throttle_rpy_mix-_throttle_rpy_mix_desired);
|
||||||
|
}
|
||||||
|
_throttle_rpy_mix = constrain_float(_throttle_rpy_mix, 0.1f, 1.0f);
|
||||||
|
}
|
||||||
|
@ -52,7 +52,7 @@ public:
|
|||||||
AC_PID& get_rate_pitch_pid() { return _pid_rate_pitch; }
|
AC_PID& get_rate_pitch_pid() { return _pid_rate_pitch; }
|
||||||
AC_PID& get_rate_yaw_pid() { return _pid_rate_yaw; }
|
AC_PID& get_rate_yaw_pid() { return _pid_rate_yaw; }
|
||||||
|
|
||||||
// get lean angle max for pilot input that prioritises altitude hold over lean angle
|
// get lean angle max for pilot input that prioritizes altitude hold over lean angle
|
||||||
float get_althold_lean_angle_max() const;
|
float get_althold_lean_angle_max() const;
|
||||||
|
|
||||||
// Set output throttle
|
// Set output throttle
|
||||||
@ -61,13 +61,33 @@ public:
|
|||||||
// calculate total body frame throttle required to produce the given earth frame throttle
|
// calculate total body frame throttle required to produce the given earth frame throttle
|
||||||
float get_throttle_boosted(float throttle_in);
|
float get_throttle_boosted(float throttle_in);
|
||||||
|
|
||||||
|
// calculate total body frame throttle required to produce the given earth frame throttle
|
||||||
|
float get_throttle_ave_max(float throttle_in);
|
||||||
|
|
||||||
|
// set desired throttle vs attitude mixing (actual mix is slewed towards this value over 1~2 seconds)
|
||||||
|
// low values favour pilot/autopilot throttle over attitude control, high values favour attitude control over throttle
|
||||||
|
// has no effect when throttle is above hover throttle
|
||||||
|
void set_throttle_mix_min() { _throttle_rpy_mix_desired = _thr_mix_min; }
|
||||||
|
void set_throttle_mix_mid() { _throttle_rpy_mix_desired = AC_ATTITUDE_CONTROL_MID_DEFAULT; }
|
||||||
|
void set_throttle_mix_max() { _throttle_rpy_mix_desired = _thr_mix_max; }
|
||||||
|
|
||||||
|
// get_throttle_rpy_mix - get low throttle compensation value
|
||||||
|
bool is_throttle_mix_min() const { return (_throttle_rpy_mix < 1.25f*_thr_mix_min); }
|
||||||
|
|
||||||
|
|
||||||
// user settable parameters
|
// user settable parameters
|
||||||
static const struct AP_Param::GroupInfo var_info[];
|
static const struct AP_Param::GroupInfo var_info[];
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
// update_throttle_rpy_mix - updates thr_low_comp value towards the target
|
||||||
|
void update_throttle_rpy_mix();
|
||||||
|
|
||||||
AP_MotorsMulticopter& _motors_multi;
|
AP_MotorsMulticopter& _motors_multi;
|
||||||
AC_PID _pid_rate_roll;
|
AC_PID _pid_rate_roll;
|
||||||
AC_PID _pid_rate_pitch;
|
AC_PID _pid_rate_pitch;
|
||||||
AC_PID _pid_rate_yaw;
|
AC_PID _pid_rate_yaw;
|
||||||
|
|
||||||
|
AP_Float _thr_mix_min; // throttle vs attitude control prioritisation used when landing (higher values mean we prioritise attitude control over throttle)
|
||||||
|
AP_Float _thr_mix_max; // throttle vs attitude control prioritisation used during active flight (higher values mean we prioritise attitude control over throttle)
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user