Browse Source

Copter: add ACRO_EXPO parameter

master
Randy Mackay 11 years ago
parent
commit
f3fd79597f
  1. 4
      ArduCopter/Parameters.h
  2. 7
      ArduCopter/Parameters.pde
  3. 4
      ArduCopter/config.h
  4. 21
      ArduCopter/control_acro.pde

4
ArduCopter/Parameters.h

@ -117,8 +117,9 @@ public:
k_param_serial2_baud, k_param_serial2_baud,
k_param_land_repositioning, k_param_land_repositioning,
k_param_sonar, // sonar object k_param_sonar, // sonar object
k_param_ekfcheck_thresh, // 54 k_param_ekfcheck_thresh,
k_param_terrain, k_param_terrain,
k_param_acro_expo, // 56
// 65: AP_Limits Library // 65: AP_Limits Library
k_param_limits = 65, // deprecated - remove k_param_limits = 65, // deprecated - remove
@ -434,6 +435,7 @@ public:
AP_Float acro_balance_roll; AP_Float acro_balance_roll;
AP_Float acro_balance_pitch; AP_Float acro_balance_pitch;
AP_Int8 acro_trainer; AP_Int8 acro_trainer;
AP_Float acro_expo;
// PI/D controllers // PI/D controllers
#if FRAME_CONFIG == HELI_FRAME #if FRAME_CONFIG == HELI_FRAME

7
ArduCopter/Parameters.pde

@ -586,6 +586,13 @@ const AP_Param::Info var_info[] PROGMEM = {
// @User: Advanced // @User: Advanced
GSCALAR(acro_trainer, "ACRO_TRAINER", ACRO_TRAINER_LIMITED), GSCALAR(acro_trainer, "ACRO_TRAINER", ACRO_TRAINER_LIMITED),
// @Param: ACRO_EXPO
// @DisplayName: Acro Expo
// @Description: Acro roll/pitch Expo to allow faster rotation when stick at edges
// @Values: 0:Disabled,0.2:Low,0.3:Medium,0.4:High
// @User: Advanced
GSCALAR(acro_expo, "ACRO_EXPO", ACRO_EXPO_DEFAULT),
// PID controller // PID controller
//--------------- //---------------

4
ArduCopter/config.h

@ -492,6 +492,10 @@
#define ACRO_BALANCE_PITCH 1.0f #define ACRO_BALANCE_PITCH 1.0f
#endif #endif
#ifndef ACRO_EXPO_DEFAULT
#define ACRO_EXPO_DEFAULT 0.3f
#endif
// Stabilize (angle controller) gains // Stabilize (angle controller) gains
#ifndef STABILIZE_ROLL_P #ifndef STABILIZE_ROLL_P
# define STABILIZE_ROLL_P 4.5f # define STABILIZE_ROLL_P 4.5f

21
ArduCopter/control_acro.pde

@ -44,10 +44,6 @@ static void acro_run()
// returns desired angle rates in centi-degrees-per-second // returns desired angle rates in centi-degrees-per-second
static void get_pilot_desired_angle_rates(int16_t roll_in, int16_t pitch_in, int16_t yaw_in, float &roll_out, float &pitch_out, float &yaw_out) static void get_pilot_desired_angle_rates(int16_t roll_in, int16_t pitch_in, int16_t yaw_in, float &roll_out, float &pitch_out, float &yaw_out)
{ {
// expo variables
static float _expo_factor = 0.3;
float rp_in, rp_in3, rp_out;
float rate_limit; float rate_limit;
Vector3f rate_ef_level, rate_bf_level, rate_bf_request; Vector3f rate_ef_level, rate_bf_level, rate_bf_request;
@ -55,17 +51,28 @@ static void get_pilot_desired_angle_rates(int16_t roll_in, int16_t pitch_in, int
roll_in = constrain_int16(roll_in, -ROLL_PITCH_INPUT_MAX, ROLL_PITCH_INPUT_MAX); roll_in = constrain_int16(roll_in, -ROLL_PITCH_INPUT_MAX, ROLL_PITCH_INPUT_MAX);
pitch_in = constrain_int16(pitch_in, -ROLL_PITCH_INPUT_MAX, ROLL_PITCH_INPUT_MAX); pitch_in = constrain_int16(pitch_in, -ROLL_PITCH_INPUT_MAX, ROLL_PITCH_INPUT_MAX);
// calculate rate requests // calculate roll, pitch rate requests
if (g.acro_expo <= 0) {
rate_bf_request.x = roll_in * g.acro_rp_p;
rate_bf_request.y = pitch_in * g.acro_rp_p;
} else {
// expo variables
float rp_in, rp_in3, rp_out;
// roll expo
rp_in = float(roll_in)/ROLL_PITCH_INPUT_MAX; rp_in = float(roll_in)/ROLL_PITCH_INPUT_MAX;
rp_in3 = rp_in*rp_in*rp_in; rp_in3 = rp_in*rp_in*rp_in;
rp_out = (_expo_factor * rp_in3) + ((1 - _expo_factor) * rp_in); rp_out = (g.acro_expo * rp_in3) + ((1 - g.acro_expo) * rp_in);
rate_bf_request.x = ROLL_PITCH_INPUT_MAX * rp_out * g.acro_rp_p; rate_bf_request.x = ROLL_PITCH_INPUT_MAX * rp_out * g.acro_rp_p;
// pitch expo
rp_in = float(pitch_in)/ROLL_PITCH_INPUT_MAX; rp_in = float(pitch_in)/ROLL_PITCH_INPUT_MAX;
rp_in3 = rp_in*rp_in*rp_in; rp_in3 = rp_in*rp_in*rp_in;
rp_out = (_expo_factor * rp_in3) + ((1 - _expo_factor) * rp_in); rp_out = (g.acro_expo * rp_in3) + ((1 - g.acro_expo) * rp_in);
rate_bf_request.y = ROLL_PITCH_INPUT_MAX * rp_out * g.acro_rp_p; rate_bf_request.y = ROLL_PITCH_INPUT_MAX * rp_out * g.acro_rp_p;
}
// calculate yaw rate request
rate_bf_request.z = yaw_in * g.acro_yaw_p; rate_bf_request.z = yaw_in * g.acro_yaw_p;
// calculate earth frame rate corrections to pull the copter back to level while in ACRO mode // calculate earth frame rate corrections to pull the copter back to level while in ACRO mode

Loading…
Cancel
Save