21 #include "ns3/simulator.h"
22 #include "ns3/double.h"
33 static TypeId tid =
TypeId (
"ns3::SteadyStateRandomWaypointMobilityModel")
35 .SetGroupName (
"Mobility")
37 .AddAttribute (
"MinSpeed",
38 "Minimum speed value, [m/s]",
41 MakeDoubleChecker<double> ())
42 .AddAttribute (
"MaxSpeed",
43 "Maximum speed value, [m/s]",
46 MakeDoubleChecker<double> ())
47 .AddAttribute (
"MinPause",
48 "Minimum pause value, [s]",
51 MakeDoubleChecker<double> ())
52 .AddAttribute (
"MaxPause",
53 "Maximum pause value, [s]",
56 MakeDoubleChecker<double> ())
57 .AddAttribute (
"MinX",
58 "Minimum X value of traveling region, [m]",
61 MakeDoubleChecker<double> ())
62 .AddAttribute (
"MaxX",
63 "Maximum X value of traveling region, [m]",
66 MakeDoubleChecker<double> ())
67 .AddAttribute (
"MinY",
68 "Minimum Y value of traveling region, [m]",
71 MakeDoubleChecker<double> ())
72 .AddAttribute (
"MaxY",
73 "Maximum Y value of traveling region, [m]",
76 MakeDoubleChecker<double> ());
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> ();
113 m_position = CreateObject<RandomRectanglePositionAllocator> ();
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)
170 pause =
Seconds (u*expectedPauseTime);
177 double x1, x2, y1, y2;
187 r = std::sqrt (((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1))/(a*a + b*b));
194 Vector (m_minX + x2, m_minY + y2, 0));
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);
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);
279 int64_t positionStreamsAllocated = 0;
290 return (9 + positionStreamsAllocated);