/* 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 . */ /* Glider model for high altitude balloon drop */ #pragma once #include "SIM_config.h" #if AP_SIM_GLIDER_ENABLED #include "SIM_Aircraft.h" #include 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_NOTHROW 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