Updated Eci

feature/19
Daniel Warner 2011-12-13 22:37:13 +00:00
parent 0d17be39fa
commit 4aab9bf601
9 changed files with 104 additions and 79 deletions

View File

@ -16,11 +16,21 @@ public:
} }
/* /*
* radians * default is in degrees
*/ */
CoordGeodetic(double lat, double lon, double alt) CoordGeodetic(double lat, double lon, double alt, bool radians = false)
: latitude(lat), longitude(lon), altitude(alt)
{ {
if (radians)
{
latitude = lat;
longitude = lon;
}
else
{
latitude = DegreesToRadians(lat);
longitude = DegreesToRadians(lon);
}
altitude = alt;
} }
CoordGeodetic(const CoordGeodetic& g) CoordGeodetic(const CoordGeodetic& g)

49
Eci.cpp
View File

@ -1,26 +1,26 @@
#include "Eci.h" #include "Eci.h"
#include "Globals.h" void Eci::ToEci(const Julian& date, const CoordGeodetic &g)
{
Eci::Eci(const Julian &date, const CoordGeodetic &geo) /*
: date_(date) { * set date
*/
date_ = date;
static const double mfactor = kTWOPI * (kOMEGA_E / kSECONDS_PER_DAY); static const double mfactor = kTWOPI * (kOMEGA_E / kSECONDS_PER_DAY);
const double latitude = geo.latitude;
const double longitude = geo.longitude;
const double altitude = geo.altitude;
/* /*
* Calculate Local Mean Sidereal Time for observers longitude * Calculate Local Mean Sidereal Time for observers longitude
*/ */
const double theta = date_.ToLocalMeanSiderealTime(longitude); const double theta = date_.ToLocalMeanSiderealTime(g.longitude);
/* /*
* take into account earth flattening * take into account earth flattening
*/ */
const double c = 1.0 / sqrt(1.0 + kF * (kF - 2.0) * pow(sin(latitude), 2.0)); const double c = 1.0 /
sqrt(1.0 + kF * (kF - 2.0) * pow(sin(g.latitude), 2.0));
const double s = pow(1.0 - kF, 2.0) * c; const double s = pow(1.0 - kF, 2.0) * c;
const double achcp = (kXKMPER * c + altitude) * cos(latitude); const double achcp = (kXKMPER * c + g.altitude) * cos(g.latitude);
/* /*
* X position in km * X position in km
@ -30,7 +30,7 @@ Eci::Eci(const Julian &date, const CoordGeodetic &geo)
*/ */
position_.x = achcp * cos(theta); position_.x = achcp * cos(theta);
position_.y = achcp * sin(theta); position_.y = achcp * sin(theta);
position_.z = (kXKMPER * s + altitude) * sin(latitude); position_.z = (kXKMPER * s + g.altitude) * sin(g.latitude);
position_.w = position_.GetMagnitude(); position_.w = position_.GetMagnitude();
/* /*
@ -45,21 +45,8 @@ Eci::Eci(const Julian &date, const CoordGeodetic &geo)
velocity_.w = velocity_.GetMagnitude(); velocity_.w = velocity_.GetMagnitude();
} }
Eci::Eci(const Julian &date, const Vector &position) CoordGeodetic Eci::ToGeodetic() const
: date_(date), position_(position) { {
}
Eci::Eci(const Julian &date, const Vector &position, const Vector &velocity)
: date_(date), position_(position), velocity_(velocity) {
}
Eci::~Eci(void) {
}
CoordGeodetic Eci::ToGeodetic() const {
const double theta = AcTan(position_.y, position_.x); const double theta = AcTan(position_.y, position_.x);
// 0 >= lon < 360 // 0 >= lon < 360
@ -67,7 +54,9 @@ CoordGeodetic Eci::ToGeodetic() const {
// 180 >= lon < 180 // 180 >= lon < 180
const double lon = fmod(theta - date_.ToGreenwichSiderealTime(), kPI); const double lon = fmod(theta - date_.ToGreenwichSiderealTime(), kPI);
const double r = sqrt((position_.x * position_.x) + (position_.y * position_.y)); const double r = sqrt((position_.x * position_.x) +
(position_.y * position_.y));
static const double e2 = kF * (2.0 - kF); static const double e2 = kF * (2.0 - kF);
double lat = AcTan(position_.z, r); double lat = AcTan(position_.z, r);
@ -75,13 +64,15 @@ CoordGeodetic Eci::ToGeodetic() const {
double c = 0.0; double c = 0.0;
int cnt = 0; int cnt = 0;
do { do
{
phi = lat; phi = lat;
const double sinphi = sin(phi); const double sinphi = sin(phi);
c = 1.0 / sqrt(1.0 - e2 * sinphi * sinphi); c = 1.0 / sqrt(1.0 - e2 * sinphi * sinphi);
lat = AcTan(position_.z + kXKMPER * c * e2 * sinphi, r); lat = AcTan(position_.z + kXKMPER * c * e2 * sinphi, r);
cnt++; cnt++;
} while (fabs(lat - phi) >= 1e-10 && cnt < 10); }
while (fabs(lat - phi) >= 1e-10 && cnt < 10);
const double alt = r / cos(lat) - kXKMPER * c; const double alt = r / cos(lat) - kXKMPER * c;

50
Eci.h
View File

@ -4,31 +4,61 @@
#include "CoordGeodetic.h" #include "CoordGeodetic.h"
#include "Vector.h" #include "Vector.h"
#include "Julian.h" #include "Julian.h"
#include "Globals.h"
class Eci { class Eci
{
public: public:
Eci() { /*
}; * in degrees
Eci(const Julian &date, const CoordGeodetic &geo); */
Eci(const Julian &date, const Vector &position); Eci(const Julian& date, double latitude, double longitude, double altitude)
Eci(const Julian &date, const Vector &position, const Vector &velocity); {
virtual ~Eci(void); ToEci(date, CoordGeodetic(latitude, longitude, altitude));
}
Vector GetPosition() const { Eci(const Julian& date, const CoordGeodetic& g)
{
ToEci(date, g);
}
Eci(const Julian &date, const Vector &position)
: date_(date), position_(position)
{
}
Eci(const Julian &date, const Vector &position, const Vector &velocity)
: date_(date), position_(position), velocity_(velocity)
{
}
virtual ~Eci()
{
}
Vector GetPosition() const
{
return position_; return position_;
} }
Vector GetVelocity() const { Vector GetVelocity() const
{
return velocity_; return velocity_;
} }
Julian GetDate() const { Julian GetDate() const
{
return date_; return date_;
} }
CoordGeodetic ToGeodetic() const; CoordGeodetic ToGeodetic() const;
protected:
void ToEci(const Julian& date, double latitude, double longitude,
double altitude);
void ToEci(const Julian& date, const CoordGeodetic& g);
private: private:
Julian date_; Julian date_;
Vector position_; Vector position_;

View File

@ -5,19 +5,15 @@
/* /*
* in degrees! * in degrees!
*/ */
Observer::Observer(const double latitude, const double longitude, const double altitude) { Observer::Observer(const double latitude, const double longitude, const double altitude)
: geo_(DegreesToRadians(latitude), DegreesToRadians(longitude), altitude),
geo_.latitude = DegreesToRadians(latitude); observers_eci_(Julian(), geo_)
geo_.longitude = DegreesToRadians(longitude); {
geo_.altitude = altitude;
observers_eci_ = Eci(Julian(), geo_);
} }
Observer::Observer(const CoordGeodetic &geo) Observer::Observer(const CoordGeodetic &geo)
: geo_(geo) { : geo_(geo), observers_eci_(Julian(), geo_)
{
observers_eci_ = Eci(Julian(), geo_);
} }
Observer::~Observer(void) { Observer::~Observer(void) {

View File

@ -9,7 +9,6 @@ const int kPASS_TIME_STEP = 180; // time step in seconds, when searching for aos
double FindMaxElevation(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian& aos, const Julian& los) { double FindMaxElevation(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian& aos, const Julian& los) {
Observer obs(user_geo); Observer obs(user_geo);
Eci eci;
double max_elevation = -99.9; double max_elevation = -99.9;
/* /*
@ -31,7 +30,7 @@ double FindMaxElevation(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian&
/* /*
* find position * find position
*/ */
sgp4.FindPosition(&eci, current_time); Eci eci = sgp4.FindPosition(current_time);
CoordTopographic topo = obs.GetLookAngle(eci); CoordTopographic topo = obs.GetLookAngle(eci);
/* /*
@ -85,7 +84,6 @@ double FindMaxElevation(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian&
Julian FindCrossingPoint(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian& initial_time1, const Julian& initial_time2, bool finding_aos) { Julian FindCrossingPoint(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian& initial_time1, const Julian& initial_time2, bool finding_aos) {
Observer obs(user_geo); Observer obs(user_geo);
Eci eci;
bool searching = true; bool searching = true;
unsigned int loop_count = 0; unsigned int loop_count = 0;
@ -100,7 +98,7 @@ Julian FindCrossingPoint(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian
/* /*
* find position * find position
*/ */
sgp4.FindPosition(&eci, middle_time); Eci eci = sgp4.FindPosition(middle_time);
CoordTopographic topo = obs.GetLookAngle(eci); CoordTopographic topo = obs.GetLookAngle(eci);
if (topo.elevation > 0.0) { if (topo.elevation > 0.0) {
@ -136,7 +134,6 @@ Julian FindCrossingPoint(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian
void AOSLOS(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian& start_time, const Julian& end_time) { void AOSLOS(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian& start_time, const Julian& end_time) {
Observer obs(user_geo); Observer obs(user_geo);
Eci eci;
Timespan time_step(0, 0, 0, kPASS_TIME_STEP); Timespan time_step(0, 0, 0, kPASS_TIME_STEP);
@ -153,7 +150,7 @@ void AOSLOS(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian& start_time,
while (current_time < end_time) { while (current_time < end_time) {
// find position // find position
sgp4.FindPosition(&eci, current_time); Eci eci = sgp4.FindPosition(current_time);
CoordTopographic topo = obs.GetLookAngle(eci); CoordTopographic topo = obs.GetLookAngle(eci);
if (topo.elevation > 0.0) { if (topo.elevation > 0.0) {

View File

@ -23,7 +23,6 @@ void RunTle(Tle tle, double start, double end, double inc) {
while (running) { while (running) {
try { try {
double val; double val;
Eci eci;
if (first_run && current != 0.0) { if (first_run && current != 0.0) {
/* /*
* make sure first run is always as zero * make sure first run is always as zero
@ -35,7 +34,7 @@ void RunTle(Tle tle, double start, double end, double inc) {
*/ */
val = current; val = current;
} }
model.FindPosition(&eci, val); Eci eci = model.FindPosition(val);
Vector position = eci.GetPosition(); Vector position = eci.GetPosition();
Vector velocity = eci.GetVelocity(); Vector velocity = eci.GetVelocity();

View File

@ -178,22 +178,22 @@ void SGP4::Initialize() {
first_run_ = false; first_run_ = false;
} }
void SGP4::FindPosition(Eci* eci, double tsince) const { Eci SGP4::FindPosition(double tsince) const {
if (use_deep_space_) if (use_deep_space_)
FindPositionSDP4(eci, tsince); return FindPositionSDP4(tsince);
else else
FindPositionSGP4(eci, tsince); return FindPositionSGP4(tsince);
} }
void SGP4::FindPosition(Eci* eci, const Julian& date) const { Eci SGP4::FindPosition(const Julian& date) const {
Timespan diff = date - elements_.Epoch(); Timespan diff = date - elements_.Epoch();
FindPosition(eci, diff.GetTotalMinutes()); return FindPosition(diff.GetTotalMinutes());
} }
void SGP4::FindPositionSDP4(Eci* eci, double tsince) const { Eci SGP4::FindPositionSDP4(double tsince) const {
/* /*
* the final values * the final values
@ -286,7 +286,7 @@ void SGP4::FindPositionSDP4(Eci* eci, double tsince) const {
/* /*
* using calculated values, find position and velocity * using calculated values, find position and velocity
*/ */
CalculateFinalPositionVelocity(eci, tsince, e, return CalculateFinalPositionVelocity(tsince, e,
a, omega, xl, xnode, a, omega, xl, xnode,
xincl, perturbed_xlcof, perturbed_aycof, xincl, perturbed_xlcof, perturbed_aycof,
perturbed_x3thm1, perturbed_x1mth2, perturbed_x7thm1, perturbed_x3thm1, perturbed_x1mth2, perturbed_x7thm1,
@ -294,7 +294,7 @@ void SGP4::FindPositionSDP4(Eci* eci, double tsince) const {
} }
void SGP4::FindPositionSGP4(Eci* eci, double tsince) const { Eci SGP4::FindPositionSGP4(double tsince) const {
/* /*
* the final values * the final values
@ -363,7 +363,7 @@ void SGP4::FindPositionSGP4(Eci* eci, double tsince) const {
* using calculated values, find position and velocity * using calculated values, find position and velocity
* we can pass in constants from Initialize() as these dont change * we can pass in constants from Initialize() as these dont change
*/ */
CalculateFinalPositionVelocity(eci, tsince, e, return CalculateFinalPositionVelocity(tsince, e,
a, omega, xl, xnode, a, omega, xl, xnode,
xincl, common_consts_.xlcof, common_consts_.aycof, xincl, common_consts_.xlcof, common_consts_.aycof,
common_consts_.x3thm1, common_consts_.x1mth2, common_consts_.x7thm1, common_consts_.x3thm1, common_consts_.x1mth2, common_consts_.x7thm1,
@ -371,7 +371,7 @@ void SGP4::FindPositionSGP4(Eci* eci, double tsince) const {
} }
void SGP4::CalculateFinalPositionVelocity(Eci* eci, const double& tsince, const double& e, Eci SGP4::CalculateFinalPositionVelocity(const double& tsince, const double& e,
const double& a, const double& omega, const double& xl, const double& xnode, const double& a, const double& omega, const double& xl, const double& xnode,
const double& xincl, const double& xlcof, const double& aycof, const double& xincl, const double& xlcof, const double& aycof,
const double& x3thm1, const double& x1mth2, const double& x7thm1, const double& x3thm1, const double& x1mth2, const double& x7thm1,
@ -522,7 +522,9 @@ void SGP4::CalculateFinalPositionVelocity(Eci* eci, const double& tsince, const
Julian julian(elements_.Epoch()); Julian julian(elements_.Epoch());
julian.AddMin(tsince); julian.AddMin(tsince);
(*eci) = Eci(julian, position, velocity); Eci eci(julian, position, velocity);
return eci;
} }
static inline double EvaluateCubicPolynomial(const double x, const double constant, static inline double EvaluateCubicPolynomial(const double x, const double constant,

13
SGP4.h
View File

@ -6,14 +6,15 @@
#include "Eci.h" #include "Eci.h"
#include "SatelliteException.h" #include "SatelliteException.h"
class SGP4 { class SGP4
{
public: public:
SGP4(const Tle& tle); SGP4(const Tle& tle);
virtual ~SGP4(void); virtual ~SGP4(void);
void SetTle(const Tle& tle); void SetTle(const Tle& tle);
void FindPosition(Eci* eci, double tsince) const; Eci FindPosition(double tsince) const;
void FindPosition(Eci* eci, const Julian& date) const; Eci FindPosition(const Julian& date) const;
struct CommonConstants { struct CommonConstants {
@ -196,9 +197,9 @@ private:
double* omgasm, double* xnodes, double* xll) const; double* omgasm, double* xnodes, double* xll) const;
void DeepSpaceSecular(const double& t, double* xll, double* omgasm, void DeepSpaceSecular(const double& t, double* xll, double* omgasm,
double* xnodes, double* em, double* xinc, double* xn) const; double* xnodes, double* em, double* xinc, double* xn) const;
void FindPositionSDP4(Eci* eci, double tsince) const; Eci FindPositionSDP4(double tsince) const;
void FindPositionSGP4(Eci* eci, double tsince) const; Eci FindPositionSGP4(double tsince) const;
void CalculateFinalPositionVelocity(Eci* eci, const double& tsince, const double& e, Eci CalculateFinalPositionVelocity(const double& tsince, const double& e,
const double& a, const double& omega, const double& xl, const double& xnode, const double& a, const double& omega, const double& xl, const double& xnode,
const double& xincl, const double& xlcof, const double& aycof, const double& xincl, const double& xlcof, const double& aycof,
const double& x3thm1, const double& x1mth2, const double& x7thm1, const double& x3thm1, const double& x1mth2, const double& x7thm1,

View File

@ -10,11 +10,10 @@ int main() {
"1 25544U 98067A 11146.36888985 .00025753 00000-0 16912-3 0 4201", "1 25544U 98067A 11146.36888985 .00025753 00000-0 16912-3 0 4201",
"2 25544 51.6504 272.6534 0003891 329.5510 71.2188 15.75539412717473"); "2 25544 51.6504 272.6534 0003891 329.5510 71.2188 15.75539412717473");
SGP4 sgp4(tle); SGP4 sgp4(tle);
Eci eci;
while(1) { while(1) {
Julian now; Julian now;
sgp4.FindPosition(&eci, now); Eci eci = sgp4.FindPosition(now);
CoordTopographic topo = obs.GetLookAngle(eci); CoordTopographic topo = obs.GetLookAngle(eci);
CoordGeodetic geo = eci.ToGeodetic(); CoordGeodetic geo = eci.ToGeodetic();
std::cout << now << " "; std::cout << now << " ";