Copter: implement simple position hold during autotune
this holds position during tuning with low gain
This commit is contained in:
parent
2b43c6aeed
commit
37fca03db3
@ -822,6 +822,7 @@ private:
|
|||||||
void autotune_updating_p_up(float &tune_p, float tune_p_max, float tune_p_step_ratio, float target, float measurement_max);
|
void autotune_updating_p_up(float &tune_p, float tune_p_max, float tune_p_step_ratio, float target, float measurement_max);
|
||||||
void autotune_updating_p_up_d_down(float &tune_d, float tune_d_min, float tune_d_step_ratio, float &tune_p, float tune_p_min, float tune_p_max, float tune_p_step_ratio, float target, float measurement_min, float measurement_max);
|
void autotune_updating_p_up_d_down(float &tune_d, float tune_d_min, float tune_d_step_ratio, float &tune_p, float tune_p_min, float tune_p_max, float tune_p_step_ratio, float target, float measurement_min, float measurement_max);
|
||||||
void autotune_twitching_measure_acceleration(float &rate_of_change, float rate_measurement, float &rate_measurement_max);
|
void autotune_twitching_measure_acceleration(float &rate_of_change, float rate_measurement, float &rate_measurement_max);
|
||||||
|
void autotune_get_poshold_attitude(float &roll_cd, float &pitch_cd);
|
||||||
void avoidance_adsb_update(void);
|
void avoidance_adsb_update(void);
|
||||||
#if ADVANCED_FAILSAFE == ENABLED
|
#if ADVANCED_FAILSAFE == ENABLED
|
||||||
void afs_fs_check(void);
|
void afs_fs_check(void);
|
||||||
|
@ -122,7 +122,7 @@ enum AutoTuneTuneType {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// autotune_state_struct - hold state flags
|
// autotune_state_struct - hold state flags
|
||||||
struct autotune_state_struct {
|
static struct autotune_state_struct {
|
||||||
AutoTuneTuneMode mode : 2; // see AutoTuneTuneMode for what modes are allowed
|
AutoTuneTuneMode mode : 2; // see AutoTuneTuneMode for what modes are allowed
|
||||||
uint8_t pilot_override : 1; // 1 = pilot is overriding controls so we suspend tuning temporarily
|
uint8_t pilot_override : 1; // 1 = pilot is overriding controls so we suspend tuning temporarily
|
||||||
AutoTuneAxisType axis : 2; // see AutoTuneAxisType for which things can be tuned
|
AutoTuneAxisType axis : 2; // see AutoTuneAxisType for which things can be tuned
|
||||||
@ -130,6 +130,8 @@ struct autotune_state_struct {
|
|||||||
AutoTuneStepType step : 2; // see AutoTuneStepType for what steps are performed
|
AutoTuneStepType step : 2; // see AutoTuneStepType for what steps are performed
|
||||||
AutoTuneTuneType tune_type : 3; // see AutoTuneTuneType
|
AutoTuneTuneType tune_type : 3; // see AutoTuneTuneType
|
||||||
uint8_t ignore_next : 1; // 1 = ignore the next test
|
uint8_t ignore_next : 1; // 1 = ignore the next test
|
||||||
|
bool have_position : 1;
|
||||||
|
Vector3f start_position;
|
||||||
} autotune_state;
|
} autotune_state;
|
||||||
|
|
||||||
// variables
|
// variables
|
||||||
@ -249,6 +251,8 @@ bool Copter::autotune_start(bool ignore_checks)
|
|||||||
pos_control->set_desired_velocity_z(inertial_nav.get_velocity_z());
|
pos_control->set_desired_velocity_z(inertial_nav.get_velocity_z());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
autotune_state.have_position = false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,6 +324,7 @@ void Copter::autotune_run()
|
|||||||
}
|
}
|
||||||
// reset pilot override time
|
// reset pilot override time
|
||||||
autotune_override_time = millis();
|
autotune_override_time = millis();
|
||||||
|
autotune_state.have_position = false;
|
||||||
}else if (autotune_state.pilot_override) {
|
}else if (autotune_state.pilot_override) {
|
||||||
// check if we should resume tuning after pilot's override
|
// check if we should resume tuning after pilot's override
|
||||||
if (millis() - autotune_override_time > AUTOTUNE_PILOT_OVERRIDE_TIMEOUT_MS) {
|
if (millis() - autotune_override_time > AUTOTUNE_PILOT_OVERRIDE_TIMEOUT_MS) {
|
||||||
@ -363,8 +368,11 @@ void Copter::autotune_attitude_control()
|
|||||||
// re-enable rate limits
|
// re-enable rate limits
|
||||||
attitude_control->use_ff_and_input_shaping(true);
|
attitude_control->use_ff_and_input_shaping(true);
|
||||||
|
|
||||||
|
float autotune_roll_cd, autotune_pitch_cd;
|
||||||
|
autotune_get_poshold_attitude(autotune_roll_cd, autotune_pitch_cd);
|
||||||
|
|
||||||
// hold level attitude
|
// hold level attitude
|
||||||
attitude_control->input_euler_angle_roll_pitch_yaw( 0.0f, 0.0f, autotune_desired_yaw, true, get_smoothing_gain());
|
attitude_control->input_euler_angle_roll_pitch_yaw(autotune_roll_cd, autotune_pitch_cd, autotune_desired_yaw, true, get_smoothing_gain());
|
||||||
|
|
||||||
// hold the copter level for 0.5 seconds before we begin a twitch
|
// hold the copter level for 0.5 seconds before we begin a twitch
|
||||||
// reset counter if we are no longer level
|
// reset counter if we are no longer level
|
||||||
@ -1321,4 +1329,38 @@ void Copter::autotune_twitching_measure_acceleration(float &rate_of_change, floa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get attitude for slow position hold in autotune mode
|
||||||
|
void Copter::autotune_get_poshold_attitude(float &roll_cd, float &pitch_cd)
|
||||||
|
{
|
||||||
|
roll_cd = pitch_cd = 0;
|
||||||
|
if (!autotune_state.have_position) {
|
||||||
|
if (!position_ok()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
autotune_state.have_position = true;
|
||||||
|
autotune_state.start_position = inertial_nav.get_position();
|
||||||
|
}
|
||||||
|
|
||||||
|
const float dist_limit_cm = 3000;
|
||||||
|
const float angle_max_cd = aparm.angle_max;
|
||||||
|
Vector3f pdiff = inertial_nav.get_position() - autotune_state.start_position;
|
||||||
|
pdiff.z = 0;
|
||||||
|
float dist_cm = pdiff.length();
|
||||||
|
if (dist_cm < 10) {
|
||||||
|
// don't do anything within 10cm
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
very simple linear controller
|
||||||
|
*/
|
||||||
|
float scaling = constrain_float(angle_max_cd * dist_cm / dist_limit_cm, 0, angle_max_cd);
|
||||||
|
Vector2f angle_ne(pdiff.x, pdiff.y);
|
||||||
|
angle_ne *= scaling / dist_cm;
|
||||||
|
|
||||||
|
// rotate into body frame
|
||||||
|
pitch_cd = angle_ne.x * ahrs.cos_yaw() + angle_ne.y * ahrs.sin_yaw();
|
||||||
|
roll_cd = angle_ne.x * ahrs.sin_yaw() - angle_ne.y * ahrs.cos_yaw();
|
||||||
|
}
|
||||||
|
|
||||||
#endif // AUTOTUNE_ENABLED == ENABLED
|
#endif // AUTOTUNE_ENABLED == ENABLED
|
||||||
|
Loading…
Reference in New Issue
Block a user