From b536f8deb9c2b5723d83a9b5d3c92f2aa5ffd717 Mon Sep 17 00:00:00 2001 From: Nicola Baldo Date: Fri, 13 Jan 2012 20:48:20 +0100 Subject: [PATCH] BuildingsMobilityModel instances automatically placed in appropriated Building --- .../doc/source/buildings-testing.rst | 7 + src/buildings/helper/buildings-helper.cc | 67 +++++++ src/buildings/helper/buildings-helper.h | 43 +++++ src/buildings/model/building-list.h | 2 +- src/buildings/model/building.cc | 177 ++++++++++++++---- src/buildings/model/building.h | 87 +++++++-- .../model/buildings-mobility-model.cc | 40 ++-- .../model/buildings-mobility-model.h | 5 +- .../model/buildings-propagation-loss-model.cc | 6 +- src/buildings/wscript | 3 + src/lte/doc/source/lte-user.rst | 44 ++--- src/lte/examples/lena-profiling.cc | 6 +- 12 files changed, 374 insertions(+), 113 deletions(-) create mode 100644 src/buildings/helper/buildings-helper.cc create mode 100644 src/buildings/helper/buildings-helper.h diff --git a/src/buildings/doc/source/buildings-testing.rst b/src/buildings/doc/source/buildings-testing.rst index dffdd3617..c701ff4c1 100644 --- a/src/buildings/doc/source/buildings-testing.rst +++ b/src/buildings/doc/source/buildings-testing.rst @@ -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 ~~~~~~~~~~~~~~ diff --git a/src/buildings/helper/buildings-helper.cc b/src/buildings/helper/buildings-helper.cc new file mode 100644 index 000000000..fb07c99ae --- /dev/null +++ b/src/buildings/helper/buildings-helper.cc @@ -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 + */ + +#include "buildings-helper.h" + +#include +#include +#include +#include +#include +#include +#include + + +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 bmm = (*nit)->GetObject (); + 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 diff --git a/src/buildings/helper/buildings-helper.h b/src/buildings/helper/buildings-helper.h new file mode 100644 index 000000000..daf191e8d --- /dev/null +++ b/src/buildings/helper/buildings-helper.h @@ -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 + */ + +#ifndef BUILDINGS_HELPER_H +#define BUILDINGS_HELPER_H + +#include +#include +#include +#include + + +namespace ns3 { + + +class BuildingsHelper +{ +public: + static void MakeAllInstancesConsistent (); + +}; + + +} + +#endif /* BUILDINGS_HELPER_H */ diff --git a/src/buildings/model/building-list.h b/src/buildings/model/building-list.h index a1989f1e0..5b116db04 100644 --- a/src/buildings/model/building-list.h +++ b/src/buildings/model/building-list.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Jaume Nin - * Based on NodeList implemenation by Mathieu Lacage + * Based on NodeList implementation by Mathieu Lacage * */ diff --git a/src/buildings/model/building.cc b/src/buildings/model/building.cc index f125ceee1..caee4274d 100644 --- a/src/buildings/model/building.cc +++ b/src/buildings/model/building.cc @@ -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 + * Authors: Marco Miozzo + * Nicola Baldo * */ +#include "building.h" +#include "building-list.h" -#include -#include #include -#include "ns3/uinteger.h" +#include +#include +#include +#include + +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 ()) .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 ()) .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 ()) .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; } diff --git a/src/buildings/model/building.h b/src/buildings/model/building.h index b3b2fafc0..3e1534d75 100644 --- a/src/buildings/model/building.h +++ b/src/buildings/model/building.h @@ -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 diff --git a/src/buildings/model/buildings-mobility-model.cc b/src/buildings/model/buildings-mobility-model.cc index 44fa91f2a..3dac59cdc 100644 --- a/src/buildings/model/buildings-mobility-model.cc +++ b/src/buildings/model/buildings-mobility-model.cc @@ -22,8 +22,10 @@ #include #include #include -#include "ns3/pointer.h" +#include +#include +NS_LOG_COMPONENT_DEFINE ("BuildingsMobilityModel"); namespace ns3 { @@ -35,12 +37,7 @@ BuildingsMobilityModel::GetTypeId (void) static TypeId tid = TypeId ("ns3::BuildingsMobilityModel") .SetParent () .SetGroupName ("Mobility") - .AddConstructor () - .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 (); 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) { + NS_LOG_FUNCTION (this); m_indoor = true; m_myBuilding = building; } @@ -101,13 +104,14 @@ BuildingsMobilityModel::SetIndoor (Ptr building) void BuildingsMobilityModel::SetIndoor (Ptr 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, 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) -{ - 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 BuildingsMobilityModel::GetBuilding () { + NS_LOG_FUNCTION (this); return (m_myBuilding); } -} // namespace \ No newline at end of file +} // namespace diff --git a/src/buildings/model/buildings-mobility-model.h b/src/buildings/model/buildings-mobility-model.h index e911e060a..2a4d88722 100644 --- a/src/buildings/model/buildings-mobility-model.h +++ b/src/buildings/model/buildings-mobility-model.h @@ -59,8 +59,6 @@ public: void SetIndoor (Ptr building, uint8_t nfloor, uint8_t nroomx, uint8_t nroomy); void SetOutdoor (void); - void SetSurroudingBuilding (Ptr 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 > m_surroudingBuildings; // buildings blocks + Ptr m_myBuilding; bool m_indoor; /** diff --git a/src/buildings/model/buildings-propagation-loss-model.cc b/src/buildings/model/buildings-propagation-loss-model.cc index 66bf2fb5c..591585d41 100644 --- a/src/buildings/model/buildings-propagation-loss-model.cc +++ b/src/buildings/model/buildings-propagation-loss-model.cc @@ -29,9 +29,6 @@ #include "ns3/buildings-mobility-model.h" #include "ns3/enum.h" -//#include -//#include - NS_LOG_COMPONENT_DEFINE ("BuildingsPropagationLossModel"); @@ -624,7 +621,9 @@ BuildingsPropagationLossModel::HeightGain (Ptr node) con double BuildingsPropagationLossModel::GetLoss (Ptr a, Ptr 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 a, Ptr // get the BuildingsMobilityModel pointers Ptr a1 = DynamicCast (a); Ptr b1 = DynamicCast (b); + NS_ASSERT_MSG ((a1 != 0) && (b1 != 0), "BuildingsPropagationLossModel only works with BuildingsMobilityModel"); double loss = 0.0; diff --git a/src/buildings/wscript b/src/buildings/wscript index 608b79ba8..57a3a84a4 100644 --- a/src/buildings/wscript +++ b/src/buildings/wscript @@ -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', ] diff --git a/src/lte/doc/source/lte-user.rst b/src/lte/doc/source/lte-user.rst index 5ce374b70..b5f49aeea 100644 --- a/src/lte/doc/source/lte-user.rst +++ b/src/lte/doc/source/lte-user.rst @@ -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 mm = enbNodes.Get (0)->GetObject (); - 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 = Create (x_min, x_max, y_min, y_max, z_min, z_max); + Ptr building = CreateObject (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 mm0 = enbNodes.Get (0)->GetObject (); + Ptr mm1 = enbNodes.Get (1)->GetObject (); + 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. diff --git a/src/lte/examples/lena-profiling.cc b/src/lte/examples/lena-profiling.cc index 52c0c8a7d..4e6d36468 100644 --- a/src/lte/examples/lena-profiling.cc +++ b/src/lte/examples/lena-profiling.cc @@ -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;