mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-10 18:03:56 -04:00
Copter: make libraries get EKF control limits themselves
This commit is contained in:
parent
3faf7824c0
commit
26ca75efae
@ -294,12 +294,6 @@ private:
|
|||||||
OpticalFlow optflow{ahrs};
|
OpticalFlow optflow{ahrs};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// gnd speed limit required to observe optical flow sensor limits
|
|
||||||
float ekfGndSpdLimit;
|
|
||||||
|
|
||||||
// scale factor applied to velocity controller gain to prevent optical flow noise causing excessive angle demand noise
|
|
||||||
float ekfNavVelGainScaler;
|
|
||||||
|
|
||||||
// system time in milliseconds of last recorded yaw reset from ekf
|
// system time in milliseconds of last recorded yaw reset from ekf
|
||||||
uint32_t ekfYawReset_ms;
|
uint32_t ekfYawReset_ms;
|
||||||
int8_t ekf_primary_core;
|
int8_t ekf_primary_core;
|
||||||
|
@ -23,12 +23,10 @@ Copter::Mode::Mode(void) :
|
|||||||
channel_throttle(copter.channel_throttle),
|
channel_throttle(copter.channel_throttle),
|
||||||
channel_yaw(copter.channel_yaw),
|
channel_yaw(copter.channel_yaw),
|
||||||
G_Dt(copter.G_Dt),
|
G_Dt(copter.G_Dt),
|
||||||
ap(copter.ap),
|
|
||||||
ekfGndSpdLimit(copter.ekfGndSpdLimit),
|
|
||||||
#if FRAME_CONFIG == HELI_FRAME
|
#if FRAME_CONFIG == HELI_FRAME
|
||||||
heli_flags(copter.heli_flags),
|
heli_flags(copter.heli_flags),
|
||||||
#endif
|
#endif
|
||||||
ekfNavVelGainScaler(copter.ekfNavVelGainScaler)
|
ap(copter.ap)
|
||||||
{ };
|
{ };
|
||||||
|
|
||||||
float Copter::Mode::auto_takeoff_no_nav_alt_cm = 0;
|
float Copter::Mode::auto_takeoff_no_nav_alt_cm = 0;
|
||||||
@ -251,9 +249,6 @@ bool Copter::set_mode(control_mode_t mode, mode_reason_t reason)
|
|||||||
// called at 100hz or more
|
// called at 100hz or more
|
||||||
void Copter::update_flight_mode()
|
void Copter::update_flight_mode()
|
||||||
{
|
{
|
||||||
// Update EKF speed limit - used to limit speed when we are using optical flow
|
|
||||||
ahrs.getEkfControlLimits(ekfGndSpdLimit, ekfNavVelGainScaler);
|
|
||||||
|
|
||||||
target_rangefinder_alt_used = false;
|
target_rangefinder_alt_used = false;
|
||||||
|
|
||||||
flightmode->run();
|
flightmode->run();
|
||||||
@ -519,7 +514,7 @@ void Copter::Mode::land_run_horizontal_control()
|
|||||||
loiter_nav->set_pilot_desired_acceleration(target_roll, target_pitch, G_Dt);
|
loiter_nav->set_pilot_desired_acceleration(target_roll, target_pitch, G_Dt);
|
||||||
|
|
||||||
// run loiter controller
|
// run loiter controller
|
||||||
loiter_nav->update(ekfGndSpdLimit, ekfNavVelGainScaler);
|
loiter_nav->update();
|
||||||
|
|
||||||
int32_t nav_roll = loiter_nav->get_roll();
|
int32_t nav_roll = loiter_nav->get_roll();
|
||||||
int32_t nav_pitch = loiter_nav->get_pitch();
|
int32_t nav_pitch = loiter_nav->get_pitch();
|
||||||
|
@ -173,12 +173,6 @@ protected:
|
|||||||
// altitude below which we do no navigation in auto takeoff
|
// altitude below which we do no navigation in auto takeoff
|
||||||
static float auto_takeoff_no_nav_alt_cm;
|
static float auto_takeoff_no_nav_alt_cm;
|
||||||
|
|
||||||
// gnd speed limit required to observe optical flow sensor limits
|
|
||||||
float &ekfGndSpdLimit;
|
|
||||||
|
|
||||||
// scale factor applied to velocity controller gain to prevent optical flow noise causing excessive angle demand noise
|
|
||||||
float &ekfNavVelGainScaler;
|
|
||||||
|
|
||||||
#if FRAME_CONFIG == HELI_FRAME
|
#if FRAME_CONFIG == HELI_FRAME
|
||||||
heli_flags_t &heli_flags;
|
heli_flags_t &heli_flags;
|
||||||
#endif
|
#endif
|
||||||
|
@ -980,7 +980,7 @@ void Copter::ModeAuto::payload_place_run_loiter()
|
|||||||
land_run_horizontal_control();
|
land_run_horizontal_control();
|
||||||
|
|
||||||
// run loiter controller
|
// run loiter controller
|
||||||
loiter_nav->update(ekfGndSpdLimit, ekfNavVelGainScaler);
|
loiter_nav->update();
|
||||||
|
|
||||||
// call attitude controller
|
// call attitude controller
|
||||||
const float target_yaw_rate = 0;
|
const float target_yaw_rate = 0;
|
||||||
|
@ -56,7 +56,7 @@ void Copter::ModeBrake::run()
|
|||||||
motors->set_desired_spool_state(AP_Motors::DESIRED_THROTTLE_UNLIMITED);
|
motors->set_desired_spool_state(AP_Motors::DESIRED_THROTTLE_UNLIMITED);
|
||||||
|
|
||||||
// run brake controller
|
// run brake controller
|
||||||
wp_nav->update_brake(ekfGndSpdLimit, ekfNavVelGainScaler);
|
wp_nav->update_brake();
|
||||||
|
|
||||||
// call attitude controller
|
// call attitude controller
|
||||||
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(wp_nav->get_roll(), wp_nav->get_pitch(), 0.0f);
|
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(wp_nav->get_roll(), wp_nav->get_pitch(), 0.0f);
|
||||||
|
@ -497,7 +497,7 @@ void Copter::ModeGuided::vel_control_run()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// call velocity controller which includes z axis controller
|
// call velocity controller which includes z axis controller
|
||||||
pos_control->update_vel_controller_xyz(ekfNavVelGainScaler);
|
pos_control->update_vel_controller_xyz();
|
||||||
|
|
||||||
// call attitude controller
|
// call attitude controller
|
||||||
if (auto_yaw.mode() == AUTO_YAW_HOLD) {
|
if (auto_yaw.mode() == AUTO_YAW_HOLD) {
|
||||||
@ -564,7 +564,7 @@ void Copter::ModeGuided::posvel_control_run()
|
|||||||
pos_control->set_desired_velocity_xy(guided_vel_target_cms.x, guided_vel_target_cms.y);
|
pos_control->set_desired_velocity_xy(guided_vel_target_cms.x, guided_vel_target_cms.y);
|
||||||
|
|
||||||
// run position controllers
|
// run position controllers
|
||||||
pos_control->update_xy_controller(ekfNavVelGainScaler);
|
pos_control->update_xy_controller();
|
||||||
pos_control->update_z_controller();
|
pos_control->update_z_controller();
|
||||||
|
|
||||||
// call attitude controller
|
// call attitude controller
|
||||||
|
@ -143,7 +143,7 @@ void Copter::ModeLoiter::run()
|
|||||||
attitude_control->set_yaw_target_to_current_heading();
|
attitude_control->set_yaw_target_to_current_heading();
|
||||||
pos_control->relax_alt_hold_controllers(0.0f); // forces throttle output to go to zero
|
pos_control->relax_alt_hold_controllers(0.0f); // forces throttle output to go to zero
|
||||||
#endif
|
#endif
|
||||||
loiter_nav->update(ekfGndSpdLimit, ekfNavVelGainScaler);
|
loiter_nav->update();
|
||||||
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(loiter_nav->get_roll(), loiter_nav->get_pitch(), target_yaw_rate);
|
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(loiter_nav->get_roll(), loiter_nav->get_pitch(), target_yaw_rate);
|
||||||
pos_control->update_z_controller();
|
pos_control->update_z_controller();
|
||||||
break;
|
break;
|
||||||
@ -168,7 +168,7 @@ void Copter::ModeLoiter::run()
|
|||||||
target_climb_rate = get_avoidance_adjusted_climbrate(target_climb_rate);
|
target_climb_rate = get_avoidance_adjusted_climbrate(target_climb_rate);
|
||||||
|
|
||||||
// run loiter controller
|
// run loiter controller
|
||||||
loiter_nav->update(ekfGndSpdLimit, ekfNavVelGainScaler);
|
loiter_nav->update();
|
||||||
|
|
||||||
// call attitude controller
|
// call attitude controller
|
||||||
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(loiter_nav->get_roll(), loiter_nav->get_pitch(), target_yaw_rate);
|
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(loiter_nav->get_roll(), loiter_nav->get_pitch(), target_yaw_rate);
|
||||||
@ -206,7 +206,7 @@ void Copter::ModeLoiter::run()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// run loiter controller
|
// run loiter controller
|
||||||
loiter_nav->update(ekfGndSpdLimit, ekfNavVelGainScaler);
|
loiter_nav->update();
|
||||||
|
|
||||||
// call attitude controller
|
// call attitude controller
|
||||||
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(loiter_nav->get_roll(), loiter_nav->get_pitch(), target_yaw_rate);
|
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(loiter_nav->get_roll(), loiter_nav->get_pitch(), target_yaw_rate);
|
||||||
|
@ -442,7 +442,7 @@ void Copter::ModePosHold::run()
|
|||||||
poshold_update_brake_angle_from_velocity(poshold.brake_pitch, -vel_fw);
|
poshold_update_brake_angle_from_velocity(poshold.brake_pitch, -vel_fw);
|
||||||
|
|
||||||
// run loiter controller
|
// run loiter controller
|
||||||
loiter_nav->update(ekfGndSpdLimit, ekfNavVelGainScaler);
|
loiter_nav->update();
|
||||||
|
|
||||||
// calculate final roll and pitch output by mixing loiter and brake controls
|
// calculate final roll and pitch output by mixing loiter and brake controls
|
||||||
poshold.roll = poshold_mix_controls(brake_to_loiter_mix, poshold.brake_roll + poshold.wind_comp_roll, loiter_nav->get_roll());
|
poshold.roll = poshold_mix_controls(brake_to_loiter_mix, poshold.brake_roll + poshold.wind_comp_roll, loiter_nav->get_roll());
|
||||||
@ -473,7 +473,7 @@ void Copter::ModePosHold::run()
|
|||||||
|
|
||||||
case POSHOLD_LOITER:
|
case POSHOLD_LOITER:
|
||||||
// run loiter controller
|
// run loiter controller
|
||||||
loiter_nav->update(ekfGndSpdLimit, ekfNavVelGainScaler);
|
loiter_nav->update();
|
||||||
|
|
||||||
// set roll angle based on loiter controller outputs
|
// set roll angle based on loiter controller outputs
|
||||||
poshold.roll = loiter_nav->get_roll();
|
poshold.roll = loiter_nav->get_roll();
|
||||||
|
@ -304,7 +304,7 @@ void Copter::ModeRTL::descent_run()
|
|||||||
loiter_nav->set_pilot_desired_acceleration(target_roll, target_pitch, G_Dt);
|
loiter_nav->set_pilot_desired_acceleration(target_roll, target_pitch, G_Dt);
|
||||||
|
|
||||||
// run loiter controller
|
// run loiter controller
|
||||||
loiter_nav->update(ekfGndSpdLimit, ekfNavVelGainScaler);
|
loiter_nav->update();
|
||||||
|
|
||||||
// call z-axis position controller
|
// call z-axis position controller
|
||||||
pos_control->set_alt_target_with_slew(rtl_path.descent_target.alt, G_Dt);
|
pos_control->set_alt_target_with_slew(rtl_path.descent_target.alt, G_Dt);
|
||||||
|
@ -169,7 +169,7 @@ void Copter::ModeThrow::run()
|
|||||||
motors->set_desired_spool_state(AP_Motors::DESIRED_THROTTLE_UNLIMITED);
|
motors->set_desired_spool_state(AP_Motors::DESIRED_THROTTLE_UNLIMITED);
|
||||||
|
|
||||||
// run loiter controller
|
// run loiter controller
|
||||||
loiter_nav->update(ekfGndSpdLimit, ekfNavVelGainScaler);
|
loiter_nav->update();
|
||||||
|
|
||||||
// call attitude controller
|
// call attitude controller
|
||||||
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(loiter_nav->get_roll(), loiter_nav->get_pitch(), 0.0f);
|
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(loiter_nav->get_roll(), loiter_nav->get_pitch(), 0.0f);
|
||||||
|
Loading…
Reference in New Issue
Block a user