1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.irurueta.navigation.gnss;
17
18 import com.irurueta.units.Distance;
19 import com.irurueta.units.DistanceConverter;
20 import com.irurueta.units.DistanceUnit;
21 import com.irurueta.units.Speed;
22 import com.irurueta.units.SpeedConverter;
23 import com.irurueta.units.SpeedUnit;
24
25 import java.io.Serializable;
26 import java.util.Objects;
27
28
29
30
31
32 public class GNSSKalmanConfig implements Serializable, Cloneable {
33
34
35
36
37 private double initialPositionUncertainty;
38
39
40
41
42 private double initialVelocityUncertainty;
43
44
45
46
47 private double initialClockOffsetUncertainty;
48
49
50
51
52 private double initialClockDriftUncertainty;
53
54
55
56
57 private double accelerationPSD;
58
59
60
61
62
63 private double clockFrequencyPSD;
64
65
66
67
68 private double clockPhasePSD;
69
70
71
72
73 private double pseudoRangeSD;
74
75
76
77
78
79 private double rangeRateSD;
80
81
82
83
84 public GNSSKalmanConfig() {
85 }
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 public GNSSKalmanConfig(final double initialPositionUncertainty,
110 final double initialVelocityUncertainty,
111 final double initialClockOffsetUncertainty,
112 final double initialClockDriftUncertainty,
113 final double accelerationPSD, final double clockFrequencyPSD,
114 final double clockPhasePSD, final double pseudoRangeSD,
115 final double rangeRateSD) {
116 setValues(initialPositionUncertainty, initialVelocityUncertainty, initialClockOffsetUncertainty,
117 initialClockDriftUncertainty, accelerationPSD, clockFrequencyPSD, clockPhasePSD, pseudoRangeSD,
118 rangeRateSD);
119 }
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 public GNSSKalmanConfig(final Distance initialPositionUncertainty,
140 final Speed initialVelocityUncertainty,
141 final Distance initialClockOffsetUncertainty,
142 final Speed initialClockDriftUncertainty,
143 final double accelerationPSD, final double clockFrequencyPSD,
144 final double clockPhasePSD, final Distance pseudoRangeSD,
145 final Speed rangeRateSD) {
146 setValues(initialPositionUncertainty, initialVelocityUncertainty, initialClockOffsetUncertainty,
147 initialClockDriftUncertainty, accelerationPSD, clockFrequencyPSD, clockPhasePSD, pseudoRangeSD,
148 rangeRateSD);
149 }
150
151
152
153
154
155
156 public GNSSKalmanConfig(final GNSSKalmanConfig input) {
157 copyFrom(input);
158 }
159
160
161
162
163
164
165 public double getInitialPositionUncertainty() {
166 return initialPositionUncertainty;
167 }
168
169
170
171
172
173
174 public void setInitialPositionUncertainty(final double initialPositionUncertainty) {
175 this.initialPositionUncertainty = initialPositionUncertainty;
176 }
177
178
179
180
181
182
183 public void getDistanceInitialPositionUncertainty(final Distance result) {
184 result.setValue(initialPositionUncertainty);
185 result.setUnit(DistanceUnit.METER);
186 }
187
188
189
190
191
192
193 public Distance getDistanceInitialPositionUncertainty() {
194 return new Distance(initialPositionUncertainty, DistanceUnit.METER);
195 }
196
197
198
199
200
201
202 public void setInitialPositionUncertainty(final Distance initialPositionUncertainty) {
203 this.initialPositionUncertainty = DistanceConverter.convert(
204 initialPositionUncertainty.getValue().doubleValue(), initialPositionUncertainty.getUnit(),
205 DistanceUnit.METER);
206 }
207
208
209
210
211
212
213 public double getInitialVelocityUncertainty() {
214 return initialVelocityUncertainty;
215 }
216
217
218
219
220
221
222 public void setInitialVelocityUncertainty(final double initialVelocityUncertainty) {
223 this.initialVelocityUncertainty = initialVelocityUncertainty;
224 }
225
226
227
228
229
230
231 public void getSpeedInitialVelocityUncertainty(final Speed result) {
232 result.setValue(initialVelocityUncertainty);
233 result.setUnit(SpeedUnit.METERS_PER_SECOND);
234 }
235
236
237
238
239
240
241 public Speed getSpeedInitialVelocityUncertainty() {
242 return new Speed(initialVelocityUncertainty, SpeedUnit.METERS_PER_SECOND);
243 }
244
245
246
247
248
249
250 public void setInitialVelocityUncertainty(final Speed initialVelocityUncertainty) {
251 this.initialVelocityUncertainty = SpeedConverter.convert(initialVelocityUncertainty.getValue().doubleValue(),
252 initialVelocityUncertainty.getUnit(), SpeedUnit.METERS_PER_SECOND);
253 }
254
255
256
257
258
259
260 public double getInitialClockOffsetUncertainty() {
261 return initialClockOffsetUncertainty;
262 }
263
264
265
266
267
268
269 public void setInitialClockOffsetUncertainty(final double initialClockOffsetUncertainty) {
270 this.initialClockOffsetUncertainty = initialClockOffsetUncertainty;
271 }
272
273
274
275
276
277
278 public void getDistanceInitialClockOffsetUncertainty(final Distance result) {
279 result.setValue(initialClockOffsetUncertainty);
280 result.setUnit(DistanceUnit.METER);
281 }
282
283
284
285
286
287
288 public Distance getDistanceInitialClockOffsetUncertainty() {
289 return new Distance(initialClockOffsetUncertainty, DistanceUnit.METER);
290 }
291
292
293
294
295
296
297 public void setInitialClockOffsetUncertainty(final Distance initialClockOffsetUncertainty) {
298 this.initialClockOffsetUncertainty = DistanceConverter.convert(
299 initialClockOffsetUncertainty.getValue().doubleValue(), initialClockOffsetUncertainty.getUnit(),
300 DistanceUnit.METER);
301 }
302
303
304
305
306
307
308 public double getInitialClockDriftUncertainty() {
309 return initialClockDriftUncertainty;
310 }
311
312
313
314
315
316
317 public void setInitialClockDriftUncertainty(final double initialClockDriftUncertainty) {
318 this.initialClockDriftUncertainty = initialClockDriftUncertainty;
319 }
320
321
322
323
324
325
326 public void getSpeedInitialClockDriftUncertainty(final Speed result) {
327 result.setValue(initialClockDriftUncertainty);
328 result.setUnit(SpeedUnit.METERS_PER_SECOND);
329 }
330
331
332
333
334
335
336 public Speed getSpeedInitialClockDriftUncertainty() {
337 return new Speed(initialClockDriftUncertainty, SpeedUnit.METERS_PER_SECOND);
338 }
339
340
341
342
343
344
345 public void setInitialClockDriftUncertainty(final Speed initialClockDriftUncertainty) {
346 this.initialClockDriftUncertainty = SpeedConverter.convert(
347 initialClockDriftUncertainty.getValue().doubleValue(), initialClockDriftUncertainty.getUnit(),
348 SpeedUnit.METERS_PER_SECOND);
349 }
350
351
352
353
354
355
356 public double getAccelerationPSD() {
357 return accelerationPSD;
358 }
359
360
361
362
363
364
365 public void setAccelerationPSD(final double accelerationPSD) {
366 this.accelerationPSD = accelerationPSD;
367 }
368
369
370
371
372
373
374
375 public double getClockFrequencyPSD() {
376 return clockFrequencyPSD;
377 }
378
379
380
381
382
383
384
385 public void setClockFrequencyPSD(final double clockFrequencyPSD) {
386 this.clockFrequencyPSD = clockFrequencyPSD;
387 }
388
389
390
391
392
393
394
395 public double getClockPhasePSD() {
396 return clockPhasePSD;
397 }
398
399
400
401
402
403
404
405 public void setClockPhasePSD(final double clockPhasePSD) {
406 this.clockPhasePSD = clockPhasePSD;
407 }
408
409
410
411
412
413
414 public double getPseudoRangeSD() {
415 return pseudoRangeSD;
416 }
417
418
419
420
421
422
423 public void setPseudoRangeSD(final double pseudoRangeSD) {
424 this.pseudoRangeSD = pseudoRangeSD;
425 }
426
427
428
429
430
431
432 public void getDistancePseudoRangeSD(final Distance result) {
433 result.setValue(pseudoRangeSD);
434 result.setUnit(DistanceUnit.METER);
435 }
436
437
438
439
440
441
442 public Distance getDistancePseudoRangeSD() {
443 return new Distance(pseudoRangeSD, DistanceUnit.METER);
444 }
445
446
447
448
449
450
451 public void setPseudoRangeSD(final Distance pseudoRangeSD) {
452 this.pseudoRangeSD = DistanceConverter.convert(pseudoRangeSD.getValue().doubleValue(), pseudoRangeSD.getUnit(),
453 DistanceUnit.METER);
454 }
455
456
457
458
459
460
461
462 public double getRangeRateSD() {
463 return rangeRateSD;
464 }
465
466
467
468
469
470
471
472 public void setRangeRateSD(final double rangeRateSD) {
473 this.rangeRateSD = rangeRateSD;
474 }
475
476
477
478
479
480
481
482 public void getSpeedRangeRateSD(final Speed result) {
483 result.setValue(rangeRateSD);
484 result.setUnit(SpeedUnit.METERS_PER_SECOND);
485 }
486
487
488
489
490
491
492 public Speed getSpeedRangeRateSD() {
493 return new Speed(rangeRateSD, SpeedUnit.METERS_PER_SECOND);
494 }
495
496
497
498
499
500
501 public void setRangeRateSD(final Speed rangeRateSD) {
502 this.rangeRateSD = SpeedConverter.convert(rangeRateSD.getValue().doubleValue(), rangeRateSD.getUnit(),
503 SpeedUnit.METERS_PER_SECOND);
504 }
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528 public void setValues(final double initialPositionUncertainty,
529 final double initialVelocityUncertainty,
530 final double initialClockOffsetUncertainty,
531 final double initialClockDriftUncertainty,
532 final double accelerationPSD, final double clockFrequencyPSD,
533 final double clockPhasePSD, final double pseudoRangeSD,
534 final double rangeRateSD) {
535 this.initialPositionUncertainty = initialPositionUncertainty;
536 this.initialVelocityUncertainty = initialVelocityUncertainty;
537 this.initialClockOffsetUncertainty = initialClockOffsetUncertainty;
538 this.initialClockDriftUncertainty = initialClockDriftUncertainty;
539 this.accelerationPSD = accelerationPSD;
540 this.clockFrequencyPSD = clockFrequencyPSD;
541 this.clockPhasePSD = clockPhasePSD;
542 this.pseudoRangeSD = pseudoRangeSD;
543 this.rangeRateSD = rangeRateSD;
544 }
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562 public void setValues(final Distance initialPositionUncertainty, final Speed initialVelocityUncertainty,
563 final Distance initialClockOffsetUncertainty, final Speed initialClockDriftUncertainty,
564 final double accelerationPSD, final double clockFrequencyPSD, final double clockPhasePSD,
565 final Distance pseudoRangeSD, final Speed rangeRateSD) {
566 setInitialPositionUncertainty(initialPositionUncertainty);
567 setInitialVelocityUncertainty(initialVelocityUncertainty);
568 setInitialClockOffsetUncertainty(initialClockOffsetUncertainty);
569 setInitialClockDriftUncertainty(initialClockDriftUncertainty);
570 this.accelerationPSD = accelerationPSD;
571 this.clockFrequencyPSD = clockFrequencyPSD;
572 this.clockPhasePSD = clockPhasePSD;
573 setPseudoRangeSD(pseudoRangeSD);
574 setRangeRateSD(rangeRateSD);
575 }
576
577
578
579
580
581
582 public void copyTo(final GNSSKalmanConfig output) {
583 output.initialPositionUncertainty = initialPositionUncertainty;
584 output.initialVelocityUncertainty = initialVelocityUncertainty;
585 output.initialClockOffsetUncertainty = initialClockOffsetUncertainty;
586 output.initialClockDriftUncertainty = initialClockDriftUncertainty;
587 output.accelerationPSD = accelerationPSD;
588 output.clockFrequencyPSD = clockFrequencyPSD;
589 output.clockPhasePSD = clockPhasePSD;
590 output.pseudoRangeSD = pseudoRangeSD;
591 output.rangeRateSD = rangeRateSD;
592 }
593
594
595
596
597
598
599 public void copyFrom(final GNSSKalmanConfig input) {
600 initialPositionUncertainty = input.initialPositionUncertainty;
601 initialVelocityUncertainty = input.initialVelocityUncertainty;
602 initialClockOffsetUncertainty = input.initialClockOffsetUncertainty;
603 initialClockDriftUncertainty = input.initialClockDriftUncertainty;
604 accelerationPSD = input.accelerationPSD;
605 clockFrequencyPSD = input.clockFrequencyPSD;
606 clockPhasePSD = input.clockPhasePSD;
607 pseudoRangeSD = input.pseudoRangeSD;
608 rangeRateSD = input.rangeRateSD;
609 }
610
611
612
613
614
615
616
617 @Override
618 public int hashCode() {
619 return Objects.hash(initialPositionUncertainty, initialVelocityUncertainty, initialClockOffsetUncertainty,
620 initialClockDriftUncertainty, accelerationPSD, clockFrequencyPSD, clockPhasePSD, pseudoRangeSD,
621 rangeRateSD);
622 }
623
624
625
626
627
628
629
630
631 @Override
632 public boolean equals(final Object obj) {
633 if (obj == this) {
634 return true;
635 }
636 if (obj == null || getClass() != obj.getClass()) {
637 return false;
638 }
639
640 final var other = (GNSSKalmanConfig) obj;
641 return equals(other);
642 }
643
644
645
646
647
648
649
650 public boolean equals(final GNSSKalmanConfig other) {
651 return equals(other, 0.0);
652 }
653
654
655
656
657
658
659
660
661
662
663 public boolean equals(final GNSSKalmanConfig other, final double threshold) {
664 if (other == null) {
665 return false;
666 }
667
668 return Math.abs(initialPositionUncertainty - other.initialPositionUncertainty) <= threshold
669 && Math.abs(initialVelocityUncertainty - other.initialVelocityUncertainty) <= threshold
670 && Math.abs(initialClockOffsetUncertainty - other.initialClockOffsetUncertainty) <= threshold
671 && Math.abs(initialClockDriftUncertainty - other.initialClockDriftUncertainty) <= threshold
672 && Math.abs(accelerationPSD - other.accelerationPSD) <= threshold
673 && Math.abs(clockFrequencyPSD - other.clockFrequencyPSD) <= threshold
674 && Math.abs(clockPhasePSD - other.clockPhasePSD) <= threshold
675 && Math.abs(pseudoRangeSD - other.pseudoRangeSD) <= threshold
676 && Math.abs(rangeRateSD - other.rangeRateSD) <= threshold;
677 }
678
679
680
681
682
683
684
685 @Override
686 protected Object clone() throws CloneNotSupportedException {
687 final var result = (GNSSKalmanConfig)super.clone();
688 copyTo(result);
689 return result;
690 }
691 }