40 if (strstr(frame_str,
"-heavy")) {
43 if (strstr(frame_str,
"-revthrust")) {
46 if (strstr(frame_str,
"-elevon")) {
48 }
else if (strstr(frame_str,
"-vtail")) {
50 }
else if (strstr(frame_str,
"-dspoilers")) {
53 if (strstr(frame_str,
"-elevrev")) {
56 if (strstr(frame_str,
"-catapult")) {
61 if (strstr(frame_str,
"-bungee")) {
66 if (strstr(frame_str,
"-throw")) {
71 if (strstr(frame_str,
"-tailsitter")) {
77 if (strstr(frame_str,
"-ice")) {
95 const float max_alpha_delta = 0.8f;
96 if (alpha-alpha0 > max_alpha_delta) {
97 alpha = alpha0 + max_alpha_delta;
98 }
else if (alpha0-alpha > max_alpha_delta) {
99 alpha = alpha0 - max_alpha_delta;
101 double sigmoid = ( 1+exp(-M*(alpha-alpha0))+exp(M*(alpha+alpha0)) ) / (1+exp(-M*(alpha-alpha0))) / (1+exp(M*(alpha+alpha0)));
102 double linear = (1.0-sigmoid) * (c_lift_0 + c_lift_a0*alpha);
103 double flatPlate = sigmoid*(2*copysign(1,alpha)*pow(sin(alpha),2)*cos(alpha));
105 float result = linear+flatPlate;
118 double AR = pow(b,2)/
s;
119 double c_drag_a = c_drag_p + pow(c_lift_0+c_lift_a0*alpha,2)/(
M_PI*oswald*AR);
130 float effective_airspeed =
airspeed;
136 effective_airspeed += inputThrust * 20;
170 double qbar = 1.0/2.0*rho*pow(effective_airspeed,2)*
s;
172 if (
is_zero(effective_airspeed))
180 la = qbar*b*(c_l_0 + c_l_b*
beta + c_l_p*b*p/(2*effective_airspeed) + c_l_r*b*r/(2*effective_airspeed) + c_l_deltaa*inputAileron + c_l_deltar*inputRudder);
181 ma = qbar*c*(c_m_0 + c_m_a*alpha + c_m_q*c*q/(2*effective_airspeed) + c_m_deltae*inputElevator);
182 na = qbar*b*(c_n_0 + c_n_b*
beta + c_n_p*b*p/(2*effective_airspeed) + c_n_r*b*r/(2*effective_airspeed) + c_n_deltaa*inputAileron + c_n_deltar*inputRudder);
188 la += CGOffset.
y * force.
z - CGOffset.
z * force.
y;
189 ma += -CGOffset.
x * force.
z + CGOffset.
z * force.
x;
190 na += -CGOffset.
y * force.
x + CGOffset.
x * force.
y;
220 double c_x_a = -c_drag_a*cos(alpha)+c_lift_a*sin(alpha);
221 double c_x_q = -c_drag_q*cos(alpha)+c_lift_q*sin(alpha);
222 double c_z_a = -c_drag_a*sin(alpha)-c_lift_a*cos(alpha);
223 double c_z_q = -c_drag_q*sin(alpha)-c_lift_q*cos(alpha);
231 double qbar = 1.0/2.0*rho*pow(
airspeed,2)*
s;
241 ax = qbar*(c_x_a + c_x_q*c*q/(2*
airspeed) - c_drag_deltae*cos(alpha)*fabs(inputElevator) + c_lift_deltae*sin(alpha)*inputElevator);
243 ay = qbar*(c_y_0 + c_y_b*
beta + c_y_p*b*p/(2*
airspeed) + c_y_r*b*r/(2*
airspeed) + c_y_deltaa*inputAileron + c_y_deltar*inputRudder);
244 az = qbar*(c_z_a + c_z_q*c*q/(2*
airspeed) - c_drag_deltae*sin(alpha)*fabs(inputElevator) - c_lift_deltae*cos(alpha)*inputElevator);
255 bool launch_triggered = input.
servos[6] > 1700;
258 elevator = -elevator;
264 float ch2 = elevator;
265 aileron = (ch2-ch1)/2.0
f;
267 elevator = -(ch2+ch1)/2.0
f;
273 float ch1 = elevator;
276 elevator = (ch2-ch1)/2.0
f;
277 rudder = (ch2+ch1)/2.0
f;
284 float elevon_left = (dspoiler1_left + dspoiler2_left)/2;
285 float elevon_right = (dspoiler1_right + dspoiler2_right)/2;
286 aileron = (elevon_right-elevon_left)/2;
287 elevator = (elevon_left+elevon_right)/2;
288 rudder = fabsf(dspoiler1_right - dspoiler2_right)/2 - fabsf(dspoiler1_left - dspoiler2_left)/2;
298 float thrust = throttle;
318 rot_accel =
getTorque(aileron, elevator, rudder, thrust, force);
324 if (launch_triggered) {
340 rpm1 = thrust * 7000;
void update_wind(const struct sitl_input &input)
Vector3< float > Vector3f
Plane(const char *home_str, const char *frame_str)
void add_noise(float throttle)
float filtered_servo_range(const struct sitl_input &input, uint8_t idx)
void calculate_forces(const struct sitl_input &input, Vector3f &rot_accel, Vector3f &body_accel)
float update(const struct Aircraft::sitl_input &input)
virtual bool on_ground() const
float dragCoeff(float alpha) const
Matrix3< T > transposed(void) const
const float hover_throttle
Vector3f getTorque(float inputAileron, float inputElevator, float inputRudder, float inputThrust, const Vector3f &force) const
bool is_zero(const T fVal1)
void update_mag_field_bf(void)
float constrain_float(const float amt, const float low, const float high)
void update_position(void)
void update_dynamics(const Vector3f &rot_accel)
struct SITL::Plane::@209 coefficient
Vector3f getForce(float inputAileron, float inputElevator, float inputRudder) const
enum SITL::Aircraft::@199 ground_behavior
virtual void update(const struct sitl_input &input)
float liftCoeff(float alpha) const
float filtered_servo_angle(const struct sitl_input &input, uint8_t idx)
bool reverse_elevator_rudder