2016-04-16 07:26:43 -03:00
|
|
|
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
|
|
|
|
|
|
|
#include "Plane.h"
|
|
|
|
|
2016-05-06 01:43:39 -03:00
|
|
|
/*
|
|
|
|
tables of tuning sets
|
|
|
|
*/
|
|
|
|
const uint8_t AP_Tuning_Plane::tuning_set_q_rate_roll_pitch[] = { TUNING_Q_RATE_ROLL_KD, TUNING_Q_RATE_ROLL_KPI,
|
|
|
|
TUNING_Q_RATE_PITCH_KD, TUNING_Q_RATE_PITCH_KPI};
|
|
|
|
const uint8_t AP_Tuning_Plane::tuning_set_q_rate_roll[] = { TUNING_Q_RATE_ROLL_KD, TUNING_Q_RATE_ROLL_KPI };
|
|
|
|
const uint8_t AP_Tuning_Plane::tuning_set_q_rate_pitch[] = { TUNING_Q_RATE_PITCH_KD, TUNING_Q_RATE_PITCH_KPI };
|
|
|
|
|
|
|
|
// macro to prevent getting the array length wrong
|
|
|
|
#define TUNING_ARRAY(v) ARRAY_SIZE(v), v
|
|
|
|
|
|
|
|
// list of tuning sets
|
|
|
|
const AP_Tuning_Plane::tuning_set AP_Tuning_Plane::tuning_sets[] = {
|
|
|
|
{ TUNING_SET_Q_RATE_ROLL_PITCH, TUNING_ARRAY(tuning_set_q_rate_roll_pitch) },
|
|
|
|
{ TUNING_SET_Q_RATE_ROLL, TUNING_ARRAY(tuning_set_q_rate_roll) },
|
|
|
|
{ TUNING_SET_Q_RATE_PITCH, TUNING_ARRAY(tuning_set_q_rate_pitch) },
|
|
|
|
{ TUNING_SET_NONE, 0, nullptr }
|
2016-04-16 07:26:43 -03:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
2016-05-06 01:43:39 -03:00
|
|
|
table of tuning names
|
2016-04-16 07:26:43 -03:00
|
|
|
*/
|
2016-05-06 01:43:39 -03:00
|
|
|
const AP_Tuning_Plane::tuning_name AP_Tuning_Plane::tuning_names[] = {
|
|
|
|
{ TUNING_Q_RATE_ROLL_KPI, "Q_RateRollPI" },
|
|
|
|
{ TUNING_Q_RATE_ROLL_KD, "Q_RateRollD" },
|
|
|
|
{ TUNING_Q_RATE_PITCH_KPI,"Q_RatePitchPI" },
|
|
|
|
{ TUNING_Q_RATE_PITCH_KD, "Q_RatePitchD" },
|
|
|
|
{ TUNING_NONE, nullptr }
|
|
|
|
};
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
/*
|
2016-05-06 01:43:39 -03:00
|
|
|
get a pointer to an AP_Float for a parameter, or NULL on fail
|
2016-04-16 07:26:43 -03:00
|
|
|
*/
|
2016-05-06 01:43:39 -03:00
|
|
|
AP_Float *AP_Tuning_Plane::get_param_pointer(uint8_t parm)
|
2016-04-16 07:26:43 -03:00
|
|
|
{
|
2016-05-06 01:43:39 -03:00
|
|
|
switch (parm) {
|
2016-04-16 07:38:00 -03:00
|
|
|
case TUNING_RLL_P:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.rollController.kP();
|
2016-04-16 07:38:00 -03:00
|
|
|
|
|
|
|
case TUNING_RLL_I:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.rollController.kI();
|
2016-04-16 07:38:00 -03:00
|
|
|
|
|
|
|
case TUNING_RLL_D:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.rollController.kD();
|
2016-04-16 07:38:00 -03:00
|
|
|
|
|
|
|
case TUNING_RLL_FF:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.rollController.kFF();
|
2016-04-16 07:38:00 -03:00
|
|
|
|
|
|
|
case TUNING_PIT_P:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.pitchController.kP();
|
2016-04-16 07:38:00 -03:00
|
|
|
|
|
|
|
case TUNING_PIT_I:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.pitchController.kI();
|
2016-04-16 07:38:00 -03:00
|
|
|
|
|
|
|
case TUNING_PIT_D:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.pitchController.kD();
|
2016-04-16 07:38:00 -03:00
|
|
|
|
|
|
|
case TUNING_PIT_FF:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.pitchController.kFF();
|
2016-04-16 07:38:00 -03:00
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2016-04-16 07:26:43 -03:00
|
|
|
if (!plane.quadplane.available()) {
|
|
|
|
// quadplane tuning options not available
|
2016-05-06 01:43:39 -03:00
|
|
|
return nullptr;
|
2016-04-16 07:26:43 -03:00
|
|
|
}
|
2016-04-16 07:38:00 -03:00
|
|
|
|
2016-05-06 01:43:39 -03:00
|
|
|
switch(parm) {
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_ROLL_KPI:
|
2016-05-06 01:43:39 -03:00
|
|
|
// use P for initial value when tuning PI
|
|
|
|
return &plane.quadplane.attitude_control->get_rate_roll_pid().kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_ROLL_KP:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_roll_pid().kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_ROLL_KI:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_roll_pid().kI();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_ROLL_KD:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_roll_pid().kD();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_PITCH_KPI:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_pitch_pid().kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_PITCH_KP:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_pitch_pid().kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_PITCH_KI:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_pitch_pid().kI();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_PITCH_KD:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_pitch_pid().kD();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_YAW_KPI:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_yaw_pid().kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_YAW_KP:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_yaw_pid().kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_YAW_KI:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_yaw_pid().kI();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_RATE_YAW_KD:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_rate_yaw_pid().kD();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_ANG_ROLL_KP:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_angle_roll_p().kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_ANG_PITCH_KP:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_angle_pitch_p().kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_ANG_YAW_KP:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.attitude_control->get_angle_yaw_p().kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_PXY_P:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.p_pos_xy.kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_PZ_P:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.p_alt_hold.kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_VXY_P:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.pi_vel_xy.kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_VXY_I:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.pi_vel_xy.kI();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_VZ_P:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.p_vel_z.kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_AZ_P:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.pid_accel_z.kP();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_AZ_I:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.pid_accel_z.kI();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
case TUNING_Q_AZ_D:
|
2016-05-06 01:43:39 -03:00
|
|
|
return &plane.quadplane.pid_accel_z.kD();
|
2016-04-16 07:26:43 -03:00
|
|
|
|
|
|
|
default:
|
2016-05-06 01:43:39 -03:00
|
|
|
break;
|
2016-04-16 07:26:43 -03:00
|
|
|
}
|
2016-05-06 01:43:39 -03:00
|
|
|
return nullptr;
|
2016-04-16 07:26:43 -03:00
|
|
|
}
|
|
|
|
|
2016-05-06 01:43:39 -03:00
|
|
|
|
2016-04-16 07:26:43 -03:00
|
|
|
/*
|
2016-05-06 01:43:39 -03:00
|
|
|
save a parameter
|
2016-04-16 07:26:43 -03:00
|
|
|
*/
|
2016-05-06 01:43:39 -03:00
|
|
|
void AP_Tuning_Plane::save_value(uint8_t parm)
|
2016-04-16 07:26:43 -03:00
|
|
|
{
|
2016-05-06 01:43:39 -03:00
|
|
|
switch(parm) {
|
|
|
|
// special handling of dual-parameters
|
|
|
|
case TUNING_Q_RATE_ROLL_KPI:
|
|
|
|
save_value(TUNING_Q_RATE_ROLL_KP);
|
|
|
|
save_value(TUNING_Q_RATE_ROLL_KI);
|
|
|
|
break;
|
|
|
|
case TUNING_Q_RATE_PITCH_KPI:
|
|
|
|
save_value(TUNING_Q_RATE_PITCH_KP);
|
|
|
|
save_value(TUNING_Q_RATE_PITCH_KI);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
AP_Float *f = get_param_pointer(parm);
|
|
|
|
if (f != nullptr) {
|
|
|
|
f->save();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
set a parameter
|
|
|
|
*/
|
|
|
|
void AP_Tuning_Plane::set_value(uint8_t parm, float value)
|
|
|
|
{
|
|
|
|
switch(parm) {
|
|
|
|
// special handling of dual-parameters
|
|
|
|
case TUNING_Q_RATE_ROLL_KPI:
|
|
|
|
set_value(TUNING_Q_RATE_ROLL_KP, value);
|
|
|
|
set_value(TUNING_Q_RATE_ROLL_KI, value);
|
|
|
|
break;
|
|
|
|
case TUNING_Q_RATE_PITCH_KPI:
|
|
|
|
set_value(TUNING_Q_RATE_PITCH_KP, value);
|
|
|
|
set_value(TUNING_Q_RATE_PITCH_KI, value);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
AP_Float *f = get_param_pointer(parm);
|
|
|
|
if (f != nullptr) {
|
|
|
|
f->set_and_notify(value);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
reload a parameter
|
|
|
|
*/
|
|
|
|
void AP_Tuning_Plane::reload_value(uint8_t parm)
|
|
|
|
{
|
|
|
|
switch(parm) {
|
|
|
|
// special handling of dual-parameters
|
|
|
|
case TUNING_Q_RATE_ROLL_KPI:
|
|
|
|
reload_value(TUNING_Q_RATE_ROLL_KP);
|
|
|
|
reload_value(TUNING_Q_RATE_ROLL_KI);
|
|
|
|
break;
|
|
|
|
case TUNING_Q_RATE_PITCH_KPI:
|
|
|
|
reload_value(TUNING_Q_RATE_PITCH_KP);
|
|
|
|
reload_value(TUNING_Q_RATE_PITCH_KI);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
AP_Float *f = get_param_pointer(parm);
|
|
|
|
if (f != nullptr) {
|
|
|
|
f->load();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2016-04-16 07:26:43 -03:00
|
|
|
}
|