101 lines
3.1 KiB
C
101 lines
3.1 KiB
C
|
#ifndef ORIBTMODELOPERATOR_H_
|
|||
|
#define ORIBTMODELOPERATOR_H_
|
|||
|
#include <QFile>
|
|||
|
#include <QDomDocument>
|
|||
|
#include <QVector3D>
|
|||
|
#include <QDebug>
|
|||
|
#include <QList>
|
|||
|
#include <Eigen/Core>
|
|||
|
#include <Eigen/Dense>
|
|||
|
#include "BaseConstVariable.h"
|
|||
|
|
|||
|
QList<SatellitePos> loadNodesFromXml(const QString& filename);
|
|||
|
void saveNodesToXml(const QString& filename, const QList<SatellitePos>& inposes);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
class OrbitModelAbstract {
|
|||
|
public:
|
|||
|
OrbitModelAbstract();
|
|||
|
~OrbitModelAbstract();
|
|||
|
public:
|
|||
|
virtual SatellitePos predictNode(double time) ;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
class OrbitElements {
|
|||
|
public:
|
|||
|
double semiMajorAxis; // <20>볤<EFBFBD><EBB3A4> (a)
|
|||
|
double eccentricity; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (e)
|
|||
|
double inclination; // <20><>б<EFBFBD><D0B1> (i)
|
|||
|
double longitudeOfAscendingNode; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ྭ (<28><>)
|
|||
|
double argumentOfPeriapsis; // <20><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> (<28><>)
|
|||
|
double trueAnomaly; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>)
|
|||
|
|
|||
|
OrbitElements();
|
|||
|
};
|
|||
|
|
|||
|
class OrbitEstimator :public OrbitModelAbstract {
|
|||
|
public:
|
|||
|
OrbitEstimator();
|
|||
|
void estimateOrbit(const SatellitePos& node);
|
|||
|
void saveToXml(const QString& filename) const;
|
|||
|
bool loadFromXml(const QString& filename);
|
|||
|
SatellitePos calculateNode(double time) const;
|
|||
|
virtual SatellitePos predictNode(double time) override;
|
|||
|
private:
|
|||
|
OrbitElements elements;
|
|||
|
OrbitElements estimateKeplerianElements(const SatellitePos& node);
|
|||
|
SatellitePos calculateKeplerianNode(const OrbitElements& elements, double time) const;
|
|||
|
double solveKeplerEquation(double M, double e) const;
|
|||
|
};
|
|||
|
|
|||
|
class PolynomialOrbitModel :public OrbitModelAbstract {
|
|||
|
public:
|
|||
|
void fitPolynomial(const QList<SatellitePos>& nodes, int degree=3);
|
|||
|
SatellitePos predictPosition(double time);
|
|||
|
void saveToXml(const QString& filename) const;
|
|||
|
bool loadFromXml(const QString& filename);
|
|||
|
virtual SatellitePos predictNode(double time) override;
|
|||
|
private:
|
|||
|
Eigen::VectorXd coefficientsX;
|
|||
|
Eigen::VectorXd coefficientsY;
|
|||
|
Eigen::VectorXd coefficientsZ;
|
|||
|
Eigen::VectorXd coefficientsVx;
|
|||
|
Eigen::VectorXd coefficientsVy;
|
|||
|
Eigen::VectorXd coefficientsVz;
|
|||
|
|
|||
|
Eigen::VectorXd leastSquaresFit(const QList<double>& x, const QList<double>& y, int degree);
|
|||
|
void saveCoefficientsToXml(QDomElement& parent, const Eigen::VectorXd& coefficients, const QString& tagName) const;
|
|||
|
bool loadCoefficientsFromXml(const QDomElement& parent, Eigen::VectorXd& coefficients, const QString& tagName);
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
class TwoLineElements :public OrbitModelAbstract {
|
|||
|
public:
|
|||
|
TwoLineElements();
|
|||
|
bool loadFromTleFile(const QString& filename);
|
|||
|
SatellitePos calculateNode(double time) const;
|
|||
|
virtual SatellitePos predictNode(double time) override;
|
|||
|
private:
|
|||
|
std::string line1;
|
|||
|
std::string line2;
|
|||
|
|
|||
|
void parseTleLines();
|
|||
|
double meanMotion() const;
|
|||
|
double semiMajorAxis() const;
|
|||
|
double eccentricity() const;
|
|||
|
double inclination() const;
|
|||
|
double longitudeOfAscendingNode() const;
|
|||
|
double argumentOfPeriapsis() const;
|
|||
|
double meanAnomaly() const;
|
|||
|
double revolutionNumberAtEpoch() const;
|
|||
|
double epochTime() const;
|
|||
|
double solveKeplerEquation(double M, double e) const;
|
|||
|
SatellitePos calculateKeplerianNode(double time) const;
|
|||
|
};
|
|||
|
|
|||
|
#endif
|