![]() |
VR-Link API Documentation for HLA Evolved
|
00001 /********************************************************************* 00002 ** Copyright (c) 1992-2010 VT MAK 00003 ** All rights reserved. 00004 *********************************************************************/ 00005 00006 00009 00010 #ifndef DtDeadReckoner_H_ 00011 #define DtDeadReckoner_H_ 00012 00013 #include "approximator.h" 00014 #include <matrix/vlTaitBryan.h> 00015 #include <matrix/vlDcm.h> 00016 #include <matrix/vlVector.h> 00017 #include "disEnums.h" 00018 00030 class DT_DLL_VLPROTIND DtDeadReckoner : public DtApproximator 00031 { 00032 public: 00033 00035 DtDeadReckoner(); 00036 00038 virtual ~DtDeadReckoner(); 00039 00041 DtDeadReckoner(const DtDeadReckoner& orig); 00042 00044 DtDeadReckoner& operator=(const DtDeadReckoner& orig); 00045 00048 virtual DtApproximator* clone() const; 00049 00051 virtual void setLocation(const DtVector& loc, DtTime curTime); 00052 00055 virtual const DtVector& approxLocation(DtTime curTime) const; 00056 00058 virtual const DtVector& deadReckonedLocation(DtTime curTime) const; 00059 00061 virtual void setVelocity(const DtVector& vel, DtTime curTime); 00062 00065 virtual const DtVector& approxVelocity(DtTime curTime) const; 00066 00068 virtual const DtVector& deadReckonedVelocity(DtTime curTime) const; 00069 00071 virtual void setOrientation(const DtTaitBryan& ori, DtTime curTime); 00072 00075 virtual const DtTaitBryan& approxEuler(DtTime curTime) const; 00076 00078 virtual const DtTaitBryan& deadReckonedEuler(DtTime curTime) const; 00079 00081 virtual void setAcceleration(const DtVector& acc, DtTime curTime); 00082 virtual const DtVector& acceleration(DtTime curTime) const; 00083 00085 virtual void setRotationalVelocity(const DtVector& vel, DtTime curTime); 00086 virtual const DtVector& rotationalVelocity(DtTime curTime) const; 00087 00090 virtual const DtDcm& approxBodyToGeoc(DtTime curTime) const; 00091 00093 virtual const DtDcm& deadReckonedBodyToGeoc(DtTime curTime) const; 00094 00097 virtual void setAlgorithm(DtDeadReckonTypes alg); 00098 virtual DtDeadReckonTypes algorithm() const; 00099 00104 virtual void deadReckonPosition(DtTime dt, 00105 const DtVector& oldPos, const DtVector& oldVel, 00106 const DtVector& oldAccel, 00107 DtVector& newVel, DtVector& newPos); 00108 00113 virtual void deadReckonOrientation(DtTime dt, 00114 const DtDcm& old_b2w, 00115 const DtDirectedRotRate& drr, 00116 DtDcm& new_b2w); 00117 00118 public: 00119 00121 static void deadReckonPosition( 00122 DtTime dt, DtDeadReckonTypes algorithm, 00123 const DtVector& oldPos, const DtVector& oldVel, 00124 const DtVector& oldAccel, 00125 DtVector& newVel, DtVector& newPos); 00126 00128 static void deadReckonOrientation( 00129 DtTime dt, DtDeadReckonTypes algorithm, 00130 const DtDcm& old_b2w, 00131 const DtDirectedRotRate& drr, 00132 DtDcm& new_b2w); 00133 00134 protected: 00135 00139 virtual void deadReckonLoc(DtTime curTime) const; 00140 00144 virtual void deadReckonBodyToGeoc(DtTime curTime) const; 00145 00149 virtual void deadReckonEuler(DtTime curTime) const; 00150 00153 virtual int isRotational(); 00154 00162 DtDeadReckoner* self() const; 00163 00164 protected: 00165 00168 static int isRotational(DtDeadReckonTypes algorithm); 00169 00170 protected: 00171 00172 DtVector myLocAtTimeOfValidity; 00173 DtVector myVelAtTimeOfValidity; 00174 DtTime mySimTimePosDataValid; 00175 DtDcm myBodyToGeocAtTimeOfValidity; 00176 DtTime mySimTimeOrientDataValid; 00177 00178 DtVector myDRLoc; 00179 DtVector myDRVel; 00180 DtTime myDRPosTime; 00181 DtDcm myDRBodyToGeoc; 00182 DtTime myDRBodyToGeocTime; 00183 DtTaitBryan myDREuler; 00184 DtTime myDREulerTime; 00185 DtDirectedRotRate myDirectedRotRate; 00186 DtDeadReckonTypes myAlgorithm; 00187 DtVector myAccel; 00188 DtBodyRates myRotVel; 00189 }; 00190 00191 inline DtDeadReckoner* DtDeadReckoner::self() const 00192 { 00193 return (DtDeadReckoner*)this; 00194 } 00195 00196 inline const DtVector& DtDeadReckoner::deadReckonedLocation(DtTime curTime) const 00197 { 00198 deadReckonLoc(curTime); 00199 return myDRLoc; 00200 } 00201 00202 inline const DtVector& DtDeadReckoner::approxLocation(DtTime curTime) const 00203 { 00204 return deadReckonedLocation(curTime); 00205 } 00206 00207 inline const DtVector& DtDeadReckoner::deadReckonedVelocity(DtTime curTime) const 00208 { 00209 deadReckonLoc(curTime); 00210 return myDRVel; 00211 } 00212 00213 inline const DtVector& DtDeadReckoner::approxVelocity(DtTime curTime) const 00214 { 00215 return deadReckonedVelocity(curTime); 00216 } 00217 00218 inline const DtDcm& DtDeadReckoner::deadReckonedBodyToGeoc(DtTime curTime) const 00219 { 00220 deadReckonBodyToGeoc(curTime); 00221 return myDRBodyToGeoc; 00222 } 00223 00224 inline const DtDcm& DtDeadReckoner::approxBodyToGeoc(DtTime curTime) const 00225 { 00226 return deadReckonedBodyToGeoc(curTime); 00227 } 00228 00229 inline const DtTaitBryan& DtDeadReckoner::deadReckonedEuler( 00230 DtTime curTime) const 00231 { 00232 deadReckonEuler(curTime); 00233 return myDREuler; 00234 } 00235 00236 inline const DtTaitBryan& DtDeadReckoner::approxEuler(DtTime curTime) const 00237 { 00238 return deadReckonedEuler(curTime); 00239 } 00240 00241 inline void DtDeadReckoner::setAlgorithm(DtDeadReckonTypes alg) 00242 { 00243 myAlgorithm = alg; 00244 } 00245 00246 inline DtDeadReckonTypes DtDeadReckoner::algorithm() const 00247 { 00248 return myAlgorithm; 00249 } 00250 00251 inline const DtVector& DtDeadReckoner::acceleration(DtTime curTime) const 00252 { 00253 return myAccel; 00254 } 00255 00256 inline const DtVector& DtDeadReckoner::rotationalVelocity(DtTime curTime) const 00257 { 00258 return myRotVel; 00259 } 00260 00261 #endif 00262