mirror of https://github.com/ArduPilot/ardupilot
204 lines
6.3 KiB
C
204 lines
6.3 KiB
C
|
/*
|
|||
|
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 <http://www.gnu.org/licenses/>.
|
|||
|
*/
|
|||
|
/*
|
|||
|
Glider model for high altitude balloon drop
|
|||
|
*/
|
|||
|
|
|||
|
#pragma once
|
|||
|
|
|||
|
#include "SIM_config.h"
|
|||
|
|
|||
|
#if AP_SIM_GLIDER_ENABLED
|
|||
|
|
|||
|
#include "SIM_Aircraft.h"
|
|||
|
#include <AP_Param/AP_Param.h>
|
|||
|
|
|||
|
namespace SITL {
|
|||
|
|
|||
|
/*
|
|||
|
a very simple plane simulator
|
|||
|
*/
|
|||
|
class Glider : public Aircraft {
|
|||
|
public:
|
|||
|
Glider(const char *frame_str);
|
|||
|
|
|||
|
/* update model by one time step */
|
|||
|
virtual void update(const struct sitl_input &input) override;
|
|||
|
|
|||
|
/* static object creator */
|
|||
|
static Aircraft *create(const char *frame_str) {
|
|||
|
return new Glider(frame_str);
|
|||
|
}
|
|||
|
|
|||
|
bool on_ground() const override;
|
|||
|
|
|||
|
static const struct AP_Param::GroupInfo var_info[];
|
|||
|
|
|||
|
protected:
|
|||
|
float alpharad;
|
|||
|
float betarad;
|
|||
|
|
|||
|
AP_Float balloon_burst_amsl;
|
|||
|
AP_Float balloon_rate;
|
|||
|
|
|||
|
/*
|
|||
|
parameters that define the glider model
|
|||
|
*/
|
|||
|
const struct Model {
|
|||
|
// total vehicle mass
|
|||
|
float mass = 9.07441; // kg
|
|||
|
|
|||
|
// reference area
|
|||
|
float Sref = 0.92762; // m^2
|
|||
|
|
|||
|
float refSpan = 1.827411; // m
|
|||
|
float refChord = 0.507614; // m
|
|||
|
float IXX = 0.234; // kg-m^2
|
|||
|
float IYY = 1.85; // kg-m^2
|
|||
|
float IZZ = 2.04; // kg-m^2
|
|||
|
|
|||
|
// CN is coefficients for forces on +Z axis
|
|||
|
// quadratic in alpharad
|
|||
|
float CN2 = -0.5771;
|
|||
|
float CN1 = 3.9496;
|
|||
|
float CN0 = 0;
|
|||
|
|
|||
|
// CA is the coefficients for forces on +X axis
|
|||
|
// quadratic in alpharad
|
|||
|
float CA2 = -1.6809;
|
|||
|
float CA1 = -0.0057;
|
|||
|
float CA0 = 0.0150;
|
|||
|
|
|||
|
// CY is the coefficients for forces on the +Y axis
|
|||
|
// quadratic in alpharad, with betarad factor
|
|||
|
float CY2 = -3.342;
|
|||
|
float CY1 = 0.0227;
|
|||
|
float CY0 = -0.4608;
|
|||
|
|
|||
|
// Cl is the coefficients for moments on X axis
|
|||
|
// quadratic in alpharad, with betarad factor
|
|||
|
float Cl2 = 0.2888;
|
|||
|
float Cl1 = -0.8518;
|
|||
|
float Cl0 = -0.0491;
|
|||
|
|
|||
|
// Cm is the coefficients for moments on Y axis
|
|||
|
// quadratic in alpharad
|
|||
|
float Cm2 = 0.099;
|
|||
|
float Cm1 = -0.6506;
|
|||
|
float Cm0 = -0.0005;
|
|||
|
|
|||
|
// Cn is the coefficients for moments on Z axis
|
|||
|
// quadratic in alpharad, with betarad factor
|
|||
|
float Cn2 = 0.0057;
|
|||
|
float Cn1 = -0.0101;
|
|||
|
float Cn0 = 0.1744;
|
|||
|
|
|||
|
// controls neutral dynamic derivatives
|
|||
|
// p, q, r are gyro rates
|
|||
|
float Cmq = -6.1866;
|
|||
|
|
|||
|
float Clp2 = 0.156;
|
|||
|
float Clp1 = 0.0129;
|
|||
|
float Clp0 = -0.315;
|
|||
|
|
|||
|
float Clr2 = -0.0284;
|
|||
|
float Clr1 = 0.2641;
|
|||
|
float Clr0 = 0.0343;
|
|||
|
|
|||
|
float Cnp2 = 0.0199;
|
|||
|
float Cnp1 = -0.315;
|
|||
|
float Cnp0 = -0.013;
|
|||
|
|
|||
|
float Cnr2 = 0.1297;
|
|||
|
float Cnr1 = 0.0343;
|
|||
|
float Cnr0 = -0.264;
|
|||
|
|
|||
|
// elevator
|
|||
|
float elevatorDeflectionLimitDeg = -12.5;
|
|||
|
float deltaCNperRadianElev = -0.7;
|
|||
|
float deltaCAperRadianElev = 0.12;
|
|||
|
float deltaCmperRadianElev = 1.39;
|
|||
|
float deltaCYperRadianElev = 0;
|
|||
|
float deltaClperRadianElev = 0;
|
|||
|
float deltaCnperRadianElev = 0;
|
|||
|
|
|||
|
// rudder
|
|||
|
float rudderDeflectionLimitDeg = 18.0;
|
|||
|
float deltaCNperRadianRud = 0;
|
|||
|
float deltaCAperRadianRud = 0.058;
|
|||
|
float deltaCmperRadianRud = 0;
|
|||
|
float deltaCYperRadianRud = 0.31;
|
|||
|
float deltaClperRadianRud = 0.038;
|
|||
|
float deltaCnperRadianRud = -0.174;
|
|||
|
|
|||
|
// aileron
|
|||
|
float aileronDeflectionLimitDeg = 15.5;
|
|||
|
float deltaCNperRadianAil = 0;
|
|||
|
float deltaCAperRadianAil = 0.016;
|
|||
|
float deltaCmperRadianAil = 0;
|
|||
|
float deltaCYperRadianAil = -0.015;
|
|||
|
|
|||
|
// quadratic in alpharad
|
|||
|
float deltaClperRadianAil0 = 0.09191;
|
|||
|
float deltaClperRadianAil1 = 0.0001;
|
|||
|
float deltaClperRadianAil2 = -0.08645;
|
|||
|
|
|||
|
// quadratic in alpharad
|
|||
|
float deltaCnperRadianAil0 = 0.00789;
|
|||
|
float deltaCnperRadianAil1 = 0.00773;
|
|||
|
float deltaCnperRadianAil2 = -0.01162;
|
|||
|
|
|||
|
// Forces in the +X direction are –CA * q * Sref
|
|||
|
// Forces in the +Y direction are +CY * q * Sref
|
|||
|
// Forces in the +Z direction are –CN * q *Sref
|
|||
|
// Moments about the X axis are +Cl * q * Sref * RefSpan
|
|||
|
// Moments about the Y axis are +Cm * q * Sref * RefChord
|
|||
|
// Moments about the Z axis are +Cn * q * Sref * RefSpan
|
|||
|
|
|||
|
// low altitude
|
|||
|
float alphaRadMax = 0.209;
|
|||
|
float betaRadMax = 0.209;
|
|||
|
|
|||
|
// balloon launch parameters
|
|||
|
float tetherLength = 50.0f; // length of tether from balloon to aircraft (m)
|
|||
|
float tetherPogoFreq = 2.0f; // measured vertical frequency of on tether (Hz)
|
|||
|
|
|||
|
} model;
|
|||
|
|
|||
|
Vector3f getForce(float inputAileron, float inputElevator, float inputRudder);
|
|||
|
Vector3f getTorque(float inputAileron, float inputElevator, float inputRudder, const Vector3f &force) const;
|
|||
|
bool update_balloon(float balloon, Vector3f &force, Vector3f &rot_accel);
|
|||
|
void calculate_forces(const struct sitl_input &input, Vector3f &rot_accel, Vector3f &body_accel);
|
|||
|
|
|||
|
Vector3f balloon_velocity; // balloon velocity NED
|
|||
|
Vector3f balloon_position{0.0f, 0.0f, -45.0f}; // balloon position NED from origin
|
|||
|
|
|||
|
enum class carriageState {
|
|||
|
NONE = 0, // no carriage option available
|
|||
|
WAITING_FOR_PICKUP = 1, // in launch cradle waiting to be picked up by launch vehicle
|
|||
|
WAITING_FOR_RELEASE = 2, // being carried by luanch vehicle waitng to be released
|
|||
|
PRE_RELEASE = 3, // had been released by launch vehicle
|
|||
|
RELEASED = 4 // had been released by launch vehicle
|
|||
|
} carriage_state;
|
|||
|
bool plane_air_release; // true when plane has separated from the airborne launching platform
|
|||
|
|
|||
|
uint32_t last_drag_ms;
|
|||
|
float sim_LD;
|
|||
|
};
|
|||
|
|
|||
|
} // namespace SITL
|
|||
|
|
|||
|
#endif // AP_SIM_GLIDER_ENABLED
|