/**************************************************************************** * * Copyright (c) 2021 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. Neither the name PX4 nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************/ #include "ActuatorEffectivenessMCTilt.hpp" using namespace matrix; ActuatorEffectivenessMCTilt::ActuatorEffectivenessMCTilt(ModuleParams *parent) : ModuleParams(parent), _mc_rotors(this, ActuatorEffectivenessRotors::AxisConfiguration::FixedUpwards, true), _tilts(this) { } bool ActuatorEffectivenessMCTilt::getEffectivenessMatrix(Configuration &configuration, EffectivenessUpdateReason external_update) { if (external_update == EffectivenessUpdateReason::NO_EXTERNAL_UPDATE) { return false; } // MC motors _mc_rotors.enablePropellerTorque(!_tilts.hasYawControl()); const bool rotors_added_successfully = _mc_rotors.addActuators(configuration); // Tilts int first_tilt_idx = configuration.num_actuators_matrix[0]; _tilts.updateTorqueSign(_mc_rotors.geometry()); const bool tilts_added_successfully = _tilts.addActuators(configuration); // Set offset such that tilts point upwards when control input == 0 (trim is 0 if min_angle == -max_angle). // Note that we don't set configuration.trim here, because in the case of trim == +-1, yaw is always saturated // and reduced to 0 with the sequential desaturation method. Instead we add it after. _tilt_offsets.setZero(); for (int i = 0; i < _tilts.count(); ++i) { float delta_angle = _tilts.config(i).max_angle - _tilts.config(i).min_angle; if (delta_angle > FLT_EPSILON) { float trim = -1.f - 2.f * _tilts.config(i).min_angle / delta_angle; _tilt_offsets(first_tilt_idx + i) = trim; } } return (rotors_added_successfully && tilts_added_successfully); } void ActuatorEffectivenessMCTilt::updateSetpoint(const matrix::Vector &control_sp, int matrix_index, ActuatorVector &actuator_sp) { actuator_sp += _tilt_offsets; // TODO: dynamic matrix update }