Copter: fixed load of var_info for attitude_control and motors

we need to pass the var_info for the specific class we are using, not
the parent class.

Fixes issue #5585

thanks to Julien for noticing!
This commit is contained in:
Andrew Tridgell 2017-01-20 11:19:20 +11:00
parent 8a32d09264
commit 332820aa88
1 changed files with 11 additions and 2 deletions

View File

@ -535,6 +535,8 @@ const char* Copter::get_frame_string()
*/
void Copter::allocate_motors(void)
{
const struct AP_Param::GroupInfo *var_info;
switch ((AP_Motors::motor_frame_class)g2.frame_class.get()) {
#if FRAME_CONFIG != HELI_FRAME
case AP_Motors::MOTOR_FRAME_QUAD:
@ -544,37 +546,44 @@ void Copter::allocate_motors(void)
case AP_Motors::MOTOR_FRAME_OCTAQUAD:
default:
motors = new AP_MotorsMatrix(MAIN_LOOP_RATE);
var_info = AP_MotorsMatrix::var_info;
break;
case AP_Motors::MOTOR_FRAME_TRI:
motors = new AP_MotorsTri(MAIN_LOOP_RATE);
var_info = AP_MotorsTri::var_info;
break;
case AP_Motors::MOTOR_FRAME_SINGLE:
motors = new AP_MotorsSingle(MAIN_LOOP_RATE);
var_info = AP_MotorsSingle::var_info;
break;
case AP_Motors::MOTOR_FRAME_COAX:
motors = new AP_MotorsCoax(MAIN_LOOP_RATE);
var_info = AP_MotorsCoax::var_info;
break;
#else // FRAME_CONFIG == HELI_FRAME
case AP_Motors::MOTOR_FRAME_HELI:
default:
motors = new AP_MotorsHeli_Single(MAIN_LOOP_RATE);
var_info = AP_MotorsHeli::var_info;
break;
#endif
}
if (motors == nullptr) {
AP_HAL::panic("Unable to allocate FRAME_CLASS=%u", (unsigned)g2.frame_class.get());
}
AP_Param::load_object_from_eeprom(motors, motors->var_info);
AP_Param::load_object_from_eeprom(motors, var_info);
#if FRAME_CONFIG != HELI_FRAME
attitude_control = new AC_AttitudeControl_Multi(ahrs, aparm, *motors, MAIN_LOOP_SECONDS);
var_info = AC_AttitudeControl_Multi::var_info;
#else
attitude_control = new AC_AttitudeControl_Heli(ahrs, aparm, *motors, MAIN_LOOP_SECONDS);
var_info = AC_AttitudeControl_Heli::var_info;
#endif
if (attitude_control == nullptr) {
AP_HAL::panic("Unable to allocate AttitudeControl");
}
AP_Param::load_object_from_eeprom(attitude_control, attitude_control->var_info);
AP_Param::load_object_from_eeprom(attitude_control, var_info);
pos_control = new AC_PosControl(ahrs, inertial_nav, *motors, *attitude_control,
g.p_alt_hold, g.p_vel_z, g.pid_accel_z,