/* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* * AP_MotorsMatrixTS.cpp - tailsitters with multicopter motor configuration */ #include #include #include "AP_MotorsMatrixTS.h" extern const AP_HAL::HAL& hal; #define SERVO_OUTPUT_RANGE 4500 // output_armed - sends commands to the motors // includes new scaling stability patch void AP_MotorsMatrixTS::output_armed_stabilizing() { if (use_standard_matrix) { AP_MotorsMatrix::output_armed_stabilizing(); return; } float roll_thrust; // roll thrust input value, +/- 1.0 float pitch_thrust; // pitch thrust input value, +/- 1.0 float throttle_thrust; // throttle thrust input value, 0.0 - 1.0 float thrust_max = 0.0f; // highest motor value float thr_adj = 0.0f; // the difference between the pilot's desired throttle and throttle_thrust_best_rpy // apply voltage and air pressure compensation const float compensation_gain = get_compensation_gain(); // compensation for battery voltage and altitude roll_thrust = (_roll_in + _roll_in_ff) * compensation_gain; pitch_thrust = (_pitch_in + _pitch_in_ff) * compensation_gain; throttle_thrust = get_throttle() * compensation_gain; // sanity check throttle is above zero and below current limited throttle if (throttle_thrust <= 0.0f) { throttle_thrust = 0.0f; limit.throttle_lower = true; } if (throttle_thrust >= _throttle_thrust_max) { throttle_thrust = _throttle_thrust_max; limit.throttle_upper = true; } thrust_max = 0.0f; for (int i=0; i 1.0f) { thr_adj = 1.0f - thrust_max; limit.throttle_upper = true; limit.roll = true; limit.pitch = true; for (int i=0; i