X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FUIUCModel%2Fuiuc_wrapper.cpp;h=c776a2f1e72b95425488fa2dbc5836fcdbd8f82e;hb=7289eaa8baafac56a3e32dedd5b77d3534d61c4a;hp=52a1e3d441877d3dddd9b58d942d17a9f6d1b49f;hpb=1dc35581f5ad10aabd45073b12b9733146d34b38;p=flightgear.git diff --git a/src/FDM/UIUCModel/uiuc_wrapper.cpp b/src/FDM/UIUCModel/uiuc_wrapper.cpp index 52a1e3d44..c776a2f1e 100644 --- a/src/FDM/UIUCModel/uiuc_wrapper.cpp +++ b/src/FDM/UIUCModel/uiuc_wrapper.cpp @@ -18,10 +18,26 @@ ---------------------------------------------------------------------- HISTORY: 01/26/2000 initial release - + 03/09/2001 (DPM) added support for gear + 06/18/2001 (RD) Made uiuc_recorder its own routine. + 07/19/2001 (RD) Added uiuc_vel_init() to initialize + the velocities. + 08/27/2001 (RD) Added uiuc_initial_init() to help + in starting an A/C at an initial condition + 02/24/2002 (GD) Added uiuc_network_routine() + 03/27/2002 (RD) Changed how forces are calculated when + body-axis is used + 12/11/2002 (RD) Divided uiuc_network_routine into + uiuc_network_recv_routine and + uiuc_network_send_routine + 03/16/2003 (RD) Added trigger lines in recorder area + ---------------------------------------------------------------------- AUTHOR(S): Bipin Sehgal + Robert Deters + Glen Dimock + David Megginson ---------------------------------------------------------------------- @@ -63,39 +79,116 @@ **********************************************************************/ +#ifdef HAVE_CONFIG_H +# include +#endif + #include +#include +#include +#include
#include "uiuc_aircraft.h" #include "uiuc_aircraftdir.h" #include "uiuc_coefficients.h" +#include "uiuc_getwind.h" #include "uiuc_engine.h" +#include "uiuc_gear.h" #include "uiuc_aerodeflections.h" #include "uiuc_recorder.h" #include "uiuc_menu.h" #include "uiuc_betaprobe.h" #include +//#include "Main/simple_udp.h" +#include "uiuc_fog.h" //321654 +//#include "uiuc_network.h" +#include "uiuc_get_flapper.h" -FG_USING_STD(cout); -FG_USING_STD(endl); +SG_USING_STD(cout); +SG_USING_STD(endl); +extern "C" void uiuc_initial_init (); +extern "C" void uiuc_vel_init (); extern "C" void uiuc_init_aeromodel (); extern "C" void uiuc_force_moment(double dt); extern "C" void uiuc_engine_routine(); +extern "C" void uiuc_wind_routine(); +extern "C" void uiuc_gear_routine(); +extern "C" void uiuc_record_routine(double dt); +extern "C" void uiuc_network_recv_routine(); +extern "C" void uiuc_network_send_routine(); AIRCRAFT *aircraft_ = new AIRCRAFT; AIRCRAFTDIR *aircraftdir_ = new AIRCRAFTDIR; -void uiuc_init_aeromodel () +// SendArray testarray(4950); + +/* Convert float to string */ +//string ftoa(double in) +//{ +// static char temp[20]; +// sprintf(temp,"%g",in); +// return (string)temp; +//} + +void uiuc_initial_init () { - string aircraft; + if (P_body_init_true) + P_body = P_body_init; + if (Q_body_init_true) + Q_body = Q_body_init; + if (R_body_init_true) + R_body = R_body_init; + + if (Phi_init_true) + Phi = Phi_init; + if (Theta_init_true) + Theta = Theta_init; + if (Psi_init_true) + Psi = Psi_init; + + if (U_body_init_true) + U_body = U_body_init; + if (V_body_init_true) + V_body = V_body_init; + if (W_body_init_true) + W_body = W_body_init; + +} + +void uiuc_vel_init () +{ + if (U_body_init_true && V_body_init_true && W_body_init_true) + { + double det_T_l_to_b, cof11, cof12, cof13, cof21, cof22, cof23, cof31, cof32, cof33; - if (aircraft_dir != "") - aircraft = aircraft_dir + "/"; + det_T_l_to_b = T_local_to_body_11*(T_local_to_body_22*T_local_to_body_33-T_local_to_body_23*T_local_to_body_32) - T_local_to_body_12*(T_local_to_body_21*T_local_to_body_33-T_local_to_body_23*T_local_to_body_31) + T_local_to_body_13*(T_local_to_body_21*T_local_to_body_32-T_local_to_body_22*T_local_to_body_31); + cof11 = T_local_to_body_22 * T_local_to_body_33 - T_local_to_body_23 * T_local_to_body_32; + cof12 = T_local_to_body_23 * T_local_to_body_31 - T_local_to_body_21 * T_local_to_body_33; + cof13 = T_local_to_body_21 * T_local_to_body_32 - T_local_to_body_22 * T_local_to_body_31; + cof21 = T_local_to_body_13 * T_local_to_body_32 - T_local_to_body_12 * T_local_to_body_33; + cof22 = T_local_to_body_11 * T_local_to_body_33 - T_local_to_body_13 * T_local_to_body_31; + cof23 = T_local_to_body_12 * T_local_to_body_31 - T_local_to_body_11 * T_local_to_body_32; + cof31 = T_local_to_body_12 * T_local_to_body_23 - T_local_to_body_13 * T_local_to_body_22; + cof32 = T_local_to_body_13 * T_local_to_body_21 - T_local_to_body_11 * T_local_to_body_23; + cof33 = T_local_to_body_11 * T_local_to_body_22 - T_local_to_body_12 * T_local_to_body_21; - aircraft += "aircraft.dat"; - cout << "We are using "<< aircraft << endl; + V_north = (cof11*U_body+cof21*V_body+cof31*W_body)/det_T_l_to_b; + V_east_rel_ground = (cof12*U_body+cof22*V_body+cof32*W_body)/det_T_l_to_b; + V_down = (cof13*U_body+cof23*V_body+cof33*W_body)/det_T_l_to_b; + + V_east = V_east_rel_ground + OMEGA_EARTH*Sea_level_radius*cos(Lat_geocentric); + } +} + +void uiuc_init_aeromodel () +{ + SGPath path(globals->get_fg_root()); + path.append(aircraft_dir); + path.append("aircraft.dat"); + cout << "We are using "<< path.str() << endl; uiuc_initializemaps(); // Initialize the maps - uiuc_menu(aircraft); // Read the specified aircraft file + uiuc_menu(path.str()); // Read the specified aircraft file } void uiuc_force_moment(double dt) @@ -105,31 +198,119 @@ void uiuc_force_moment(double dt) double qSb = qS * bw; uiuc_aerodeflections(dt); - uiuc_coefficients(); + uiuc_coefficients(dt); - /* Calculate the wind axis forces */ + /* Calculate the forces */ if (CX && CZ) { - CD = -CX * cos(Alpha) - CZ * sin(Alpha); - CL = CX * sin(Alpha) - CZ * cos(Alpha); + F_X_aero = CX * qS; + F_Y_aero = CY * qS; + F_Z_aero = CZ * qS; } - F_X_wind = -1 * CD * qS; - F_Y_wind = CY * qS; - F_Z_wind = -1 * CL * qS; + else + { + // Cos_beta * Cos_beta corrects V_rel_wind to get normal q onto wing, + // hence Cos_beta * Cos_beta term included. + // Same thing is done w/ moments below. + // Without this "die-off" function, lift would be produced in a 90 deg sideslip, when + // that should not be the case. See FGFS notes 021105 + F_X_wind = -CD * qS * Cos_beta * Cos_beta; + F_Y_wind = CY * qS; + F_Z_wind = -CL * qS * Cos_beta * Cos_beta; + // F_X_wind = -CD * qS * Cos_beta * Cos_beta; + // F_Y_wind = CY * qS * Cos_beta * Cos_beta; + // F_Z_wind = -CL * qS * Cos_beta * Cos_beta; - /* 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; + // 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 + M_l_aero = Cl * qSb ; + M_m_aero = Cm * qScbar * Cos_beta * Cos_beta; + M_n_aero = Cn * qSb ; + // 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; - /* Moment calculations */ - M_l_aero = Cl * qSb; - M_m_aero = Cm * qScbar; - M_n_aero = Cn * qSb; + // Adding in apparent mass effects + if (Mass_appMass_ratio) + F_Z_aero += -(Mass_appMass_ratio * Mass) * W_dot_body; + if (I_xx_appMass_ratio) + M_l_aero += -(I_xx_appMass_ratio * I_xx) * P_dot_body; + if (I_yy_appMass_ratio) + M_m_aero += -(I_yy_appMass_ratio * I_yy) * Q_dot_body; + if (I_zz_appMass_ratio) + M_n_aero += -(I_zz_appMass_ratio * I_zz) * R_dot_body; - /* Call fligt data recorder */ - if (Simtime >= recordStartTime) - uiuc_recorder(dt); + if (Mass_appMass) + F_Z_aero += -Mass_appMass * W_dot_body; + if (I_xx_appMass) + M_l_aero += -I_xx_appMass * P_dot_body; + if (I_yy_appMass) + M_m_aero += -I_yy_appMass * Q_dot_body; + if (I_zz_appMass) + M_n_aero += -I_zz_appMass * R_dot_body; + + // 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) + { + uiuc_get_flapper(dt); + F_X_aero += F_X_aero_flapper; + F_Z_aero += F_Z_aero_flapper; + M_m_aero += flapper_Moment; + } + + // fog field update + Fog = 0; + if (fog_field) + uiuc_fog(); + + double vis; + if (Fog != 0) + { + vis = fgGetDouble("/environment/visibility-m"); + if (Fog > 0) + vis /= 1.01; + else + vis *= 1.01; + fgSetDouble("/environment/visibility-m", vis); + } + + + /* Send data on the network to the Glass Cockpit */ + + // string input=""; + + // input += " stick_right " + ftoa(Lat_control); + // input += " rudder_left " + ftoa(-Rudder_pedal); + // input += " stick_forward " + ftoa(Long_control); + // input += " stick_trim_forward " + ftoa(Long_trim); + // input += " vehicle_pitch " + ftoa(Theta * 180.0 / 3.14); + // input += " vehicle_roll " + ftoa(Phi * 180.0 / 3.14); + // input += " vehicle_speed " + ftoa(V_rel_wind); + // input += " throttle_forward " + ftoa(Throttle_pct); + // input += " altitude " + ftoa(Altitude); + // input += " climb_rate " + ftoa(-1.0*V_down_rel_ground); + + // testarray.getHello(); + // testarray.sendData(input); + + /* End of Networking */ + +} + +void uiuc_wind_routine() +{ + uiuc_getwind(); } void uiuc_engine_routine() @@ -137,4 +318,38 @@ void uiuc_engine_routine() uiuc_engine(); } +void uiuc_gear_routine () +{ + uiuc_gear(); +} + +void uiuc_record_routine(double dt) +{ + if (trigger_last_time_step == 0 && trigger_on == 1) { + if (trigger_toggle == 0) + trigger_toggle = 1; + else + trigger_toggle = 0; + trigger_num++; + if (trigger_num % 2 != 0) + trigger_counter++; + } + + if (Simtime >= recordStartTime) + uiuc_recorder(dt); + + trigger_last_time_step = trigger_on; +} + +void uiuc_network_recv_routine() +{ + //if (use_uiuc_network) + //uiuc_network(1); +} + +void uiuc_network_send_routine() +{ + //if (use_uiuc_network) + //uiuc_network(2); +} //end uiuc_wrapper.cpp