LCOV - code coverage report
Current view: top level - home/pbarker/rc/ardupilot/ArduPlane - tuning.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 0 131 0.0 %
Date: 2026-09-09 11:02:08 Functions: 0 4 0.0 %

          Line data    Source code
       1             : #include <AP_Tuning/AP_Tuning_config.h>
       2             : 
       3             : #if AP_TUNING_ENABLED
       4             : 
       5             : #include "Plane.h"
       6             : 
       7             : /*
       8             :   the vehicle class has its own var table for TUNE_PARAM so it can
       9             :   have separate parameter docs for the list of available parameters
      10             :  */
      11             : const AP_Param::GroupInfo AP_Tuning_Plane::var_info[] = {
      12             :     // @Param: PARAM
      13             :     // @DisplayName: Transmitter tuning parameter or set of parameters
      14             :     // @Description: This sets which parameter or set of parameters will be tuned. Values greater than 100 indicate a set of parameters rather than a single parameter. Parameters less than 50 are for QuadPlane vertical lift motors only.
      15             :     // @Values: 0:None,1:RateRollPI,2:RateRollP,3:RateRollI,4:RateRollD,5:RatePitchPI,6:RatePitchP,7:RatePitchI,8:RatePitchD,9:RateYawPI,10:RateYawP,11:RateYawI,12:RateYawD,13:AngleRollP,14:AnglePitchP,15:AngleYawP,16:PosXYP,17:PosZP,18:VelXYP,19:VelXYI,20:VelZP,21:AccelZP,22:AccelZI,23:AccelZD,24:RatePitchFF,25:RateRollFF,26:RateYawFF,50:FixedWingRollP,51:FixedWingRollI,52:FixedWingRollD,53:FixedWingRollFF,54:FixedWingPitchP,55:FixedWingPitchI,56:FixedWingPitchD,57:FixedWingPitchFF,101:Set_RateRollPitch,102:Set_RateRoll,103:Set_RatePitch,104:Set_RateYaw,105:Set_AngleRollPitch,106:Set_VelXY,107:Set_AccelZ,108:Set_RatePitchDP,109:Set_RateRollDP,110:Set_RateYawDP
      16             :     // @User: Standard
      17             :     AP_GROUPINFO("PARAM", 1, AP_Tuning_Plane, parmset, 0),
      18             : 
      19             :     // the rest of the parameters are from AP_Tuning
      20             :     AP_NESTEDGROUPINFO(AP_Tuning, 0),
      21             : 
      22             :     AP_GROUPEND
      23             : };
      24             : 
      25             : 
      26             : /*
      27             :   tables of tuning sets
      28             :  */
      29             : const uint8_t AP_Tuning_Plane::tuning_set_rate_roll_pitch[] =  { TUNING_RATE_ROLL_D, TUNING_RATE_ROLL_PI,
      30             :                                                                  TUNING_RATE_PITCH_D, TUNING_RATE_PITCH_PI};
      31             : const uint8_t AP_Tuning_Plane::tuning_set_rate_roll[] =        { TUNING_RATE_ROLL_D, TUNING_RATE_ROLL_PI };
      32             : const uint8_t AP_Tuning_Plane::tuning_set_rate_pitch[] =       { TUNING_RATE_PITCH_D, TUNING_RATE_PITCH_PI };
      33             : const uint8_t AP_Tuning_Plane::tuning_set_rate_yaw[] =         { TUNING_RATE_YAW_P, TUNING_RATE_YAW_I, TUNING_RATE_YAW_D };
      34             : const uint8_t AP_Tuning_Plane::tuning_set_ang_roll_pitch[] =   { TUNING_ANG_ROLL_P, TUNING_ANG_PITCH_P };
      35             : const uint8_t AP_Tuning_Plane::tuning_set_vxy[] =              { TUNING_VXY_P, TUNING_VXY_I };
      36             : const uint8_t AP_Tuning_Plane::tuning_set_az[] =               { TUNING_AZ_P, TUNING_AZ_I, TUNING_AZ_D };
      37             : const uint8_t AP_Tuning_Plane::tuning_set_rate_pitchDP[]=      { TUNING_RATE_PITCH_D, TUNING_RATE_PITCH_P };
      38             : const uint8_t AP_Tuning_Plane::tuning_set_rate_rollDP[]=       { TUNING_RATE_ROLL_D, TUNING_RATE_ROLL_P };
      39             : const uint8_t AP_Tuning_Plane::tuning_set_rate_yawDP[]=        { TUNING_RATE_YAW_D, TUNING_RATE_YAW_P };
      40             : const uint8_t AP_Tuning_Plane::tuning_set_dp_roll_pitch[] =    { TUNING_RLL_D, TUNING_RLL_P, TUNING_PIT_D, TUNING_PIT_P };
      41             : const uint8_t AP_Tuning_Plane::tuning_set_pidff_roll[] =       { TUNING_RLL_P, TUNING_RLL_I, TUNING_RLL_D, TUNING_RLL_FF };
      42             : const uint8_t AP_Tuning_Plane::tuning_set_pidff_pitch[] =      { TUNING_PIT_P, TUNING_PIT_I, TUNING_PIT_D, TUNING_PIT_FF };
      43             : 
      44             : // macro to prevent getting the array length wrong
      45             : #define TUNING_ARRAY(v) ARRAY_SIZE(v), v
      46             : 
      47             : // list of tuning sets
      48             : const AP_Tuning_Plane::tuning_set AP_Tuning_Plane::tuning_sets[] = {
      49             :     { TUNING_SET_RATE_ROLL_PITCH,       TUNING_ARRAY(tuning_set_rate_roll_pitch) },
      50             :     { TUNING_SET_RATE_ROLL,             TUNING_ARRAY(tuning_set_rate_roll) },
      51             :     { TUNING_SET_RATE_PITCH,            TUNING_ARRAY(tuning_set_rate_pitch) },
      52             :     { TUNING_SET_RATE_YAW,              TUNING_ARRAY(tuning_set_rate_yaw) },
      53             :     { TUNING_SET_ANG_ROLL_PITCH,        TUNING_ARRAY(tuning_set_ang_roll_pitch) },
      54             :     { TUNING_SET_VXY,                   TUNING_ARRAY(tuning_set_vxy) },
      55             :     { TUNING_SET_AZ,                    TUNING_ARRAY(tuning_set_az) },
      56             :     { TUNING_SET_RATE_PITCHDP,          TUNING_ARRAY(tuning_set_rate_pitchDP) },
      57             :     { TUNING_SET_RATE_ROLLDP,           TUNING_ARRAY(tuning_set_rate_rollDP) },
      58             :     { TUNING_SET_RATE_YAWDP,            TUNING_ARRAY(tuning_set_rate_yawDP) },
      59             :     { TUNING_SET_DP_ROLL_PITCH,         TUNING_ARRAY(tuning_set_dp_roll_pitch) },
      60             :     { TUNING_SET_PIDFF_ROLL,            TUNING_ARRAY(tuning_set_pidff_roll) },
      61             :     { TUNING_SET_PIDFF_PITCH,           TUNING_ARRAY(tuning_set_pidff_pitch) },
      62             :     { 0, 0, nullptr }
      63             : };
      64             : 
      65             : /*
      66             :   table of tuning names
      67             :  */
      68             : const AP_Tuning_Plane::tuning_name AP_Tuning_Plane::tuning_names[] = {
      69             :     { TUNING_RATE_ROLL_PI, "RateRollPI" },
      70             :     { TUNING_RATE_ROLL_P,  "RateRollP" },
      71             :     { TUNING_RATE_ROLL_I,  "RateRollI" },
      72             :     { TUNING_RATE_ROLL_D,  "RateRollD" },
      73             :     { TUNING_RATE_PITCH_PI,"RatePitchPI" },
      74             :     { TUNING_RATE_PITCH_P, "RatePitchP" },
      75             :     { TUNING_RATE_PITCH_I, "RatePitchI" },
      76             :     { TUNING_RATE_PITCH_D, "RatePitchD" },
      77             :     { TUNING_RATE_YAW_PI,  "RateYawPI" },
      78             :     { TUNING_RATE_YAW_P,   "RateYawP" },
      79             :     { TUNING_RATE_YAW_I,   "RateYawI" },
      80             :     { TUNING_RATE_YAW_D,   "RateYawD" },
      81             :     { TUNING_ANG_ROLL_P,   "AngRollP" },
      82             :     { TUNING_ANG_PITCH_P,  "AngPitchP" },
      83             :     { TUNING_ANG_YAW_P,    "AngYawP" },
      84             :     { TUNING_RATE_PITCH_FF, "RatePitchFF" },
      85             :     { TUNING_RATE_ROLL_FF, "RateRollFF" },
      86             :     { TUNING_RATE_YAW_FF, "RateYawFF" },
      87             :     { TUNING_PXY_P,        "PXY_P" },
      88             :     { TUNING_PZ_P,         "PZ_P" },
      89             :     { TUNING_VXY_P,        "VXY_P" },
      90             :     { TUNING_VXY_I,        "VXY_I" },
      91             :     { TUNING_VZ_P,         "VZ_P" },
      92             :     { TUNING_AZ_P,         "RateAZ_P" },
      93             :     { TUNING_AZ_I,         "RateAZ_I" },
      94             :     { TUNING_AZ_D,         "RateAZ_D" },
      95             :     { TUNING_RLL_P,        "RollP" },
      96             :     { TUNING_RLL_I,        "RollI" },
      97             :     { TUNING_RLL_D,        "RollD" },
      98             :     { TUNING_RLL_FF,       "RollFF" },
      99             :     { TUNING_PIT_P,        "PitchP" },
     100             :     { TUNING_PIT_I,        "PitchI" },
     101             :     { TUNING_PIT_D,        "PitchD" },
     102             :     { TUNING_PIT_FF,       "PitchFF" },
     103             :     { TUNING_Q_FWD_THR,    "QModeFwdThr" },
     104             :     { TUNING_NONE, nullptr }
     105             : };
     106             : 
     107             : /*
     108             :   get a pointer to an AP_Float for a parameter, or nullptr on fail
     109             :  */
     110           0 : AP_Float *AP_Tuning_Plane::get_param_pointer(uint8_t parm)
     111             : {
     112             : #if HAL_QUADPLANE_ENABLED
     113           0 :     if (parm < TUNING_FIXED_WING_BASE && !plane.quadplane.available()) {
     114             :         // quadplane tuning options not available
     115           0 :         return nullptr;
     116             :     }
     117             : #endif
     118             : 
     119           0 :     switch(parm) {
     120             : 
     121             : #if HAL_QUADPLANE_ENABLED
     122           0 :     case TUNING_RATE_ROLL_PI:
     123             :         // use P for initial value when tuning PI
     124           0 :         return &plane.quadplane.attitude_control->get_rate_roll_pid().kP();
     125             : 
     126           0 :     case TUNING_RATE_ROLL_P:
     127           0 :         return &plane.quadplane.attitude_control->get_rate_roll_pid().kP();
     128             : 
     129           0 :     case TUNING_RATE_ROLL_I:
     130           0 :         return &plane.quadplane.attitude_control->get_rate_roll_pid().kI();
     131             : 
     132           0 :     case TUNING_RATE_ROLL_D:
     133           0 :         return &plane.quadplane.attitude_control->get_rate_roll_pid().kD();
     134             : 
     135           0 :     case TUNING_RATE_PITCH_PI:
     136           0 :         return &plane.quadplane.attitude_control->get_rate_pitch_pid().kP();
     137             : 
     138           0 :     case TUNING_RATE_PITCH_P:
     139           0 :         return &plane.quadplane.attitude_control->get_rate_pitch_pid().kP();
     140             : 
     141           0 :     case TUNING_RATE_PITCH_I:
     142           0 :         return &plane.quadplane.attitude_control->get_rate_pitch_pid().kI();
     143             : 
     144           0 :     case TUNING_RATE_PITCH_D:
     145           0 :         return &plane.quadplane.attitude_control->get_rate_pitch_pid().kD();
     146             : 
     147           0 :     case TUNING_RATE_YAW_PI:
     148           0 :         return &plane.quadplane.attitude_control->get_rate_yaw_pid().kP();
     149             : 
     150           0 :     case TUNING_RATE_YAW_P:
     151           0 :         return &plane.quadplane.attitude_control->get_rate_yaw_pid().kP();
     152             : 
     153           0 :     case TUNING_RATE_YAW_I:
     154           0 :         return &plane.quadplane.attitude_control->get_rate_yaw_pid().kI();
     155             : 
     156           0 :     case TUNING_RATE_YAW_D:
     157           0 :         return &plane.quadplane.attitude_control->get_rate_yaw_pid().kD();
     158             : 
     159           0 :     case TUNING_ANG_ROLL_P:
     160           0 :         return &plane.quadplane.attitude_control->get_angle_roll_p().kP();
     161             : 
     162           0 :     case TUNING_ANG_PITCH_P:
     163           0 :         return &plane.quadplane.attitude_control->get_angle_pitch_p().kP();
     164             : 
     165           0 :     case TUNING_ANG_YAW_P:
     166           0 :         return &plane.quadplane.attitude_control->get_angle_yaw_p().kP();
     167             : 
     168           0 :     case TUNING_PXY_P:
     169           0 :         return &plane.quadplane.pos_control->NE_get_pos_p().kP();
     170             : 
     171           0 :     case TUNING_PZ_P:
     172           0 :         return &plane.quadplane.pos_control->D_get_pos_p().kP();
     173             : 
     174           0 :     case TUNING_VXY_P:
     175           0 :         return &plane.quadplane.pos_control->NE_get_vel_pid().kP();
     176             : 
     177           0 :     case TUNING_VXY_I:
     178           0 :         return &plane.quadplane.pos_control->NE_get_vel_pid().kI();
     179             : 
     180           0 :     case TUNING_VZ_P:
     181           0 :         return &plane.quadplane.pos_control->D_get_vel_pid().kP();
     182             : 
     183           0 :     case TUNING_AZ_P:
     184           0 :         return &plane.quadplane.pos_control->D_get_accel_pid().kP();
     185             : 
     186           0 :     case TUNING_AZ_I:
     187           0 :         return &plane.quadplane.pos_control->D_get_accel_pid().kI();
     188             : 
     189           0 :     case TUNING_AZ_D:
     190           0 :         return &plane.quadplane.pos_control->D_get_accel_pid().kD();
     191             : 
     192           0 :     case TUNING_RATE_PITCH_FF:
     193           0 :         return &plane.quadplane.attitude_control->get_rate_pitch_pid().ff();
     194             : 
     195           0 :     case TUNING_RATE_ROLL_FF:
     196           0 :         return &plane.quadplane.attitude_control->get_rate_roll_pid().ff();
     197             : 
     198           0 :     case TUNING_RATE_YAW_FF:
     199           0 :         return &plane.quadplane.attitude_control->get_rate_yaw_pid().ff();
     200             : 
     201           0 :     case TUNING_Q_FWD_THR:
     202           0 :         return &plane.quadplane.q_fwd_thr_gain;
     203             : #endif // HAL_QUADPLANE_ENABLED
     204             : 
     205             :     // fixed wing tuning parameters
     206           0 :     case TUNING_RLL_P:
     207           0 :         return &plane.rollController.kP();
     208             : 
     209           0 :     case TUNING_RLL_I:
     210           0 :         return &plane.rollController.kI();
     211             : 
     212           0 :     case TUNING_RLL_D:
     213           0 :         return &plane.rollController.kD();
     214             : 
     215           0 :     case TUNING_RLL_FF:
     216           0 :         return &plane.rollController.kFF();
     217             : 
     218           0 :     case TUNING_PIT_P:
     219           0 :         return &plane.pitchController.kP();
     220             : 
     221           0 :     case TUNING_PIT_I:
     222           0 :         return &plane.pitchController.kI();
     223             : 
     224           0 :     case TUNING_PIT_D:
     225           0 :         return &plane.pitchController.kD();
     226             : 
     227           0 :     case TUNING_PIT_FF:
     228           0 :         return &plane.pitchController.kFF();
     229             :     }
     230           0 :     return nullptr;
     231             : }
     232             : 
     233             : 
     234             : /*
     235             :   save a parameter
     236             :  */
     237           0 : void AP_Tuning_Plane::save_value(uint8_t parm)
     238             : {
     239           0 :     switch(parm) {
     240             :     // special handling of dual-parameters
     241           0 :     case TUNING_RATE_ROLL_PI:
     242           0 :         save_value(TUNING_RATE_ROLL_P);
     243           0 :         save_value(TUNING_RATE_ROLL_I);
     244           0 :         break;
     245           0 :     case TUNING_RATE_PITCH_PI:
     246           0 :         save_value(TUNING_RATE_PITCH_P);
     247           0 :         save_value(TUNING_RATE_PITCH_I);
     248           0 :         break;
     249           0 :     default:
     250           0 :         AP_Float *f = get_param_pointer(parm);
     251           0 :         if (f != nullptr) {
     252           0 :             f->save();
     253             :         }
     254           0 :         break;
     255             :     }
     256           0 : }
     257             : 
     258             : /*
     259             :   set a parameter
     260             :  */
     261           0 : void AP_Tuning_Plane::set_value(uint8_t parm, float value)
     262             : {
     263           0 :     switch(parm) {
     264             :     // special handling of dual-parameters
     265           0 :     case TUNING_RATE_ROLL_PI:
     266           0 :         set_value(TUNING_RATE_ROLL_P, value);
     267           0 :         set_value(TUNING_RATE_ROLL_I, value);
     268           0 :         break;
     269           0 :     case TUNING_RATE_PITCH_PI:
     270           0 :         set_value(TUNING_RATE_PITCH_P, value);
     271           0 :         set_value(TUNING_RATE_PITCH_I, value);
     272           0 :         break;
     273           0 :     default:
     274           0 :         AP_Float *f = get_param_pointer(parm);
     275           0 :         if (f != nullptr) {
     276           0 :             uint64_t param_bit = (1ULL << parm);
     277           0 :             if (!(param_bit & have_set)) {
     278             :                 // first time this param has been set by tuning. We
     279             :                 // need to see if a reversion value is available in
     280             :                 // FRAM, and if not then save one
     281           0 :                 float current_value = f->get();
     282           0 :                 if (!f->load()) {
     283             :                     // there is no value in FRAM, set one
     284           0 :                     f->set_and_save(current_value);
     285             :                 }
     286           0 :                 have_set |= param_bit;
     287             :             }
     288           0 :             f->set_and_notify(value);
     289             :         }
     290           0 :         break;
     291             :     }
     292           0 : }
     293             : 
     294             : /*
     295             :   reload a parameter
     296             :  */
     297           0 : void AP_Tuning_Plane::reload_value(uint8_t parm)
     298             : {
     299           0 :     switch(parm) {
     300             :     // special handling of dual-parameters
     301           0 :     case TUNING_RATE_ROLL_PI:
     302           0 :         reload_value(TUNING_RATE_ROLL_P);
     303           0 :         reload_value(TUNING_RATE_ROLL_I);
     304           0 :         break;
     305           0 :     case TUNING_RATE_PITCH_PI:
     306           0 :         reload_value(TUNING_RATE_PITCH_P);
     307           0 :         reload_value(TUNING_RATE_PITCH_I);
     308           0 :         break;
     309           0 :     default:
     310           0 :         AP_Float *f = get_param_pointer(parm);
     311           0 :         if (f != nullptr) {
     312           0 :             uint64_t param_bit = (1ULL << parm);
     313             :             // only reload if we have set this parameter at some point
     314           0 :             if (param_bit & have_set) {
     315           0 :                 f->load();
     316             :             }
     317             :         }
     318           0 :         break;
     319             :     }
     320           0 : }
     321             : 
     322             : #endif  // AP_TUNING_ENABLED

Generated by: LCOV version 1.14