|
|
|
@ -70,49 +70,51 @@ void QuadPlane::tailsitter_output(void)
@@ -70,49 +70,51 @@ void QuadPlane::tailsitter_output(void)
|
|
|
|
|
|
|
|
|
|
float tilt_left = 0.0f; |
|
|
|
|
float tilt_right = 0.0f; |
|
|
|
|
uint16_t mask = tailsitter.motor_mask; |
|
|
|
|
|
|
|
|
|
// handle forward flight modes and transition to VTOL modes
|
|
|
|
|
if ((!tailsitter_active() || in_tailsitter_vtol_transition()) && !assisted_flight) { |
|
|
|
|
// in forward flight: set motor tilt servos and throttles using FW controller
|
|
|
|
|
if (tailsitter.vectored_forward_gain > 0) { |
|
|
|
|
// thrust vectoring in fixed wing flight
|
|
|
|
|
float aileron = SRV_Channels::get_output_scaled(SRV_Channel::k_aileron); |
|
|
|
|
float elevator = SRV_Channels::get_output_scaled(SRV_Channel::k_elevator); |
|
|
|
|
tilt_left = (elevator + aileron) * tailsitter.vectored_forward_gain; |
|
|
|
|
tilt_right = (elevator - aileron) * tailsitter.vectored_forward_gain; |
|
|
|
|
} |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_tiltMotorLeft, tilt_left); |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_tiltMotorRight, tilt_right); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// handle forward flight modes and transition to VTOL modes
|
|
|
|
|
if (!tailsitter_active() || in_tailsitter_vtol_transition()) { |
|
|
|
|
// get FW controller throttle demand and mask of motors enabled during forward flight
|
|
|
|
|
float throttle = SRV_Channels::get_output_scaled(SRV_Channel::k_throttle); |
|
|
|
|
if (hal.util->get_soft_armed()) { |
|
|
|
|
if (in_tailsitter_vtol_transition() && !throttle_wait && is_flying()) { |
|
|
|
|
/*
|
|
|
|
|
during transitions to vtol mode set the throttle to |
|
|
|
|
hover thrust, center the rudder and set the altitude controller |
|
|
|
|
integrator to the same throttle level |
|
|
|
|
*/ |
|
|
|
|
throttle = motors->get_throttle_hover() * 100; |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_rudder, 0); |
|
|
|
|
pos_control->get_accel_z_pid().set_integrator(throttle*10); |
|
|
|
|
|
|
|
|
|
// override AP_MotorsTailsitter throttles during back transition
|
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, throttle); |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttleLeft, throttle); |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttleRight, throttle); |
|
|
|
|
if (hal.util->get_soft_armed() && in_tailsitter_vtol_transition() && !throttle_wait && is_flying()) { |
|
|
|
|
/*
|
|
|
|
|
during transitions to vtol mode set the throttle to |
|
|
|
|
hover thrust, center the rudder and set the altitude controller |
|
|
|
|
integrator to the same throttle level |
|
|
|
|
*/ |
|
|
|
|
throttle = motors->get_throttle_hover() * 100; |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_rudder, 0); |
|
|
|
|
pos_control->get_accel_z_pid().set_integrator(throttle*10); |
|
|
|
|
|
|
|
|
|
// override AP_MotorsTailsitter throttles during back transition
|
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, throttle); |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttleLeft, throttle); |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_throttleRight, throttle); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!assisted_flight) { |
|
|
|
|
// set AP_MotorsMatrix throttles for forward flight
|
|
|
|
|
motors->output_motor_mask(throttle * 0.01f, tailsitter.motor_mask, plane.rudder_dt); |
|
|
|
|
|
|
|
|
|
// in forward flight: set motor tilt servos and throttles using FW controller
|
|
|
|
|
if (tailsitter.vectored_forward_gain > 0) { |
|
|
|
|
// thrust vectoring in fixed wing flight
|
|
|
|
|
float aileron = SRV_Channels::get_output_scaled(SRV_Channel::k_aileron); |
|
|
|
|
float elevator = SRV_Channels::get_output_scaled(SRV_Channel::k_elevator); |
|
|
|
|
tilt_left = (elevator + aileron) * tailsitter.vectored_forward_gain; |
|
|
|
|
tilt_right = (elevator - aileron) * tailsitter.vectored_forward_gain; |
|
|
|
|
} |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_tiltMotorLeft, tilt_left); |
|
|
|
|
SRV_Channels::set_output_scaled(SRV_Channel::k_tiltMotorRight, tilt_right); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// set AP_MotorsMatrix throttles for forward flight
|
|
|
|
|
motors->output_motor_mask(throttle * 0.01f, mask, plane.rudder_dt); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// handle VTOL modes
|
|
|
|
|
// the MultiCopter rate controller has already been run in an earlier call
|
|
|
|
|
// to motors_output() from quadplane.update(), unless we are in assisted flight
|
|
|
|
|
if (assisted_flight && tailsitter_transition_fw_complete()) { |
|
|
|
|
if (assisted_flight) { |
|
|
|
|
hold_stabilize(SRV_Channels::get_output_scaled(SRV_Channel::k_throttle) * 0.01f); |
|
|
|
|
motors_output(true); |
|
|
|
|
} else { |
|
|
|
|