From 9f1658bba4dbe2f44f7a406522dc7fd6d1500ff4 Mon Sep 17 00:00:00 2001 From: curt Date: Sat, 17 Oct 1998 00:43:58 +0000 Subject: [PATCH] Initial revision. --- FDM/LaRCsim.cxx | 445 ++++++++++++++++++++++++++++++++++++++++++++++++ FDM/LaRCsim.hxx | 54 ++++++ 2 files changed, 499 insertions(+) create mode 100644 FDM/LaRCsim.cxx create mode 100644 FDM/LaRCsim.hxx diff --git a/FDM/LaRCsim.cxx b/FDM/LaRCsim.cxx new file mode 100644 index 000000000..ede3e99f6 --- /dev/null +++ b/FDM/LaRCsim.cxx @@ -0,0 +1,445 @@ +// LaRCsim.cxx -- interface to the LaRCsim flight model +// +// Written by Curtis Olson, started October 1998. +// +// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu +// +// 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 2 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, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ +// (Log is kept at end of this file) + + +#include "LaRCsim.hxx" + +#include +#include +#include +#include +#include +#include + + +// Initialize the LaRCsim flight model, dt is the time increment for +// each subsequent iteration through the EOM +int fgLaRCsimInit(double dt) { + ls_toplevel_init(dt); + + return(1); +} + + +// Run an iteration of the EOM (equations of motion) +int fgLaRCsimUpdate(fgFLIGHT *f, int multiloop) { + double save_alt = 0.0; + + // lets try to avoid really screwing up the LaRCsim model + if ( FG_Altitude < -9000 ) { + save_alt = FG_Altitude; + FG_Altitude = 0; + } + + // translate FG to LaRCsim structure + fgFlight_2_LaRCsim(f); + // printf("FG_Altitude = %.2f\n", FG_Altitude * 0.3048); + // printf("Altitude = %.2f\n", Altitude * 0.3048); + // printf("Radius to Vehicle = %.2f\n", Radius_to_vehicle * 0.3048); + + ls_update(multiloop); + + // printf("%d FG_Altitude = %.2f\n", i, FG_Altitude * 0.3048); + // printf("%d Altitude = %.2f\n", i, Altitude * 0.3048); + + // translate LaRCsim back to FG structure so that the + // autopilot (and the rest of the sim can use the updated + // values + fgLaRCsim_2_Flight(f); + + // but lets restore our original bogus altitude when we are done + if ( save_alt < -9000 ) { + FG_Altitude = save_alt; + } + + return 1; +} + + +// Convert from the fgFLIGHT struct to the LaRCsim generic_ struct +int fgFlight_2_LaRCsim (fgFLIGHT *f) { + Mass = FG_Mass; + I_xx = FG_I_xx; + I_yy = FG_I_yy; + I_zz = FG_I_zz; + I_xz = FG_I_xz; + Dx_pilot = FG_Dx_pilot; + Dy_pilot = FG_Dy_pilot; + Dz_pilot = FG_Dz_pilot; + Dx_cg = FG_Dx_cg; + Dy_cg = FG_Dy_cg; + Dz_cg = FG_Dz_cg; + F_X = FG_F_X; + F_Y = FG_F_Y; + F_Z = FG_F_Z; + F_north = FG_F_north; + F_east = FG_F_east; + F_down = FG_F_down; + F_X_aero = FG_F_X_aero; + F_Y_aero = FG_F_Y_aero; + F_Z_aero = FG_F_Z_aero; + F_X_engine = FG_F_X_engine; + F_Y_engine = FG_F_Y_engine; + F_Z_engine = FG_F_Z_engine; + F_X_gear = FG_F_X_gear; + F_Y_gear = FG_F_Y_gear; + F_Z_gear = FG_F_Z_gear; + M_l_rp = FG_M_l_rp; + M_m_rp = FG_M_m_rp; + M_n_rp = FG_M_n_rp; + M_l_cg = FG_M_l_cg; + M_m_cg = FG_M_m_cg; + M_n_cg = FG_M_n_cg; + M_l_aero = FG_M_l_aero; + M_m_aero = FG_M_m_aero; + M_n_aero = FG_M_n_aero; + M_l_engine = FG_M_l_engine; + M_m_engine = FG_M_m_engine; + M_n_engine = FG_M_n_engine; + M_l_gear = FG_M_l_gear; + M_m_gear = FG_M_m_gear; + M_n_gear = FG_M_n_gear; + V_dot_north = FG_V_dot_north; + V_dot_east = FG_V_dot_east; + V_dot_down = FG_V_dot_down; + U_dot_body = FG_U_dot_body; + V_dot_body = FG_V_dot_body; + W_dot_body = FG_W_dot_body; + A_X_cg = FG_A_X_cg; + A_Y_cg = FG_A_Y_cg; + A_Z_cg = FG_A_Z_cg; + A_X_pilot = FG_A_X_pilot; + A_Y_pilot = FG_A_Y_pilot; + A_Z_pilot = FG_A_Z_pilot; + N_X_cg = FG_N_X_cg; + N_Y_cg = FG_N_Y_cg; + N_Z_cg = FG_N_Z_cg; + N_X_pilot = FG_N_X_pilot; + N_Y_pilot = FG_N_Y_pilot; + N_Z_pilot = FG_N_Z_pilot; + P_dot_body = FG_P_dot_body; + Q_dot_body = FG_Q_dot_body; + R_dot_body = FG_R_dot_body; + V_north = FG_V_north; + V_east = FG_V_east; + V_down = FG_V_down; + V_north_rel_ground = FG_V_north_rel_ground; + V_east_rel_ground = FG_V_east_rel_ground; + V_down_rel_ground = FG_V_down_rel_ground; + V_north_airmass = FG_V_north_airmass; + V_east_airmass = FG_V_east_airmass; + V_down_airmass = FG_V_down_airmass; + V_north_rel_airmass = FG_V_north_rel_airmass; + V_east_rel_airmass = FG_V_east_rel_airmass; + V_down_rel_airmass = FG_V_down_rel_airmass; + U_gust = FG_U_gust; + V_gust = FG_V_gust; + W_gust = FG_W_gust; + U_body = FG_U_body; + V_body = FG_V_body; + W_body = FG_W_body; + V_rel_wind = FG_V_rel_wind; + V_true_kts = FG_V_true_kts; + V_rel_ground = FG_V_rel_ground; + V_inertial = FG_V_inertial; + V_ground_speed = FG_V_ground_speed; + V_equiv = FG_V_equiv; + V_equiv_kts = FG_V_equiv_kts; + V_calibrated = FG_V_calibrated; + V_calibrated_kts = FG_V_calibrated_kts; + P_body = FG_P_body; + Q_body = FG_Q_body; + R_body = FG_R_body; + P_local = FG_P_local; + Q_local = FG_Q_local; + R_local = FG_R_local; + P_total = FG_P_total; + Q_total = FG_Q_total; + R_total = FG_R_total; + Phi_dot = FG_Phi_dot; + Theta_dot = FG_Theta_dot; + Psi_dot = FG_Psi_dot; + Latitude_dot = FG_Latitude_dot; + Longitude_dot = FG_Longitude_dot; + Radius_dot = FG_Radius_dot; + Lat_geocentric = FG_Lat_geocentric; + Lon_geocentric = FG_Lon_geocentric; + Radius_to_vehicle = FG_Radius_to_vehicle; + Latitude = FG_Latitude; + Longitude = FG_Longitude; + Altitude = FG_Altitude; + Phi = FG_Phi; + Theta = FG_Theta; + Psi = FG_Psi; + T_local_to_body_11 = FG_T_local_to_body_11; + T_local_to_body_12 = FG_T_local_to_body_12; + T_local_to_body_13 = FG_T_local_to_body_13; + T_local_to_body_21 = FG_T_local_to_body_21; + T_local_to_body_22 = FG_T_local_to_body_22; + T_local_to_body_23 = FG_T_local_to_body_23; + T_local_to_body_31 = FG_T_local_to_body_31; + T_local_to_body_32 = FG_T_local_to_body_32; + T_local_to_body_33 = FG_T_local_to_body_33; + Gravity = FG_Gravity; + Centrifugal_relief = FG_Centrifugal_relief; + Alpha = FG_Alpha; + Beta = FG_Beta; + Alpha_dot = FG_Alpha_dot; + Beta_dot = FG_Beta_dot; + Cos_alpha = FG_Cos_alpha; + Sin_alpha = FG_Sin_alpha; + Cos_beta = FG_Cos_beta; + Sin_beta = FG_Sin_beta; + Cos_phi = FG_Cos_phi; + Sin_phi = FG_Sin_phi; + Cos_theta = FG_Cos_theta; + Sin_theta = FG_Sin_theta; + Cos_psi = FG_Cos_psi; + Sin_psi = FG_Sin_psi; + Gamma_vert_rad = FG_Gamma_vert_rad; + Gamma_horiz_rad = FG_Gamma_horiz_rad; + Sigma = FG_Sigma; + Density = FG_Density; + V_sound = FG_V_sound; + Mach_number = FG_Mach_number; + Static_pressure = FG_Static_pressure; + Total_pressure = FG_Total_pressure; + Impact_pressure = FG_Impact_pressure; + Dynamic_pressure = FG_Dynamic_pressure; + Static_temperature = FG_Static_temperature; + Total_temperature = FG_Total_temperature; + Sea_level_radius = FG_Sea_level_radius; + Earth_position_angle = FG_Earth_position_angle; + Runway_altitude = FG_Runway_altitude; + Runway_latitude = FG_Runway_latitude; + Runway_longitude = FG_Runway_longitude; + Runway_heading = FG_Runway_heading; + Radius_to_rwy = FG_Radius_to_rwy; + D_cg_north_of_rwy = FG_D_cg_north_of_rwy; + D_cg_east_of_rwy = FG_D_cg_east_of_rwy; + D_cg_above_rwy = FG_D_cg_above_rwy; + X_cg_rwy = FG_X_cg_rwy; + Y_cg_rwy = FG_Y_cg_rwy; + H_cg_rwy = FG_H_cg_rwy; + D_pilot_north_of_rwy = FG_D_pilot_north_of_rwy; + D_pilot_east_of_rwy = FG_D_pilot_east_of_rwy; + D_pilot_above_rwy = FG_D_pilot_above_rwy; + X_pilot_rwy = FG_X_pilot_rwy; + Y_pilot_rwy = FG_Y_pilot_rwy; + H_pilot_rwy = FG_H_pilot_rwy; + + return( 0 ); +} + + +// Convert from the LaRCsim generic_ struct to the fgFLIGHT struct +int fgLaRCsim_2_Flight (fgFLIGHT *f) { + fgCONTROLS *c; + + c = current_aircraft.controls; + + Lat_control = FG_Aileron; + Long_control = FG_Elevator; + Long_trim = FG_Elev_Trim; + Rudder_pedal = FG_Rudder; + Throttle_pct = FG_Throttle[0]; + + FG_Mass = Mass; + FG_I_xx = I_xx; + FG_I_yy = I_yy; + FG_I_zz = I_zz; + FG_I_xz = I_xz; + FG_Dx_pilot = Dx_pilot; + FG_Dy_pilot = Dy_pilot; + FG_Dz_pilot = Dz_pilot; + FG_Dx_cg = Dx_cg; + FG_Dy_cg = Dy_cg; + FG_Dz_cg = Dz_cg; + FG_F_X = F_X; + FG_F_Y = F_Y; + FG_F_Z = F_Z; + FG_F_north = F_north; + FG_F_east = F_east; + FG_F_down = F_down; + FG_F_X_aero = F_X_aero; + FG_F_Y_aero = F_Y_aero; + FG_F_Z_aero = F_Z_aero; + FG_F_X_engine = F_X_engine; + FG_F_Y_engine = F_Y_engine; + FG_F_Z_engine = F_Z_engine; + FG_F_X_gear = F_X_gear; + FG_F_Y_gear = F_Y_gear; + FG_F_Z_gear = F_Z_gear; + FG_M_l_rp = M_l_rp; + FG_M_m_rp = M_m_rp; + FG_M_n_rp = M_n_rp; + FG_M_l_cg = M_l_cg; + FG_M_m_cg = M_m_cg; + FG_M_n_cg = M_n_cg; + FG_M_l_aero = M_l_aero; + FG_M_m_aero = M_m_aero; + FG_M_n_aero = M_n_aero; + FG_M_l_engine = M_l_engine; + FG_M_m_engine = M_m_engine; + FG_M_n_engine = M_n_engine; + FG_M_l_gear = M_l_gear; + FG_M_m_gear = M_m_gear; + FG_M_n_gear = M_n_gear; + FG_V_dot_north = V_dot_north; + FG_V_dot_east = V_dot_east; + FG_V_dot_down = V_dot_down; + FG_U_dot_body = U_dot_body; + FG_V_dot_body = V_dot_body; + FG_W_dot_body = W_dot_body; + FG_A_X_cg = A_X_cg; + FG_A_Y_cg = A_Y_cg; + FG_A_Z_cg = A_Z_cg; + FG_A_X_pilot = A_X_pilot; + FG_A_Y_pilot = A_Y_pilot; + FG_A_Z_pilot = A_Z_pilot; + FG_N_X_cg = N_X_cg; + FG_N_Y_cg = N_Y_cg; + FG_N_Z_cg = N_Z_cg; + FG_N_X_pilot = N_X_pilot; + FG_N_Y_pilot = N_Y_pilot; + FG_N_Z_pilot = N_Z_pilot; + FG_P_dot_body = P_dot_body; + FG_Q_dot_body = Q_dot_body; + FG_R_dot_body = R_dot_body; + FG_V_north = V_north; + FG_V_east = V_east; + FG_V_down = V_down; + FG_V_north_rel_ground = V_north_rel_ground; + FG_V_east_rel_ground = V_east_rel_ground; + FG_V_down_rel_ground = V_down_rel_ground; + FG_V_north_airmass = V_north_airmass; + FG_V_east_airmass = V_east_airmass; + FG_V_down_airmass = V_down_airmass; + FG_V_north_rel_airmass = V_north_rel_airmass; + FG_V_east_rel_airmass = V_east_rel_airmass; + FG_V_down_rel_airmass = V_down_rel_airmass; + FG_U_gust = U_gust; + FG_V_gust = V_gust; + FG_W_gust = W_gust; + FG_U_body = U_body; + FG_V_body = V_body; + FG_W_body = W_body; + FG_V_rel_wind = V_rel_wind; + FG_V_true_kts = V_true_kts; + FG_V_rel_ground = V_rel_ground; + FG_V_inertial = V_inertial; + FG_V_ground_speed = V_ground_speed; + FG_V_equiv = V_equiv; + FG_V_equiv_kts = V_equiv_kts; + FG_V_calibrated = V_calibrated; + FG_V_calibrated_kts = V_calibrated_kts; + FG_P_body = P_body; + FG_Q_body = Q_body; + FG_R_body = R_body; + FG_P_local = P_local; + FG_Q_local = Q_local; + FG_R_local = R_local; + FG_P_total = P_total; + FG_Q_total = Q_total; + FG_R_total = R_total; + FG_Phi_dot = Phi_dot; + FG_Theta_dot = Theta_dot; + FG_Psi_dot = Psi_dot; + FG_Latitude_dot = Latitude_dot; + FG_Longitude_dot = Longitude_dot; + FG_Radius_dot = Radius_dot; + FG_Lat_geocentric = Lat_geocentric; + FG_Lon_geocentric = Lon_geocentric; + FG_Radius_to_vehicle = Radius_to_vehicle; + FG_Latitude = Latitude; + FG_Longitude = Longitude; + FG_Altitude = Altitude; + FG_Phi = Phi; + FG_Theta = Theta; + FG_Psi = Psi; + FG_T_local_to_body_11 = T_local_to_body_11; + FG_T_local_to_body_12 = T_local_to_body_12; + FG_T_local_to_body_13 = T_local_to_body_13; + FG_T_local_to_body_21 = T_local_to_body_21; + FG_T_local_to_body_22 = T_local_to_body_22; + FG_T_local_to_body_23 = T_local_to_body_23; + FG_T_local_to_body_31 = T_local_to_body_31; + FG_T_local_to_body_32 = T_local_to_body_32; + FG_T_local_to_body_33 = T_local_to_body_33; + FG_Gravity = Gravity; + FG_Centrifugal_relief = Centrifugal_relief; + FG_Alpha = Alpha; + FG_Beta = Beta; + FG_Alpha_dot = Alpha_dot; + FG_Beta_dot = Beta_dot; + FG_Cos_alpha = Cos_alpha; + FG_Sin_alpha = Sin_alpha; + FG_Cos_beta = Cos_beta; + FG_Sin_beta = Sin_beta; + FG_Cos_phi = Cos_phi; + FG_Sin_phi = Sin_phi; + FG_Cos_theta = Cos_theta; + FG_Sin_theta = Sin_theta; + FG_Cos_psi = Cos_psi; + FG_Sin_psi = Sin_psi; + FG_Gamma_vert_rad = Gamma_vert_rad; + FG_Gamma_horiz_rad = Gamma_horiz_rad; + FG_Sigma = Sigma; + FG_Density = Density; + FG_V_sound = V_sound; + FG_Mach_number = Mach_number; + FG_Static_pressure = Static_pressure; + FG_Total_pressure = Total_pressure; + FG_Impact_pressure = Impact_pressure; + FG_Dynamic_pressure = Dynamic_pressure; + FG_Static_temperature = Static_temperature; + FG_Total_temperature = Total_temperature; + FG_Sea_level_radius = Sea_level_radius; + FG_Earth_position_angle = Earth_position_angle; + FG_Runway_altitude = Runway_altitude; + FG_Runway_latitude = Runway_latitude; + FG_Runway_longitude = Runway_longitude; + FG_Runway_heading = Runway_heading; + FG_Radius_to_rwy = Radius_to_rwy; + FG_D_cg_north_of_rwy = D_cg_north_of_rwy; + FG_D_cg_east_of_rwy = D_cg_east_of_rwy; + FG_D_cg_above_rwy = D_cg_above_rwy; + FG_X_cg_rwy = X_cg_rwy; + FG_Y_cg_rwy = Y_cg_rwy; + FG_H_cg_rwy = H_cg_rwy; + FG_D_pilot_north_of_rwy = D_pilot_north_of_rwy; + FG_D_pilot_east_of_rwy = D_pilot_east_of_rwy; + FG_D_pilot_above_rwy = D_pilot_above_rwy; + FG_X_pilot_rwy = X_pilot_rwy; + FG_Y_pilot_rwy = Y_pilot_rwy; + FG_H_pilot_rwy = H_pilot_rwy; + + return ( 0 ); +} + + +// $Log$ +// Revision 1.1 1998/10/17 00:43:58 curt +// Initial revision. +// +// diff --git a/FDM/LaRCsim.hxx b/FDM/LaRCsim.hxx new file mode 100644 index 000000000..642ebf44b --- /dev/null +++ b/FDM/LaRCsim.hxx @@ -0,0 +1,54 @@ +/************************************************************************** + * ls_interface.h -- interface to the "LaRCsim" flight model + * + * Written by Curtis Olson, started May 1997. + * + * Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id$ + * (Log is kept at end of this file) + **************************************************************************/ + + +#ifndef _LARCSIM_HXX +#define _LARCSIM_HXX + + +#include "flight.hxx" + + +/* reset flight params to a specific position */ +int fgLaRCsimInit(double dt); + +/* update position based on inputs, positions, velocities, etc. */ +int fgLaRCsimUpdate(fgFLIGHT *f, int multiloop); + +/* Convert from the fgFLIGHT struct to the LaRCsim generic_ struct */ +int fgFlight_2_LaRCsim (fgFLIGHT *f); + +/* Convert from the LaRCsim generic_ struct to the fgFLIGHT struct */ +int fgLaRCsim_2_Flight (fgFLIGHT *f); + + +#endif /* _LARCSIM_HXX */ + + +/* $Log$ +/* Revision 1.1 1998/10/17 00:43:58 curt +/* Initial revision. +/* + */ -- 2.39.2