|
|
|
@ -44,35 +44,105 @@
@@ -44,35 +44,105 @@
|
|
|
|
|
ActuatorEffectivenessMultirotor::ActuatorEffectivenessMultirotor(): |
|
|
|
|
ModuleParams(nullptr) |
|
|
|
|
{ |
|
|
|
|
parameters_updated(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
ActuatorEffectivenessMultirotor::update() |
|
|
|
|
ActuatorEffectivenessMultirotor::getEffectivenessMatrix(matrix::Matrix<float, NUM_AXES, NUM_ACTUATORS> &matrix) |
|
|
|
|
{ |
|
|
|
|
bool updated = false; |
|
|
|
|
|
|
|
|
|
// Check if parameters have changed
|
|
|
|
|
if (_parameter_update_sub.updated()) { |
|
|
|
|
if (_updated || _parameter_update_sub.updated()) { |
|
|
|
|
// clear update
|
|
|
|
|
parameter_update_s param_update; |
|
|
|
|
_parameter_update_sub.copy(¶m_update); |
|
|
|
|
|
|
|
|
|
updateParams(); |
|
|
|
|
parameters_updated(); |
|
|
|
|
|
|
|
|
|
updated = true; |
|
|
|
|
_updated = false; |
|
|
|
|
|
|
|
|
|
// Get multirotor geometry
|
|
|
|
|
MultirotorGeometry geometry = {}; |
|
|
|
|
geometry.rotors[0].position_x = _param_ca_mc_r0_px.get(); |
|
|
|
|
geometry.rotors[0].position_y = _param_ca_mc_r0_py.get(); |
|
|
|
|
geometry.rotors[0].position_z = _param_ca_mc_r0_pz.get(); |
|
|
|
|
geometry.rotors[0].axis_x = _param_ca_mc_r0_ax.get(); |
|
|
|
|
geometry.rotors[0].axis_y = _param_ca_mc_r0_ay.get(); |
|
|
|
|
geometry.rotors[0].axis_z = _param_ca_mc_r0_az.get(); |
|
|
|
|
geometry.rotors[0].thrust_coef = _param_ca_mc_r0_ct.get(); |
|
|
|
|
geometry.rotors[0].moment_ratio = _param_ca_mc_r0_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[1].position_x = _param_ca_mc_r1_px.get(); |
|
|
|
|
geometry.rotors[1].position_y = _param_ca_mc_r1_py.get(); |
|
|
|
|
geometry.rotors[1].position_z = _param_ca_mc_r1_pz.get(); |
|
|
|
|
geometry.rotors[1].axis_x = _param_ca_mc_r1_ax.get(); |
|
|
|
|
geometry.rotors[1].axis_y = _param_ca_mc_r1_ay.get(); |
|
|
|
|
geometry.rotors[1].axis_z = _param_ca_mc_r1_az.get(); |
|
|
|
|
geometry.rotors[1].thrust_coef = _param_ca_mc_r1_ct.get(); |
|
|
|
|
geometry.rotors[1].moment_ratio = _param_ca_mc_r1_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[2].position_x = _param_ca_mc_r2_px.get(); |
|
|
|
|
geometry.rotors[2].position_y = _param_ca_mc_r2_py.get(); |
|
|
|
|
geometry.rotors[2].position_z = _param_ca_mc_r2_pz.get(); |
|
|
|
|
geometry.rotors[2].axis_x = _param_ca_mc_r2_ax.get(); |
|
|
|
|
geometry.rotors[2].axis_y = _param_ca_mc_r2_ay.get(); |
|
|
|
|
geometry.rotors[2].axis_z = _param_ca_mc_r2_az.get(); |
|
|
|
|
geometry.rotors[2].thrust_coef = _param_ca_mc_r2_ct.get(); |
|
|
|
|
geometry.rotors[2].moment_ratio = _param_ca_mc_r2_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[3].position_x = _param_ca_mc_r3_px.get(); |
|
|
|
|
geometry.rotors[3].position_y = _param_ca_mc_r3_py.get(); |
|
|
|
|
geometry.rotors[3].position_z = _param_ca_mc_r3_pz.get(); |
|
|
|
|
geometry.rotors[3].axis_x = _param_ca_mc_r3_ax.get(); |
|
|
|
|
geometry.rotors[3].axis_y = _param_ca_mc_r3_ay.get(); |
|
|
|
|
geometry.rotors[3].axis_z = _param_ca_mc_r3_az.get(); |
|
|
|
|
geometry.rotors[3].thrust_coef = _param_ca_mc_r3_ct.get(); |
|
|
|
|
geometry.rotors[3].moment_ratio = _param_ca_mc_r3_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[4].position_x = _param_ca_mc_r4_px.get(); |
|
|
|
|
geometry.rotors[4].position_y = _param_ca_mc_r4_py.get(); |
|
|
|
|
geometry.rotors[4].position_z = _param_ca_mc_r4_pz.get(); |
|
|
|
|
geometry.rotors[4].axis_x = _param_ca_mc_r4_ax.get(); |
|
|
|
|
geometry.rotors[4].axis_y = _param_ca_mc_r4_ay.get(); |
|
|
|
|
geometry.rotors[4].axis_z = _param_ca_mc_r4_az.get(); |
|
|
|
|
geometry.rotors[4].thrust_coef = _param_ca_mc_r4_ct.get(); |
|
|
|
|
geometry.rotors[4].moment_ratio = _param_ca_mc_r4_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[5].position_x = _param_ca_mc_r5_px.get(); |
|
|
|
|
geometry.rotors[5].position_y = _param_ca_mc_r5_py.get(); |
|
|
|
|
geometry.rotors[5].position_z = _param_ca_mc_r5_pz.get(); |
|
|
|
|
geometry.rotors[5].axis_x = _param_ca_mc_r5_ax.get(); |
|
|
|
|
geometry.rotors[5].axis_y = _param_ca_mc_r5_ay.get(); |
|
|
|
|
geometry.rotors[5].axis_z = _param_ca_mc_r5_az.get(); |
|
|
|
|
geometry.rotors[5].thrust_coef = _param_ca_mc_r5_ct.get(); |
|
|
|
|
geometry.rotors[5].moment_ratio = _param_ca_mc_r5_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[6].position_x = _param_ca_mc_r6_px.get(); |
|
|
|
|
geometry.rotors[6].position_y = _param_ca_mc_r6_py.get(); |
|
|
|
|
geometry.rotors[6].position_z = _param_ca_mc_r6_pz.get(); |
|
|
|
|
geometry.rotors[6].axis_x = _param_ca_mc_r6_ax.get(); |
|
|
|
|
geometry.rotors[6].axis_y = _param_ca_mc_r6_ay.get(); |
|
|
|
|
geometry.rotors[6].axis_z = _param_ca_mc_r6_az.get(); |
|
|
|
|
geometry.rotors[6].thrust_coef = _param_ca_mc_r6_ct.get(); |
|
|
|
|
geometry.rotors[6].moment_ratio = _param_ca_mc_r6_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[7].position_x = _param_ca_mc_r7_px.get(); |
|
|
|
|
geometry.rotors[7].position_y = _param_ca_mc_r7_py.get(); |
|
|
|
|
geometry.rotors[7].position_z = _param_ca_mc_r7_pz.get(); |
|
|
|
|
geometry.rotors[7].axis_x = _param_ca_mc_r7_ax.get(); |
|
|
|
|
geometry.rotors[7].axis_y = _param_ca_mc_r7_ay.get(); |
|
|
|
|
geometry.rotors[7].axis_z = _param_ca_mc_r7_az.get(); |
|
|
|
|
geometry.rotors[7].thrust_coef = _param_ca_mc_r7_ct.get(); |
|
|
|
|
geometry.rotors[7].moment_ratio = _param_ca_mc_r7_km.get(); |
|
|
|
|
|
|
|
|
|
computeEffectivenessMatrix(geometry, matrix); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return updated; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
matrix::Matrix<float, ActuatorEffectivenessMultirotor::NUM_AXES, ActuatorEffectivenessMultirotor::NUM_ACTUATORS> |
|
|
|
|
ActuatorEffectivenessMultirotor::computeEffectivenessMatrix(MultirotorGeometry geometry) |
|
|
|
|
void |
|
|
|
|
ActuatorEffectivenessMultirotor::computeEffectivenessMatrix(const MultirotorGeometry &geometry, |
|
|
|
|
matrix::Matrix<float, NUM_AXES, NUM_ACTUATORS> &effectiveness) |
|
|
|
|
{ |
|
|
|
|
matrix::Matrix<float, ActuatorEffectivenessMultirotor::NUM_AXES, ActuatorEffectivenessMultirotor::NUM_ACTUATORS> |
|
|
|
|
effectiveness; |
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < NUM_ROTORS_MAX; i++) { |
|
|
|
|
// Get rotor axis
|
|
|
|
|
matrix::Vector3f axis( |
|
|
|
@ -115,87 +185,4 @@ ActuatorEffectivenessMultirotor::computeEffectivenessMatrix(MultirotorGeometry g
@@ -115,87 +185,4 @@ ActuatorEffectivenessMultirotor::computeEffectivenessMatrix(MultirotorGeometry g
|
|
|
|
|
effectiveness(j + 3, i) = thrust(j); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return effectiveness; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
ActuatorEffectivenessMultirotor::parameters_updated() |
|
|
|
|
{ |
|
|
|
|
// Get multirotor geometry
|
|
|
|
|
MultirotorGeometry geometry = {}; |
|
|
|
|
geometry.rotors[0].position_x = _param_ca_mc_r0_px.get(); |
|
|
|
|
geometry.rotors[0].position_y = _param_ca_mc_r0_py.get(); |
|
|
|
|
geometry.rotors[0].position_z = _param_ca_mc_r0_pz.get(); |
|
|
|
|
geometry.rotors[0].axis_x = _param_ca_mc_r0_ax.get(); |
|
|
|
|
geometry.rotors[0].axis_y = _param_ca_mc_r0_ay.get(); |
|
|
|
|
geometry.rotors[0].axis_z = _param_ca_mc_r0_az.get(); |
|
|
|
|
geometry.rotors[0].thrust_coef = _param_ca_mc_r0_ct.get(); |
|
|
|
|
geometry.rotors[0].moment_ratio = _param_ca_mc_r0_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[1].position_x = _param_ca_mc_r1_px.get(); |
|
|
|
|
geometry.rotors[1].position_y = _param_ca_mc_r1_py.get(); |
|
|
|
|
geometry.rotors[1].position_z = _param_ca_mc_r1_pz.get(); |
|
|
|
|
geometry.rotors[1].axis_x = _param_ca_mc_r1_ax.get(); |
|
|
|
|
geometry.rotors[1].axis_y = _param_ca_mc_r1_ay.get(); |
|
|
|
|
geometry.rotors[1].axis_z = _param_ca_mc_r1_az.get(); |
|
|
|
|
geometry.rotors[1].thrust_coef = _param_ca_mc_r1_ct.get(); |
|
|
|
|
geometry.rotors[1].moment_ratio = _param_ca_mc_r1_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[2].position_x = _param_ca_mc_r2_px.get(); |
|
|
|
|
geometry.rotors[2].position_y = _param_ca_mc_r2_py.get(); |
|
|
|
|
geometry.rotors[2].position_z = _param_ca_mc_r2_pz.get(); |
|
|
|
|
geometry.rotors[2].axis_x = _param_ca_mc_r2_ax.get(); |
|
|
|
|
geometry.rotors[2].axis_y = _param_ca_mc_r2_ay.get(); |
|
|
|
|
geometry.rotors[2].axis_z = _param_ca_mc_r2_az.get(); |
|
|
|
|
geometry.rotors[2].thrust_coef = _param_ca_mc_r2_ct.get(); |
|
|
|
|
geometry.rotors[2].moment_ratio = _param_ca_mc_r2_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[3].position_x = _param_ca_mc_r3_px.get(); |
|
|
|
|
geometry.rotors[3].position_y = _param_ca_mc_r3_py.get(); |
|
|
|
|
geometry.rotors[3].position_z = _param_ca_mc_r3_pz.get(); |
|
|
|
|
geometry.rotors[3].axis_x = _param_ca_mc_r3_ax.get(); |
|
|
|
|
geometry.rotors[3].axis_y = _param_ca_mc_r3_ay.get(); |
|
|
|
|
geometry.rotors[3].axis_z = _param_ca_mc_r3_az.get(); |
|
|
|
|
geometry.rotors[3].thrust_coef = _param_ca_mc_r3_ct.get(); |
|
|
|
|
geometry.rotors[3].moment_ratio = _param_ca_mc_r3_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[4].position_x = _param_ca_mc_r4_px.get(); |
|
|
|
|
geometry.rotors[4].position_y = _param_ca_mc_r4_py.get(); |
|
|
|
|
geometry.rotors[4].position_z = _param_ca_mc_r4_pz.get(); |
|
|
|
|
geometry.rotors[4].axis_x = _param_ca_mc_r4_ax.get(); |
|
|
|
|
geometry.rotors[4].axis_y = _param_ca_mc_r4_ay.get(); |
|
|
|
|
geometry.rotors[4].axis_z = _param_ca_mc_r4_az.get(); |
|
|
|
|
geometry.rotors[4].thrust_coef = _param_ca_mc_r4_ct.get(); |
|
|
|
|
geometry.rotors[4].moment_ratio = _param_ca_mc_r4_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[5].position_x = _param_ca_mc_r5_px.get(); |
|
|
|
|
geometry.rotors[5].position_y = _param_ca_mc_r5_py.get(); |
|
|
|
|
geometry.rotors[5].position_z = _param_ca_mc_r5_pz.get(); |
|
|
|
|
geometry.rotors[5].axis_x = _param_ca_mc_r5_ax.get(); |
|
|
|
|
geometry.rotors[5].axis_y = _param_ca_mc_r5_ay.get(); |
|
|
|
|
geometry.rotors[5].axis_z = _param_ca_mc_r5_az.get(); |
|
|
|
|
geometry.rotors[5].thrust_coef = _param_ca_mc_r5_ct.get(); |
|
|
|
|
geometry.rotors[5].moment_ratio = _param_ca_mc_r5_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[6].position_x = _param_ca_mc_r6_px.get(); |
|
|
|
|
geometry.rotors[6].position_y = _param_ca_mc_r6_py.get(); |
|
|
|
|
geometry.rotors[6].position_z = _param_ca_mc_r6_pz.get(); |
|
|
|
|
geometry.rotors[6].axis_x = _param_ca_mc_r6_ax.get(); |
|
|
|
|
geometry.rotors[6].axis_y = _param_ca_mc_r6_ay.get(); |
|
|
|
|
geometry.rotors[6].axis_z = _param_ca_mc_r6_az.get(); |
|
|
|
|
geometry.rotors[6].thrust_coef = _param_ca_mc_r6_ct.get(); |
|
|
|
|
geometry.rotors[6].moment_ratio = _param_ca_mc_r6_km.get(); |
|
|
|
|
|
|
|
|
|
geometry.rotors[7].position_x = _param_ca_mc_r7_px.get(); |
|
|
|
|
geometry.rotors[7].position_y = _param_ca_mc_r7_py.get(); |
|
|
|
|
geometry.rotors[7].position_z = _param_ca_mc_r7_pz.get(); |
|
|
|
|
geometry.rotors[7].axis_x = _param_ca_mc_r7_ax.get(); |
|
|
|
|
geometry.rotors[7].axis_y = _param_ca_mc_r7_ay.get(); |
|
|
|
|
geometry.rotors[7].axis_z = _param_ca_mc_r7_az.get(); |
|
|
|
|
geometry.rotors[7].thrust_coef = _param_ca_mc_r7_ct.get(); |
|
|
|
|
geometry.rotors[7].moment_ratio = _param_ca_mc_r7_km.get(); |
|
|
|
|
|
|
|
|
|
// Compute effectiveness matrix
|
|
|
|
|
_effectiveness = computeEffectivenessMatrix(geometry); |
|
|
|
|
} |
|
|
|
|