]> git.mxchange.org Git - flightgear.git/commitdiff
provide a property /orientation/track
authortorsten <torsten>
Sat, 2 Jan 2010 18:29:01 +0000 (18:29 +0000)
committerTim Moore <timoore@redhat.com>
Sun, 3 Jan 2010 21:26:16 +0000 (22:26 +0100)
The track is computed between two subsequent settings of the geodetic position and represents the true track.
Also the _set_Latitude() and _set_Longitude() methods were removed. Use _set_Geodetic_Position(lat,lon) instead.

src/FDM/SP/ACMS.cxx
src/FDM/SP/MagicCarpet.cxx
src/FDM/UFO.cxx
src/FDM/flight.cxx
src/FDM/flight.hxx

index ad36f28cf0e664152fceeead119e9e79e6be7356..6fd219bc932ec3bf1b67e63925d35e9af47b1d96 100644 (file)
@@ -88,15 +88,14 @@ void FGACMS::update( double dt ) {
     _set_V_calibrated_kts( kts );
     _set_V_ground_speed( kts );
 
-    SGGeod pos = SGGeod::fromDegM(get_Longitude(), get_Latitude(), get_Altitude());
+    SGGeod pos = getPosition();
     // update (lon/lat) position
     SGGeod pos2;
     double az2;
     geo_direct_wgs_84 ( pos, heading * SGD_RADIANS_TO_DEGREES,
                         dist, pos2, &az2 );
 
-    _set_Longitude( pos2.getLongitudeRad() );
-    _set_Latitude( pos2.getLatitudeRad() );
+    _set_Geodetic_Position(  pos2.getLatitudeRad(), pos2.getLongitudeRad(), pos.getElevationFt() );
 
     double sl_radius, lat_geoc;
     sgGeodToGeoc( get_Latitude(), get_Altitude(), &sl_radius, &lat_geoc );
index 99c937433daa222ee211e92b035045fbaf3fc157..44bffd0ef7e5dd324647fcbfb0c9ae9c32564611 100644 (file)
@@ -93,8 +93,7 @@ void FGMagicCarpet::update( double dt ) {
                            get_Psi() * SGD_RADIANS_TO_DEGREES,
                            dist, &lat2, &lon2, &az2 );
 
-       _set_Longitude( lon2 * SGD_DEGREES_TO_RADIANS );
-       _set_Latitude( lat2 * SGD_DEGREES_TO_RADIANS );
+        _set_Geodetic_Position( lat2 * SGD_DEGREES_TO_RADIANS,  lon2 * SGD_DEGREES_TO_RADIANS );
     }
 
     // cout << "lon error = " << fabs(end.x()*SGD_RADIANS_TO_DEGREES - lon2)
index e8a37fc7b727ebec08d5ceeee34c1512b6c741e2..93928f67d4bdddb30644d51f91137497622d28f8 100644 (file)
@@ -162,8 +162,7 @@ void FGUFO::update( double dt ) {
                             get_Psi() * SGD_RADIANS_TO_DEGREES,
                             dist, &lat2, &lon2, &az2 );
 
-        _set_Longitude( lon2 * SGD_DEGREES_TO_RADIANS );
-        _set_Latitude( lat2 * SGD_DEGREES_TO_RADIANS );
+        _set_Geodetic_Position( lat2 * SGD_DEGREES_TO_RADIANS,  lon2 * SGD_DEGREES_TO_RADIANS );
     }
 
     // cout << "lon error = " << fabs(end.x()*SGD_RADIANS_TO_DEGREES - lon2)
index bc5b3059a2fbeb8ee3ddab07dbe59ed3f7b94104..c9956d8cb85d6b062e59b47face45eea6d6ba636 100644 (file)
@@ -278,6 +278,8 @@ FGInterface::bind ()
        &FGInterface::get_Psi_deg,
        &FGInterface::set_Psi_deg);
   fgSetArchivable("/orientation/heading-deg");
+  fgTie("/orientation/track-deg", this,
+       &FGInterface::get_Track);
 
   // Body-axis "euler rates" (rotation speed, but in a funny
   // representation).
@@ -404,6 +406,7 @@ FGInterface::unbind ()
   fgUntie("/orientation/roll-deg");
   fgUntie("/orientation/pitch-deg");
   fgUntie("/orientation/heading-deg");
+  fgUntie("/orientation/track-deg");
   fgUntie("/orientation/roll-rate-degps");
   fgUntie("/orientation/pitch-rate-degps");
   fgUntie("/orientation/yaw-rate-degps");
@@ -442,6 +445,7 @@ FGInterface::update (double dt)
 
 void FGInterface::_updatePositionM(const SGVec3d& cartPos)
 {
+    TrackComputer tracker( track, geodetic_position_v );
     cartesian_position_v = cartPos;
     geodetic_position_v = SGGeod::fromCart(cartesian_position_v);
     geocentric_position_v = SGGeoc::fromCart(cartesian_position_v);
@@ -452,6 +456,7 @@ void FGInterface::_updatePositionM(const SGVec3d& cartPos)
 
 void FGInterface::_updatePosition(const SGGeod& geod)
 {
+    TrackComputer tracker( track, geodetic_position_v );
     geodetic_position_v = geod;
     cartesian_position_v = SGVec3d::fromGeod(geodetic_position_v);
     geocentric_position_v = SGGeoc::fromCart(cartesian_position_v);
@@ -463,6 +468,7 @@ void FGInterface::_updatePosition(const SGGeod& geod)
 
 void FGInterface::_updatePosition(const SGGeoc& geoc)
 {
+    TrackComputer tracker( track, geodetic_position_v );
     geocentric_position_v = geoc;
     cartesian_position_v = SGVec3d::fromGeoc(geocentric_position_v);
     geodetic_position_v = SGGeod::fromCart(cartesian_position_v);
index ba955145657cda7cb8cbd07253b244d0d4780d89..222df3b546492a29ac427982eda29c3e034f39fa 100644 (file)
@@ -88,6 +88,34 @@ using std::list;
 using std::vector;
 using std::string;
 
+/**
+ * A little helper class to update the track if
+ * the position has changed. In the constructor, 
+ * create a copy of the current position and store 
+ * references to the position object and the track
+ * variable to update.
+ * The destructor, called at TrackComputer's end of 
+ * life/visibility, computes the track if the 
+ * position has changed.
+ */
+class TrackComputer {
+public:
+  inline TrackComputer( double & track, const SGGeod & position ) : 
+    _track( track ),
+    _position( position ),
+    _prevPosition( position ) {
+  }
+
+  inline ~TrackComputer() {
+    if( _prevPosition == _position ) return;
+    _track = SGGeodesy::courseDeg( _prevPosition, _position );
+  }
+private:
+  double & _track;
+  const SGGeod & _position;
+  const SGGeod _prevPosition;
+};
+
 // This is based heavily on LaRCsim/ls_generic.h
 class FGInterface : public SGSubsystem {
 
@@ -157,6 +185,7 @@ private:
     double runway_altitude;
     double climb_rate;                // in feet per second
     double altitude_agl;
+    double track;
 
     double daux[16];           // auxilliary doubles
     float  faux[16];           // auxilliary floats
@@ -265,19 +294,27 @@ public:
        geocentric_position_v.setLongitudeRad(lon);
        geocentric_position_v.setRadiusFt(rad);
     }
+/*  Don't call _set_L[at|ong]itude() directly, use _set_Geodetic_Position() instead.
+    These methods can't update the track.
+ *
     inline void _set_Latitude(double lat) {
         geodetic_position_v.setLatitudeRad(lat);
     }
     inline void _set_Longitude(double lon) {
         geodetic_position_v.setLongitudeRad(lon);
     }
+*/
     inline void _set_Altitude(double altitude) {
         geodetic_position_v.setElevationFt(altitude);
     }
     inline void _set_Altitude_AGL(double agl) {
        altitude_agl = agl;
     }
+    inline void _set_Geodetic_Position( double lat, double lon ) {
+        _set_Geodetic_Position( lat, lon, geodetic_position_v.getElevationFt());
+    }
     inline void _set_Geodetic_Position( double lat, double lon, double alt ) {
+        TrackComputer tracker( track, geodetic_position_v );
        geodetic_position_v.setLatitudeRad(lat);
        geodetic_position_v.setLongitudeRad(lon);
        geodetic_position_v.setElevationFt(alt);
@@ -541,6 +578,7 @@ public:
         return geodetic_position_v.getElevationFt();
     }
     inline double get_Altitude_AGL(void) const { return altitude_agl; }
+    inline double get_Track(void) const { return track; }
 
     inline double get_Latitude_deg () const {
       return geodetic_position_v.getLatitudeDeg();