satellite-mobility-observer-test.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013 Magister Solutions Ltd
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Sami Rantanen <sami.rantanen@magister.fi>
19  */
20 
27 #include "../helper/satellite-helper.h"
28 #include "../model/satellite-constant-position-mobility-model.h"
29 #include "../model/satellite-mobility-observer.h"
30 #include "../model/satellite-propagation-delay-model.h"
31 #include "../model/satellite-utils.h"
32 #include "../utils/satellite-env-variables.h"
33 
34 #include "ns3/double.h"
35 #include "ns3/log.h"
36 #include "ns3/simulator.h"
37 #include "ns3/singleton.h"
38 #include "ns3/test.h"
39 
40 using namespace ns3;
41 
42 // definitions for reference elevation angle table, g_refElAngles
43 static const uint32_t g_latitudeCount = 19;
44 static const uint32_t g_longitudeCount = 37;
45 
46 static const double g_firstLatValue = -90.00;
47 static const double g_firstLonValue = -180.00;
48 
49 static const double g_latStep = 10.00;
50 static const double g_lonStep = 10.00;
51 
52 // reference test values, when sphere (radius 6378137 [m]) is used as reference ellipsoid
53 // satellite is at location latitude 0.00, longitude 33.00, altitude 35786000 [m]
54 // values in table are with altitude 0 [m]
55 //
56 // row = latitude from -90 ... 90 with 10 degrees step
57 // col = longitude from -180 ... 180 with 10 degrees step
58 //
60  {
61  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
62  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
63  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
64  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
65  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
66  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
67  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
68  -8.6018742e+00, -8.6018742e+00,
69  },
70 
71  {
72  -1.6704625e+01, -1.7493055e+01, -1.8012186e+01, -1.8246050e+01, -1.8187401e+01,
73  -1.7838061e+01, -1.7208826e+01, -1.6318974e+01, -1.5195434e+01, -1.3871747e+01,
74  -1.2386929e+01, -1.0784340e+01, -9.1106057e+00, -7.4145745e+00, -5.7462845e+00,
75  -4.1558514e+00, -2.6922153e+00, -1.4016983e+00, -3.2637365e-01, 4.9768367e-01,
76  1.0421305e+00, 1.2878816e+00, 1.2262239e+00, 8.5934923e-01, 2.0021921e-01,
77  -7.2821655e-01, -1.8943228e+00, -3.2594126e+00, -4.7795075e+00, -6.4070521e+00,
78  -8.0924743e+00, -9.7855486e+00, -1.1436585e+01, -1.2997501e+01, -1.4422852e+01,
79  -1.5670881e+01, -1.6704625e+01,
80  },
81 
82  {
83  -2.4576013e+01, -2.6154391e+01, -2.7198607e+01, -2.7670434e+01, -2.7552023e+01,
84  -2.6847888e+01, -2.5584395e+01, -2.3806912e+01, -2.1575549e+01, -1.8960673e+01,
85  -1.6039194e+01, -1.2892100e+01, -9.6032842e+00, -6.2593405e+00, -2.9498717e+00,
86  2.3226561e-01, 3.1913676e+00, 5.8305290e+00, 8.0550058e+00, 9.7774715e+00,
87  1.0924793e+01, 1.1445248e+01, 1.1314514e+01, 1.0538752e+01, 9.1538106e+00,
88  7.2208060e+00, 4.8194220e+00, 2.0406964e+00, -1.0192362e+00, -4.2636521e+00,
89  -7.5978706e+00, -1.0930338e+01, -1.4172702e+01, -1.7239467e+01, -2.0047834e+01,
90  -2.2518238e+01, -2.4576013e+01,
91  },
92 
93  {
94  -3.2150830e+01, -3.4559650e+01, -3.6169920e+01, -3.6902409e+01, -3.6718280e+01,
95  -3.5627470e+01, -3.3686477e+01, -3.0986701e+01, -2.7639000e+01, -2.3760356e+01,
96  -1.9465727e+01, -1.4865194e+01, -1.0065058e+01, -5.1713370e+00, -2.9441703e-01,
97  4.4461307e+00, 8.9176003e+00, 1.2972465e+01, 1.6450908e+01, 1.9189792e+01,
98  2.1039320e+01, 2.1885576e+01, 2.1672558e+01, 2.0414606e+01, 1.8193117e+01,
99  1.5139226e+01, 1.1410534e+01, 7.1704160e+00, 2.5744409e+00, -2.2357749e+00,
100  -7.1331465e+00, -1.2002325e+01, -1.6735261e+01, -2.1226341e+01, -2.5368068e+01,
101  -2.9048360e+01, -3.2150830e+01,
102  },
103 
104  {
105  -3.9340005e+01, -4.2663495e+01, -4.4926798e+01, -4.5969303e+01, -4.5706421e+01,
106  -4.4160181e+01, -4.1450862e+01, -3.7756269e+01, -3.3266805e+01, -2.8156901e+01,
107  -2.2575234e+01, -1.6647050e+01, -1.0482042e+01, -4.1841877e+00, 2.1377900e+00,
108  8.3595752e+00, 1.4330196e+01, 1.9861842e+01, 2.4723918e+01, 2.8648396e+01,
109  3.1356671e+01, 3.2613755e+01, 3.2296196e+01, 3.0436121e+01, 2.7209219e+01,
110  2.2875939e+01, 1.7715647e+01, 1.1983180e+01, 5.8918217e+00, -3.8641798e-01,
111  -6.7125435e+00, -1.2969801e+01, -1.9052647e+01, -2.4856049e+01, -3.0265212e+01,
112  -3.5146265e+01, -3.9340005e+01,
113  },
114 
115  {
116  -4.6006510e+01, -5.0377333e+01, -5.3449005e+01, -5.4896833e+01, -5.4529539e+01,
117  -5.2398361e+01, -4.8765619e+01, -4.3969265e+01, -3.8312737e+01, -3.2027268e+01,
118  -2.5278415e+01, -1.8185662e+01, -1.0841716e+01, -3.3289119e+00, 4.2661058e+00,
119  1.1837327e+01, 1.9241765e+01, 2.6277592e+01, 3.2658732e+01, 3.7994962e+01,
120  4.1806163e+01, 4.3619473e+01, 4.3158455e+01, 4.0497024e+01, 3.6015197e+01,
121  3.0207381e+01, 2.3523617e+01, 1.6311315e+01, 8.8197845e+00, 1.2243958e+00,
122  -6.3490162e+00, -1.3804110e+01, -2.1057702e+01, -2.8025122e+01, -3.4605077e+01,
123  -4.0662117e+01, -4.6006510e+01,
124  },
125 
126  {
127  -5.1930043e+01, -5.7520985e+01, -6.1664013e+01, -6.3706420e+01, -6.3181670e+01,
128  -6.0221250e+01, -5.5425332e+01, -4.9408454e+01, -4.2595155e+01, -3.5239767e+01,
129  -2.7490147e+01, -1.9435029e+01, -1.1133295e+01, -2.6328414e+00, 6.0148092e+00,
130  1.4739663e+01, 2.3433938e+01, 3.1922592e+01, 3.9915329e+01, 4.6932754e+01,
131  5.2230631e+01, 5.4870709e+01, 5.4190691e+01, 5.0376730e+01, 4.4284022e+01,
132  3.6803157e+01, 2.8567067e+01, 1.9969144e+01, 1.1246230e+01, 2.5419583e+00,
133  -6.0538155e+00, -1.4480449e+01, -2.2689549e+01, -3.0630706e+01, -3.8235778e+01,
134  -4.5396738e+01, -5.1930043e+01,
135  },
136 
137  {
138  -5.6763473e+01, -6.3721803e+01, -6.9350213e+01, -7.2406072e+01, -7.1595300e+01,
139  -6.7322356e+01, -6.1051957e+01, -5.3761638e+01, -4.5899432e+01, -3.7661064e+01,
140  -2.9133792e+01, -2.0356792e+01, -1.1348040e+01, -2.1185707e+00, 7.3174061e+00,
141  1.6932120e+01, 2.6669719e+01, 3.6421102e+01, 4.5972840e+01, 5.4890661e+01,
142  6.2253932e+01, 6.6299419e+01, 6.5223137e+01, 5.9587071e+01, 5.1443019e+01,
143  4.2196812e+01, 3.2529315e+01, 2.2765306e+01, 1.3067511e+01, 3.5195690e+00,
144  -5.8361176e+00, -1.4978614e+01, -2.3896132e+01, -3.2576186e+01, -4.0994468e+01,
145  -4.9096993e+01, -5.6763473e+01,
146  },
147 
148  {
149  -6.0018125e+01, -6.8243134e+01, -7.5780862e+01, -8.0930434e+01, -7.9407340e+01,
150  -7.2901185e+01, -6.5003558e+01, -5.6632347e+01, -4.8002623e+01, -3.9171269e+01,
151  -3.0147310e+01, -2.0921952e+01, -1.1479516e+01, -1.8030130e+00, 8.1215023e+00,
152  1.8300042e+01, 2.8723815e+01, 3.9357750e+01, 5.0116479e+01, 6.0796148e+01,
153  7.0799966e+01, 7.7720429e+01, 7.5667940e+01, 6.6957660e+01, 5.6556579e+01,
154  4.5806960e+01, 3.5082849e+01, 2.4526346e+01, 1.4198272e+01, 4.1213054e+00,
155  -5.7027141e+00, -1.5283649e+01, -2.4637188e+01, -3.3780337e+01, -4.2726850e+01,
156  -5.1480271e+01, -6.0018125e+01,
157  },
158 
159  {
160  -6.1181558e+01, -6.9969924e+01, -7.8698721e+01, -8.7394065e+01, -8.3918289e+01,
161  -7.5212668e+01, -6.6463206e+01, -5.7643574e+01, -4.8726780e+01, -3.9685056e+01,
162  -3.0489905e+01, -2.1112394e+01, -1.1523783e+01, -1.6966442e+00, 8.3934130e+00,
163  1.8765296e+01, 2.9429276e+01, 4.0383351e+01, 5.1609653e+01, 6.3071832e+01,
164  7.4714498e+01, 8.6465700e+01, 8.1757338e+01, 7.0040060e+01, 5.8461787e+01,
165  4.7088358e+01, 3.5967660e+01, 2.5128442e+01, 1.4581832e+01, 4.3244734e+00,
166  -5.6577772e+00, -1.5386361e+01, -2.4887136e+01, -3.4188224e+01, -4.3318546e+01,
167  -5.2306916e+01, -6.1181558e+01,
168  },
169 
170  {
171  -6.0018125e+01, -6.8243134e+01, -7.5780862e+01, -8.0930434e+01, -7.9407340e+01,
172  -7.2901185e+01, -6.5003558e+01, -5.6632347e+01, -4.8002623e+01, -3.9171269e+01,
173  -3.0147310e+01, -2.0921952e+01, -1.1479516e+01, -1.8030130e+00, 8.1215023e+00,
174  1.8300042e+01, 2.8723815e+01, 3.9357750e+01, 5.0116479e+01, 6.0796148e+01,
175  7.0799966e+01, 7.7720429e+01, 7.5667940e+01, 6.6957660e+01, 5.6556579e+01,
176  4.5806960e+01, 3.5082849e+01, 2.4526346e+01, 1.4198272e+01, 4.1213054e+00,
177  -5.7027141e+00, -1.5283649e+01, -2.4637188e+01, -3.3780337e+01, -4.2726850e+01,
178  -5.1480271e+01, -6.0018125e+01,
179  },
180 
181  {
182  -5.6763473e+01, -6.3721803e+01, -6.9350213e+01, -7.2406072e+01, -7.1595300e+01,
183  -6.7322356e+01, -6.1051957e+01, -5.3761638e+01, -4.5899432e+01, -3.7661064e+01,
184  -2.9133792e+01, -2.0356792e+01, -1.1348040e+01, -2.1185707e+00, 7.3174061e+00,
185  1.6932120e+01, 2.6669719e+01, 3.6421102e+01, 4.5972840e+01, 5.4890661e+01,
186  6.2253932e+01, 6.6299419e+01, 6.5223137e+01, 5.9587071e+01, 5.1443019e+01,
187  4.2196812e+01, 3.2529315e+01, 2.2765306e+01, 1.3067511e+01, 3.5195690e+00,
188  -5.8361176e+00, -1.4978614e+01, -2.3896132e+01, -3.2576186e+01, -4.0994468e+01,
189  -4.9096993e+01, -5.6763473e+01,
190  },
191 
192  {
193  -5.1930043e+01, -5.7520985e+01, -6.1664013e+01, -6.3706420e+01, -6.3181670e+01,
194  -6.0221250e+01, -5.5425332e+01, -4.9408454e+01, -4.2595155e+01, -3.5239767e+01,
195  -2.7490147e+01, -1.9435029e+01, -1.1133295e+01, -2.6328414e+00, 6.0148092e+00,
196  1.4739663e+01, 2.3433938e+01, 3.1922592e+01, 3.9915329e+01, 4.6932754e+01,
197  5.2230631e+01, 5.4870709e+01, 5.4190691e+01, 5.0376730e+01, 4.4284022e+01,
198  3.6803157e+01, 2.8567067e+01, 1.9969144e+01, 1.1246230e+01, 2.5419583e+00,
199  -6.0538155e+00, -1.4480449e+01, -2.2689549e+01, -3.0630706e+01, -3.8235778e+01,
200  -4.5396738e+01, -5.1930043e+01,
201  },
202 
203  {
204  -4.6006510e+01, -5.0377333e+01, -5.3449005e+01, -5.4896833e+01, -5.4529539e+01,
205  -5.2398361e+01, -4.8765619e+01, -4.3969265e+01, -3.8312737e+01, -3.2027268e+01,
206  -2.5278415e+01, -1.8185662e+01, -1.0841716e+01, -3.3289119e+00, 4.2661058e+00,
207  1.1837327e+01, 1.9241765e+01, 2.6277592e+01, 3.2658732e+01, 3.7994962e+01,
208  4.1806163e+01, 4.3619473e+01, 4.3158455e+01, 4.0497024e+01, 3.6015197e+01,
209  3.0207381e+01, 2.3523617e+01, 1.6311315e+01, 8.8197845e+00, 1.2243958e+00,
210  -6.3490162e+00, -1.3804110e+01, -2.1057702e+01, -2.8025122e+01, -3.4605077e+01,
211  -4.0662117e+01, -4.6006510e+01,
212  },
213 
214  {
215  -3.9340005e+01, -4.2663495e+01, -4.4926798e+01, -4.5969303e+01, -4.5706421e+01,
216  -4.4160181e+01, -4.1450862e+01, -3.7756269e+01, -3.3266805e+01, -2.8156901e+01,
217  -2.2575234e+01, -1.6647050e+01, -1.0482042e+01, -4.1841877e+00, 2.1377900e+00,
218  8.3595752e+00, 1.4330196e+01, 1.9861842e+01, 2.4723918e+01, 2.8648396e+01,
219  3.1356671e+01, 3.2613755e+01, 3.2296196e+01, 3.0436121e+01, 2.7209219e+01,
220  2.2875939e+01, 1.7715647e+01, 1.1983180e+01, 5.8918217e+00, -3.8641798e-01,
221  -6.7125435e+00, -1.2969801e+01, -1.9052647e+01, -2.4856049e+01, -3.0265212e+01,
222  -3.5146265e+01, -3.9340005e+01,
223  },
224 
225  {
226  -3.2150830e+01, -3.4559650e+01, -3.6169920e+01, -3.6902409e+01, -3.6718280e+01,
227  -3.5627470e+01, -3.3686477e+01, -3.0986701e+01, -2.7639000e+01, -2.3760356e+01,
228  -1.9465727e+01, -1.4865194e+01, -1.0065058e+01, -5.1713370e+00, -2.9441703e-01,
229  4.4461307e+00, 8.9176003e+00, 1.2972465e+01, 1.6450908e+01, 1.9189792e+01,
230  2.1039320e+01, 2.1885576e+01, 2.1672558e+01, 2.0414606e+01, 1.8193117e+01,
231  1.5139226e+01, 1.1410534e+01, 7.1704160e+00, 2.5744409e+00, -2.2357749e+00,
232  -7.1331465e+00, -1.2002325e+01, -1.6735261e+01, -2.1226341e+01, -2.5368068e+01,
233  -2.9048360e+01, -3.2150830e+01,
234  },
235 
236  {
237  -2.4576013e+01, -2.6154391e+01, -2.7198607e+01, -2.7670434e+01, -2.7552023e+01,
238  -2.6847888e+01, -2.5584395e+01, -2.3806912e+01, -2.1575549e+01, -1.8960673e+01,
239  -1.6039194e+01, -1.2892100e+01, -9.6032842e+00, -6.2593405e+00, -2.9498717e+00,
240  2.3226561e-01, 3.1913676e+00, 5.8305290e+00, 8.0550058e+00, 9.7774715e+00,
241  1.0924793e+01, 1.1445248e+01, 1.1314514e+01, 1.0538752e+01, 9.1538106e+00,
242  7.2208060e+00, 4.8194220e+00, 2.0406964e+00, -1.0192362e+00, -4.2636521e+00,
243  -7.5978706e+00, -1.0930338e+01, -1.4172702e+01, -1.7239467e+01, -2.0047834e+01,
244  -2.2518238e+01, -2.4576013e+01,
245  },
246 
247  {
248  -1.6704625e+01, -1.7493055e+01, -1.8012186e+01, -1.8246050e+01, -1.8187401e+01,
249  -1.7838061e+01, -1.7208826e+01, -1.6318974e+01, -1.5195434e+01, -1.3871747e+01,
250  -1.2386929e+01, -1.0784340e+01, -9.1106057e+00, -7.4145745e+00, -5.7462845e+00,
251  -4.1558514e+00, -2.6922153e+00, -1.4016983e+00, -3.2637365e-01, 4.9768367e-01,
252  1.0421305e+00, 1.2878816e+00, 1.2262239e+00, 8.5934923e-01, 2.0021921e-01,
253  -7.2821655e-01, -1.8943228e+00, -3.2594126e+00, -4.7795075e+00, -6.4070521e+00,
254  -8.0924743e+00, -9.7855486e+00, -1.1436585e+01, -1.2997501e+01, -1.4422852e+01,
255  -1.5670881e+01, -1.6704625e+01,
256  },
257 
258  {
259  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
260  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
261  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
262  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
263  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
264  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
265  -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00, -8.6018742e+00,
266  -8.6018742e+00, -8.6018742e+00,
267  }};
268 
295 class SatMobilityObserverTestCase : public TestCase
296 {
297  public:
299  virtual ~SatMobilityObserverTestCase();
300 
301  private:
302  virtual void DoRun(void);
303 };
304 
306  : TestCase("Test satellite mobility observer model.")
307 {
308 }
309 
311 {
312 }
313 
314 void
316 {
317  // Set simulation output details
318  Singleton<SatEnvVariables>::Get()->DoInitialize();
319  Singleton<SatEnvVariables>::Get()->SetOutputVariables("test-sat-mobility-observer", "", true);
320 
321  // create mobilities
322  Ptr<SatConstantPositionMobilityModel> gwMob = CreateObject<SatConstantPositionMobilityModel>();
323  Ptr<SatConstantPositionMobilityModel> utMob = CreateObject<SatConstantPositionMobilityModel>();
324  Ptr<SatConstantPositionMobilityModel> geoMob = CreateObject<SatConstantPositionMobilityModel>();
325 
326  // create propagation delays
327  Ptr<SatConstantPropagationDelayModel> gwProgDelay =
328  CreateObject<SatConstantPropagationDelayModel>();
329  Ptr<SatConstantPropagationDelayModel> utProgDelay =
330  CreateObject<SatConstantPropagationDelayModel>();
331 
332  // set propagation delays
333  gwProgDelay->SetDelay(Seconds(200));
334  utProgDelay->SetDelay(Seconds(300));
335 
336  // set satellite position, altitude is the Earth radius
337  double earthRadius =
338  CalculateDistance(GeoCoordinate(0.00, 0.00, 0.00).ToVector(), Vector(0, 0, 0));
339  GeoCoordinate satellitePosition = GeoCoordinate(0.00, 0.00, earthRadius);
340  geoMob->SetGeoPosition(satellitePosition);
341 
342  // set some positions to UT and GW
343  gwMob->SetGeoPosition(GeoCoordinate(0.00, 0.00, 0.00));
344  utMob->SetGeoPosition(GeoCoordinate(0.00, 0.00, 0.00));
345 
346  // create mobility observers
347  Ptr<SatMobilityObserver> utObserver = CreateObject<SatMobilityObserver>(utMob, geoMob);
348  Ptr<SatMobilityObserver> gwObserver = CreateObject<SatMobilityObserver>(gwMob, geoMob);
349 
350  utObserver->ObserveTimingAdvance(utProgDelay, gwProgDelay, gwMob);
351  double timingAdvance = utObserver->GetTimingAdvance().GetSeconds();
352 
353  // check that we use correct earth radius
354  NS_TEST_ASSERT_MSG_EQ(earthRadius, 6378137, "Earth radius is not what expected");
355 
356  // check that timing advance is correct
357  NS_TEST_ASSERT_MSG_EQ(timingAdvance, 500, "Timing Advance incorrect");
358 
359  // Test that we get 0 degrees elevation angle at range points, where we stop seeing satellite
360  gwMob->SetGeoPosition(GeoCoordinate(60.00, 0.00, 0.00));
361  utMob->SetGeoPosition(GeoCoordinate(00.0, 60.00, 0.00));
362 
363  double utEl = utObserver->GetElevationAngle();
364  double gwEl = gwObserver->GetElevationAngle();
365 
366  NS_TEST_ASSERT_MSG_EQ(utEl, 0, "UT elevation angle incorrect");
367  NS_TEST_ASSERT_MSG_EQ(gwEl, 0, "GW elevation angle incorrect");
368 
369  gwMob->SetGeoPosition(GeoCoordinate(-60.0, 0.00, 0.00));
370  utMob->SetGeoPosition(GeoCoordinate(0.00, -60.00, 0.00));
371 
372  utEl = utObserver->GetElevationAngle();
373  gwEl = gwObserver->GetElevationAngle();
374 
375  NS_TEST_ASSERT_MSG_EQ(utEl, 0, "UT elevation angle incorrect");
376  NS_TEST_ASSERT_MSG_EQ(gwEl, 0, "GW elevation angle incorrect");
377 
378  gwMob->SetGeoPosition(GeoCoordinate(45.00, 45.00, 0.00));
379  utMob->SetGeoPosition(GeoCoordinate(-45.00, -45.00, 0.00));
380 
381  utEl = utObserver->GetElevationAngle();
382  gwEl = gwObserver->GetElevationAngle();
383 
384  NS_TEST_ASSERT_MSG_EQ(utEl, 0, "UT elevation angle incorrect");
385  NS_TEST_ASSERT_MSG_EQ(gwEl, 0, "GW elevation angle incorrect");
386 
387  gwMob->SetGeoPosition(GeoCoordinate(-45.00, 45.00, 0.00));
388  utMob->SetGeoPosition(GeoCoordinate(45.00, -45.00, 0.00));
389 
390  utEl = utObserver->GetElevationAngle();
391  gwEl = gwObserver->GetElevationAngle();
392 
393  NS_TEST_ASSERT_MSG_EQ(utEl, 0, "UT elevation angle incorrect");
394  NS_TEST_ASSERT_MSG_EQ(gwEl, 0, "GW elevation angle incorrect");
395 
396  // Test that we get valid elevation angle at points where we should see satellite
397 
398  gwMob->SetGeoPosition(GeoCoordinate(44.01, 45.00, 0.00));
399  utMob->SetGeoPosition(GeoCoordinate(45.00, -42.00, 0.00));
400 
401  utEl = utObserver->GetElevationAngle();
402  gwEl = gwObserver->GetElevationAngle();
403 
404  NS_TEST_ASSERT_MSG_EQ(std::isnan(utEl), false, "UT elevation angle incorrect");
405  NS_TEST_ASSERT_MSG_EQ(std::isnan(gwEl), false, "GW elevation angle incorrect");
406 
407  gwMob->SetGeoPosition(GeoCoordinate(10.0, 10.00, 0.00));
408  utMob->SetGeoPosition(GeoCoordinate(0.00, 0.00, 0.00));
409 
410  utEl = utObserver->GetElevationAngle();
411  gwEl = gwObserver->GetElevationAngle();
412 
413  NS_TEST_ASSERT_MSG_EQ(std::isnan(utEl), false, "UT elevation angle incorrect");
414  NS_TEST_ASSERT_MSG_EQ(std::isnan(gwEl), false, "GW elevation angle incorrect");
415 
416  // Test that we get invalid elevation angle at points where we shouldn't see satellite
417 
418  gwMob->SetGeoPosition(GeoCoordinate(45.01, 45.00, 0.00));
419  utMob->SetGeoPosition(GeoCoordinate(45.00, -45.01, 0.00));
420 
421  utEl = utObserver->GetElevationAngle();
422  gwEl = gwObserver->GetElevationAngle();
423 
424  NS_TEST_ASSERT_MSG_EQ(std::isnan(utEl), true, "UT elevation angle incorrect");
425  NS_TEST_ASSERT_MSG_EQ(std::isnan(gwEl), true, "GW elevation angle incorrect");
426 
427  gwMob->SetGeoPosition(GeoCoordinate(90.0, 0.00, 0.00));
428  utMob->SetGeoPosition(GeoCoordinate(0.00, 180.00, 0.00));
429 
430  utEl = utObserver->GetElevationAngle();
431  gwEl = gwObserver->GetElevationAngle();
432 
433  NS_TEST_ASSERT_MSG_EQ(std::isnan(utEl), true, "UT elevation angle incorrect");
434  NS_TEST_ASSERT_MSG_EQ(std::isnan(gwEl), true, "GW elevation angle incorrect");
435 
436  // Test that we get correct elevation angle with our reference satellite
437 
438  satellitePosition.SetLatitude(0.00);
439  satellitePosition.SetLongitude(33.00);
440  satellitePosition.SetAltitude(35786000.00);
441  geoMob->SetGeoPosition(satellitePosition);
442 
443  Ptr<UniformRandomVariable> randAlt = CreateObject<UniformRandomVariable>();
444  randAlt->SetAttribute("Min", DoubleValue(-200.00));
445  randAlt->SetAttribute("Max", DoubleValue(600.00));
446 
447  gwObserver->SetAttribute("MinAltitude", DoubleValue(-200.00));
448  gwObserver->SetAttribute("MaxAltitude", DoubleValue(600.00));
449 
450  for (uint32_t i = 0; i < g_latitudeCount; i++)
451  {
452  for (uint32_t j = 0; j < g_longitudeCount; j++)
453  {
454  double lat = g_firstLatValue + (double)i * g_latStep;
455  double lon = g_firstLonValue + (double)j * g_lonStep;
456  double alt = randAlt->GetValue();
457 
458  gwMob->SetGeoPosition(GeoCoordinate(lat, lon, alt));
459  gwEl = gwObserver->GetElevationAngle();
460  double refValue = g_refElAngles[i][j];
461 
462  if (refValue < 0)
463  {
464  // NAN should be returned, because only points where we can see satellite is
465  // accepted
466  NS_TEST_ASSERT_MSG_EQ(std::isnan(gwEl),
467  true,
468  "UT elevation angle incorrect: lat-> " << lat << " lon-> "
469  << " alt->" << alt);
470  }
471  else
472  {
473  // valid values should be returned and it should be inside tolerance
474  NS_TEST_ASSERT_MSG_EQ(std::isnan(gwEl),
475  false,
476  "UT elevation angle incorrect (NAN): lat-> "
477  << lat << " lon-> "
478  << " alt" << alt);
479  NS_TEST_ASSERT_MSG_EQ_TOL(gwEl,
480  refValue,
481  0.00001,
482  "UT elevation angle incorrect: lat-> " << lat << " lon-> "
483  << " alt" << alt);
484  }
485  }
486  }
487 
488  Simulator::Destroy();
489 
490  Singleton<SatEnvVariables>::Get()->DoDispose();
491 }
492 
496 class SatMobilityObserverTestSuite : public TestSuite
497 {
498  public:
500 };
501 
503  : TestSuite("sat-mobility-observer-test", UNIT)
504 {
505  AddTestCase(new SatMobilityObserverTestCase, TestCase::QUICK);
506 }
507 
508 // Do allocate an instance of this TestSuite
Test case to unit test Satellite Mobility Observer.
Test suite for Satellite mobility observer unit test cases.
GeoCoordinate class is used to store and operate with geodetic coordinates.
void SetAltitude(double altitude)
Sets altitude value of coordinate.
void SetLatitude(double latitude)
Sets latitude value of coordinate.
void SetLongitude(double longitude)
Sets longitude value of coordinate.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
static const double g_firstLonValue
static const double g_firstLatValue
static const uint32_t g_longitudeCount
static const uint32_t g_latitudeCount
static const double g_lonStep
static const double g_refElAngles[g_latitudeCount][g_longitudeCount]
static SatMobilityObserverTestSuite satSatMobilityObserverTestSuite
static const double g_latStep