1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.irurueta.navigation.indoor.position;
17
18 import com.irurueta.geometry.InhomogeneousPoint3D;
19 import com.irurueta.geometry.Point3D;
20 import com.irurueta.navigation.LockedException;
21 import com.irurueta.navigation.indoor.RadioSource;
22 import com.irurueta.navigation.indoor.RadioSourceLocated;
23 import com.irurueta.navigation.indoor.RangingFingerprint;
24 import com.irurueta.navigation.indoor.RangingReading;
25 import com.irurueta.numerical.robust.RobustEstimatorMethod;
26
27 import java.util.List;
28
29
30
31
32
33
34
35
36
37
38 @SuppressWarnings("DuplicatedCode")
39 public abstract class RobustRangingPositionEstimator3D extends RobustRangingPositionEstimator<Point3D> {
40
41
42
43
44 protected RobustRangingPositionEstimator3D() {
45 super();
46 preliminarySubsetSize = getMinRequiredSources();
47 }
48
49
50
51
52
53
54 protected RobustRangingPositionEstimator3D(final RobustRangingPositionEstimatorListener<Point3D> listener) {
55 super(listener);
56 preliminarySubsetSize = getMinRequiredSources();
57 }
58
59
60
61
62
63
64 @Override
65 public int getMinRequiredSources() {
66 return Point3D.POINT3D_HOMOGENEOUS_COORDINATES_LENGTH;
67 }
68
69
70
71
72
73
74
75 public static RobustRangingPositionEstimator3D create(final RobustEstimatorMethod method) {
76 return switch (method) {
77 case RANSAC -> new RANSACRobustRangingPositionEstimator3D();
78 case LMEDS -> new LMedSRobustRangingPositionEstimator3D();
79 case MSAC -> new MSACRobustRangingPositionEstimator3D();
80 case PROSAC -> new PROSACRobustRangingPositionEstimator3D();
81 default -> new PROMedSRobustRangingPositionEstimator3D();
82 };
83 }
84
85
86
87
88
89
90
91
92
93
94 public static RobustRangingPositionEstimator3D create(
95 final List<? extends RadioSourceLocated<Point3D>> sources, final RobustEstimatorMethod method) {
96 return switch (method) {
97 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(sources);
98 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(sources);
99 case MSAC -> new MSACRobustRangingPositionEstimator3D(sources);
100 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sources);
101 default -> new PROMedSRobustRangingPositionEstimator3D(sources);
102 };
103 }
104
105
106
107
108
109
110
111
112
113
114 public static RobustRangingPositionEstimator3D create(
115 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
116 extends RadioSource>> fingerprint,
117 final RobustEstimatorMethod method) {
118 return switch (method) {
119 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(fingerprint);
120 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(fingerprint);
121 case MSAC -> new MSACRobustRangingPositionEstimator3D(fingerprint);
122 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(fingerprint);
123 default -> new PROMedSRobustRangingPositionEstimator3D(fingerprint);
124 };
125 }
126
127
128
129
130
131
132
133
134
135
136
137
138 public static RobustRangingPositionEstimator3D create(
139 final List<? extends RadioSourceLocated<Point3D>> sources,
140 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
141 extends RadioSource>> fingerprint,
142 final RobustEstimatorMethod method) {
143 return switch (method) {
144 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(sources, fingerprint);
145 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(sources, fingerprint);
146 case MSAC -> new MSACRobustRangingPositionEstimator3D(sources, fingerprint);
147 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sources, fingerprint);
148 default -> new PROMedSRobustRangingPositionEstimator3D(sources, fingerprint);
149 };
150 }
151
152
153
154
155
156
157
158
159 public static RobustRangingPositionEstimator3D create(
160 final RobustRangingPositionEstimatorListener<Point3D> listener, final RobustEstimatorMethod method) {
161 return switch (method) {
162 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(listener);
163 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(listener);
164 case MSAC -> new MSACRobustRangingPositionEstimator3D(listener);
165 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(listener);
166 default -> new PROMedSRobustRangingPositionEstimator3D(listener);
167 };
168 }
169
170
171
172
173
174
175
176
177
178
179
180 public static RobustRangingPositionEstimator3D create(
181 final List<? extends RadioSourceLocated<Point3D>> sources,
182 final RobustRangingPositionEstimatorListener<Point3D> listener, final RobustEstimatorMethod method) {
183 return switch (method) {
184 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(sources, listener);
185 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(sources, listener);
186 case MSAC -> new MSACRobustRangingPositionEstimator3D(sources, listener);
187 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sources, listener);
188 default -> new PROMedSRobustRangingPositionEstimator3D(sources, listener);
189 };
190 }
191
192
193
194
195
196
197
198
199
200
201
202 public static RobustRangingPositionEstimator3D create(
203 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
204 extends RadioSource>> fingerprint,
205 final RobustRangingPositionEstimatorListener<Point3D> listener, final RobustEstimatorMethod method) {
206 return switch (method) {
207 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(fingerprint, listener);
208 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(fingerprint, listener);
209 case MSAC -> new MSACRobustRangingPositionEstimator3D(fingerprint, listener);
210 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(fingerprint, listener);
211 default -> new PROMedSRobustRangingPositionEstimator3D(fingerprint, listener);
212 };
213 }
214
215
216
217
218
219
220
221
222
223
224
225
226
227 public static RobustRangingPositionEstimator3D create(
228 final List<? extends RadioSourceLocated<Point3D>> sources,
229 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
230 extends RadioSource>> fingerprint,
231 final RobustRangingPositionEstimatorListener<Point3D> listener, final RobustEstimatorMethod method) {
232 return switch (method) {
233 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(sources, fingerprint, listener);
234 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(sources, fingerprint, listener);
235 case MSAC -> new MSACRobustRangingPositionEstimator3D(sources, fingerprint, listener);
236 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sources, fingerprint, listener);
237 default -> new PROMedSRobustRangingPositionEstimator3D(sources, fingerprint, listener);
238 };
239 }
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255 public static RobustRangingPositionEstimator3D create(
256 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
257 final RobustEstimatorMethod method) {
258 return switch (method) {
259 case RANSAC -> new RANSACRobustRangingPositionEstimator3D();
260 case LMEDS -> new LMedSRobustRangingPositionEstimator3D();
261 case MSAC -> new MSACRobustRangingPositionEstimator3D();
262 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sourceQualityScores,
263 fingerprintReadingQualityScores);
264 default -> new PROMedSRobustRangingPositionEstimator3D(sourceQualityScores,
265 fingerprintReadingQualityScores);
266 };
267 }
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287 public static RobustRangingPositionEstimator3D create(
288 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
289 final List<? extends RadioSourceLocated<Point3D>> sources, final RobustEstimatorMethod method) {
290 return switch (method) {
291 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(sources);
292 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(sources);
293 case MSAC -> new MSACRobustRangingPositionEstimator3D(sources);
294 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sourceQualityScores,
295 fingerprintReadingQualityScores, sources);
296 default -> new PROMedSRobustRangingPositionEstimator3D(sourceQualityScores, fingerprintReadingQualityScores,
297 sources);
298 };
299 }
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319 public static RobustRangingPositionEstimator3D create(
320 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
321 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
322 extends RadioSource>> fingerprint,
323 final RobustEstimatorMethod method) {
324 return switch (method) {
325 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(fingerprint);
326 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(fingerprint);
327 case MSAC -> new MSACRobustRangingPositionEstimator3D(fingerprint);
328 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sourceQualityScores,
329 fingerprintReadingQualityScores, fingerprint);
330 default -> new PROMedSRobustRangingPositionEstimator3D(sourceQualityScores, fingerprintReadingQualityScores,
331 fingerprint);
332 };
333 }
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356 public static RobustRangingPositionEstimator3D create(
357 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
358 final List<? extends RadioSourceLocated<Point3D>> sources,
359 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
360 extends RadioSource>> fingerprint, final RobustEstimatorMethod method) {
361 return switch (method) {
362 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(sources, fingerprint);
363 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(sources, fingerprint);
364 case MSAC -> new MSACRobustRangingPositionEstimator3D(sources, fingerprint);
365 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sourceQualityScores,
366 fingerprintReadingQualityScores, sources, fingerprint);
367 default -> new PROMedSRobustRangingPositionEstimator3D(sourceQualityScores, fingerprintReadingQualityScores,
368 sources, fingerprint);
369 };
370 }
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387 public static RobustRangingPositionEstimator3D create(
388 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
389 final RobustRangingPositionEstimatorListener<Point3D> listener, final RobustEstimatorMethod method) {
390 return switch (method) {
391 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(listener);
392 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(listener);
393 case MSAC -> new MSACRobustRangingPositionEstimator3D(listener);
394 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sourceQualityScores,
395 fingerprintReadingQualityScores, listener);
396 default -> new PROMedSRobustRangingPositionEstimator3D(sourceQualityScores, fingerprintReadingQualityScores,
397 listener);
398 };
399 }
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420 public static RobustRangingPositionEstimator3D create(
421 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
422 final List<? extends RadioSourceLocated<Point3D>> sources,
423 final RobustRangingPositionEstimatorListener<Point3D> listener, final RobustEstimatorMethod method) {
424 return switch (method) {
425 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(sources, listener);
426 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(sources, listener);
427 case MSAC -> new MSACRobustRangingPositionEstimator3D(sources, listener);
428 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sourceQualityScores,
429 fingerprintReadingQualityScores, sources, listener);
430 default -> new PROMedSRobustRangingPositionEstimator3D(sourceQualityScores, fingerprintReadingQualityScores,
431 sources, listener);
432 };
433 }
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454 public static RobustRangingPositionEstimator3D create(
455 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
456 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
457 extends RadioSource>> fingerprint,
458 final RobustRangingPositionEstimatorListener<Point3D> listener, final RobustEstimatorMethod method) {
459 return switch (method) {
460 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(fingerprint, listener);
461 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(fingerprint, listener);
462 case MSAC -> new MSACRobustRangingPositionEstimator3D(fingerprint, listener);
463 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sourceQualityScores,
464 fingerprintReadingQualityScores, fingerprint, listener);
465 default -> new PROMedSRobustRangingPositionEstimator3D(sourceQualityScores, fingerprintReadingQualityScores,
466 fingerprint, listener);
467 };
468 }
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492 public static RobustRangingPositionEstimator3D create(
493 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
494 final List<? extends RadioSourceLocated<Point3D>> sources,
495 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
496 extends RadioSource>> fingerprint,
497 final RobustRangingPositionEstimatorListener<Point3D> listener, final RobustEstimatorMethod method) {
498 return switch (method) {
499 case RANSAC -> new RANSACRobustRangingPositionEstimator3D(sources, fingerprint, listener);
500 case LMEDS -> new LMedSRobustRangingPositionEstimator3D(sources, fingerprint, listener);
501 case MSAC -> new MSACRobustRangingPositionEstimator3D(sources, fingerprint, listener);
502 case PROSAC -> new PROSACRobustRangingPositionEstimator3D(sourceQualityScores,
503 fingerprintReadingQualityScores, sources, fingerprint, listener);
504 default -> new PROMedSRobustRangingPositionEstimator3D(sourceQualityScores, fingerprintReadingQualityScores,
505 sources, fingerprint, listener);
506 };
507 }
508
509
510
511
512
513
514 public static RobustRangingPositionEstimator3D create() {
515 return create(DEFAULT_ROBUST_METHOD);
516 }
517
518
519
520
521
522
523
524
525
526 public static RobustRangingPositionEstimator3D create(final List<? extends RadioSourceLocated<Point3D>> sources) {
527 return create(sources, DEFAULT_ROBUST_METHOD);
528 }
529
530
531
532
533
534
535
536
537
538 public static RobustRangingPositionEstimator3D create(
539 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
540 extends RadioSource>> fingerprint) {
541 return create(fingerprint, DEFAULT_ROBUST_METHOD);
542 }
543
544
545
546
547
548
549
550
551
552
553
554 public static RobustRangingPositionEstimator3D create(
555 final List<? extends RadioSourceLocated<Point3D>> sources,
556 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
557 extends RadioSource>> fingerprint) {
558 return create(sources, fingerprint, DEFAULT_ROBUST_METHOD);
559 }
560
561
562
563
564
565
566
567 public static RobustRangingPositionEstimator3D create(
568 final RobustRangingPositionEstimatorListener<Point3D> listener) {
569 return create(listener, DEFAULT_ROBUST_METHOD);
570 }
571
572
573
574
575
576
577
578
579
580
581 public static RobustRangingPositionEstimator3D create(
582 final List<? extends RadioSourceLocated<Point3D>> sources,
583 final RobustRangingPositionEstimatorListener<Point3D> listener) {
584 return create(sources, listener, DEFAULT_ROBUST_METHOD);
585 }
586
587
588
589
590
591
592
593
594
595
596 public static RobustRangingPositionEstimator3D create(
597 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
598 extends RadioSource>> fingerprint,
599 final RobustRangingPositionEstimatorListener<Point3D> listener) {
600 return create(fingerprint, listener, DEFAULT_ROBUST_METHOD);
601 }
602
603
604
605
606
607
608
609
610
611
612
613
614 public static RobustRangingPositionEstimator3D create(
615 final List<? extends RadioSourceLocated<Point3D>> sources,
616 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
617 extends RadioSource>> fingerprint,
618 final RobustRangingPositionEstimatorListener<Point3D> listener) {
619 return create(sources, fingerprint, listener, DEFAULT_ROBUST_METHOD);
620 }
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635 public static RobustRangingPositionEstimator3D create(
636 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores) {
637 return create(sourceQualityScores, fingerprintReadingQualityScores, DEFAULT_ROBUST_METHOD);
638 }
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657 public static RobustRangingPositionEstimator3D create(
658 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
659 List<? extends RadioSourceLocated<Point3D>> sources) {
660 return create(sourceQualityScores, fingerprintReadingQualityScores, sources, DEFAULT_ROBUST_METHOD);
661 }
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680 public static RobustRangingPositionEstimator3D create(
681 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
682 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
683 extends RadioSource>> fingerprint) {
684 return create(sourceQualityScores, fingerprintReadingQualityScores, fingerprint, DEFAULT_ROBUST_METHOD);
685 }
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707 public static RobustRangingPositionEstimator3D create(
708 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
709 final List<? extends RadioSourceLocated<Point3D>> sources,
710 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
711 extends RadioSource>> fingerprint) {
712 return create(sourceQualityScores, fingerprintReadingQualityScores, sources, fingerprint,
713 DEFAULT_ROBUST_METHOD);
714 }
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730 public static RobustRangingPositionEstimator3D create(
731 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
732 final RobustRangingPositionEstimatorListener<Point3D> listener) {
733 return create(sourceQualityScores, fingerprintReadingQualityScores, listener, DEFAULT_ROBUST_METHOD);
734 }
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754 public static RobustRangingPositionEstimator3D create(
755 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
756 final List<? extends RadioSourceLocated<Point3D>> sources,
757 final RobustRangingPositionEstimatorListener<Point3D> listener) {
758 return create(sourceQualityScores, fingerprintReadingQualityScores, sources, listener, DEFAULT_ROBUST_METHOD);
759 }
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779 public static RobustRangingPositionEstimator3D create(
780 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
781 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
782 extends RadioSource>> fingerprint,
783 final RobustRangingPositionEstimatorListener<Point3D> listener) {
784 return create(sourceQualityScores, fingerprintReadingQualityScores, fingerprint, listener,
785 DEFAULT_ROBUST_METHOD);
786 }
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809 public static RobustRangingPositionEstimator3D create(
810 final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
811 final List<? extends RadioSourceLocated<Point3D>> sources,
812 final RangingFingerprint<? extends RadioSource, ? extends RangingReading<?
813 extends RadioSource>> fingerprint, final RobustRangingPositionEstimatorListener<Point3D> listener) {
814 return create(sourceQualityScores, fingerprintReadingQualityScores, sources, fingerprint, listener,
815 DEFAULT_ROBUST_METHOD);
816 }
817
818
819
820
821
822
823
824
825
826
827
828 @Override
829 @SuppressWarnings("Duplicates")
830 protected void setPositionsDistancesDistanceStandardDeviationsAndQualityScores(
831 final List<Point3D> positions, List<Double> distances, final List<Double> distanceStandardDeviations,
832 final List<Double> distanceQualityScores) {
833 final var size = positions.size();
834 Point3D[] positionsArray = new InhomogeneousPoint3D[size];
835 positionsArray = positions.toArray(positionsArray);
836
837 final var distancesArray = new double[size];
838 final var distanceStandardDeviationsArray = new double[size];
839
840 double[] qualityScoresArray = null;
841 if (distanceQualityScores != null) {
842 qualityScoresArray = new double[size];
843 }
844
845 for (var i = 0; i < size; i++) {
846 distancesArray[i] = distances.get(i);
847 distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
848
849 if (qualityScoresArray != null) {
850 qualityScoresArray[i] = distanceQualityScores.get(i);
851 }
852 }
853
854 try {
855 laterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
856 distanceStandardDeviationsArray);
857
858 if (qualityScoresArray != null) {
859 laterationSolver.setQualityScores(qualityScoresArray);
860 }
861 } catch (final LockedException e) {
862 throw new IllegalArgumentException(e);
863 }
864 }
865 }