mirror of https://github.com/ArduPilot/ardupilot
TradHeli: move pilot desired rotor speed to heli.pde
This commit is contained in:
parent
527f05ddec
commit
197fc67897
|
@ -1086,6 +1086,9 @@ static void throttle_loop()
|
||||||
update_auto_armed();
|
update_auto_armed();
|
||||||
|
|
||||||
#if FRAME_CONFIG == HELI_FRAME
|
#if FRAME_CONFIG == HELI_FRAME
|
||||||
|
// update rotor speed
|
||||||
|
heli_update_rotor_speed_targets();
|
||||||
|
|
||||||
// update trad heli swash plate movement
|
// update trad heli swash plate movement
|
||||||
heli_update_landing_swash();
|
heli_update_landing_swash();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -225,4 +225,29 @@ static void heli_update_landing_swash()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// heli_update_rotor_speed_targets - reads pilot input and passes new rotor speed targets to heli motors object
|
||||||
|
static void heli_update_rotor_speed_targets()
|
||||||
|
{
|
||||||
|
// get rotor control method
|
||||||
|
uint8_t rsc_control_mode = motors.get_rsc_mode();
|
||||||
|
|
||||||
|
switch (rsc_control_mode) {
|
||||||
|
case AP_MOTORS_HELI_RSC_MODE_NONE:
|
||||||
|
// even though pilot passes rotors speed directly to rotor ESC via receiver, motor lib needs to know if
|
||||||
|
// rotor is spinning in case we are using direct drive tailrotor which must be spun up at same time
|
||||||
|
case AP_MOTORS_HELI_RSC_MODE_CH8_PASSTHROUGH:
|
||||||
|
// pass through pilot desired rotor speed
|
||||||
|
motors.set_desired_rotor_speed(g.rc_8.control_in);
|
||||||
|
break;
|
||||||
|
case AP_MOTORS_HELI_RSC_MODE_SETPOINT:
|
||||||
|
// pass setpoint through as desired rotor speed
|
||||||
|
if (g.rc_8.control_in > 0) {
|
||||||
|
motors.set_desired_rotor_speed(motors.get_rsc_setpoint());
|
||||||
|
}else{
|
||||||
|
motors.set_desired_rotor_speed(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // FRAME_CONFIG == HELI_FRAME
|
#endif // FRAME_CONFIG == HELI_FRAME
|
|
@ -361,6 +361,12 @@ int16_t AP_MotorsHeli::get_pilot_desired_collective(int16_t control_in)
|
||||||
return collective_out;
|
return collective_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set_desired_rotor_speed - sets target rotor speed as a number from 0 ~ 1000
|
||||||
|
void AP_MotorsHeli::set_desired_rotor_speed(int16_t desired_speed)
|
||||||
|
{
|
||||||
|
_rotor_desired = desired_speed;
|
||||||
|
}
|
||||||
|
|
||||||
// return true if the main rotor is up to speed
|
// return true if the main rotor is up to speed
|
||||||
bool AP_MotorsHeli::motor_runup_complete()
|
bool AP_MotorsHeli::motor_runup_complete()
|
||||||
{
|
{
|
||||||
|
@ -398,7 +404,6 @@ void AP_MotorsHeli::output_armed()
|
||||||
_rc_yaw->servo_out = _rc_yaw->control_in;
|
_rc_yaw->servo_out = _rc_yaw->control_in;
|
||||||
}
|
}
|
||||||
|
|
||||||
//static int counter = 0;
|
|
||||||
_rc_roll->calc_pwm();
|
_rc_roll->calc_pwm();
|
||||||
_rc_pitch->calc_pwm();
|
_rc_pitch->calc_pwm();
|
||||||
_rc_throttle->calc_pwm();
|
_rc_throttle->calc_pwm();
|
||||||
|
@ -406,8 +411,8 @@ void AP_MotorsHeli::output_armed()
|
||||||
|
|
||||||
move_swash( _rc_roll->servo_out, _rc_pitch->servo_out, _rc_throttle->servo_out, _rc_yaw->servo_out );
|
move_swash( _rc_roll->servo_out, _rc_pitch->servo_out, _rc_throttle->servo_out, _rc_yaw->servo_out );
|
||||||
|
|
||||||
// To-Do: clean-up the passing in of the desired rotor speed
|
// update rotor and direct drive esc speeds
|
||||||
rsc_control(_servo_rsc->control_in);
|
rsc_control();
|
||||||
}
|
}
|
||||||
|
|
||||||
// output_disarmed - sends commands to the motors
|
// output_disarmed - sends commands to the motors
|
||||||
|
@ -657,7 +662,7 @@ void AP_MotorsHeli::move_swash(int16_t roll_out, int16_t pitch_out, int16_t coll
|
||||||
|
|
||||||
// rsc_control - update value to send to tail and main rotor's ESC
|
// rsc_control - update value to send to tail and main rotor's ESC
|
||||||
// desired_rotor_speed is a desired speed from 0 to 1000
|
// desired_rotor_speed is a desired speed from 0 to 1000
|
||||||
void AP_MotorsHeli::rsc_control(int16_t desired_rotor_speed)
|
void AP_MotorsHeli::rsc_control()
|
||||||
{
|
{
|
||||||
// if disarmed output minimums
|
// if disarmed output minimums
|
||||||
if (!armed()) {
|
if (!armed()) {
|
||||||
|
@ -674,63 +679,13 @@ void AP_MotorsHeli::rsc_control(int16_t desired_rotor_speed)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle simpler case of pilot directly controlling main rotor
|
|
||||||
if (_rsc_mode == AP_MOTORS_HELI_RSC_MODE_NONE) {
|
|
||||||
switch (_tail_type) {
|
|
||||||
// return immediately if no direct drive tail motor
|
|
||||||
case AP_MOTORS_HELI_TAILTYPE_SERVO:
|
|
||||||
case AP_MOTORS_HELI_TAILTYPE_SERVO_EXTGYRO:
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// direct drive variable pitch tail
|
|
||||||
case AP_MOTORS_HELI_TAILTYPE_DIRECTDRIVE_VARPITCH:
|
|
||||||
if (desired_rotor_speed > 0) {
|
|
||||||
// ramp up tail if main rotor on
|
|
||||||
tail_ramp(_direct_drive_setpoint);
|
|
||||||
}else{
|
|
||||||
// ramp down tail rotor if main rotor off
|
|
||||||
tail_ramp(0);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// direct drive fixed pitch tail
|
|
||||||
case AP_MOTORS_HELI_TAILTYPE_DIRECTDRIVE_FIXEDPITCH:
|
|
||||||
// output fixed-pitch speed control if Ch8 is high
|
|
||||||
if (desired_rotor_speed > 0) {
|
|
||||||
// copy yaw output to tail esc
|
|
||||||
write_aux(_servo_4->servo_out);
|
|
||||||
}else{
|
|
||||||
write_aux(0);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// handle more complex case of channel 8 passthrough and external governor
|
|
||||||
int16_t temp_rotor_speed;
|
|
||||||
if (_rsc_mode == AP_MOTORS_HELI_RSC_MODE_CH8_PASSTHROUGH) {
|
|
||||||
temp_rotor_speed = desired_rotor_speed;
|
|
||||||
}else{
|
|
||||||
// rotor speed is predefined set-point
|
|
||||||
if (desired_rotor_speed > 0) {
|
|
||||||
temp_rotor_speed = _rsc_setpoint;
|
|
||||||
}else{
|
|
||||||
temp_rotor_speed = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ramp up or down main rotor and tail
|
// ramp up or down main rotor and tail
|
||||||
if (temp_rotor_speed > 0) {
|
if (_rotor_desired > 0) {
|
||||||
// ramp up tail rotor (this does nothing if not using direct drive variable pitch tail)
|
// ramp up tail rotor (this does nothing if not using direct drive variable pitch tail)
|
||||||
tail_ramp(_direct_drive_tailspeed);
|
tail_ramp(_direct_drive_tailspeed);
|
||||||
// note: this always returns true if not using direct drive variable pitch tail
|
// note: this always returns true if not using direct drive variable pitch tail
|
||||||
if (tail_rotor_runup_complete()) {
|
if (tail_rotor_runup_complete()) {
|
||||||
rotor_ramp(temp_rotor_speed);
|
rotor_ramp(_rotor_desired);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
// shutting down main rotor
|
// shutting down main rotor
|
||||||
|
@ -744,7 +699,7 @@ void AP_MotorsHeli::rsc_control(int16_t desired_rotor_speed)
|
||||||
// direct drive fixed pitch tail servo gets copy of yaw servo out (ch4) while main rotor is running
|
// direct drive fixed pitch tail servo gets copy of yaw servo out (ch4) while main rotor is running
|
||||||
if (_tail_type == AP_MOTORS_HELI_TAILTYPE_DIRECTDRIVE_FIXEDPITCH) {
|
if (_tail_type == AP_MOTORS_HELI_TAILTYPE_DIRECTDRIVE_FIXEDPITCH) {
|
||||||
// output fixed-pitch speed control if Ch8 is high
|
// output fixed-pitch speed control if Ch8 is high
|
||||||
if (temp_rotor_speed > 0 || _rotor_out > 0) {
|
if (_rotor_desired > 0 || _rotor_out > 0) {
|
||||||
// copy yaw output to tail esc
|
// copy yaw output to tail esc
|
||||||
write_aux(_servo_4->servo_out);
|
write_aux(_servo_4->servo_out);
|
||||||
}else{
|
}else{
|
||||||
|
|
|
@ -114,6 +114,7 @@ public:
|
||||||
_collective_scalar_manual(1),
|
_collective_scalar_manual(1),
|
||||||
_collective_out(0),
|
_collective_out(0),
|
||||||
_collective_mid_pwm(0),
|
_collective_mid_pwm(0),
|
||||||
|
_rotor_desired(0),
|
||||||
_rotor_out(0),
|
_rotor_out(0),
|
||||||
_rsc_ramp_increment(0.0f),
|
_rsc_ramp_increment(0.0f),
|
||||||
_tail_direct_drive_out(0)
|
_tail_direct_drive_out(0)
|
||||||
|
@ -175,6 +176,15 @@ public:
|
||||||
// set_collective_for_landing - limits collective from going too low if we know we are landed
|
// set_collective_for_landing - limits collective from going too low if we know we are landed
|
||||||
void set_collective_for_landing(bool landing) { _heliflags.landing_collective = landing; }
|
void set_collective_for_landing(bool landing) { _heliflags.landing_collective = landing; }
|
||||||
|
|
||||||
|
// get_rsc_mode - gets the rotor speed control method (AP_MOTORS_HELI_RSC_MODE_NONE, AP_MOTORS_HELI_RSC_MODE_CH8_PASSTHROUGH or AP_MOTORS_HELI_RSC_MODE_SETPOINT)
|
||||||
|
uint8_t get_rsc_mode() { return _rsc_mode; }
|
||||||
|
|
||||||
|
// get_rsc_setpoint - gets contents of _rsc_setpoint parameter (0~1000)
|
||||||
|
int16_t get_rsc_setpoint() { return _rsc_setpoint; }
|
||||||
|
|
||||||
|
// set_desired_rotor_speed - sets target rotor speed as a number from 0 ~ 1000
|
||||||
|
void set_desired_rotor_speed(int16_t desired_speed);
|
||||||
|
|
||||||
// return true if the main rotor is up to speed
|
// return true if the main rotor is up to speed
|
||||||
bool motor_runup_complete();
|
bool motor_runup_complete();
|
||||||
|
|
||||||
|
@ -205,7 +215,7 @@ private:
|
||||||
void calculate_roll_pitch_collective_factors();
|
void calculate_roll_pitch_collective_factors();
|
||||||
|
|
||||||
// rsc_control - main function to update values to send to main rotor and tail rotor ESCs
|
// rsc_control - main function to update values to send to main rotor and tail rotor ESCs
|
||||||
void rsc_control(int16_t desired_rotor_speed);
|
void rsc_control();
|
||||||
|
|
||||||
// rotor_ramp - ramps rotor towards target. result put rotor_out and sent to ESC
|
// rotor_ramp - ramps rotor towards target. result put rotor_out and sent to ESC
|
||||||
void rotor_ramp(int16_t rotor_target);
|
void rotor_ramp(int16_t rotor_target);
|
||||||
|
@ -272,7 +282,8 @@ private:
|
||||||
float _collective_scalar_manual; // collective scalar to reduce the range of the collective movement while collective is being controlled manually (i.e. directly by the pilot)
|
float _collective_scalar_manual; // collective scalar to reduce the range of the collective movement while collective is being controlled manually (i.e. directly by the pilot)
|
||||||
int16_t _collective_out; // actual collective pitch value. Required by the main code for calculating cruise throttle
|
int16_t _collective_out; // actual collective pitch value. Required by the main code for calculating cruise throttle
|
||||||
int16_t _collective_mid_pwm; // collective mid parameter value converted to pwm form (i.e. 0 ~ 1000)
|
int16_t _collective_mid_pwm; // collective mid parameter value converted to pwm form (i.e. 0 ~ 1000)
|
||||||
float _rotor_out; // output to the rotor (0 ~ 1000)
|
int16_t _rotor_desired; // latest desired rotor speed from pilot
|
||||||
|
float _rotor_out; // latest output sent to the main rotor or an estimate of the rotors actual speed (whichever is higher) (0 ~ 1000)
|
||||||
float _rsc_ramp_increment; // the amount we can increase the rotor output during each 100hz iteration
|
float _rsc_ramp_increment; // the amount we can increase the rotor output during each 100hz iteration
|
||||||
int16_t _tail_direct_drive_out; // current ramped speed of output on ch7 when using direct drive variable pitch tail type
|
int16_t _tail_direct_drive_out; // current ramped speed of output on ch7 when using direct drive variable pitch tail type
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue