revised REM implementation
This commit is contained in:
@@ -41,27 +41,35 @@ BuildingsHelper::MakeMobilityModelConsistent ()
|
||||
{
|
||||
Ptr<BuildingsMobilityModel> bmm = (*nit)->GetObject<BuildingsMobilityModel> ();
|
||||
NS_ABORT_MSG_UNLESS (0 != bmm, "node " << (*nit)->GetId () << " does not have a BuildingsMobilityModel");
|
||||
bool found = false;
|
||||
for (BuildingList::Iterator bit = BuildingList::Begin (); bit != BuildingList::End (); ++bit)
|
||||
{
|
||||
Vector pos = bmm->GetPosition ();
|
||||
if ((*bit)->IsInside (pos))
|
||||
{
|
||||
NS_LOG_LOGIC ("node " << (*nit)->GetId () << " falls inside building " << (*bit)->GetId ());
|
||||
NS_ABORT_MSG_UNLESS (found == false, "node already inside another building!");
|
||||
found = true;
|
||||
uint16_t floor = (*bit)->GetFloor (pos);
|
||||
uint16_t roomX = (*bit)->GetRoomX (pos);
|
||||
uint16_t roomY = (*bit)->GetRoomY (pos);
|
||||
bmm->SetIndoor (*bit, floor, roomX, roomY);
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
NS_LOG_LOGIC ("node " << (*nit)->GetId () << " is outdoor");
|
||||
bmm->SetOutdoor ();
|
||||
}
|
||||
MakeConsistent (bmm);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BuildingsHelper::MakeConsistent (Ptr<BuildingsMobilityModel> bmm)
|
||||
{
|
||||
bool found = false;
|
||||
for (BuildingList::Iterator bit = BuildingList::Begin (); bit != BuildingList::End (); ++bit)
|
||||
{
|
||||
Vector pos = bmm->GetPosition ();
|
||||
if ((*bit)->IsInside (pos))
|
||||
{
|
||||
NS_LOG_LOGIC ("BuildingsMobilityModel " << bmm << " falls inside building " << (*bit)->GetId ());
|
||||
NS_ABORT_MSG_UNLESS (found == false, " BuildingsMobilityModel already inside another building!");
|
||||
found = true;
|
||||
uint16_t floor = (*bit)->GetFloor (pos);
|
||||
uint16_t roomX = (*bit)->GetRoomX (pos);
|
||||
uint16_t roomY = (*bit)->GetRoomY (pos);
|
||||
bmm->SetIndoor (*bit, floor, roomX, roomY);
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
NS_LOG_LOGIC ("BuildingsMobilityModel " << bmm << " is outdoor");
|
||||
bmm->SetOutdoor ();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
@@ -25,15 +25,18 @@
|
||||
#include <ns3/attribute.h>
|
||||
#include <ns3/object-factory.h>
|
||||
#include <ns3/node-container.h>
|
||||
#include <ns3/ptr.h>
|
||||
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class BuildingsMobilityModel;
|
||||
|
||||
class BuildingsHelper
|
||||
{
|
||||
public:
|
||||
static void MakeMobilityModelConsistent ();
|
||||
static void MakeConsistent (Ptr<BuildingsMobilityModel> bmm);
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -498,6 +498,21 @@ generated. Note that each RadioEnvironmentMapHelper instance can
|
||||
generate only one REM; if you want to generate more REMs, you need to
|
||||
create one separate instance for each REM.
|
||||
|
||||
Note that the REM generation is very demanding, in particular:
|
||||
|
||||
* the run-time memory consumption is approximately 5KB per pixel. For example,
|
||||
a REM with a resolution of 500x500 needs about 1.25 GB of memory, and
|
||||
a resolution of 1000x1000 needs about 5 GB (too much for a
|
||||
regular PC at the time of this writing).
|
||||
* if you generate a REM at the beginning of a simulation, it will
|
||||
slow down the execution of the rest of the simulation. If you want
|
||||
to generate a REM for a program and also use the same program to
|
||||
get simulation result, it is recommended to add a command-line
|
||||
switch that allows to either generate the REM or run the complete
|
||||
simulation. For this purpose, note that there is an attribute
|
||||
``RadioEnvironmentMapHelper::StopWhenDone`` (default: true) that
|
||||
will force the simulation to stop right after the REM has been generated.
|
||||
|
||||
The REM is stored in an ASCII file in the following format:
|
||||
|
||||
* column 1 is the x coordinate
|
||||
@@ -512,6 +527,7 @@ below::
|
||||
set xlabel "X"
|
||||
set ylabel "Y"
|
||||
set cblabel "SINR (dB)"
|
||||
unset key
|
||||
plot "rem.out" using ($1):($2):(10*log10($4)) with image
|
||||
|
||||
|
||||
|
||||
@@ -174,8 +174,6 @@ main (int argc, char *argv[])
|
||||
}
|
||||
mobility.Install (ueNodes.at(i));
|
||||
}
|
||||
BuildingsHelper::MakeMobilityModelConsistent ();
|
||||
|
||||
|
||||
// Create Devices and install them in the Nodes (eNB and UE)
|
||||
NetDeviceContainer enbDevs;
|
||||
@@ -218,6 +216,9 @@ main (int argc, char *argv[])
|
||||
lteHelper->ActivateEpsBearer (ueDev, bearer, EpcTft::Default ());
|
||||
}
|
||||
|
||||
|
||||
BuildingsHelper::MakeMobilityModelConsistent ();
|
||||
|
||||
// by default, simulation will anyway stop right after the REM has been generated
|
||||
Simulator::Stop (Seconds (0.0069));
|
||||
|
||||
@@ -231,9 +232,6 @@ main (int argc, char *argv[])
|
||||
remHelper->SetAttribute ("Z", DoubleValue (1.5));
|
||||
remHelper->Install ();
|
||||
|
||||
|
||||
|
||||
BuildingsHelper::MakeMobilityModelConsistent ();
|
||||
Simulator::Run ();
|
||||
|
||||
// GtkConfigStore config;
|
||||
|
||||
@@ -33,9 +33,10 @@
|
||||
#include <ns3/buildings-mobility-model.h>
|
||||
#include <ns3/simulator.h>
|
||||
#include <ns3/node.h>
|
||||
#include <ns3/buildings-helper.h>
|
||||
|
||||
#include <fstream>
|
||||
|
||||
#include <limits>
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("RadioEnvironmentMapHelper");
|
||||
|
||||
@@ -96,20 +97,24 @@ RadioEnvironmentMapHelper::GetTypeId (void)
|
||||
.AddAttribute ("XRes", "The resolution (number of points) of the map along the x axis.",
|
||||
UintegerValue (100),
|
||||
MakeUintegerAccessor (&RadioEnvironmentMapHelper::m_xRes),
|
||||
MakeUintegerChecker<uint32_t> ())
|
||||
MakeUintegerChecker<uint32_t> (2,std::numeric_limits<uint16_t>::max ()))
|
||||
.AddAttribute ("YRes", "The resolution (number of points) of the map along the y axis.",
|
||||
UintegerValue (100),
|
||||
MakeUintegerAccessor (&RadioEnvironmentMapHelper::m_yRes),
|
||||
MakeUintegerChecker<uint32_t> ())
|
||||
MakeUintegerChecker<uint32_t> (2,std::numeric_limits<uint16_t>::max ()))
|
||||
.AddAttribute ("Z", "The value of the z coordinate for which the map is to be generated",
|
||||
DoubleValue (0.0),
|
||||
MakeDoubleAccessor (&RadioEnvironmentMapHelper::m_z),
|
||||
MakeDoubleChecker<double> ())
|
||||
.AddAttribute ("ExitWhenDone", "If true, Simulator::Stop () will be called as soon as the REM has been generated",
|
||||
.AddAttribute ("StopWhenDone", "If true, Simulator::Stop () will be called as soon as the REM has been generated",
|
||||
BooleanValue (true),
|
||||
MakeBooleanAccessor (&RadioEnvironmentMapHelper::m_exitWhenDone),
|
||||
MakeBooleanAccessor (&RadioEnvironmentMapHelper::m_stopWhenDone),
|
||||
MakeBooleanChecker ())
|
||||
|
||||
.AddAttribute ("NoisePower",
|
||||
"the power of the measuring instrument noise, in Watts. Default to a kT of -174 dBm with a noise figure of 9 dB and a bandwidth of 25 LTE Resource Blocks",
|
||||
DoubleValue (1.4230e-10),
|
||||
MakeDoubleAccessor (&RadioEnvironmentMapHelper::m_noisePower),
|
||||
MakeDoubleChecker<double> ())
|
||||
;
|
||||
return tid;
|
||||
}
|
||||
@@ -133,22 +138,21 @@ RadioEnvironmentMapHelper::Install ()
|
||||
m_channel = match.Get (0)->GetObject<SpectrumChannel> ();
|
||||
NS_ABORT_MSG_IF (m_channel == 0, "object at " << m_channelPath << "is not of type SpectrumChannel");
|
||||
|
||||
double xStep = (m_xMax - m_xMin)/m_xRes;
|
||||
double yStep = (m_yMax - m_yMin)/m_yRes;
|
||||
double xStep = (m_xMax - m_xMin)/(m_xRes-1);
|
||||
double yStep = (m_yMax - m_yMin)/(m_yRes-1);
|
||||
|
||||
for (double x = m_xMin; x <= m_xMax ; x += xStep)
|
||||
|
||||
for (double x = m_xMin; x < m_xMax + 0.5*xStep; x += xStep)
|
||||
{
|
||||
m_rem.push_back (std::list<RemPoint> ());
|
||||
for (double y = m_yMin; y <= m_yMax ; y += yStep)
|
||||
for (double y = m_yMin; y < m_yMax + 0.5*yStep ; y += yStep)
|
||||
{
|
||||
RemPoint p;
|
||||
p.phy = CreateObject<RemSpectrumPhy> ();
|
||||
p.bmm = CreateObject<BuildingsMobilityModel> ();
|
||||
p.node = CreateObject<Node> ();
|
||||
p.node->AggregateObject (p.bmm);
|
||||
p.phy->SetMobility (p.bmm);
|
||||
p.bmm->SetPosition (Vector (x, y, m_z));
|
||||
m_rem.back ().push_back (p);
|
||||
BuildingsHelper::MakeConsistent (p.bmm);
|
||||
m_rem.push_back (p);
|
||||
}
|
||||
}
|
||||
Simulator::Schedule (Seconds (0.0055), &RadioEnvironmentMapHelper::Connect, this);
|
||||
@@ -160,18 +164,13 @@ void
|
||||
RadioEnvironmentMapHelper::Connect ()
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
for (std::list<std::list<RemPoint> >::iterator it1 = m_rem.begin ();
|
||||
it1 != m_rem.end ();
|
||||
++it1)
|
||||
for (std::list<RemPoint>::iterator it = m_rem.begin ();
|
||||
it != m_rem.end ();
|
||||
++it)
|
||||
{
|
||||
for (std::list<RemPoint>::iterator it2 = it1->begin ();
|
||||
it2 != it1->end ();
|
||||
++it2)
|
||||
{
|
||||
NS_LOG_LOGIC ("adding phy " << it2->phy);
|
||||
m_channel->AddRx (it2->phy);
|
||||
}
|
||||
}
|
||||
NS_LOG_LOGIC ("adding phy " << it->phy);
|
||||
m_channel->AddRx (it->phy);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -186,25 +185,20 @@ RadioEnvironmentMapHelper::PrintAndDeactivate ()
|
||||
return;
|
||||
}
|
||||
|
||||
for (std::list<std::list<RemPoint> >::iterator it1 = m_rem.begin ();
|
||||
it1 != m_rem.end ();
|
||||
++it1)
|
||||
for (std::list<RemPoint>::iterator it = m_rem.begin ();
|
||||
it != m_rem.end ();
|
||||
++it)
|
||||
{
|
||||
for (std::list<RemPoint>::iterator it2 = it1->begin ();
|
||||
it2 != it1->end ();
|
||||
++it2)
|
||||
{
|
||||
Vector pos = it2->bmm->GetPosition ();
|
||||
outFile << pos.x << "\t"
|
||||
<< pos.y << "\t"
|
||||
<< pos.z << "\t"
|
||||
<< it2->phy->GetSinr ()
|
||||
<< std::endl;
|
||||
it2->phy->Deactivate ();
|
||||
}
|
||||
Vector pos = it->bmm->GetPosition ();
|
||||
outFile << pos.x << "\t"
|
||||
<< pos.y << "\t"
|
||||
<< pos.z << "\t"
|
||||
<< it->phy->GetSinr (m_noisePower)
|
||||
<< std::endl;
|
||||
it->phy->Deactivate ();
|
||||
}
|
||||
outFile.close ();
|
||||
if (m_exitWhenDone)
|
||||
if (m_stopWhenDone)
|
||||
{
|
||||
Simulator::Stop ();
|
||||
}
|
||||
|
||||
@@ -62,29 +62,29 @@ private:
|
||||
struct RemPoint
|
||||
{
|
||||
Ptr<RemSpectrumPhy> phy;
|
||||
Ptr<Node> node;
|
||||
Ptr<NetDevice> dev;
|
||||
Ptr<BuildingsMobilityModel> bmm;
|
||||
};
|
||||
|
||||
std::list<std::list<RemPoint> > m_rem;
|
||||
std::list<RemPoint> m_rem;
|
||||
|
||||
double m_xMin;
|
||||
double m_xMax;
|
||||
uint32_t m_xRes;
|
||||
uint16_t m_xRes;
|
||||
|
||||
double m_yMin;
|
||||
double m_yMax;
|
||||
uint32_t m_yRes;
|
||||
uint16_t m_yRes;
|
||||
|
||||
double m_z;
|
||||
|
||||
std::string m_channelPath;
|
||||
std::string m_outputFile;
|
||||
|
||||
bool m_exitWhenDone;
|
||||
bool m_stopWhenDone;
|
||||
|
||||
Ptr<SpectrumChannel> m_channel;
|
||||
|
||||
double m_noisePower;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -35,9 +35,7 @@ namespace ns3 {
|
||||
NS_OBJECT_ENSURE_REGISTERED (RemSpectrumPhy);
|
||||
|
||||
RemSpectrumPhy::RemSpectrumPhy ()
|
||||
: m_mobility (0),
|
||||
m_netDevice (0),
|
||||
m_channel (0),
|
||||
: m_mobility (0),
|
||||
m_referenceSignalPower (0),
|
||||
m_sumPower (0),
|
||||
m_active (true)
|
||||
@@ -57,8 +55,6 @@ RemSpectrumPhy::DoDispose ()
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
m_mobility = 0;
|
||||
m_netDevice = 0;
|
||||
m_channel = 0;
|
||||
SpectrumPhy::DoDispose ();
|
||||
}
|
||||
|
||||
@@ -68,45 +64,18 @@ RemSpectrumPhy::GetTypeId (void)
|
||||
static TypeId tid = TypeId ("ns3::RemSpectrumPhy")
|
||||
.SetParent<SpectrumPhy> ()
|
||||
.AddConstructor<RemSpectrumPhy> ()
|
||||
.AddAttribute ("NoisePower",
|
||||
"the power of the measuring instrument noise, in Watts. Default to a kT of -174 dBm with a noise figure of 9 dB and a bandwidth of 25 LTE Resource Blocks",
|
||||
DoubleValue (1.4230e-10),
|
||||
MakeDoubleAccessor (&RemSpectrumPhy::m_noisePower),
|
||||
MakeDoubleChecker<double> ())
|
||||
;
|
||||
return tid;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Ptr<NetDevice>
|
||||
RemSpectrumPhy::GetDevice ()
|
||||
{
|
||||
return m_netDevice;
|
||||
}
|
||||
|
||||
|
||||
Ptr<MobilityModel>
|
||||
RemSpectrumPhy::GetMobility ()
|
||||
{
|
||||
return m_mobility;
|
||||
}
|
||||
|
||||
|
||||
Ptr<const SpectrumModel>
|
||||
RemSpectrumPhy::GetRxSpectrumModel () const
|
||||
{
|
||||
return m_spectrumModel;
|
||||
}
|
||||
|
||||
void
|
||||
RemSpectrumPhy::SetDevice (Ptr<NetDevice> d)
|
||||
RemSpectrumPhy::SetChannel (Ptr<SpectrumChannel> c)
|
||||
{
|
||||
NS_LOG_FUNCTION (this << d);
|
||||
m_netDevice = d;
|
||||
// this is a no-op, RemSpectrumPhy does not transmit hence it does not need a reference to the channel
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
RemSpectrumPhy::SetMobility (Ptr<MobilityModel> m)
|
||||
{
|
||||
@@ -114,19 +83,30 @@ RemSpectrumPhy::SetMobility (Ptr<MobilityModel> m)
|
||||
m_mobility = m;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
RemSpectrumPhy::SetChannel (Ptr<SpectrumChannel> c)
|
||||
RemSpectrumPhy::SetDevice (Ptr<NetDevice> d)
|
||||
{
|
||||
NS_LOG_FUNCTION (this << c);
|
||||
m_channel = c;
|
||||
NS_LOG_FUNCTION (this << d);
|
||||
// this is a no-op, RemSpectrumPhy does not handle any data hence it does not support the use of a NetDevice
|
||||
}
|
||||
|
||||
void
|
||||
RemSpectrumPhy::SetRxSpectrumModel (Ptr<SpectrumModel> m)
|
||||
Ptr<MobilityModel>
|
||||
RemSpectrumPhy::GetMobility ()
|
||||
{
|
||||
NS_LOG_FUNCTION (this << m);
|
||||
m_spectrumModel = m;
|
||||
return m_mobility;
|
||||
}
|
||||
|
||||
Ptr<NetDevice>
|
||||
RemSpectrumPhy::GetDevice ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
Ptr<const SpectrumModel>
|
||||
RemSpectrumPhy::GetRxSpectrumModel () const
|
||||
{
|
||||
// supports any SpectrumModel
|
||||
return 0;
|
||||
}
|
||||
|
||||
Ptr<AntennaModel>
|
||||
@@ -154,9 +134,9 @@ RemSpectrumPhy::StartRx (Ptr<SpectrumSignalParameters> params)
|
||||
}
|
||||
|
||||
double
|
||||
RemSpectrumPhy::GetSinr ()
|
||||
RemSpectrumPhy::GetSinr (double noisePower)
|
||||
{
|
||||
return m_referenceSignalPower / (m_sumPower + m_noisePower);
|
||||
return m_referenceSignalPower / (m_sumPower + noisePower);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -55,9 +55,11 @@ public:
|
||||
RemSpectrumPhy ();
|
||||
virtual ~RemSpectrumPhy ();
|
||||
|
||||
// inherited from Object
|
||||
void DoDispose ();
|
||||
static TypeId GetTypeId (void);
|
||||
|
||||
// inherited from SpectrumPhy
|
||||
// inherited from SpectrumPhy
|
||||
void SetChannel (Ptr<SpectrumChannel> c);
|
||||
void SetMobility (Ptr<MobilityModel> m);
|
||||
void SetDevice (Ptr<NetDevice> d);
|
||||
@@ -67,19 +69,12 @@ public:
|
||||
Ptr<AntennaModel> GetRxAntenna ();
|
||||
void StartRx (Ptr<SpectrumSignalParameters> params);
|
||||
|
||||
|
||||
/**
|
||||
* set the SpectrumModel to be used for reception
|
||||
*
|
||||
*/
|
||||
void SetRxSpectrumModel (Ptr<SpectrumModel>);
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* \return the Signal to Noise Ratio calculated
|
||||
*/
|
||||
double GetSinr ();
|
||||
double GetSinr (double noisePower);
|
||||
|
||||
/**
|
||||
* make StartRx a no-op from now on
|
||||
@@ -87,18 +82,12 @@ public:
|
||||
*/
|
||||
void Deactivate ();
|
||||
|
||||
protected:
|
||||
void DoDispose ();
|
||||
|
||||
private:
|
||||
Ptr<MobilityModel> m_mobility;
|
||||
Ptr<NetDevice> m_netDevice;
|
||||
Ptr<SpectrumChannel> m_channel;
|
||||
Ptr<SpectrumModel> m_spectrumModel;
|
||||
|
||||
double m_referenceSignalPower;
|
||||
double m_sumPower;
|
||||
double m_noisePower;
|
||||
|
||||
bool m_active;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user