From 93c9f8cbf4d0484302d8a7dd8e5512da557a8b90 Mon Sep 17 00:00:00 2001 From: curt Date: Wed, 11 Sep 2002 02:31:10 +0000 Subject: [PATCH] Updates from Rob Deters. --- src/FDM/UIUCModel/uiuc_aircraft.h | 130 +++++++++++- src/FDM/UIUCModel/uiuc_menu.cpp | 296 +++++++++++++++++++++++++++- src/FDM/UIUCModel/uiuc_recorder.cpp | 45 ++++- src/FDM/UIUCModel/uiuc_wrapper.cpp | 31 +-- 4 files changed, 478 insertions(+), 24 deletions(-) diff --git a/src/FDM/UIUCModel/uiuc_aircraft.h b/src/FDM/UIUCModel/uiuc_aircraft.h index 74f2f491b..1e95f81aa 100644 --- a/src/FDM/UIUCModel/uiuc_aircraft.h +++ b/src/FDM/UIUCModel/uiuc_aircraft.h @@ -69,6 +69,7 @@ 04/21/2002 (MSS) Added new variables for apparent mass effects and options for computing *_2U coefficient scale factors. + 08/29/2002 (MSS) Added simpleSingleModel ---------------------------------------------------------------------- @@ -164,7 +165,7 @@ enum {Dx_pilot_flag = 2000, Dy_pilot_flag, Dz_pilot_flag, use_V_rel_wind_2U_flag, nondim_rate_V_rel_wind_flag, use_abs_U_body_2U_flag, dyn_on_speed_flag, dyn_on_speed_zero_flag, - use_dyn_on_speed_curve1_flag, Alpha_flag, + use_dyn_on_speed_curve1_flag, use_Alpha_dot_on_speed_flag, Alpha_flag, Beta_flag, U_body_flag, V_body_flag, W_body_flag, ignore_unknown_flag}; // geometry === Aircraft-specific geometric quantities @@ -190,7 +191,25 @@ enum {Weight_flag = 6000, I_yy_appMass_flag, I_zz_appMass_flag}; // engine ===== Propulsion data -enum {simpleSingle_flag = 7000, c172_flag, cherokee_flag, +enum {simpleSingle_flag = 7000, simpleSingleModel_flag, + c172_flag, cherokee_flag, gyroForce_Q_body_flag, gyroForce_R_body_flag, + omega_flag, omegaRPM_flag, polarInertia_flag, + slipstream_effects_flag, propDia_flag, + eta_q_Cm_q_flag, + eta_q_Cm_adot_flag, + eta_q_Cmfade_flag, + eta_q_Cl_beta_flag, + eta_q_Cl_p_flag, + eta_q_Cl_r_flag, + eta_q_Cl_dr_flag, + eta_q_CY_beta_flag, + eta_q_CY_p_flag, + eta_q_CY_r_flag, + eta_q_CY_dr_flag, + eta_q_Cn_beta_flag, + eta_q_Cn_p_flag, + eta_q_Cn_r_flag, + eta_q_Cn_dr_flag, Throttle_pct_input_flag, forcemom_flag, Xp_input_flag, Zp_input_flag, Mp_input_flag}; // CD ========= Aerodynamic x-force quantities (longitudinal) @@ -390,11 +409,13 @@ enum {Simtime_record = 16000, dt_record, flapper_freq_record, flapper_phi_record, flapper_phi_deg_record, flapper_Lift_record, flapper_Thrust_record, - flapper_Inertia_record, flapper_Moment_record}; + flapper_Inertia_record, flapper_Moment_record, + + debug1_record, debug2_record, debug3_record}; // misc ======= Miscellaneous inputs -enum {simpleHingeMomentCoef_flag = 17000, dfTimefdf_flag/*, flapper_flag, - flapper_phi_init_flag*/}; +enum {simpleHingeMomentCoef_flag = 17000, dfTimefdf_flag, flapper_flag, + flapper_phi_init_flag}; //321654 // fog ======== Fog field quantities @@ -487,6 +508,13 @@ struct AIRCRAFT bool use_dyn_on_speed_curve1; #define use_dyn_on_speed_curve1 aircraft_->use_dyn_on_speed_curve1 bool P_body_init_true; + + bool use_Alpha_dot_on_speed; +#define use_Alpha_dot_on_speed aircraft_->use_Alpha_dot_on_speed + double Alpha_dot_on_speed; +#define Alpha_dot_on_speed aircraft_->Alpha_dot_on_speed + + double P_body_init; #define P_body_init_true aircraft_->P_body_init_true #define P_body_init aircraft_->P_body_init @@ -700,6 +728,22 @@ struct AIRCRAFT double simpleSingleMaxThrust; #define simpleSingleMaxThrust aircraft_->simpleSingleMaxThrust + + bool simpleSingleModel; +#define simpleSingleModel aircraft_->simpleSingleModel + double t_v0; +#define t_v0 aircraft_->t_v0 + double dtdv_t0; +#define dtdv_t0 aircraft_->dtdv_t0 + double v_t0; +#define v_t0 aircraft_->v_t0 + double dtdvvt; +#define dtdvvt aircraft_->dtdvvt + + double tc, induced, eta_q; +#define tc aircraft_->tc +#define induced aircraft_->induced +#define eta_q aircraft_->eta_q bool Throttle_pct_input; string Throttle_pct_input_file; @@ -713,6 +757,70 @@ struct AIRCRAFT #define Throttle_pct_input_dTArray aircraft_->Throttle_pct_input_dTArray #define Throttle_pct_input_ntime aircraft_->Throttle_pct_input_ntime #define Throttle_pct_input_startTime aircraft_->Throttle_pct_input_startTime + bool gyroForce_Q_body, gyroForce_R_body; + double minOmega, maxOmega, minOmegaRPM, maxOmegaRPM, engineOmega, polarInertia; +#define gyroForce_Q_body aircraft_->gyroForce_Q_body +#define gyroForce_R_body aircraft_->gyroForce_R_body +#define minOmega aircraft_->minOmega +#define maxOmega aircraft_->maxOmega +#define minOmegaRPM aircraft_->minOmegaRPM +#define maxOmegaRPM aircraft_->maxOmegaRPM +#define engineOmega aircraft_->engineOmega +#define polarInertia aircraft_->polarInertia + + // propeller slipstream effects + bool slipstream_effects; + double propDia; + double eta_q_Cm_q, eta_q_Cm_q_fac; + double eta_q_Cm_adot, eta_q_Cm_adot_fac; + double eta_q_Cmfade, eta_q_Cmfade_fac; + double eta_q_Cl_beta, eta_q_Cl_beta_fac; + double eta_q_Cl_p, eta_q_Cl_p_fac; + double eta_q_Cl_r, eta_q_Cl_r_fac; + double eta_q_Cl_dr, eta_q_Cl_dr_fac; + double eta_q_CY_beta, eta_q_CY_beta_fac; + double eta_q_CY_p, eta_q_CY_p_fac; + double eta_q_CY_r, eta_q_CY_r_fac; + double eta_q_CY_dr, eta_q_CY_dr_fac; + double eta_q_Cn_beta, eta_q_Cn_beta_fac; + double eta_q_Cn_p, eta_q_Cn_p_fac; + double eta_q_Cn_r, eta_q_Cn_r_fac; + double eta_q_Cn_dr, eta_q_Cn_dr_fac; + +#define slipstream_effects aircraft_->slipstream_effects +#define propDia aircraft_->propDia +#define eta_q_Cm_q aircraft_->eta_q_Cm_q +#define eta_q_Cm_q_fac aircraft_->eta_q_Cm_q_fac +#define eta_q_Cm_adot aircraft_->eta_q_Cm_adot +#define eta_q_Cm_adot_fac aircraft_->eta_q_Cm_adot_fac +#define eta_q_Cmfade aircraft_->eta_q_Cmfade +#define eta_q_Cmfade_fac aircraft_->eta_q_Cmfade_fac +#define eta_q_Cl_beta aircraft_->eta_q_Cl_beta +#define eta_q_Cl_beta_fac aircraft_->eta_q_Cl_beta_fac +#define eta_q_Cl_p aircraft_->eta_q_Cl_p +#define eta_q_Cl_p_fac aircraft_->eta_q_Cl_p_fac +#define eta_q_Cl_r aircraft_->eta_q_Cl_r +#define eta_q_Cl_r_fac aircraft_->eta_q_Cl_r_fac +#define eta_q_Cl_dr aircraft_->eta_q_Cl_dr +#define eta_q_Cl_dr_fac aircraft_->eta_q_Cl_dr_fac +#define eta_q_CY_beta aircraft_->eta_q_CY_beta +#define eta_q_CY_beta_fac aircraft_->eta_q_CY_beta_fac +#define eta_q_CY_p aircraft_->eta_q_CY_p +#define eta_q_CY_p_fac aircraft_->eta_q_CY_p_fac +#define eta_q_CY_r aircraft_->eta_q_CY_r +#define eta_q_CY_r_fac aircraft_->eta_q_CY_r_fac +#define eta_q_CY_dr aircraft_->eta_q_CY_dr +#define eta_q_CY_dr_fac aircraft_->eta_q_CY_dr_fac +#define eta_q_Cn_beta aircraft_->eta_q_Cn_beta +#define eta_q_Cn_beta_fac aircraft_->eta_q_Cn_beta_fac +#define eta_q_Cn_p aircraft_->eta_q_Cn_p +#define eta_q_Cn_p_fac aircraft_->eta_q_Cn_p_fac +#define eta_q_Cn_r aircraft_->eta_q_Cn_r +#define eta_q_Cn_r_fac aircraft_->eta_q_Cn_r_fac +#define eta_q_Cn_dr aircraft_->eta_q_Cn_dr +#define eta_q_Cn_dr_fac aircraft_->eta_q_Cn_dr_fac + + bool Xp_input; string Xp_input_file; double Xp_input_timeArray[5400]; @@ -1153,6 +1261,14 @@ struct AIRCRAFT #define Cmfade_nAlphaArray aircraft_->Cmfade_nAlphaArray #define Cmfade_nde aircraft_->Cmfade_nde #define CmfadeI aircraft_->CmfadeI + + double gamma_wing, w_induced, w_coef, downwash_angle, AlphaTail; +#define gamma_wing aircraft_->gamma_wing +#define w_induced aircraft_->w_induced +#define w_coef aircraft_->w_coef +#define downwash_angle aircraft_->downwash_angle +#define AlphaTail aircraft_->AlphaTail + string Cmfdf; double Cmfdf_dfArray[100]; double Cmfdf_CmArray[100]; @@ -2122,8 +2238,8 @@ struct AIRCRAFT #define dfTimefdf_dfArray aircraft_->dfTimefdf_dfArray #define dfTimefdf_TimeArray aircraft_->dfTimefdf_TimeArray #define dfTimefdf_ndf aircraft_->dfTimefdf_ndf - /* - FlapData *flapper_data; + + /* FlapData *flapper_data; #define flapper_data aircraft_->flapper_data bool flapper_model; #define flapper_model aircraft_->flapper_model diff --git a/src/FDM/UIUCModel/uiuc_menu.cpp b/src/FDM/UIUCModel/uiuc_menu.cpp index ce245c7c1..d3580f08e 100644 --- a/src/FDM/UIUCModel/uiuc_menu.cpp +++ b/src/FDM/UIUCModel/uiuc_menu.cpp @@ -79,6 +79,10 @@ will compile with certain compilers. 08/29/2002 (RD) Separated each primary keyword into its own function to speed up compile time + 08/29/2002 (RD w/ help from CO) Made changes to shorten + compile time. [] RD to add more comments here. + 08/29/3003 (MSS) Adding new keywords for new engine model + and slipstream effects on tail. ---------------------------------------------------------------------- @@ -453,6 +457,16 @@ void parse_init( const string& linetoken2, const string& linetoken3, use_dyn_on_speed_curve1 = true; break; } + case use_Alpha_dot_on_speed_flag: + { + use_Alpha_dot_on_speed = true; + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + Alpha_dot_on_speed = token_value; + break; + } case Alpha_flag: { if (check_float(linetoken3)) @@ -1076,6 +1090,31 @@ void parse_engine( const string& linetoken2, const string& linetoken3, engineParts -> storeCommands (*command_line); break; } + case simpleSingleModel_flag: + { + simpleSingleModel = true; + /* input the thrust at zero speed */ + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + t_v0 = token_value; + /* input slope of thrust at speed for which thrust is zero */ + if (check_float(linetoken4)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + dtdv_t0 = token_value; + /* input speed at which thrust is zero */ + if (check_float(linetoken5)) + token5 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + v_t0 = token_value; + dtdvvt = -dtdv_t0 * v_t0 / t_v0; + engineParts -> storeCommands (*command_line); + break; + } case c172_flag: { engineParts -> storeCommands (*command_line); @@ -1102,6 +1141,241 @@ void parse_engine( const string& linetoken2, const string& linetoken3, Throttle_pct_input_startTime = token_value; break; } + case gyroForce_Q_body_flag: + { + /* include gyroscopic forces due to pitch */ + gyroForce_Q_body = true; + break; + } + case gyroForce_R_body_flag: + { + /* include gyroscopic forces due to yaw */ + gyroForce_R_body = true; + break; + } + + case slipstream_effects_flag: + { + // include slipstream effects + slipstream_effects = true; + if (!simpleSingleModel) + uiuc_warnings_errors(3, *command_line); + break; + } + case propDia_flag: + { + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + propDia = token_value; + break; + } + case eta_q_Cm_q_flag: + { + // include slipstream effects due to Cm_q + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cm_q_fac = token_value; + if (eta_q_Cm_q_fac == 0.0) {eta_q_Cm_q_fac = 1.0;} + break; + } + case eta_q_Cm_adot_flag: + { + // include slipstream effects due to Cm_adot + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cm_adot_fac = token_value; + if (eta_q_Cm_adot_fac == 0.0) {eta_q_Cm_adot_fac = 1.0;} + break; + } + case eta_q_Cmfade_flag: + { + // include slipstream effects due to Cmfade + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cmfade_fac = token_value; + if (eta_q_Cmfade_fac == 0.0) {eta_q_Cmfade_fac = 1.0;} + break; + } + case eta_q_Cl_beta_flag: + { + // include slipstream effects due to Cl_beta + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cl_beta_fac = token_value; + if (eta_q_Cl_beta_fac == 0.0) {eta_q_Cl_beta_fac = 1.0;} + break; + } + case eta_q_Cl_p_flag: + { + // include slipstream effects due to Cl_p + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cl_p_fac = token_value; + if (eta_q_Cl_p_fac == 0.0) {eta_q_Cl_p_fac = 1.0;} + break; + } + case eta_q_Cl_r_flag: + { + // include slipstream effects due to Cl_r + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cl_r_fac = token_value; + if (eta_q_Cl_r_fac == 0.0) {eta_q_Cl_r_fac = 1.0;} + break; + } + case eta_q_Cl_dr_flag: + { + // include slipstream effects due to Cl_dr + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cl_dr_fac = token_value; + if (eta_q_Cl_dr_fac == 0.0) {eta_q_Cl_dr_fac = 1.0;} + break; + } + case eta_q_CY_beta_flag: + { + // include slipstream effects due to CY_beta + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_CY_beta_fac = token_value; + if (eta_q_CY_beta_fac == 0.0) {eta_q_CY_beta_fac = 1.0;} + break; + } + case eta_q_CY_p_flag: + { + // include slipstream effects due to CY_p + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_CY_p_fac = token_value; + if (eta_q_CY_p_fac == 0.0) {eta_q_CY_p_fac = 1.0;} + break; + } + case eta_q_CY_r_flag: + { + // include slipstream effects due to CY_r + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_CY_r_fac = token_value; + if (eta_q_CY_r_fac == 0.0) {eta_q_CY_r_fac = 1.0;} + break; + } + case eta_q_CY_dr_flag: + { + // include slipstream effects due to CY_dr + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_CY_dr_fac = token_value; + if (eta_q_CY_dr_fac == 0.0) {eta_q_CY_dr_fac = 1.0;} + break; + } + case eta_q_Cn_beta_flag: + { + // include slipstream effects due to Cn_beta + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cn_beta_fac = token_value; + if (eta_q_Cn_beta_fac == 0.0) {eta_q_Cn_beta_fac = 1.0;} + break; + } + case eta_q_Cn_p_flag: + { + // include slipstream effects due to Cn_p + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cn_p_fac = token_value; + if (eta_q_Cn_p_fac == 0.0) {eta_q_Cn_p_fac = 1.0;} + break; + } + case eta_q_Cn_r_flag: + { + // include slipstream effects due to Cn_r + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cn_r_fac = token_value; + if (eta_q_Cn_r_fac == 0.0) {eta_q_Cn_r_fac = 1.0;} + break; + } + case eta_q_Cn_dr_flag: + { + // include slipstream effects due to Cn_dr + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + eta_q_Cn_dr_fac = token_value; + if (eta_q_Cn_dr_fac == 0.0) {eta_q_Cn_dr_fac = 1.0;} + break; + } + + case omega_flag: + { + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + minOmega = token_value; + if (check_float(linetoken4)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + maxOmega = token_value; + break; + } + case omegaRPM_flag: + { + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + minOmegaRPM = token_value; + minOmega = minOmegaRPM * 2.0 * LS_PI / 60; + if (check_float(linetoken4)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + maxOmegaRPM = token_value; + maxOmega = maxOmegaRPM * 2.0 * LS_PI / 60; + break; + } + case polarInertia_flag: + { + if (check_float(linetoken3)) + token3 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + polarInertia = token_value; + break; + } case forcemom_flag: { engineParts -> storeCommands (*command_line); @@ -6490,6 +6764,22 @@ void parse_record( const string& linetoken2, LIST command_line ) { recordParts -> storeCommands (*command_line); break; }*/ + /****************** Flapper Data ***********************/ + case debug1_record: + { + recordParts -> storeCommands (*command_line); + break; + } + case debug2_record: + { + recordParts -> storeCommands (*command_line); + break; + } + case debug3_record: + { + recordParts -> storeCommands (*command_line); + break; + } default: { if (dont_ignore) @@ -6530,7 +6820,7 @@ void parse_misc( const string& linetoken2, const string& linetoken3, dfTimefdf_ndf); break; } - /* case flapper_flag: + /*case flapper_flag: { string flap_file; @@ -6613,8 +6903,8 @@ void uiuc_menu( string aircraft_name ) /* set speed at which dynamic pressure terms will be accounted for, since if velocity is too small, coefficients will go to infinity */ - dyn_on_speed = 33; /* 20 kts, default */ - dyn_on_speed_zero = 0.5 * dyn_on_speed; /* only used of use_dyn_on_speed_curve1 is used */ + dyn_on_speed = 33; /* 20 kts (33 ft/sec), default */ + dyn_on_speed_zero = 0.5 * dyn_on_speed; /* only used if use_dyn_on_speed_curve1 is used */ bootindex = 0; // the index for the bootTime dont_ignore = true; diff --git a/src/FDM/UIUCModel/uiuc_recorder.cpp b/src/FDM/UIUCModel/uiuc_recorder.cpp index bed9318aa..80ffc91fd 100644 --- a/src/FDM/UIUCModel/uiuc_recorder.cpp +++ b/src/FDM/UIUCModel/uiuc_recorder.cpp @@ -1840,7 +1840,7 @@ void uiuc_recorder( double dt ) } /*********************** Moments ***********************/ -/* case flapper_freq_record: + /* case flapper_freq_record: { fout << flapper_freq << " "; break; @@ -1874,7 +1874,48 @@ void uiuc_recorder( double dt ) { fout << flapper_Moment << " "; break; - } */ + }*/ + /*********************** debug ***********************/ + /* debug variables for use in probing data */ + /* comment out old lines, and add new */ + /* only remove code that you have written */ + case debug1_record: + { + // eta on tail + // fout << eta_q << " "; + // engine RPM + // fout << engineOmega * 60 / (2 * LS_PI)<< " "; + // climb rate in fpm + //fout << V_down * 60 << " "; + // w_induced downwash at tail due to wing + fout << w_induced << " "; + break; + } + case debug2_record: + { + //Lift to drag ratio + // fout << V_north/V_down << " "; + // g's through the c.g. of the aircraft + // fout << (-A_Z_cg/32.174) << " "; + // gyroscopic moment (see uiuc_wrapper.cpp) + // fout << (polarInertia * engineOmega * Q_body) << " "; + // downwash_angle at tail + fout << downwash_angle * 57.29 << " "; + + break; + } + case debug3_record: + { + // die off function for eta_q + // fout << (Cos_alpha * Cos_alpha) << " "; + // gyroscopic moment (see uiuc_wrapper.cpp) + // fout << (-polarInertia * engineOmega * R_body) << " "; + // AlphaTail + fout << AlphaTail * 57.29 << " "; + fout << Alpha * 57.29 << " "; + break; + } + }; } // end record map } diff --git a/src/FDM/UIUCModel/uiuc_wrapper.cpp b/src/FDM/UIUCModel/uiuc_wrapper.cpp index 4df74dd17..19884721b 100644 --- a/src/FDM/UIUCModel/uiuc_wrapper.cpp +++ b/src/FDM/UIUCModel/uiuc_wrapper.cpp @@ -208,18 +208,17 @@ void uiuc_force_moment(double dt) F_Y_wind = CY * qS * Cos_beta * Cos_beta; F_Z_wind = -CL * qS * Cos_beta * Cos_beta; - /* wind-axis to body-axis transformation */ + // wind-axis to body-axis transformation F_X_aero = F_X_wind * Cos_alpha * Cos_beta - F_Y_wind * Cos_alpha * Sin_beta - F_Z_wind * Sin_alpha; F_Y_aero = F_X_wind * Sin_beta + F_Y_wind * Cos_beta; F_Z_aero = F_X_wind * Sin_alpha * Cos_beta - F_Y_wind * Sin_alpha * Sin_beta + F_Z_wind * Cos_alpha; } - /* Moment calculations */ + // Moment calculations M_l_aero = Cl * qSb * Cos_beta * Cos_beta; M_m_aero = Cm * qScbar * Cos_beta * Cos_beta; M_n_aero = Cn * qSb * Cos_beta * Cos_beta; - /* Adding in apparent mass effects */ - + // Adding in apparent mass effects if (Mass_appMass_ratio) F_Z_aero += -(Mass_appMass_ratio * Mass) * W_dot_body; if (I_xx_appMass_ratio) @@ -227,7 +226,7 @@ void uiuc_force_moment(double dt) if (I_yy_appMass_ratio) M_m_aero += -(I_yy_appMass_ratio * I_yy) * Q_dot_body; if (I_zz_appMass_ratio) - M_m_aero += -(I_zz_appMass_ratio * I_yy) * R_dot_body; + M_n_aero += -(I_zz_appMass_ratio * I_zz) * R_dot_body; if (Mass_appMass) F_Z_aero += -Mass_appMass * W_dot_body; @@ -236,14 +235,22 @@ void uiuc_force_moment(double dt) if (I_yy_appMass) M_m_aero += -I_yy_appMass * Q_dot_body; if (I_zz_appMass) - M_m_aero += -I_zz_appMass * R_dot_body; + M_n_aero += -I_zz_appMass * R_dot_body; - //if (flapper_model) - // { - // F_X_aero += F_X_aero_flapper; - // F_Z_aero += F_Z_aero_flapper; - // M_m_aero += flapper_Moment; - // } + // gyroscopic moments + // engineOmega is positive when rotation is ccw when viewed from the front + if (gyroForce_Q_body) + M_n_aero += polarInertia * engineOmega * Q_body; + if (gyroForce_R_body) + M_m_aero += -polarInertia * engineOmega * R_body; + + // ornithopter support + if (flapper_model) + { + F_X_aero += F_X_aero_flapper; + F_Z_aero += F_Z_aero_flapper; + M_m_aero += flapper_Moment; + } // fog field update Fog = 0; -- 2.39.5