A Discrete-Event Network Simulator
API
group-mobility-helper.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2008 INRIA
4 * Copyright (c) 2021 University of Washington: Group mobility changes
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation;
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
20 * Adapted from 'mobility-helper.cc' for group mobility by Tom Henderson
21 */
22
23#include "ns3/group-mobility-helper.h"
24#include "ns3/mobility-model.h"
25#include "ns3/position-allocator.h"
26#include "ns3/hierarchical-mobility-model.h"
27#include "ns3/log.h"
28#include "ns3/pointer.h"
29#include "ns3/config.h"
30#include "ns3/simulator.h"
31#include "ns3/names.h"
32#include "ns3/string.h"
33#include <iostream>
34
35namespace ns3 {
36
37NS_LOG_COMPONENT_DEFINE ("GroupMobilityHelper");
38
40 : NS_LOG_TEMPLATE_DEFINE ("GroupMobilityHelper")
41{
42}
43
45{
46}
47
48void
50{
51 m_referencePosition = allocator;
52}
53
54void
56{
57 m_memberPosition = allocator;
58}
59
60void
62{
64}
65
66void
68{
69 NS_ABORT_MSG_IF (node->GetObject<MobilityModel> (), "Mobility model already installed");
70 NS_ABORT_MSG_IF (!m_referenceMobility, "Reference mobility model is empty");
71 NS_ABORT_MSG_UNLESS (m_memberMobilityFactory.IsTypeIdSet (), "Member mobility factory is unset");
73 {
74 Vector referencePosition = m_referencePosition->GetNext ();
75 m_referenceMobility->SetPosition (referencePosition);
77 }
78 Ptr<HierarchicalMobilityModel> hierarchical = CreateObject<HierarchicalMobilityModel> ();
79 hierarchical->SetParent (m_referenceMobility);
81 NS_ABORT_MSG_IF (!child, "Member mobility factory did not produce a MobilityModel");
83 {
84 Vector position = m_memberPosition->GetNext ();
85 child->SetPosition (position);
86 }
87 hierarchical->SetChild (child);
88 NS_LOG_DEBUG ("node="<<node<<", mob="<<hierarchical);
89 node->AggregateObject (hierarchical);
90}
91
92void
93GroupMobilityHelper::Install (std::string nodeName)
94{
95 Ptr<Node> node = Names::Find<Node> (nodeName);
96 Install (node);
97}
98
99void
101{
102 for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
103 {
104 Install (*i);
105 }
106}
107int64_t
109{
110 int64_t currentStream = stream;
111 Ptr<Node> node;
112 bool firstNode = true;
114 for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
115 {
116 node = (*i);
118 if (!mobility)
119 {
120 NS_FATAL_ERROR ("Did not find a HierarchicalMobilityModel");
121 }
122 if (firstNode)
123 {
124 // Assign streams only once for the reference node
125 currentStream += mobility->GetParent ()->AssignStreams (currentStream);
126 firstNode = false;
127 }
128 currentStream += mobility->GetChild ()->AssignStreams (currentStream);
129 }
130 return (currentStream - stream);
131}
132
133} // namespace ns3
int64_t AssignStreams(NodeContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by the mobility models on t...
ObjectFactory m_memberMobilityFactory
Object factory to create member mobility models.
void SetMemberPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of the member mobility...
void Install(Ptr< Node > node)
Install and configure a hierarchical mobility model to the given node, based on the configured refere...
void SetReferenceMobilityModel(Ptr< MobilityModel > mobility)
Set the reference mobility model which will be installed as the parent mobility model during GroupMob...
bool m_referencePositionSet
flag for avoiding multiple SetPosition calls on the reference model
~GroupMobilityHelper()
Destroy a group mobility helper.
Ptr< PositionAllocator > m_referencePosition
Position allocator for use as reference position allocator.
Ptr< PositionAllocator > m_memberPosition
Position allocator for use as member position allocator.
void SetReferencePositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of the reference mobil...
Ptr< MobilityModel > m_referenceMobility
Reference mobility model.
GroupMobilityHelper()
Construct a group mobility helper.
Keep track of the current position and velocity of an object.
void SetPosition(const Vector &position)
keep track of a set of node pointers.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
bool IsTypeIdSet(void) const
Check if the ObjectFactory has been configured with a TypeId.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
Definition: object.cc:252
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
Definition: abort.h:144
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:206
#define NS_LOG_TEMPLATE_DEFINE(name)
Initialize a reference to a Log component.
Definition: log.h:240
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:274
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:98