Browse Source

Copter: fixed deadzone handling for external tail gyro

when using an external tail gyro on a flybar heli the stick input
should be directly passed to output. This patch fixes the use of
deadzone in that passthrough.

It also makes the tail handling consistent with roll and pitch
handling, by not using ACRO_YAW_P when in tail pass-through.

Finally it also fixes deadzone handling for roll and pitch, and
removes the unnecessary get_pilot_desired_yaw_rate() that has a
different prototype from the one used in the rest of the code
master
Andrew Tridgell 10 years ago
parent
commit
1c26ed0fca
  1. 1
      ArduCopter/Copter.h
  2. 35
      ArduCopter/heli_control_acro.cpp

1
ArduCopter/Copter.h

@ -826,7 +826,6 @@ private: @@ -826,7 +826,6 @@ private:
void heli_radio_passthrough();
bool heli_acro_init(bool ignore_checks);
void heli_acro_run();
void get_pilot_desired_yaw_rate(int16_t yaw_in, float &yaw_out);
bool heli_stabilize_init(bool ignore_checks);
void heli_stabilize_run();
void read_inertia();

35
ArduCopter/heli_control_acro.cpp

@ -51,25 +51,32 @@ void Copter::heli_acro_run() @@ -51,25 +51,32 @@ void Copter::heli_acro_run()
// run attitude controller
attitude_control.rate_bf_roll_pitch_yaw(target_roll, target_pitch, target_yaw);
}else{
// flybar helis only need yaw rate control
get_pilot_desired_yaw_rate(channel_yaw->control_in, target_yaw);
/*
for fly-bar passthrough use control_in values with no
deadzone. This gives true pass-through.
*/
float roll_in = channel_roll->pwm_to_angle_dz(0);
float pitch_in = channel_pitch->pwm_to_angle_dz(0);
float yaw_in;
if (motors.supports_yaw_passthrough()) {
// if the tail on a flybar heli has an external gyro then
// also use no deadzone for the yaw control and
// pass-through the input direct to output.
yaw_in = channel_yaw->pwm_to_angle_dz(0);
} else {
// if there is no external gyro then run the usual
// ACRO_YAW_P gain on the input control, including
// deadzone
yaw_in = get_pilot_desired_yaw_rate(channel_yaw->control_in);
}
// run attitude controller
attitude_control.passthrough_bf_roll_pitch_rate_yaw(channel_roll->control_in, channel_pitch->control_in, target_yaw);
attitude_control.passthrough_bf_roll_pitch_rate_yaw(roll_in, pitch_in, yaw_in);
}
// output pilot's throttle without angle boost
attitude_control.set_throttle_out(channel_throttle->control_in, false, g.throttle_filt);
}
// get_pilot_desired_yaw_rate - transform pilot's yaw input into a desired yaw angle rate
// returns desired yaw rate in centi-degrees-per-second
void Copter::get_pilot_desired_yaw_rate(int16_t yaw_in, float &yaw_out)
{
// calculate rate request
float rate_bf_yaw_request = yaw_in * g.acro_yaw_p;
// hand back rate request
yaw_out = rate_bf_yaw_request;
}
#endif //HELI_FRAME

Loading…
Cancel
Save