Fix wrong speed

This commit is contained in:
Tim Schubert 2020-08-19 02:40:13 +02:00
parent 95bc153b1b
commit a92c54703f
5 changed files with 20 additions and 19 deletions

View file

@ -32,11 +32,11 @@ public:
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
std::vector<Orbit> orbits = { std::vector<Orbit> orbits = {
Orbit (1.150, 53.0, 32, 50), Orbit (1150, 53.0, 32, 50),
Orbit (1.110, 53.8, 32, 50), Orbit (1110, 53.8, 32, 50),
Orbit (1.130, 74.0, 8, 50), Orbit (1130, 74.0, 8, 50),
Orbit (1.275, 81, 5, 75), Orbit (1275, 81, 5, 75),
Orbit (1.325, 70, 6, 75), Orbit (1325, 70, 6, 75),
}; };
NodeContainer satellites; NodeContainer satellites;
for (Orbit orb: orbits) for (Orbit orb: orbits)
@ -62,7 +62,7 @@ int main(int argc, char *argv[])
outfile << "Time,Satellite,x,y,z,Speed" << std::endl; outfile << "Time,Satellite,x,y,z,Speed" << std::endl;
Simulator::Stop (Hours (2.0)); Simulator::Stop (Hours (24));
Simulator::Run (); Simulator::Run ();
Simulator::Destroy (); Simulator::Destroy ();
} }

View file

@ -82,8 +82,9 @@ LeoCircularOrbitMobilityModel::GetSpeed () const
Vector Vector
LeoCircularOrbitMobilityModel::DoGetVelocity () const LeoCircularOrbitMobilityModel::DoGetVelocity () const
{ {
Vector3D heading = CrossProduct (PlaneNorm (), DoGetPosition ()); Vector3D pos = DoGetPosition ();
// TODO pos = Vector3D (pos.x / pos.GetLength (), pos.y / pos.GetLength (), pos.z / pos.GetLength ());
Vector3D heading = CrossProduct (PlaneNorm (), pos);
return Product (GetSpeed (), heading); return Product (GetSpeed (), heading);
} }
@ -106,7 +107,7 @@ LeoCircularOrbitMobilityModel::GetProgress (Time t) const
{ {
sign = -1; sign = -1;
} }
return sign * (2 * M_PI * ((GetSpeed () * t.GetSeconds ()) / LEO_EARTH_RAD_M)) + m_offset; return sign * (2 * M_PI * ((GetSpeed () * t.GetSeconds ()) / LEO_EARTH_RAD_KM)) + m_offset;
} }
Vector3D Vector3D
@ -130,7 +131,7 @@ LeoCircularOrbitMobilityModel::CalcPosition (Time t) const
{ {
double lat = CalcLatitude (); double lat = CalcLatitude ();
// account for orbit latitude and earth rotation offset // account for orbit latitude and earth rotation offset
Vector3D x = Product (m_orbitHeight, Vector3D (cos (m_inclination) * cos (lat), Vector3D x = Product (m_orbitHeight*1000, Vector3D (cos (m_inclination) * cos (lat),
cos (m_inclination) * sin (lat), cos (m_inclination) * sin (lat),
sin (m_inclination))); sin (m_inclination)));
@ -175,12 +176,12 @@ LeoCircularOrbitMobilityModel::DoSetPosition (const Vector &position)
double LeoCircularOrbitMobilityModel::GetAltitude () const double LeoCircularOrbitMobilityModel::GetAltitude () const
{ {
return m_orbitHeight - LEO_EARTH_RAD_M; return m_orbitHeight - LEO_EARTH_RAD_KM;
} }
void LeoCircularOrbitMobilityModel::SetAltitude (double h) void LeoCircularOrbitMobilityModel::SetAltitude (double h)
{ {
m_orbitHeight = LEO_EARTH_RAD_M + h; m_orbitHeight = LEO_EARTH_RAD_KM + h;
Update (); Update ();
} }

View file

@ -9,7 +9,7 @@
#include "ns3/mobility-model.h" #include "ns3/mobility-model.h"
#include "ns3/nstime.h" #include "ns3/nstime.h"
#define LEO_EARTH_RAD_M 6371009.0 #define LEO_EARTH_RAD_KM 6371.0090
#define LEO_EARTH_GM_KM_E10 39.8600436 #define LEO_EARTH_GM_KM_E10 39.8600436
namespace ns3 { namespace ns3 {

View file

@ -38,7 +38,7 @@ private:
mob->SetAttribute ("Altitude", DoubleValue (0.0)); mob->SetAttribute ("Altitude", DoubleValue (0.0));
mob->SetAttribute ("Inclination", DoubleValue (1.0)); mob->SetAttribute ("Inclination", DoubleValue (1.0));
NS_TEST_ASSERT_MSG_EQ_TOL (mob->GetPosition ().GetLength(), LEO_EARTH_RAD_M, 0.1, "Unexpected position on earths surface for 1 deg inclination"); NS_TEST_ASSERT_MSG_EQ_TOL (mob->GetPosition ().GetLength() / 1000, LEO_EARTH_RAD_KM, 0.1, "Unexpected position on earths surface for 1 deg inclination");
} }
}; };
@ -51,7 +51,7 @@ private:
void TestLengthPosition (double expl, double expx, Ptr<LeoCircularOrbitMobilityModel> mob) void TestLengthPosition (double expl, double expx, Ptr<LeoCircularOrbitMobilityModel> mob)
{ {
Vector pos = mob->GetPosition (); Vector pos = mob->GetPosition ();
NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.GetLength (), expl, 0.001, "Distance to earth should be the same", __FILE__, __LINE__); NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.GetLength () / 1000, expl, 0.001, "Distance to earth should be the same", __FILE__, __LINE__);
NS_TEST_EXPECT_MSG_NE_INTERNAL (pos.x, expx, "Position should not be equal", __FILE__, __LINE__); NS_TEST_EXPECT_MSG_NE_INTERNAL (pos.x, expx, "Position should not be equal", __FILE__, __LINE__);
} }
@ -62,7 +62,7 @@ private:
mob->SetAttribute ("Inclination", DoubleValue (20.0)); mob->SetAttribute ("Inclination", DoubleValue (20.0));
Vector pos = mob->GetPosition (); Vector pos = mob->GetPosition ();
Simulator::Schedule (Seconds (100.0), &LeoOrbitProgressTestCase::TestLengthPosition, this, LEO_EARTH_RAD_M, pos.x, mob); Simulator::Schedule (Seconds (100.0), &LeoOrbitProgressTestCase::TestLengthPosition, this, LEO_EARTH_RAD_KM, pos.x, mob);
Simulator::Stop (Seconds (101.0)); Simulator::Stop (Seconds (101.0));
Simulator::Run (); Simulator::Run ();
Simulator::Destroy (); Simulator::Destroy ();

View file

@ -11,8 +11,9 @@ set xrange [-8e6:8e6]
set yrange [-8e6:8e6] set yrange [-8e6:8e6]
set zrange [-8e6:8e6] set zrange [-8e6:8e6]
set parametric set parametric
set isosamples 100,100 set isosamples 20,20
unset key unset key
unset title
set hidden3d set hidden3d
# number of nodes per time slot # number of nodes per time slot
@ -22,8 +23,7 @@ ground=ARG2
numsats=ARG3 numsats=ARG3
numsamples=ARG4 numsamples=ARG4
do for [j=0:numsamples] { do for [j=0:numsamples-1] {
set title 'time '.j
splot [-pi:pi][-pi/2:pi/2] EARTH*cos(u)*cos(v), EARTH*sin(u)*cos(v), EARTH*sin(v), \ splot [-pi:pi][-pi/2:pi/2] EARTH*cos(u)*cos(v), EARTH*sin(u)*cos(v), EARTH*sin(v), \
ground using 1:2:3 lt rgb "green", \ ground using 1:2:3 lt rgb "green", \
sats using 3:4:5:2 every ::(j*numsats)::((j+1)*numsats) lt rgb "blue" sats using 3:4:5:2 every ::(j*numsats)::((j+1)*numsats) lt rgb "blue"