29#include "ns3/boolean.h"
31#include "ns3/simulator.h"
32#include "ns3/string.h"
37NS_LOG_COMPONENT_DEFINE(
"SatSGP4MobilityModel");
51 TypeId(
"ns3::SatSGP4MobilityModel")
53 .AddConstructor<SatSGP4MobilityModel>()
54 .AddAttribute(
"UpdatePositionEachRequest",
55 "Compute position each time a packet is transmitted",
60 "UpdatePositionPeriod",
61 "Period of satellite position refresh, if UpdatePositionEachRequest is false",
62 TimeValue(Seconds(1)),
72 NS_LOG_FUNCTION(
this);
78 NS_LOG_FUNCTION(
this);
80 SatMobilityModel::NotifyConstructionCompleted();
92 NS_LOG_FUNCTION(
this << startStr);
101 NS_LOG_FUNCTION(
this);
109 NS_LOG_FUNCTION(
this << t);
117 NS_LOG_FUNCTION(
this);
137 return 1000 *
rvTemeTovItrf(Vector3D(r[0], r[1], r[2]), Vector3D(v[0], v[1], v[2]), cur);
143 NS_LOG_FUNCTION(
this);
151 NS_LOG_FUNCTION(
this << position);
159 NS_LOG_FUNCTION(
this);
194 NS_LOG_FUNCTION(
this << position);
203 NS_LOG_FUNCTION(
this);
211 NS_LOG_FUNCTION(
this);
224 NS_LOG_FUNCTION(
this << tle);
226 uint32_t delimPos = tle.find(
"\n");
227 const std::string line1 = tle.substr(0, delimPos);
228 const std::string line2 = tle.substr(delimPos + 1, tle.size() - delimPos);
230 double start, stop, delta;
235 "Two-Line Element info lines must be of length" <<
TleSatInfoWidth <<
"!");
237 m_tle1 = std::string(line1.c_str());
238 m_tle2 = std::string(line2.c_str());
240 memcpy(l1, line1.c_str(),
sizeof(l1));
241 memcpy(l2, line2.c_str(),
sizeof(l2));
253 NS_FATAL_ERROR(
"Simulation start date "
255 <<
" after TLE epoch. TLE are only valid for a few days");
260 NS_FATAL_ERROR(
"Error while loading TLE file");
272 return pmt * (tmt * rteme);
277 const Vector3D& vteme,
284 return pmt * ((tmt * vteme) -
CrossProduct(w, tmt * rteme));
292 const double &xp = eop.first, &yp = eop.second;
293 const double cosxp = cos(xp), cosyp = cos(yp);
294 const double sinxp = sin(xp), sinyp = sin(yp);
320 const double gmst = t.
GetGmst();
321 const double cosg = cos(gmst), sing = sin(gmst);
332 return Matrix(cosg, sing, 0, -sing, cosg, 0, 0, 0, 1);
359 return Vector3D(
m[0][0] * v.x +
m[0][1] * v.y +
m[0][2] * v.z,
360 m[1][0] * v.x +
m[1][1] * v.y +
m[1][2] * v.z,
361 m[2][0] * v.x +
m[2][1] * v.y +
m[2][2] * v.z);
GeoCoordinate class is used to store and operate with geodetic coordinates.
Vector ToVector() const
Converts Geodetic coordinates to Cartesian coordinates.
Class to handle Julian days and provide respective Earth Orientation Parameters (EOP).
double GetGmst(void) const
Retrieve the Greenwich Mean Sidereal Time.
double GetOmegaEarth(void) const
Retrieve Earth's angular velocity.
std::pair< double, double > GetPolarMotion(void) const
Retrieve the polar motion cofficients measured/predicted.
SatMobilityModel()
Default constructor.
void NotifyGeoCourseChange(void) const
Keep track of the current position and velocity of satellite using SGP4 model.
std::string m_startStr
Simulation absolute start time in string format.
virtual void DoSetGeoPosition(const GeoCoordinate &position)
static const gravconsttype WGeoSys
World Geodetic System (WGS) constants to be used by SGP4/SDP4 models.
JulianDate GetStartTime() const
Get the time instant considered as the simulation start.
virtual void DoSetPosition(const Vector &position)
static const uint32_t TleSatInfoWidth
Satellite's information line size defined by TLE data format.
virtual void NotifyConstructionCompleted() override
Notifier called once the ObjectBase is fully constructed.
GeoCoordinate m_lastPosition
Last saved satellite position.
void SetStartTime(const JulianDate &t)
Set the time instant considered as the simulation start.
SatSGP4MobilityModel()
Default constructor.
static Matrix PefToItrf(const JulianDate &t)
Retrieve the matrix for converting from PEF to ITRF at a given time.
Time m_updatePositionPeriod
Period of satellite position refresh, if UpdatePositionEachRequest is false.
JulianDate GetTleEpoch(void) const
Retrieve the TLE epoch time.
bool m_updatePositionEachRequest
Compute position each time a packet is transmitted.
virtual Vector DoGetVelocity() const
elsetrec m_sgp4_record
SGP4/SDP4 record.
static Vector3D rvTemeTovItrf(const Vector3D &rteme, const Vector3D &vteme, const JulianDate &t)
Retrieve the satellite's velocity vector in ITRF coordinates.
static Matrix TemeToPef(const JulianDate &t)
Retrieve the matrix for converting from TEME to PEF at a given time.
Time m_timeLastUpdate
Last position update time.
std::string m_tle2
satellite's TLE data.
static TypeId GetTypeId(void)
Get the type ID.
static Vector3D rTemeTorItrf(const Vector3D &rteme, const JulianDate &t)
Retrieve the satellite's position vector in ITRF coordinates.
void SetStartDate(std::string startStr)
Set the simulation absolute start time in string format.
virtual GeoCoordinate DoGetGeoPosition() const
bool IsInitialized(void) const
Check if the satellite has already been initialized.
virtual Vector DoGetPosition() const
void SetTleInfo(const std::string &tle)
Set satellite's TLE information required for its initialization.
JulianDate m_start
Simulation absolute start time.
virtual ~SatSGP4MobilityModel()
Destructor.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
Vector3D CrossProduct(const Vector3D &v1, const Vector3D &v2)
Cross product of two Vector3D objects.
void twoline2rv(char longstr1[130], char longstr2[130], char typerun, char typeinput, char opsmode, gravconsttype whichconst, double &startmfe, double &stopmfe, double &deltamin, elsetrec &satrec)
bool sgp4(gravconsttype whichconst, elsetrec &satrec, double tsince, double r[3], double v[3])
Matrix data structure to make coordinate conversion code clearer and less verbose.
Vector3D operator*(const Vector3D &v) const