⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fglocation.h

📁 6 DOF Missle Simulation
💻 H
📖 第 1 页 / 共 2 页
字号:
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Header:       FGLocation.h Author:       Jon S. Berndt, Mathias Froehlich Date started: 04/04/2004 ------- Copyright (C) 1999  Jon S. Berndt (jsb@hal-pc.org) ------------------ -------           (C) 2004  Mathias Froehlich (Mathias.Froehlich@web.de) ---- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. Further information about the GNU Lesser General Public License can also be found on the world wide web at http://www.gnu.org.HISTORY-------------------------------------------------------------------------------04/04/2004   MF   Created from code previously in the old positions class.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%SENTRY%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/#ifndef FGLOCATION_H#define FGLOCATION_H/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%INCLUDES%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/#include <FGJSBBase.h>#include <input_output/FGPropertyManager.h>#include "FGColumnVector3.h"#include "FGMatrix33.h"/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%DEFINITIONS%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/#define ID_LOCATION "$Id$"/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FORWARD DECLARATIONS%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/namespace JSBSim {/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%CLASS DOCUMENTATION%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*//** Holds an arbitrary location in the earth centered reference frame.    This coordinate frame has its center in the middle of the earth.    Its x-axis points from the center of the earth towards a location    with zero latitude and longitude on the earths surface. The y-axis    points from the center of the earth towards a location with zero    latitude and 90deg longitude on the earths surface. The z-axis    points from the earths center to the geographic north pole.    This class provides access functions to set and get the location as    either the simple x, y and z values in ft or longitude/latitude and    the radial distance of the location from the earth center.    It is common to associate a parent frame with a location. This    frame is usually called the local horizontal frame or simply the local    frame. This frame has its x/y plane parallel to the surface of the earth    (with the assumption of a spherical earth). The x-axis points    towards north, the y-axis points towards east and the z-axis    points to the center of the earth.    Since this frame is determined by the location, this class also    provides the rotation matrices required to transform from the    earth centered frame to the local horizontal frame and back. There    are also conversion functions for conversion of position vectors    given in the one frame to positions in the other frame.    The earth centered reference frame is *NOT* an inertial frame    since it rotates with the earth.    The coordinates in the earth centered frame are the master values.    All other values are computed from these master values and are    cached as long as the location is changed by access through a    non-const member function. Values are cached to improve performance.    It is best practice to work with a natural set of master values.    Other parameters that are derived from these master values are calculated    only when needed, and IF they are needed and calculated, then they are    cached (stored and remembered) so they do not need to be re-calculated    until the master values they are derived from are themselves changed    (and become stale).    Accuracy and round off:    Given that we model a vehicle near the earth, the earths surface    radius is about 2*10^7, ft and that we use double values for the    representation of the location, we have an accuracy of about    1e-16*2e7ft/1=2e-9ft left. This should be sufficient for our needs.    Note that this is the same relative accuracy we would have when we    compute directly with lon/lat/radius. For the radius value this    is clear. For the lon/lat pair this is easy to see. Take for    example KSFO located at about 37.61deg north 122.35deg west, which    corresponds to 0.65642rad north and 2.13541rad west. Both values    are of magnitude of about 1. But 1ft corresponds to about    1/(2e7*2*pi)=7.9577e-09rad. So the left accuracy with this    representation is also about 1*1e-16/7.9577e-09=1.2566e-08 which    is of the same magnitude as the representation chosen here.    The advantage of this representation is that it is a linear space    without singularities. The singularities are the north and south    pole and most notably the non-steady jump at -pi to pi. It is    harder to track this jump correctly especially when we need to    work with error norms and derivatives of the equations of motion    within the time-stepping code. Also, the rate of change is of the    same magnitude for all components in this representation which is    an advantage for numerical stability in implicit time-stepping too.    Note: The latitude is a GEOCENTRIC value. FlightGear    converts latitude to a geodetic value and uses that. In order to get best    matching relative to a map, geocentric latitude must be converted to geodetic.    @see Stevens and Lewis, "Aircraft Control and Simulation", Second edition    @see W. C. Durham "Aircraft Dynamics & Control", section 2.2    @author Mathias Froehlich    @version $Id$  *//*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%CLASS DECLARATION%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/class FGLocation : virtual FGJSBBase{public:  /** Default constructor. */  FGLocation(void);  /** Constructor to set the longitude, latitude and the distance      from the center of the earth.      @param lon longitude      @param lat GEOCENTRIC latitude      @param radius distance from center of earth to vehicle in feet*/  FGLocation(double lon, double lat, double radius);  /** Column constructor. */  FGLocation(const FGColumnVector3& lv) : mECLoc(lv), mCacheValid(false)  {    a = 0.0;    b = 0.0;    a2 = 0.0;    b2 = 0.0;    e2 = 1.0;    e = 1.0;    eps2 = -1.0;    f = 1.0;  }  /** Copy constructor. */  FGLocation(const FGLocation& l)    : mECLoc(l.mECLoc), mCacheValid(l.mCacheValid)  {//    if (!mCacheValid) return; // This doesn't seem right.    mLon = l.mLon;    mLat = l.mLat;    mRadius = l.mRadius;    mTl2ec = l.mTl2ec;    mTec2l = l.mTec2l;    a = l.a;    b = l.b;    a2 = l.a2;    b2 = l.b2;    e2 = l.e2;    e = l.e;    eps2 = l.eps2;    f = l.f;    initial_longitude = l.initial_longitude;  }  /** Set the longitude.      @param longitude Longitude in rad to set.      Sets the longitude of the location represented with this class      instance to the value of the given argument. The value is meant      to be in rad. The latitude and the radius value are preserved      with this call with the exception of radius being equal to      zero. If the radius is previously set to zero it is changed to be      equal to 1.0 past this call. Longitude is positive east and negative west. */  void SetLongitude(double longitude);  /** Set the latitude.      @param latitude Latitude in rad to set.      Sets the latitude of the location represented with this class      instance to the value of the given argument. The value is meant      to be in rad. The longitude and the radius value are preserved      with this call with the exception of radius being equal to      zero. If the radius is previously set to zero it is changed to be      equal to 1.0 past this call.      Latitude is positive north and negative south.      The arguments should be within the bounds of -pi/2 <= lat <= pi/2.      The behavior of this function with arguments outside this range is      left as an exercise to the gentle reader ... */  void SetLatitude(double latitude);  /** Set the distance from the center of the earth.      @param radius Radius in ft to set.      Sets the radius of the location represented with this class      instance to the value of the given argument. The value is meant      to be in ft. The latitude and longitude values are preserved      with this call with the exception of radius being equal to      zero. If the radius is previously set to zero, latitude and      longitude is set equal to zero past this call.      The argument should be positive.      The behavior of this function called with a negative argument is      left as an exercise to the gentle reader ... */  void SetRadius(double radius);  /** Sets the longitude, latitude and the distance from the center of the earth.      @param lon longitude in radians      @param lat GEOCENTRIC latitude in radians      @param radius distance from center of earth to vehicle in feet*/  void SetPosition(double lon, double lat, double radius);  /** Sets the semimajor and semiminor axis lengths for this planet.      The eccentricity and flattening are calculated from the semimajor      and semiminor axis lengths */  void SetEllipse(double semimajor, double semiminor);  /** Get the longitude.      @return the longitude in rad of the location represented with this      class instance. The returned values are in the range between      -pi <= lon <= pi. Longitude is positive east and negative west. */  double GetLongitude() const { ComputeDerived(); return mLon; }  /** Get the longitude.      @return the longitude in deg of the location represented with this      class instance. The returned values are in the range between      -180 <= lon <= 180.  Longitude is positive east and negative west. */  double GetLongitudeDeg() const { ComputeDerived(); return radtodeg*mLon; }  /** Get the sine of Longitude. */  double GetSinLongitude() const { ComputeDerived(); return -mTec2l(2,1); }  /** Get the cosine of Longitude. */  double GetCosLongitude() const { ComputeDerived(); return mTec2l(2,2); }  /** Get the latitude.      @return the latitude in rad of the location represented with this      class instance. The returned values are in the range between      -pi/2 <= lon <= pi/2. Latitude is positive north and negative south. */  double GetLatitude() const { ComputeDerived(); return mLat; }  /** Get the geodetic latitude.      @return the geodetic latitude in rad of the location represented with this

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -