From bf59e665263b4a6c5993c8c3e0c5a550345cc4d4 Mon Sep 17 00:00:00 2001 From: Tim Schubert Date: Mon, 17 Aug 2020 13:30:39 +0200 Subject: [PATCH] Fix bugs and write data directly to file --- .../leo-circular-orbit-tracing-example.cc | 33 +++++++++++-------- model/leo-circular-orbit-mobility-model.cc | 16 ++++++--- utils/plot-satellites.gnuplot | 6 ++-- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/examples/leo-circular-orbit-tracing-example.cc b/examples/leo-circular-orbit-tracing-example.cc index 0c11a20..c5f7296 100644 --- a/examples/leo-circular-orbit-tracing-example.cc +++ b/examples/leo-circular-orbit-tracing-example.cc @@ -1,5 +1,7 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +#include + #include "ns3/core-module.h" #include "ns3/mobility-module.h" #include "ns3/leo-module.h" @@ -8,32 +10,37 @@ using namespace ns3; NS_LOG_COMPONENT_DEFINE ("LeoCircularOrbitTracingExample"); +ofstream outfile ("leo-circular-orbit-tracing-example.csv"); + void CourseChange (std::string context, Ptr position) { Vector pos = position->GetPosition (); Ptr node = position->GetObject (); - std::cout << Simulator::Now () << "," << node->GetId () << "," << pos.x << "," << pos.y << "," << pos.z << "," << position->GetVelocity ().GetLength() << std::endl; + outfile << Simulator::Now () << "," << node->GetId () << "," << pos.x << "," << pos.y << "," << pos.z << "," << position->GetVelocity ().GetLength() << std::endl; } int main(int argc, char *argv[]) { - NodeContainer c; - c.Create (600); + for (double incl: { 70.0, 100.0 }) + { + NodeContainer c; + c.Create (600); - MobilityHelper mobility; - mobility.SetPositionAllocator ("ns3::LeoCircularOrbitPostionAllocator", - "NumOrbits", IntegerValue (6), - "NumSatellites", IntegerValue (100)); - mobility.SetMobilityModel ("ns3::LeoCircularOrbitMobilityModel", - "Altitude", DoubleValue (1200.0), - "Inclination", DoubleValue (80.0), - "Precision", TimeValue (Minutes (1))); - mobility.Install (c); + MobilityHelper mobility; + mobility.SetPositionAllocator ("ns3::LeoCircularOrbitPostionAllocator", + "NumOrbits", IntegerValue (6), + "NumSatellites", IntegerValue (100)); + mobility.SetMobilityModel ("ns3::LeoCircularOrbitMobilityModel", + "Altitude", DoubleValue (1200.0), + "Inclination", DoubleValue (incl), + "Precision", TimeValue (Minutes (1))); + mobility.Install (c); + } Config::Connect ("/NodeList/*/$ns3::MobilityModel/CourseChange", MakeCallback (&CourseChange)); - std::cout << "Time,Satellite,x,y,z,Speed" << std::endl; + outfile << "Time,Satellite,x,y,z,Speed" << std::endl; Simulator::Stop (Minutes (60.0)); Simulator::Run (); diff --git a/model/leo-circular-orbit-mobility-model.cc b/model/leo-circular-orbit-mobility-model.cc index d9b0981..684f20a 100644 --- a/model/leo-circular-orbit-mobility-model.cc +++ b/model/leo-circular-orbit-mobility-model.cc @@ -76,7 +76,8 @@ DotProduct (const Vector3D &l, const Vector3D &r) double LeoCircularOrbitMobilityModel::GetSpeed () const { - return sqrt (LEO_EARTH_GM_KM_E10 / m_orbitHeight) * 1e5; + // force non-retrograd movement + return sqrt (LEO_EARTH_GM_KM_E10 / m_orbitHeight) * 1e5; } Vector @@ -90,9 +91,14 @@ LeoCircularOrbitMobilityModel::DoGetVelocity () const Vector3D LeoCircularOrbitMobilityModel::PlaneNorm () const { - return Vector3D (sin (-m_inclination) * cos (m_latitude), - sin (-m_inclination) * sin (m_latitude), - cos (m_inclination)); + int sign = 1; + if (m_inclination < M_PI/4) + { + sign = -1; + } + return Vector3D (sign * sin (-m_inclination) * cos (m_latitude), + sign * sin (-m_inclination) * sin (m_latitude), + sign * cos (m_inclination)); } double @@ -173,7 +179,7 @@ void LeoCircularOrbitMobilityModel::SetAltitude (double h) double LeoCircularOrbitMobilityModel::GetInclination () const { - return (m_inclination / M_PI) * 180.0; + return (m_inclination / (M_PI)) * 180.0; } void LeoCircularOrbitMobilityModel::SetInclination (double incl) diff --git a/utils/plot-satellites.gnuplot b/utils/plot-satellites.gnuplot index 5acccc3..7e4ed2f 100644 --- a/utils/plot-satellites.gnuplot +++ b/utils/plot-satellites.gnuplot @@ -7,13 +7,13 @@ unset xtics unset ytics unset ztics unset border -set hidden3d unset key set view equal xyz -n=600 +# number of nodes per time slot +n=1200 do for [j=0:100] { set title 'time '.j - splot 'somefile' using 3:4:5:2 every ::(j*n)::((j+1)*n) + splot 'leo-circular-orbit-tracing-example.csv' using 3:4:5:2 every ::(j*n)::((j+1)*n) }