Copter: heli: Update swashplate behavior

change swashplate behavior on ground in Acro, Stabilize, and AltHold
flight modes. See discussion here:

https://discuss.ardupilot.org/t/tradheli-swashplate-behavior-while-on-the-ground-and-potential-fix-to-issue-5396/22463/18
This commit is contained in:
bnsgeyer 2017-10-26 18:53:49 -04:00 committed by Andrew Tridgell
parent e8173f27df
commit 6d0cfc13a2
3 changed files with 26 additions and 6 deletions

View File

@ -74,18 +74,24 @@ void Copter::althold_run()
motors->set_desired_spool_state(AP_Motors::DESIRED_SHUT_DOWN);
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(target_roll, target_pitch, target_yaw_rate, get_smoothing_gain());
attitude_control->reset_rate_controller_I_terms();
attitude_control->set_yaw_target_to_current_heading();
#if FRAME_CONFIG == HELI_FRAME
// force descent rate and call position controller
pos_control->set_alt_target_from_climb_rate(-abs(g.land_speed), G_Dt, false);
heli_flags.init_targets_on_arming=true;
#else
attitude_control->reset_rate_controller_I_terms();
attitude_control->set_yaw_target_to_current_heading();
pos_control->relax_alt_hold_controllers(0.0f); // forces throttle output to go to zero
#endif
pos_control->update_z_controller();
break;
case AltHold_Takeoff:
#if FRAME_CONFIG == HELI_FRAME
if (heli_flags.init_targets_on_arming) {
heli_flags.init_targets_on_arming=false;
}
#endif
// set motors to full range
motors->set_desired_spool_state(AP_Motors::DESIRED_THROTTLE_UNLIMITED);
@ -121,8 +127,18 @@ void Copter::althold_run()
motors->set_desired_spool_state(AP_Motors::DESIRED_THROTTLE_UNLIMITED);
}
#if FRAME_CONFIG == HELI_FRAME
if (heli_flags.init_targets_on_arming) {
attitude_control->reset_rate_controller_I_terms();
attitude_control->set_yaw_target_to_current_heading();
if (motors->get_interlock()) {
heli_flags.init_targets_on_arming=false;
}
}
#else
attitude_control->reset_rate_controller_I_terms();
attitude_control->set_yaw_target_to_current_heading();
#endif
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(target_roll, target_pitch, target_yaw_rate, get_smoothing_gain());
pos_control->relax_alt_hold_controllers(0.0f); // forces throttle output to go to zero
pos_control->update_z_controller();

View File

@ -35,12 +35,14 @@ void Copter::heli_acro_run()
if(!motors->armed()) {
heli_flags.init_targets_on_arming=true;
attitude_control->set_yaw_target_to_current_heading();
attitude_control->set_attitude_target_to_current_attitude();
attitude_control->reset_rate_controller_I_terms();
}
if(motors->armed() && heli_flags.init_targets_on_arming) {
attitude_control->set_yaw_target_to_current_heading();
if (motors->rotor_speed_above_critical()) {
attitude_control->set_attitude_target_to_current_attitude();
attitude_control->reset_rate_controller_I_terms();
if (motors->get_interlock()) {
heli_flags.init_targets_on_arming=false;
}
}

View File

@ -35,11 +35,13 @@ void Copter::heli_stabilize_run()
if(!motors->armed()) {
heli_flags.init_targets_on_arming=true;
attitude_control->set_yaw_target_to_current_heading();
attitude_control->reset_rate_controller_I_terms();
}
if(motors->armed() && heli_flags.init_targets_on_arming) {
attitude_control->set_yaw_target_to_current_heading();
if (motors->rotor_speed_above_critical()) {
attitude_control->reset_rate_controller_I_terms();
if (motors->get_interlock()) {
heli_flags.init_targets_on_arming=false;
}
}