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; // 半长轴 (a)
|
||
double eccentricity; // 离心率 (e)
|
||
double inclination; // 倾斜角 (i)
|
||
double longitudeOfAscendingNode; // 升交点赤经 (Ω)
|
||
double argumentOfPeriapsis; // 近地点幅角 (ω)
|
||
double trueAnomaly; // 真近点角 (ν)
|
||
|
||
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 |