BuildingsMobilityModel instances automatically placed in appropriated Building

This commit is contained in:
Nicola Baldo
2012-01-13 20:48:20 +01:00
parent fb2188ae96
commit b536f8deb9
12 changed files with 374 additions and 113 deletions

View File

@@ -30,6 +30,13 @@ For more details about ``test.py`` and the ns-3 testing framework, please refer
Description of the test suites
******************************
BuildingsHelper test
~~~~~~~~~~~~~~~~~~~~
The test suite ``buildings-helper`` checks that the method ``BuildingsHelper::MakeAllInstancesConsistent ()`` works properly, i.e., that the BuildingsHelper is successful in locating if nodes are outdoor or indoor, and if indoor that they are located in the correct building, room and floor. Several test cases are provided with different buildings (having different size, position, rooms and floors) and different node positions. The test passes if each every node is located correctly.
Pathloss tests
~~~~~~~~~~~~~~

View File

@@ -0,0 +1,67 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2010 CTTC
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Nicola Baldo <nbaldo@cttc.es>
*/
#include "buildings-helper.h"
#include <ns3/node-list.h>
#include <ns3/building.h>
#include <ns3/building-list.h>
#include <ns3/mobility-model.h>
#include <ns3/buildings-mobility-model.h>
#include <ns3/abort.h>
#include <ns3/log.h>
NS_LOG_COMPONENT_DEFINE ("BuildingsHelper");
namespace ns3 {
void
BuildingsHelper::MakeAllInstancesConsistent ()
{
NS_LOG_FUNCTION_NOARGS ();
for (NodeList::Iterator nit = NodeList::Begin (); nit != NodeList::End (); ++nit)
{
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 ();
}
}
}
} // namespace ns3

View File

@@ -0,0 +1,43 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2012 CTTC
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Nicola Baldo <nbaldo@cttc.es>
*/
#ifndef BUILDINGS_HELPER_H
#define BUILDINGS_HELPER_H
#include <string>
#include <ns3/attribute.h>
#include <ns3/object-factory.h>
#include <ns3/node-container.h>
namespace ns3 {
class BuildingsHelper
{
public:
static void MakeAllInstancesConsistent ();
};
}
#endif /* BUILDINGS_HELPER_H */

View File

@@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Jaume Nin <jaume.nin@cttc,cat>
* Based on NodeList implemenation by Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
* Based on NodeList implementation by Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*
*/

View File

@@ -15,15 +15,21 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Marco Miozzo <marco.miozzo@cttc.es>
* Authors: Marco Miozzo <marco.miozzo@cttc.es>
* Nicola Baldo <nbaldo@cttc.es>
*
*/
#include "building.h"
#include "building-list.h"
#include <ns3/building.h>
#include <ns3/building-list.h>
#include <ns3/enum.h>
#include "ns3/uinteger.h"
#include <ns3/uinteger.h>
#include <ns3/log.h>
#include <ns3/assert.h>
#include <math.h>
NS_LOG_COMPONENT_DEFINE ("Building");
namespace ns3 {
@@ -37,17 +43,17 @@ Building::GetTypeId (void)
.AddAttribute ("roomX", "The number of rooms in the X axis.",
TypeId::ATTR_GET, // allow only getting it.
UintegerValue (4),
MakeUintegerAccessor (&Building::m_roomX),
MakeUintegerAccessor (&Building::m_roomsX),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("roomY", "The number of rooms in the Y axis.",
TypeId::ATTR_GET, // allow only getting it.
UintegerValue (1),
MakeUintegerAccessor (&Building::m_roomY),
MakeUintegerAccessor (&Building::m_roomsY),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("nFloor", "The number of floors of this building.",
TypeId::ATTR_GET, // allow only getting it.
UintegerValue (1),
MakeUintegerAccessor (&Building::m_floor),
MakeUintegerAccessor (&Building::m_floors),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("Id", "The id (unique integer) of this Building.",
TypeId::ATTR_GET, // allow only getting it.
@@ -58,104 +64,195 @@ Building::GetTypeId (void)
return tid;
}
Building::Building (double _xMin, double _xMax,
double _yMin, double _yMax,
double _zMin, double _zMax/*,
uint8_t _nFloors, uint8_t _nRoomX, uint8_t _nRoomY*/)
: m_floor (1),
m_roomX (1),
m_roomY (1),
Building::Building (double xMin,
double xMax,
double yMin,
double yMax,
double zMin,
double zMax)
: m_buildingBounds (xMin, xMax, yMin, yMax, zMin, zMax),
m_floors (1),
m_roomsX (1),
m_roomsY (1),
m_buildingType (Residential),
m_externalWalls (ConcreteWithWindows)
{
m_buldingBounds = Box (_xMin, _xMax, _yMin, _yMax, _zMin, _zMax);
NS_LOG_FUNCTION (this);
Construct();
}
Building::Building ()
: m_floor (1),
m_roomX (1),
m_roomY (1),
: m_floors (1),
m_roomsX (1),
m_roomsY (1),
m_buildingType (Residential),
m_externalWalls (ConcreteWithWindows)
{
m_buldingBounds = Box ();
NS_LOG_FUNCTION (this);
m_buildingBounds = Box ();
Construct();
}
Building::~Building ()
{
NS_LOG_FUNCTION (this);
}
void
Building::DoDispose ()
{
NS_LOG_FUNCTION (this);
}
void
Building::Construct ()
{
NS_LOG_FUNCTION (this);
m_buildingId = BuildingList::Add(this);
}
uint32_t
Building::GetId (void) const
{
NS_LOG_FUNCTION (this);
return m_buildingId;
}
void
Building::SetBuildingType (Building::BuildingType_t t)
{
NS_LOG_FUNCTION (this << t);
m_buildingType = t;
}
void
Building::SetExtWallsType (Building::ExtWallsType_t t)
{
NS_LOG_FUNCTION (this << t);
m_externalWalls = t;
}
void
Building::SetFloorsNumber (uint8_t nfloors)
Building::SetNFloors (uint16_t nfloors)
{
m_floor = nfloors;
NS_LOG_FUNCTION (this << nfloors);
m_floors = nfloors;
}
void
Building::SetNumberRoomX (uint8_t nroomx)
Building::SetNRoomsX (uint16_t nroomx)
{
m_roomX = nroomx;
NS_LOG_FUNCTION (this << nroomx);
m_roomsX = nroomx;
}
void
Building::SetNumberRoomY (uint8_t nroomy)
Building::SetNRoomsY (uint16_t nroomy)
{
m_roomY = nroomy;
NS_LOG_FUNCTION (this << nroomy);
m_roomsY = nroomy;
}
Building::BuildingType_t
Building::GetBuildingType ()
Building::GetBuildingType () const
{
return (m_buildingType);
}
Building::ExtWallsType_t
Building::GetExtWallsType ()
Building::GetExtWallsType () const
{
return (m_externalWalls);
}
uint8_t
Building::GetNumberFloors ()
uint16_t
Building::GetNFloors () const
{
return (m_floor);
return (m_floors);
}
uint8_t
Building::GetNumberRoomX ()
uint16_t
Building::GetNRoomsX () const
{
return (m_roomX);
return (m_roomsX);
}
uint8_t
Building::GetNumberRoomY ()
uint16_t
Building::GetNRoomsY () const
{
return (m_roomY);
return (m_roomsY);
}
Box
Building::GetBuildingBounds ()
bool
Building::IsInside (Vector position) const
{
return (m_buldingBounds);
return m_buildingBounds.IsInside (position);
}
uint16_t
Building::GetRoomX (Vector position) const
{
NS_ASSERT (IsInside (position));
uint16_t n;
if (position.x == m_buildingBounds.xMax)
{
n = m_roomsX;
}
else
{
double xLength = m_buildingBounds.xMax - m_buildingBounds.xMin;
double x = position.x - m_buildingBounds.xMin;
n = floor (m_roomsX * x/xLength) + 1;
NS_LOG_LOGIC ("xLength=" << xLength << ", x=" << x << ", m_roomsX=" << m_roomsX);
}
NS_LOG_LOGIC ("RoomX: " << n);
return n;
}
uint16_t
Building::GetRoomY (Vector position) const
{
NS_ASSERT (IsInside (position));
uint16_t n;
if (position.y == m_buildingBounds.yMax)
{
n = m_roomsY;
}
else
{
double yLength = m_buildingBounds.yMax - m_buildingBounds.yMin;
double y = position.y - m_buildingBounds.yMin;
n = floor (m_roomsY * y/yLength) + 1;
NS_LOG_LOGIC ("yLength=" << yLength << ", y=" << y << ", m_roomsY=" << m_roomsY);
}
NS_LOG_LOGIC ("RoomY: " << n);
return n;
}
uint16_t
Building::GetFloor (Vector position) const
{
NS_ASSERT (IsInside (position));
uint16_t n;
if (position.z == m_buildingBounds.zMax)
{
n = m_floors;
}
else
{
double zLength = m_buildingBounds.zMax - m_buildingBounds.zMin;
double z = position.z - m_buildingBounds.zMin;
n = floor (m_floors * z/zLength) + 1;
NS_LOG_LOGIC ("zLength=" << zLength << ", z=" << z << ", m_floors=" << m_floors);
}
NS_LOG_LOGIC ("floor: " << n);
return n;
}

View File

@@ -37,7 +37,11 @@ namespace ns3 {
class Building : public Object
{
public:
// inherited from Object
static TypeId GetTypeId (void);
virtual void DoDispose ();
enum BuildingType_t
{
@@ -49,6 +53,8 @@ public:
};
/**
* Construct a simple building with 1 room and 1 floor
*
* \param xMin x coordinates of left boundary.
* \param xMax x coordinates of right boundary.
* \param yMin y coordinates of bottom boundary.
@@ -56,7 +62,6 @@ public:
* \param zMin z coordinates of down boundary.
* \param zMax z coordinates of up boundary.
*
* Create a building.
*/
Building (double xMin,
double xMax,
@@ -71,6 +76,18 @@ public:
*/
Building ();
/**
* Destructor
*
*/
virtual ~Building ();
/**
* \return the unique id of this Building. This unique id happens to
* be also the index of the Building into the BuildingList.
*/
uint32_t GetId (void) const;
/**
* \param t the type of building (i.e., Residential, Office, Commercial)
*
@@ -93,68 +110,102 @@ public:
* This method allows to set the number of floors in the building
* (default is 1)
*/
void SetFloorsNumber (uint8_t nfloors);
void SetNFloors (uint16_t nfloors);
/**
* \param nroomx the number of rooms along the x axis
*
* This method allows to set the number of rooms along the x-axis
*/
void SetNumberRoomX (uint8_t nroomx);
void SetNRoomsX (uint16_t nroomx);
/**
* \param nroomy the number of floors in the building
*
* This method allows to set the number of rooms along the y-axis
*/
void SetNumberRoomY (uint8_t nroomy);
void SetNRoomsY (uint16_t nroomy);
/**
* \return the type of building
* Return the type of building (i.e., Residential, Office, Commercial)
*/
BuildingType_t GetBuildingType ();
BuildingType_t GetBuildingType () const;
/**
* \return the type of external walls of the building
*/
ExtWallsType_t GetExtWallsType ();
ExtWallsType_t GetExtWallsType () const;
/**
* \return the number of floors of the building
*/
uint8_t GetNumberFloors ();
uint16_t GetNFloors () const;
/**
* \return the number of rooms along the x-axis of the building
*/
uint8_t GetNumberRoomX ();
uint16_t GetNRoomsX () const;
/**
* \return the number of rooms along the y-axis
*/
uint8_t GetNumberRoomY ();
uint16_t GetNRoomsY () const;
/**
* \return the bounds of the building as Box class
/**
*
*
* \param position some position
*
* \return true if the position fall inside the building, false otherwise
*/
Box GetBuildingBounds ();
bool IsInside (Vector position) const;
/**
*
*
* \param position a position inside the building
*
* \return the number of the room along the X axis where the
* position falls
*/
uint16_t GetRoomX (Vector position) const;
/**
*
*
* \param position a position inside the building
*
* \return the number of the room along the Y axis where the
* position falls
*/
uint16_t GetRoomY (Vector position) const;
/**
*
* \param position a position inside the building
*
* \return the floor where the position falls
*/
uint16_t GetFloor (Vector position) const;
private:
void Construct ();
Box m_buldingBounds;
Box m_buildingBounds;
/**
* number of floors, must be greater than 0, and 1 means only one floor
* (i.e., groundfloor)
*/
uint8_t m_floor;
uint8_t m_roomX;
uint8_t m_roomY;
uint16_t m_floors;
uint16_t m_roomsX;
uint16_t m_roomsY;
uint32_t m_buildingId;
BuildingType_t m_buildingType;
@@ -166,7 +217,7 @@ private:
//std::istream &operator >> (std::istream &is, Box &box);
ATTRIBUTE_HELPER_HEADER (Building);
//ATTRIBUTE_HELPER_HEADER (Building);
} // namespace ns3

View File

@@ -22,8 +22,10 @@
#include <ns3/simulator.h>
#include <ns3/position-allocator.h>
#include <ns3/buildings-mobility-model.h>
#include "ns3/pointer.h"
#include <ns3/pointer.h>
#include <ns3/log.h>
NS_LOG_COMPONENT_DEFINE ("BuildingsMobilityModel");
namespace ns3 {
@@ -35,12 +37,7 @@ BuildingsMobilityModel::GetTypeId (void)
static TypeId tid = TypeId ("ns3::BuildingsMobilityModel")
.SetParent<MobilityModel> ()
.SetGroupName ("Mobility")
.AddConstructor<BuildingsMobilityModel> ()
.AddAttribute ("Bounds",
"Bounds of the area to cruise.",
BoxValue (Box (-100.0, 100.0, -100.0, 100.0, 0.0, 100.0)),
MakeBoxAccessor (&BuildingsMobilityModel::m_bounds),
MakeBoxChecker ());
.AddConstructor<BuildingsMobilityModel> ();
return tid;
}
@@ -48,6 +45,7 @@ BuildingsMobilityModel::GetTypeId (void)
BuildingsMobilityModel::BuildingsMobilityModel ()
{
NS_LOG_FUNCTION (this);
m_indoor = false;
m_nFloor = 0;
m_roomX = 1;
@@ -57,43 +55,48 @@ BuildingsMobilityModel::BuildingsMobilityModel ()
void
BuildingsMobilityModel::DoDispose (void)
{
// chain up
m_surroudingBuildings.clear ();
NS_LOG_FUNCTION (this);
MobilityModel::DoDispose ();
}
Vector
BuildingsMobilityModel::DoGetPosition (void) const
{
NS_LOG_FUNCTION (this);
m_helper.Update ();
return m_helper.GetCurrentPosition ();
}
void
BuildingsMobilityModel::DoSetPosition (const Vector &position)
{
NS_LOG_FUNCTION (this);
m_helper.SetPosition (position);
}
Vector
BuildingsMobilityModel::DoGetVelocity (void) const
{
NS_LOG_FUNCTION (this);
return m_helper.GetVelocity ();
}
bool
BuildingsMobilityModel::IsIndoor (void)
{
NS_LOG_FUNCTION (this);
return (m_indoor);
}
bool
BuildingsMobilityModel::IsOutdoor (void)
{
NS_LOG_FUNCTION (this);
return (!m_indoor);
}
void
BuildingsMobilityModel::SetIndoor (Ptr<Building> building)
{
NS_LOG_FUNCTION (this);
m_indoor = true;
m_myBuilding = building;
}
@@ -101,13 +104,14 @@ BuildingsMobilityModel::SetIndoor (Ptr<Building> building)
void
BuildingsMobilityModel::SetIndoor (Ptr<Building> building, uint8_t nfloor, uint8_t nroomx, uint8_t nroomy)
{
NS_LOG_FUNCTION (this);
m_indoor = true;
m_myBuilding = building;
m_nFloor = nfloor;
m_roomX = nroomx;
m_roomY = nroomy;
if (!building->GetBuildingBounds ().IsInside (m_helper.GetCurrentPosition ()))
if (!building->IsInside (m_helper.GetCurrentPosition ()))
{
NS_FATAL_ERROR ("Position of the node is inconsistent with building bounds");
}
@@ -117,12 +121,14 @@ BuildingsMobilityModel::SetIndoor (Ptr<Building> building, uint8_t nfloor, uint8
void
BuildingsMobilityModel::SetOutdoor (void)
{
NS_LOG_FUNCTION (this);
m_indoor = false;
}
void
BuildingsMobilityModel::SetFloorNumber (uint8_t nfloor)
{
NS_LOG_FUNCTION (this);
m_nFloor = nfloor;
}
@@ -135,31 +141,28 @@ BuildingsMobilityModel::SetRoomNumberX (uint8_t nroomx)
void
BuildingsMobilityModel::SetRoomNumberY (uint8_t nroomy)
{
NS_LOG_FUNCTION (this);
m_roomY = nroomy;
}
void
BuildingsMobilityModel::SetSurroudingBuilding (Ptr<Building> building)
{
m_surroudingBuildings.push_back (building);
}
uint8_t
BuildingsMobilityModel::GetFloorNumber (void)
{
NS_LOG_FUNCTION (this);
return (m_nFloor);
}
uint8_t
BuildingsMobilityModel::GetRoomNumberX (void)
{
NS_LOG_FUNCTION (this);
return (m_roomX);
}
uint8_t
BuildingsMobilityModel::GetRoomNumberY (void)
{
NS_LOG_FUNCTION (this);
return (m_roomY);
}
@@ -167,8 +170,9 @@ BuildingsMobilityModel::GetRoomNumberY (void)
Ptr<Building>
BuildingsMobilityModel::GetBuilding ()
{
NS_LOG_FUNCTION (this);
return (m_myBuilding);
}
} // namespace
} // namespace

View File

@@ -59,8 +59,6 @@ public:
void SetIndoor (Ptr<Building> building, uint8_t nfloor, uint8_t nroomx, uint8_t nroomy);
void SetOutdoor (void);
void SetSurroudingBuilding (Ptr<Building> building);
void SetFloorNumber (uint8_t nfloor);
void SetRoomNumberX (uint8_t nroomx);
void SetRoomNumberY (uint8_t nroomy);
@@ -79,8 +77,7 @@ private:
virtual void DoSetPosition (const Vector &position);
virtual Vector DoGetVelocity (void) const;
ConstantVelocityHelper m_helper;
Box m_bounds; // bounds of the simulation field (if needed)
std::list < Ptr<Building> > m_surroudingBuildings; // buildings blocks
Ptr<Building> m_myBuilding;
bool m_indoor;
/**

View File

@@ -29,9 +29,6 @@
#include "ns3/buildings-mobility-model.h"
#include "ns3/enum.h"
//#include <ns3/shadowing-loss-model.h>
//#include <ns3/jakes-fading-loss-model.h>
NS_LOG_COMPONENT_DEFINE ("BuildingsPropagationLossModel");
@@ -624,7 +621,9 @@ BuildingsPropagationLossModel::HeightGain (Ptr<BuildingsMobilityModel> node) con
double
BuildingsPropagationLossModel::GetLoss (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const
{
NS_ASSERT_MSG ((a->GetPosition ().z > 0) && (b->GetPosition ().z > 0), "BuildingsPropagationLossModel does not support underground nodes (placed at z < 0)");
double distance = a->GetDistanceFrom (b);
if (distance <= m_minDistance)
{
@@ -634,6 +633,7 @@ BuildingsPropagationLossModel::GetLoss (Ptr<MobilityModel> a, Ptr<MobilityModel>
// get the BuildingsMobilityModel pointers
Ptr<BuildingsMobilityModel> a1 = DynamicCast<BuildingsMobilityModel> (a);
Ptr<BuildingsMobilityModel> b1 = DynamicCast<BuildingsMobilityModel> (b);
NS_ASSERT_MSG ((a1 != 0) && (b1 != 0), "BuildingsPropagationLossModel only works with BuildingsMobilityModel");
double loss = 0.0;

View File

@@ -8,10 +8,12 @@ def build(bld):
'model/building-list.cc',
'model/buildings-mobility-model.cc',
'model/buildings-propagation-loss-model.cc',
'helper/buildings-helper.cc',
]
module_test = bld.create_ns3_module_test_library('buildings')
module_test.source = [
'test/buildings-helper-test.cc',
'test/buildings-pathloss-test.cc',
'test/buildings-shadowing-test.cc',
]
@@ -23,6 +25,7 @@ def build(bld):
'model/building-list.h',
'model/buildings-mobility-model.h',
'model/buildings-propagation-loss-model.h',
'helper/buildings-helper.h',
'test/buildings-pathloss-test.h',
'test/buildings-shadowing-test.h',
]

View File

@@ -403,18 +403,6 @@ It is to be noted that using other means to configure the frequency used by the
MobilityHelper mobility;
mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
#. Node creation and positioning::
ueNodes.Create (1);
mobility.Install (ueNodes);
NetDeviceContainer ueDevs;
ueDevs = lteHelper->InstallUeDevice (ueNodes);
Ptr<BuildingsMobilityModel> mm = enbNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
double x_axis = 0.0;
double y_axis = 0.0;
double z_axis = 0.0;
mm->SetPosition (Vector (x_axis, y_axis, z_axis));
#. Building creation::
double x_min = 0.0;
@@ -423,29 +411,33 @@ It is to be noted that using other means to configure the frequency used by the
double y_max = 20.0;
double z_min = 0.0;
double z_max = 10.0;
Ptr<Building> building = Create<Building> (x_min, x_max, y_min, y_max, z_min, z_max);
Ptr<Building> building = CreateObject <Building> (x_min, x_max, y_min, y_max, z_min, z_max);
building->SetBuildingType (Building::Residential);
building->SetExtWallsType (Building::ConcreteWithWindows);
building->SetFloorsNumber (3);
building->SetNumberRoomX (3);
building->SetNumberRoomY (2);
building->SetNFloors (3);
building->SetNRoomsX (3);
building->SetNRoomsY (2);
This will instantiate a residential building with base of 10 x 20 meters and height of 10 meters whose external walls are of concrete with windows; the building has three floors and has an internal 3 x 2 grid of rooms of equal size.
#. Building and nodes interactions::
#. Node creation and positioning::
mm->SetIndoor (building, 2, 1, 1);
ueNodes.Create (2);
mobility.Install (ueNodes);
NetDeviceContainer ueDevs;
ueDevs = lteHelper->InstallUeDevice (ueNodes);
Ptr<BuildingsMobilityModel> mm0 = enbNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
Ptr<BuildingsMobilityModel> mm1 = enbNodes.Get (1)->GetObject<BuildingsMobilityModel> ();
mm0->SetPosition (Vector (5.0, 5.0, 1.5));
mm1->SetPosition (Vector (30.0, 40.0, 1.5));
which is equivalent to the form::
This positions the node on the scenario. Note that, in this example, node 0 will be in the building, and node 1 will be out of the building. Note that this alone is not sufficient to setup the topology correctly. What is left to be done is to issue the following command after we have placed all nodes in the simulation::
BuildingsHelper::MakeAllInstancesConsistent ();
This command will go through the lists of all nodes and of all buildings, determine for each user if it is indoor or outdoor, and if indoor it will also determine the building in which the user is located and the corresponding floor and number inside the building.
mm->SetIndoor (building);
mm->SetFloorNumber (2);
mm->SetRoomNumberX (1);
mm->SetRoomNumberY (1);
This informs the node's mobility model that the node is located inside the building on the second floor in the corner room of the 3 x 2 grid.
We suggest the usage of the first form since it performs a consistency check of the node position with the building bounds.
It has to be noted that the simulator does not check the consistence between the node's position (x,y,z coordinates) and the building position and size for outdoor nodes. The responsibility of this consistency is completely left to the user.

View File

@@ -141,9 +141,9 @@ main (int argc, char *argv[])
0.0, nFloors* roomHeight);
building->SetBuildingType(Building::Residential);
building->SetExtWallsType(Building::ConcreteWithWindows);
building->SetFloorsNumber(nFloors);
building->SetNumberRoomX(nRooms);
building->SetNumberRoomY(nRooms);
building->SetNFloors (nFloors);
building->SetNRoomsX (nRooms);
building->SetNRoomsY (nRooms);
mobility.SetMobilityModel("ns3::BuildingsMobilityModel");
mobility.Install (enbNodes);
uint32_t plantedEnb = 0;