21 #include "ns3/simulator.h"
22 #include "ns3/double.h"
23 #include "steady-state-random-waypoint-mobility-model.h"
28 NS_OBJECT_ENSURE_REGISTERED (SteadyStateRandomWaypointMobilityModel);
31 SteadyStateRandomWaypointMobilityModel::GetTypeId (
void)
33 static TypeId tid = TypeId (
"ns3::SteadyStateRandomWaypointMobilityModel")
34 .SetParent<MobilityModel> ()
35 .SetGroupName (
"Mobility")
36 .AddConstructor<SteadyStateRandomWaypointMobilityModel> ()
37 .AddAttribute (
"MinSpeed",
38 "Minimum speed value, [m/s]",
40 MakeDoubleAccessor (&SteadyStateRandomWaypointMobilityModel::m_minSpeed),
41 MakeDoubleChecker<double> ())
42 .AddAttribute (
"MaxSpeed",
43 "Maximum speed value, [m/s]",
45 MakeDoubleAccessor (&SteadyStateRandomWaypointMobilityModel::m_maxSpeed),
46 MakeDoubleChecker<double> ())
47 .AddAttribute (
"MinPause",
48 "Minimum pause value, [s]",
50 MakeDoubleAccessor (&SteadyStateRandomWaypointMobilityModel::m_minPause),
51 MakeDoubleChecker<double> ())
52 .AddAttribute (
"MaxPause",
53 "Maximum pause value, [s]",
55 MakeDoubleAccessor (&SteadyStateRandomWaypointMobilityModel::m_maxPause),
56 MakeDoubleChecker<double> ())
57 .AddAttribute (
"MinX",
58 "Minimum X value of traveling region, [m]",
60 MakeDoubleAccessor (&SteadyStateRandomWaypointMobilityModel::m_minX),
61 MakeDoubleChecker<double> ())
62 .AddAttribute (
"MaxX",
63 "Maximum X value of traveling region, [m]",
65 MakeDoubleAccessor (&SteadyStateRandomWaypointMobilityModel::m_maxX),
66 MakeDoubleChecker<double> ())
67 .AddAttribute (
"MinY",
68 "Minimum Y value of traveling region, [m]",
70 MakeDoubleAccessor (&SteadyStateRandomWaypointMobilityModel::m_minY),
71 MakeDoubleChecker<double> ())
72 .AddAttribute (
"MaxY",
73 "Maximum Y value of traveling region, [m]",
75 MakeDoubleAccessor (&SteadyStateRandomWaypointMobilityModel::m_maxY),
76 MakeDoubleChecker<double> ());
81 SteadyStateRandomWaypointMobilityModel::SteadyStateRandomWaypointMobilityModel () :
82 alreadyStarted (false)
84 m_speed = CreateObject<UniformRandomVariable> ();
85 m_pause = CreateObject<UniformRandomVariable> ();
86 m_x1_r = CreateObject<UniformRandomVariable> ();
87 m_y1_r = CreateObject<UniformRandomVariable> ();
88 m_x2_r = CreateObject<UniformRandomVariable> ();
89 m_y2_r = CreateObject<UniformRandomVariable> ();
90 m_u_r = CreateObject<UniformRandomVariable> ();
91 m_x = CreateObject<UniformRandomVariable> ();
92 m_y = CreateObject<UniformRandomVariable> ();
98 DoInitializePrivate ();
103 SteadyStateRandomWaypointMobilityModel::DoInitializePrivate (
void)
105 alreadyStarted =
true;
113 m_position = CreateObject<RandomRectanglePositionAllocator> ();
118 m_position->SetX (m_x);
119 m_position->SetY (m_y);
128 double expectedPauseTime = (m_minPause + m_maxPause)/2;
129 double a = m_maxX - m_minX;
130 double b = m_maxY - m_minY;
131 double v0 = m_minSpeed;
132 double v1 = m_maxSpeed;
133 double log1 = b*b / a*std::log (std::sqrt ((a*a)/(b*b) + 1) + a/b);
134 double log2 = a*a / b*std::log (std::sqrt ((b*b)/(a*a) + 1) + b/a);
135 double expectedTravelTime = 1.0/6.0*(log1 + log2);
136 expectedTravelTime += 1.0/15.0*((a*a*a)/(b*b) + (b*b*b)/(a*a)) -
137 1.0/15.0*std::sqrt (a*a + b*b)*((a*a)/(b*b) + (b*b)/(a*a) - 3);
140 expectedTravelTime /= v0;
144 expectedTravelTime *= std::log (v1/v0)/(v1 - v0);
146 double probabilityPaused = expectedPauseTime/(expectedPauseTime + expectedTravelTime);
147 NS_ASSERT (probabilityPaused >= 0 && probabilityPaused <= 1);
150 if (u < probabilityPaused)
152 m_helper.SetPosition (m_position->GetNext ());
155 if (m_minPause != m_maxPause)
157 if (u < (2*m_minPause/(m_minPause + m_maxPause)))
159 pause =
Seconds (u*(m_minPause + m_maxPause)/2);
165 pause =
Seconds (m_maxPause - std::sqrt ((1 - u)*(m_maxPause*m_maxPause - m_minPause*m_minPause)));
170 pause =
Seconds (u*expectedPauseTime);
173 m_event =
Simulator::Schedule (pause, &SteadyStateRandomWaypointMobilityModel::BeginWalk,
this);
177 double x1, x2, y1, y2;
187 r = std::sqrt (((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1))/(a*a + b*b));
191 m_helper.SetPosition (Vector (m_minX + u2*x1 + (1 - u2)*x2, m_minY + u2*y1 + (1 - u2)*y2, 0));
194 Vector (m_minX + x2, m_minY + y2, 0));
200 SteadyStateRandomWaypointMobilityModel::SteadyStateBeginWalk (
const Vector &destination)
203 Vector m_current = m_helper.GetCurrentPosition ();
204 NS_ASSERT (m_minX <= m_current.x && m_current.x <= m_maxX);
205 NS_ASSERT (m_minY <= m_current.y && m_current.y <= m_maxY);
206 NS_ASSERT (m_minX <= destination.x && destination.x <= m_maxX);
207 NS_ASSERT (m_minY <= destination.y && destination.y <= m_maxY);
209 double speed = std::pow (m_maxSpeed, u)/std::pow (m_minSpeed, u - 1);
210 double dx = (destination.x - m_current.x);
211 double dy = (destination.y - m_current.y);
212 double dz = (destination.z - m_current.z);
213 double k = speed / std::sqrt (dx*dx + dy*dy + dz*dz);
215 m_helper.SetVelocity (Vector (k*dx, k*dy, k*dz));
219 &SteadyStateRandomWaypointMobilityModel::Start,
this);
224 SteadyStateRandomWaypointMobilityModel::BeginWalk (
void)
227 Vector m_current = m_helper.GetCurrentPosition ();
228 NS_ASSERT (m_minX <= m_current.x && m_current.x <= m_maxX);
229 NS_ASSERT (m_minY <= m_current.y && m_current.y <= m_maxY);
230 Vector destination = m_position->GetNext ();
231 double speed = m_speed->
GetValue ();
232 double dx = (destination.x - m_current.x);
233 double dy = (destination.y - m_current.y);
234 double dz = (destination.z - m_current.z);
235 double k = speed / std::sqrt (dx*dx + dy*dy + dz*dz);
237 m_helper.SetVelocity (Vector (k*dx, k*dy, k*dz));
241 &SteadyStateRandomWaypointMobilityModel::Start,
this);
246 SteadyStateRandomWaypointMobilityModel::Start (
void)
251 m_event =
Simulator::Schedule (pause, &SteadyStateRandomWaypointMobilityModel::BeginWalk,
this);
259 return m_helper.GetCurrentPosition ();
266 m_helper.SetPosition (position);
274 return m_helper.GetVelocity ();
279 int64_t positionStreamsAllocated = 0;
289 positionStreamsAllocated = m_position->AssignStreams (stream + 9);
290 return (9 + positionStreamsAllocated);
virtual void DoInitialize(void)
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
#define NS_ASSERT(condition)
bool IsRunning(void) const
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
double CalculateDistance(const Vector3D &a, const Vector3D &b)
void NotifyCourseChange(void) const
virtual void DoSetPosition(const Vector &position)
static void Remove(const EventId &id)
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
virtual Vector DoGetPosition(void) const
virtual Vector DoGetVelocity(void) const
virtual int64_t DoAssignStreams(int64_t)
Hold an floating point type.
void SetAttribute(std::string name, const AttributeValue &value)
virtual void DoInitialize(void)