Rename Topographic to Topocentric. Add brief comments to all classes.
parent
0ae67f450d
commit
566be64e8d
|
|
@ -8,7 +8,9 @@
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores a geodetic position
|
* @brief Stores a geodetic location (latitude, longitude, altitude).
|
||||||
|
*
|
||||||
|
* Internally the values are stored in radians and kilometres.
|
||||||
*/
|
*/
|
||||||
struct CoordGeodetic
|
struct CoordGeodetic
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
#include "CoordTopocentric.h"
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef COORDTOPOGRAPHIC_H_
|
#ifndef COORDTOPOCENTRIC_H_
|
||||||
#define COORDTOPOGRAPHIC_H_
|
#define COORDTOPOCENTRIC_H_
|
||||||
|
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
|
|
||||||
|
|
@ -8,15 +8,19 @@
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores a topographic position
|
* @brief Stores a topocentric location (azimuth, elevation, range and range
|
||||||
|
* rate).
|
||||||
|
*
|
||||||
|
* Azimuth and elevation are stored in radians. Range in kilometres. Range
|
||||||
|
* rate in kilometres/second.
|
||||||
*/
|
*/
|
||||||
struct CoordTopographic
|
struct CoordTopocentric
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Default constructor
|
* Default constructor
|
||||||
*/
|
*/
|
||||||
CoordTopographic()
|
CoordTopocentric()
|
||||||
: azimuth(0.0),
|
: azimuth(0.0),
|
||||||
elevation(0.0),
|
elevation(0.0),
|
||||||
range(0.0),
|
range(0.0),
|
||||||
|
|
@ -26,20 +30,20 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
* @param[in] arg_azimuth azimuth in radians
|
* @param[in] az azimuth in radians
|
||||||
* @param[in] arg_elevation elevation in radians
|
* @param[in] el elevation in radians
|
||||||
* @param[in] arg_range range in kilometers
|
* @param[in] rnge range in kilometers
|
||||||
* @param[in] arg_range_rate range rate in kilometers per second
|
* @param[in] rnge_rate range rate in kilometers per second
|
||||||
*/
|
*/
|
||||||
CoordTopographic(
|
CoordTopocentric(
|
||||||
double arg_azimuth,
|
double az,
|
||||||
double arg_elevation,
|
double el,
|
||||||
double arg_range,
|
double rnge,
|
||||||
double arg_range_rate)
|
double rnge_rate)
|
||||||
: azimuth(arg_azimuth),
|
: azimuth(az),
|
||||||
elevation(arg_elevation),
|
elevation(el),
|
||||||
range(arg_range),
|
range(rnge),
|
||||||
range_rate(arg_range_rate)
|
range_rate(rnge_rate)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,7 +51,7 @@ public:
|
||||||
* Copy constructor
|
* Copy constructor
|
||||||
* @param[in] topo object to copy from
|
* @param[in] topo object to copy from
|
||||||
*/
|
*/
|
||||||
CoordTopographic(const CoordTopographic& topo)
|
CoordTopocentric(const CoordTopocentric& topo)
|
||||||
{
|
{
|
||||||
azimuth = topo.azimuth;
|
azimuth = topo.azimuth;
|
||||||
elevation = topo.elevation;
|
elevation = topo.elevation;
|
||||||
|
|
@ -58,7 +62,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Destructor
|
* Destructor
|
||||||
*/
|
*/
|
||||||
virtual ~CoordTopographic()
|
virtual ~CoordTopocentric()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -66,7 +70,7 @@ public:
|
||||||
* Assignment operator
|
* Assignment operator
|
||||||
* @param[in] topo object to copy from
|
* @param[in] topo object to copy from
|
||||||
*/
|
*/
|
||||||
CoordTopographic& operator=(const CoordTopographic& topo)
|
CoordTopocentric& operator=(const CoordTopocentric& topo)
|
||||||
{
|
{
|
||||||
if (this != &topo)
|
if (this != &topo)
|
||||||
{
|
{
|
||||||
|
|
@ -83,7 +87,7 @@ public:
|
||||||
* @param[in] topo value to check
|
* @param[in] topo value to check
|
||||||
* @returns whether the object is equal
|
* @returns whether the object is equal
|
||||||
*/
|
*/
|
||||||
bool operator==(const CoordTopographic& topo) const
|
bool operator==(const CoordTopocentric& topo) const
|
||||||
{
|
{
|
||||||
return IsEqual(topo);
|
return IsEqual(topo);
|
||||||
}
|
}
|
||||||
|
|
@ -93,7 +97,7 @@ public:
|
||||||
* @param[in] topo the object to compare with
|
* @param[in] topo the object to compare with
|
||||||
* @returns whether the object is not equal
|
* @returns whether the object is not equal
|
||||||
*/
|
*/
|
||||||
bool operator !=(const CoordTopographic& topo) const
|
bool operator !=(const CoordTopocentric& topo) const
|
||||||
{
|
{
|
||||||
return !IsEqual(topo);
|
return !IsEqual(topo);
|
||||||
}
|
}
|
||||||
|
|
@ -123,7 +127,7 @@ public:
|
||||||
double range_rate;
|
double range_rate;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool IsEqual(const CoordTopographic& topo) const
|
bool IsEqual(const CoordTopocentric& topo) const
|
||||||
{
|
{
|
||||||
bool equal = false;
|
bool equal = false;
|
||||||
if (azimuth == topo.azimuth &&
|
if (azimuth == topo.azimuth &&
|
||||||
|
|
@ -138,7 +142,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
inline std::ostream& operator<<(std::ostream& strm, const CoordTopographic& t)
|
inline std::ostream& operator<<(std::ostream& strm, const CoordTopocentric& t)
|
||||||
{
|
{
|
||||||
return strm << t.ToString();
|
return strm << t.ToString();
|
||||||
}
|
}
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
#include "CoordTopographic.h"
|
|
||||||
|
|
@ -21,6 +21,9 @@ namespace
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Represents an instance in time.
|
||||||
|
*/
|
||||||
class DateTime
|
class DateTime
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,9 @@
|
||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The exception that the SGP4 class throws when a satellite decays.
|
||||||
|
*/
|
||||||
class DecayedException : public std::exception
|
class DecayedException : public std::exception
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,7 @@
|
||||||
#include "DateTime.h"
|
#include "DateTime.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class store to store an Earth-centered inertial position.
|
* @brief Stores an Earth-centered inertial position for a particular time.
|
||||||
* This is only valid for the date specified.
|
|
||||||
*/
|
*/
|
||||||
class Eci
|
class Eci
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
lib_LIBRARIES = libsgp4.a
|
lib_LIBRARIES = libsgp4.a
|
||||||
libsgp4_a_SOURCES = \
|
libsgp4_a_SOURCES = \
|
||||||
CoordGeodetic.cpp \
|
CoordGeodetic.cpp \
|
||||||
CoordTopographic.cpp \
|
CoordTopocentric.cpp \
|
||||||
DateTime.cpp \
|
DateTime.cpp \
|
||||||
Eci.cpp \
|
Eci.cpp \
|
||||||
Globals.cpp \
|
Globals.cpp \
|
||||||
|
|
@ -18,7 +18,7 @@ include_HEADERS = CoordGeodetic.h \
|
||||||
SatelliteException.h \
|
SatelliteException.h \
|
||||||
TleException.h \
|
TleException.h \
|
||||||
Vector.h \
|
Vector.h \
|
||||||
CoordTopographic.h \
|
CoordTopocentric.h \
|
||||||
Globals.h \
|
Globals.h \
|
||||||
Observer.h \
|
Observer.h \
|
||||||
SGP4.h \
|
SGP4.h \
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
#include "Observer.h"
|
#include "Observer.h"
|
||||||
|
|
||||||
#include "CoordTopographic.h"
|
#include "CoordTopocentric.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* calculate lookangle between the observer and the passed in Eci object
|
* calculate lookangle between the observer and the passed in Eci object
|
||||||
*/
|
*/
|
||||||
CoordTopographic Observer::GetLookAngle(const Eci &eci)
|
CoordTopocentric Observer::GetLookAngle(const Eci &eci)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* update the observers Eci to match the time of the Eci passed in
|
* update the observers Eci to match the time of the Eci passed in
|
||||||
|
|
@ -58,7 +58,7 @@ CoordTopographic Observer::GetLookAngle(const Eci &eci)
|
||||||
* range in km
|
* range in km
|
||||||
* range rate in km/s
|
* range rate in km/s
|
||||||
*/
|
*/
|
||||||
return CoordTopographic(az,
|
return CoordTopocentric(az,
|
||||||
el,
|
el,
|
||||||
range.w,
|
range.w,
|
||||||
rate);
|
rate);
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,11 @@
|
||||||
#include "Eci.h"
|
#include "Eci.h"
|
||||||
|
|
||||||
class DateTime;
|
class DateTime;
|
||||||
class CoordTopographic;
|
class CoordTopocentric;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stores an observers location in Eci coordinates.
|
||||||
|
*/
|
||||||
class Observer
|
class Observer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -65,7 +68,7 @@ public:
|
||||||
* @param[in] eci the object to find the look angle to
|
* @param[in] eci the object to find the look angle to
|
||||||
* @returns the lookup angle
|
* @returns the lookup angle
|
||||||
*/
|
*/
|
||||||
CoordTopographic GetLookAngle(const Eci &eci);
|
CoordTopocentric GetLookAngle(const Eci &eci);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,9 @@
|
||||||
|
|
||||||
class Tle;
|
class Tle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The extracted orbital elements used by the SGP4 propagator.
|
||||||
|
*/
|
||||||
class OrbitalElements
|
class OrbitalElements
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -112,7 +115,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
double mean_anomoly_;
|
double mean_anomoly_;
|
||||||
double ascending_node_;
|
double ascending_node_;
|
||||||
double argument_perigee_;
|
double argument_perigee_;
|
||||||
|
|
|
||||||
159
libsgp4/SGP4.h
159
libsgp4/SGP4.h
|
|
@ -13,6 +13,9 @@
|
||||||
* This documents the SGP4 tracking library.
|
* This documents the SGP4 tracking library.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The simplified perturbations model 4 propagater.
|
||||||
|
*/
|
||||||
class SGP4
|
class SGP4
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -30,6 +33,84 @@ public:
|
||||||
Eci FindPosition(double tsince) const;
|
Eci FindPosition(double tsince) const;
|
||||||
Eci FindPosition(const DateTime& date) const;
|
Eci FindPosition(const DateTime& date) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Initialise();
|
||||||
|
Eci FindPositionSDP4(const double tsince) const;
|
||||||
|
Eci FindPositionSGP4(double tsince) const;
|
||||||
|
Eci CalculateFinalPositionVelocity(
|
||||||
|
const double tsince,
|
||||||
|
const double e,
|
||||||
|
const double a,
|
||||||
|
const double omega,
|
||||||
|
const double xl,
|
||||||
|
const double xnode,
|
||||||
|
const double xincl,
|
||||||
|
const double xlcof,
|
||||||
|
const double aycof,
|
||||||
|
const double x3thm1,
|
||||||
|
const double x1mth2,
|
||||||
|
const double x7thm1,
|
||||||
|
const double cosio,
|
||||||
|
const double sinio) const;
|
||||||
|
void DeepSpaceInitialise(
|
||||||
|
const double eosq,
|
||||||
|
const double sinio,
|
||||||
|
const double cosio,
|
||||||
|
const double betao,
|
||||||
|
const double theta2,
|
||||||
|
const double betao2,
|
||||||
|
const double xmdot,
|
||||||
|
const double omgdot,
|
||||||
|
const double xnodot);
|
||||||
|
void DeepSpaceCalculateLunarSolarTerms(
|
||||||
|
const double tsince,
|
||||||
|
double& pe,
|
||||||
|
double& pinc,
|
||||||
|
double& pl,
|
||||||
|
double& pgh,
|
||||||
|
double& ph) const;
|
||||||
|
void DeepSpacePeriodics(
|
||||||
|
const double tsince,
|
||||||
|
double& em,
|
||||||
|
double& xinc,
|
||||||
|
double& omgasm,
|
||||||
|
double& xnodes,
|
||||||
|
double& xll) const;
|
||||||
|
void DeepSpaceSecular(
|
||||||
|
const double tsince,
|
||||||
|
double& xll,
|
||||||
|
double& omgasm,
|
||||||
|
double& xnodes,
|
||||||
|
double& em,
|
||||||
|
double& xinc,
|
||||||
|
double& xn) const;
|
||||||
|
void DeepSpaceCalcDotTerms(struct IntegratorValues& values) const;
|
||||||
|
void DeepSpaceIntegrator(
|
||||||
|
const double delt,
|
||||||
|
const double step2,
|
||||||
|
const struct IntegratorValues& values) const;
|
||||||
|
void Reset();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* flags
|
||||||
|
*/
|
||||||
|
bool use_simple_model_;
|
||||||
|
bool use_deep_space_;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the constants used
|
||||||
|
*/
|
||||||
|
struct CommonConstants common_consts_;
|
||||||
|
struct NearSpaceConstants nearspace_consts_;
|
||||||
|
struct DeepSpaceConstants deepspace_consts_;
|
||||||
|
struct IntegratorConstants integrator_consts_;
|
||||||
|
mutable struct IntegratorParams integrator_params_;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the orbit data
|
||||||
|
*/
|
||||||
|
OrbitalElements elements_;
|
||||||
|
|
||||||
struct CommonConstants
|
struct CommonConstants
|
||||||
{
|
{
|
||||||
double cosio;
|
double cosio;
|
||||||
|
|
@ -169,84 +250,6 @@ public:
|
||||||
*/
|
*/
|
||||||
struct IntegratorValues values_t;
|
struct IntegratorValues values_t;
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
|
||||||
void Initialise();
|
|
||||||
Eci FindPositionSDP4(const double tsince) const;
|
|
||||||
Eci FindPositionSGP4(double tsince) const;
|
|
||||||
Eci CalculateFinalPositionVelocity(
|
|
||||||
const double tsince,
|
|
||||||
const double e,
|
|
||||||
const double a,
|
|
||||||
const double omega,
|
|
||||||
const double xl,
|
|
||||||
const double xnode,
|
|
||||||
const double xincl,
|
|
||||||
const double xlcof,
|
|
||||||
const double aycof,
|
|
||||||
const double x3thm1,
|
|
||||||
const double x1mth2,
|
|
||||||
const double x7thm1,
|
|
||||||
const double cosio,
|
|
||||||
const double sinio) const;
|
|
||||||
void DeepSpaceInitialise(
|
|
||||||
const double eosq,
|
|
||||||
const double sinio,
|
|
||||||
const double cosio,
|
|
||||||
const double betao,
|
|
||||||
const double theta2,
|
|
||||||
const double betao2,
|
|
||||||
const double xmdot,
|
|
||||||
const double omgdot,
|
|
||||||
const double xnodot);
|
|
||||||
void DeepSpaceCalculateLunarSolarTerms(
|
|
||||||
const double tsince,
|
|
||||||
double& pe,
|
|
||||||
double& pinc,
|
|
||||||
double& pl,
|
|
||||||
double& pgh,
|
|
||||||
double& ph) const;
|
|
||||||
void DeepSpacePeriodics(
|
|
||||||
const double tsince,
|
|
||||||
double& em,
|
|
||||||
double& xinc,
|
|
||||||
double& omgasm,
|
|
||||||
double& xnodes,
|
|
||||||
double& xll) const;
|
|
||||||
void DeepSpaceSecular(
|
|
||||||
const double tsince,
|
|
||||||
double& xll,
|
|
||||||
double& omgasm,
|
|
||||||
double& xnodes,
|
|
||||||
double& em,
|
|
||||||
double& xinc,
|
|
||||||
double& xn) const;
|
|
||||||
void DeepSpaceCalcDotTerms(struct IntegratorValues& values) const;
|
|
||||||
void DeepSpaceIntegrator(
|
|
||||||
const double delt,
|
|
||||||
const double step2,
|
|
||||||
const struct IntegratorValues& values) const;
|
|
||||||
void Reset();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* flags
|
|
||||||
*/
|
|
||||||
bool use_simple_model_;
|
|
||||||
bool use_deep_space_;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the constants used
|
|
||||||
*/
|
|
||||||
struct CommonConstants common_consts_;
|
|
||||||
struct NearSpaceConstants nearspace_consts_;
|
|
||||||
struct DeepSpaceConstants deepspace_consts_;
|
|
||||||
struct IntegratorConstants integrator_consts_;
|
|
||||||
mutable struct IntegratorParams integrator_params_;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the orbit data
|
|
||||||
*/
|
|
||||||
OrbitalElements elements_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,9 @@
|
||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The exception that the SGP4 class throws upon an error.
|
||||||
|
*/
|
||||||
class SatelliteException : public std::exception
|
class SatelliteException : public std::exception
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,9 @@
|
||||||
#include "DateTime.h"
|
#include "DateTime.h"
|
||||||
#include "Eci.h"
|
#include "Eci.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Find the position of the sun
|
||||||
|
*/
|
||||||
class SolarPosition
|
class SolarPosition
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,13 @@ namespace
|
||||||
static const long long GregorianStart = 49916304000000000LL;
|
static const long long GregorianStart = 49916304000000000LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Represents a time interval.
|
||||||
|
*
|
||||||
|
* Represents a time interval (duration/elapsed) that is measured as a positive
|
||||||
|
* or negative number of days, hours, minutes, seconds, and fractions
|
||||||
|
* of a second.
|
||||||
|
*/
|
||||||
class TimeSpan
|
class TimeSpan
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,9 @@
|
||||||
#include "TleException.h"
|
#include "TleException.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tle class
|
* @brief Processes a two-line element set used to convey OrbitalElements.
|
||||||
* @details Loads and validates a tle.
|
*
|
||||||
|
* Used to extract the various raw fields from a two-line element set.
|
||||||
*/
|
*/
|
||||||
class Tle
|
class Tle
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,11 @@
|
||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The exception that the Tle class throws on an error.
|
||||||
|
*
|
||||||
|
* The exception that the Tle decoder will throw on an error.
|
||||||
|
*/
|
||||||
class TleException : public std::exception
|
class TleException : public std::exception
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,11 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Generic vector
|
||||||
|
*
|
||||||
|
* Stores x, y, z, w
|
||||||
|
*/
|
||||||
struct Vector
|
struct Vector
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#include <Observer.h>
|
#include <Observer.h>
|
||||||
#include <SGP4.h>
|
#include <SGP4.h>
|
||||||
#include <Util.h>
|
#include <Util.h>
|
||||||
#include <CoordTopographic.h>
|
#include <CoordTopocentric.h>
|
||||||
#include <CoordGeodetic.h>
|
#include <CoordGeodetic.h>
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
@ -15,95 +15,6 @@ struct PassDetails
|
||||||
double max_elevation;
|
double max_elevation;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if 0
|
|
||||||
double FindMaxElevation(
|
|
||||||
const CoordGeodetic& user_geo,
|
|
||||||
SGP4& sgp4,
|
|
||||||
const DateTime& aos,
|
|
||||||
const DateTime& los)
|
|
||||||
{
|
|
||||||
Observer obs(user_geo);
|
|
||||||
|
|
||||||
double max_elevation = 0.0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* time step in seconds
|
|
||||||
*/
|
|
||||||
double time_step = 180.0;
|
|
||||||
/*
|
|
||||||
* still searching for max elevation
|
|
||||||
*/
|
|
||||||
bool searching = true;
|
|
||||||
/*
|
|
||||||
* fine tune the max elevation value
|
|
||||||
*/
|
|
||||||
bool fine_tune = false;
|
|
||||||
|
|
||||||
DateTime current_time(aos);
|
|
||||||
while (current_time < los && searching)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* find position
|
|
||||||
*/
|
|
||||||
Eci eci = sgp4.FindPosition(current_time);
|
|
||||||
CoordTopographic topo = obs.GetLookAngle(eci);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* keep updating max elevation
|
|
||||||
*/
|
|
||||||
if (topo.elevation > max_elevation)
|
|
||||||
{
|
|
||||||
max_elevation = topo.elevation;
|
|
||||||
}
|
|
||||||
else if (!fine_tune)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* passed max elevation
|
|
||||||
* max elevation happened in the last 6 minutes
|
|
||||||
* go back and fine tune max elevation value
|
|
||||||
*/
|
|
||||||
current_time = current_time.AddSeconds(-2.0 * time_step);
|
|
||||||
/*
|
|
||||||
* dont go back before aos
|
|
||||||
*/
|
|
||||||
if (current_time < aos)
|
|
||||||
current_time = aos;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 1 second increment
|
|
||||||
*/
|
|
||||||
time_step = 1.0;
|
|
||||||
fine_tune = true;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* reset elevation
|
|
||||||
*/
|
|
||||||
max_elevation = -99.9;
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* found max elevation
|
|
||||||
*/
|
|
||||||
|
|
||||||
searching = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (searching)
|
|
||||||
{
|
|
||||||
current_time = current_time.AddSeconds(time_step);
|
|
||||||
if (current_time > los)
|
|
||||||
{
|
|
||||||
current_time = los;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return max_elevation;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
double FindMaxElevation(
|
double FindMaxElevation(
|
||||||
const CoordGeodetic& user_geo,
|
const CoordGeodetic& user_geo,
|
||||||
SGP4& sgp4,
|
SGP4& sgp4,
|
||||||
|
|
@ -134,7 +45,7 @@ double FindMaxElevation(
|
||||||
* find position
|
* find position
|
||||||
*/
|
*/
|
||||||
Eci eci = sgp4.FindPosition(current_time);
|
Eci eci = sgp4.FindPosition(current_time);
|
||||||
CoordTopographic topo = obs.GetLookAngle(eci);
|
CoordTopocentric topo = obs.GetLookAngle(eci);
|
||||||
|
|
||||||
if (topo.elevation > max_elevation)
|
if (topo.elevation > max_elevation)
|
||||||
{
|
{
|
||||||
|
|
@ -210,7 +121,7 @@ DateTime FindCrossingPoint(
|
||||||
* calculate satellite position
|
* calculate satellite position
|
||||||
*/
|
*/
|
||||||
Eci eci = sgp4.FindPosition(middle_time);
|
Eci eci = sgp4.FindPosition(middle_time);
|
||||||
CoordTopographic topo = obs.GetLookAngle(eci);
|
CoordTopocentric topo = obs.GetLookAngle(eci);
|
||||||
|
|
||||||
if (topo.elevation > 0.0)
|
if (topo.elevation > 0.0)
|
||||||
{
|
{
|
||||||
|
|
@ -264,7 +175,7 @@ DateTime FindCrossingPoint(
|
||||||
while (running && cnt++ < 6)
|
while (running && cnt++ < 6)
|
||||||
{
|
{
|
||||||
Eci eci = sgp4.FindPosition(middle_time);
|
Eci eci = sgp4.FindPosition(middle_time);
|
||||||
CoordTopographic topo = obs.GetLookAngle(eci);
|
CoordTopocentric topo = obs.GetLookAngle(eci);
|
||||||
if (topo.elevation > 0)
|
if (topo.elevation > 0)
|
||||||
{
|
{
|
||||||
middle_time = middle_time.AddSeconds(finding_aos ? -1 : 1);
|
middle_time = middle_time.AddSeconds(finding_aos ? -1 : 1);
|
||||||
|
|
@ -305,7 +216,7 @@ std::list<struct PassDetails> GeneratePassList(
|
||||||
* calculate satellite position
|
* calculate satellite position
|
||||||
*/
|
*/
|
||||||
Eci eci = sgp4.FindPosition(current_time);
|
Eci eci = sgp4.FindPosition(current_time);
|
||||||
CoordTopographic topo = obs.GetLookAngle(eci);
|
CoordTopocentric topo = obs.GetLookAngle(eci);
|
||||||
|
|
||||||
if (!found_aos && topo.elevation > 0.0)
|
if (!found_aos && topo.elevation > 0.0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#include <SGP4.h>
|
#include <SGP4.h>
|
||||||
#include <Observer.h>
|
#include <Observer.h>
|
||||||
#include <CoordGeodetic.h>
|
#include <CoordGeodetic.h>
|
||||||
#include <CoordTopographic.h>
|
#include <CoordTopocentric.h>
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#include <CoordTopographic.h>
|
#include <CoordTopocentric.h>
|
||||||
#include <CoordGeodetic.h>
|
#include <CoordGeodetic.h>
|
||||||
#include <Observer.h>
|
#include <Observer.h>
|
||||||
#include <SGP4.h>
|
#include <SGP4.h>
|
||||||
|
|
@ -28,7 +28,7 @@ int main()
|
||||||
/*
|
/*
|
||||||
* get look angle for observer to satellite
|
* get look angle for observer to satellite
|
||||||
*/
|
*/
|
||||||
CoordTopographic topo = obs.GetLookAngle(eci);
|
CoordTopocentric topo = obs.GetLookAngle(eci);
|
||||||
/*
|
/*
|
||||||
* convert satellite position to geodetic coordinates
|
* convert satellite position to geodetic coordinates
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue