1 /*
2 * Copyright (C) 2020 Alberto Irurueta Carro (alberto@irurueta.com)
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package com.irurueta.navigation.inertial.calibration.gyroscope;
17
18 import com.irurueta.algebra.Matrix;
19 import com.irurueta.navigation.LockedException;
20 import com.irurueta.navigation.NotReadyException;
21 import com.irurueta.navigation.frames.ECEFPosition;
22 import com.irurueta.navigation.frames.NEDPosition;
23 import com.irurueta.navigation.inertial.calibration.CalibrationException;
24 import com.irurueta.navigation.inertial.calibration.StandardDeviationBodyKinematics;
25 import com.irurueta.numerical.robust.LMedSRobustEstimator;
26 import com.irurueta.numerical.robust.LMedSRobustEstimatorListener;
27 import com.irurueta.numerical.robust.RobustEstimator;
28 import com.irurueta.numerical.robust.RobustEstimatorException;
29 import com.irurueta.numerical.robust.RobustEstimatorMethod;
30
31 import java.util.List;
32
33 /**
34 * Robustly estimates gyroscope cross couplings and scaling factors
35 * along with G-dependent cross biases introduced on the gyroscope by the
36 * specific forces sensed by the accelerometer using LMedS robust estimator
37 * when gyroscope biases are known.
38 * <p>
39 * This calibrator assumes that the IMU is placed flat on a turntable spinning
40 * at constant speed, but absolute orientation or position of IMU is unknown.
41 * Turntable must rotate fast enough so that Earth rotation effects can be
42 * neglected, bus slow enough so that gyroscope readings can be properly made.
43 * <p>
44 * To use this calibrator at least 10 measurements are needed when common
45 * z-axis is assumed and G-dependent cross biases are ignored, otherwise
46 * at least 13 measurements are required when common z-axis is not assumed.
47 * If G-dependent cross biases are being estimated, then at least 19
48 * measurements are needed when common z-axis is assumed, otherwise at
49 * least 22 measurements are required when common z-axis is not assumed.
50 * <p>
51 * Measured gyroscope angular rates is assumed to follow the model shown below:
52 * <pre>
53 * Ωmeas = bg + (I + Mg) * Ωtrue + Gg * ftrue + w
54 * </pre>
55 * Where:
56 * - Ωmeas is the measured gyroscope angular rates. This is a 3x1 vector.
57 * - bg is the gyroscope bias. Ideally, on a perfect gyroscope, this should be a
58 * 3x1 zero vector.
59 * - I is the 3x3 identity matrix.
60 * - Mg is the 3x3 matrix containing cross-couplings and scaling factors. Ideally, on
61 * a perfect gyroscope, this should be a 3x3 zero matrix.
62 * - Ωtrue is ground-truth gyroscope angular rates.
63 * - Gg is the G-dependent cross biases introduced by the specific forces sensed
64 * by the accelerometer. Ideally, on a perfect gyroscope, this should be a 3x3
65 * zero matrix.
66 * - ftrue is ground-truth specific force. This is a 3x1 vector.
67 * - w is measurement noise. This is a 3x1 vector.
68 */
69 public class LMedSRobustKnownBiasTurntableGyroscopeCalibrator extends RobustKnownBiasTurntableGyroscopeCalibrator {
70
71 /**
72 * Default value to be used for stop threshold. Stop threshold can be used to
73 * avoid keeping the algorithm unnecessarily iterating in case that best
74 * estimated threshold using median of residuals is not small enough. Once a
75 * solution is found that generates a threshold below this value, the
76 * algorithm will stop.
77 * The stop threshold can be used to prevent the LMedS algorithm iterating
78 * too many times in cases where samples have a very similar accuracy.
79 * For instance, in cases where proportion of outliers is very small (close
80 * to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
81 * iterate for a long time trying to find the best solution when indeed
82 * there is no need to do that if a reasonable threshold has already been
83 * reached.
84 * Because of this behaviour the stop threshold can be set to a value much
85 * lower than the one typically used in RANSAC, and yet the algorithm could
86 * still produce even smaller thresholds in estimated results.
87 */
88 public static final double DEFAULT_STOP_THRESHOLD = 5e-1;
89
90 /**
91 * Minimum allowed stop threshold value.
92 */
93 public static final double MIN_STOP_THRESHOLD = 0.0;
94
95 /**
96 * Threshold to be used to keep the algorithm iterating in case that best
97 * estimated threshold using median of residuals is not small enough. Once
98 * a solution is found that generates a threshold below this value, the
99 * algorithm will stop.
100 * The stop threshold can be used to prevent the LMedS algorithm iterating
101 * too many times in cases where samples have a very similar accuracy.
102 * For instance, in cases where proportion of outliers is very small (close
103 * to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
104 * iterate for a long time trying to find the best solution when indeed
105 * there is no need to do that if a reasonable threshold has already been
106 * reached.
107 * Because of this behaviour the stop threshold can be set to a value much
108 * lower than the one typically used in RANSAC, and yet the algorithm could
109 * still produce even smaller thresholds in estimated results.
110 */
111 private double stopThreshold = DEFAULT_STOP_THRESHOLD;
112
113 /**
114 * Constructor.
115 */
116 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator() {
117 super();
118 }
119
120 /**
121 * Constructor.
122 *
123 * @param position position where body kinematics measures
124 * have been taken.
125 * @param turntableRotationRate constant rotation rate at which the
126 * turntable is spinning. Must be
127 * expressed in radians per second (rad/s).
128 * @param timeInterval time interval between measurements being
129 * captured expressed in seconds (s).
130 * @param measurements collection of body kinematics
131 * measurements with standard deviations
132 * taken at the same position with zero
133 * velocity and unknown different
134 * orientations.
135 * @param bias known gyroscope bias. This must be 3x1 and
136 * is expressed in radians per second
137 * (rad/s).
138 * @param initialMg initial gyroscope scale factors and
139 * cross coupling errors matrix. Must
140 * be 3x3.
141 * @param initialGg initial gyroscope G-dependent cross
142 * biases introduced on the gyroscope by
143 * the specific forces sensed by the
144 * accelerometer. Must be 3x3.
145 * @throws IllegalArgumentException if any of the provided values does
146 * not have proper size or if either
147 * turntable rotation rate or
148 * time interval is zero or negative.
149 */
150 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
151 final ECEFPosition position, final double turntableRotationRate,
152 final double timeInterval, final List<StandardDeviationBodyKinematics> measurements,
153 final Matrix bias, final Matrix initialMg, final Matrix initialGg) {
154 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg);
155 }
156
157 /**
158 * Constructor.
159 *
160 * @param position position where body kinematics measures
161 * have been taken.
162 * @param turntableRotationRate constant rotation rate at which the
163 * turntable is spinning. Must be
164 * expressed in radians per second (rad/s).
165 * @param timeInterval time interval between measurements being
166 * captured expressed in seconds (s).
167 * @param measurements collection of body kinematics
168 * measurements with standard deviations
169 * taken at the same position with zero
170 * velocity and unknown different
171 * orientations.
172 * @param bias known gyroscope bias. This must be 3x1 and
173 * is expressed in radians per second
174 * (rad/s).
175 * @param initialMg initial gyroscope scale factors and
176 * cross coupling errors matrix. Must
177 * be 3x3.
178 * @param initialGg initial gyroscope G-dependent cross
179 * biases introduced on the gyroscope by
180 * the specific forces sensed by the
181 * accelerometer. Must be 3x3.
182 * @param listener listener to handle events raised by this
183 * calibrator.
184 * @throws IllegalArgumentException if any of the provided values does
185 * not have proper size or if either
186 * turntable rotation rate or
187 * time interval is zero or negative.
188 */
189 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
190 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
191 final List<StandardDeviationBodyKinematics> measurements, final Matrix bias, final Matrix initialMg,
192 final Matrix initialGg, final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
193 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg, listener);
194 }
195
196 /**
197 * Constructor.
198 *
199 * @param position position where body kinematics measures
200 * have been taken.
201 * @param turntableRotationRate constant rotation rate at which the
202 * turntable is spinning. Must be
203 * expressed in radians per second (rad/s).
204 * @param timeInterval time interval between measurements being
205 * captured expressed in seconds (s).
206 * @param measurements collection of body kinematics
207 * measurements with standard deviations
208 * taken at the same position with zero
209 * velocity and unknown different
210 * orientations.
211 * @param bias known gyroscope bias. This must have
212 * length 3 and is expressed in radians
213 * per second (rad/s).
214 * @param initialMg initial gyroscope scale factors and
215 * cross coupling errors matrix. Must
216 * be 3x3.
217 * @param initialGg initial gyroscope G-dependent cross
218 * biases introduced on the gyroscope by
219 * the specific forces sensed by the
220 * accelerometer. Must be 3x3.
221 * @throws IllegalArgumentException if any of the provided values does
222 * not have proper size or if either
223 * turntable rotation rate or
224 * time interval is zero or negative.
225 */
226 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
227 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
228 final List<StandardDeviationBodyKinematics> measurements, final double[] bias, final Matrix initialMg,
229 final Matrix initialGg) {
230 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg);
231 }
232
233 /**
234 * Constructor.
235 *
236 * @param position position where body kinematics measures
237 * have been taken.
238 * @param turntableRotationRate constant rotation rate at which the
239 * turntable is spinning. Must be
240 * expressed in radians per second (rad/s).
241 * @param timeInterval time interval between measurements being
242 * captured expressed in seconds (s).
243 * @param measurements collection of body kinematics
244 * measurements with standard deviations
245 * taken at the same position with zero
246 * velocity and unknown different
247 * orientations.
248 * @param bias known gyroscope bias. This must have length
249 * 3 and is expressed in radians
250 * per second (rad/s).
251 * @param initialMg initial gyroscope scale factors and
252 * cross coupling errors matrix. Must
253 * be 3x3.
254 * @param initialGg initial gyroscope G-dependent cross
255 * biases introduced on the gyroscope by
256 * the specific forces sensed by the
257 * accelerometer. Must be 3x3.
258 * @param listener listener to handle events raised by
259 * this calibrator.
260 * @throws IllegalArgumentException if any of the provided values does
261 * not have proper size or if either
262 * turntable rotation rate or
263 * time interval is zero or negative.
264 */
265 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
266 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
267 final List<StandardDeviationBodyKinematics> measurements, final double[] bias, final Matrix initialMg,
268 final Matrix initialGg, final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
269 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg, listener);
270 }
271
272 /**
273 * Constructor.
274 *
275 * @param position position where body kinematics measures
276 * have been taken.
277 * @param turntableRotationRate constant rotation rate at which the
278 * turntable is spinning. Must be
279 * expressed in radians per second (rad/s).
280 * @param timeInterval time interval between measurements being
281 * captured expressed in seconds (s).
282 * @param measurements collection of body kinematics
283 * measurements with standard deviations
284 * taken at the same position with zero
285 * velocity and unknown different
286 * orientations.
287 * @param bias known gyroscope bias. This must have length
288 * 3 and is expressed in radians per
289 * second (rad/s).
290 * @param initialMg initial gyroscope scale factors and
291 * cross coupling errors matrix. Must
292 * be 3x3.
293 * @param initialGg initial gyroscope G-dependent cross
294 * biases introduced on the gyroscope by
295 * the specific forces sensed by the
296 * accelerometer. Must be 3x3.
297 * @param accelerometerBias known accelerometer bias. This must
298 * have length 3 and is expressed in
299 * meters per squared second
300 * (m/s^2).
301 * @param accelerometerMa known accelerometer scale factors and
302 * cross coupling matrix. Must be 3x3.
303 * @throws IllegalArgumentException if any of the provided values does
304 * not have proper size or if either
305 * turntable rotation rate or
306 * time interval is zero or negative.
307 */
308 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
309 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
310 final List<StandardDeviationBodyKinematics> measurements, final double[] bias, final Matrix initialMg,
311 final Matrix initialGg, final double[] accelerometerBias, final Matrix accelerometerMa) {
312 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg,
313 accelerometerBias, accelerometerMa);
314 }
315
316 /**
317 * Constructor.
318 *
319 * @param position position where body kinematics measures
320 * have been taken.
321 * @param turntableRotationRate constant rotation rate at which the
322 * turntable is spinning. Must be
323 * expressed in radians per second (rad/s).
324 * @param timeInterval time interval between measurements being
325 * captured expressed in seconds (s).
326 * @param measurements collection of body kinematics
327 * measurements with standard deviations
328 * taken at the same position with zero
329 * velocity and unknown different
330 * orientations.
331 * @param bias known gyroscope bias. This must have length
332 * 3 and is expressed in radians per
333 * second (rad/s).
334 * @param initialMg initial gyroscope scale factors and
335 * cross coupling errors matrix. Must
336 * be 3x3.
337 * @param initialGg initial gyroscope G-dependent cross
338 * biases introduced on the gyroscope by
339 * the specific forces sensed by the
340 * accelerometer. Must be 3x3.
341 * @param accelerometerBias known accelerometer bias. This must
342 * have length 3 and is expressed in
343 * meters per squared second (m/s^2).
344 * @param accelerometerMa known accelerometer scale factors and
345 * cross coupling matrix. Must be 3x3.
346 * @param listener listener to handle events raised by
347 * this calibrator.
348 * @throws IllegalArgumentException if any of the provided values does
349 * not have proper size or if either
350 * turntable rotation rate or
351 * time interval is zero or negative.
352 */
353 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
354 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
355 final List<StandardDeviationBodyKinematics> measurements, final double[] bias, final Matrix initialMg,
356 final Matrix initialGg, final double[] accelerometerBias, final Matrix accelerometerMa,
357 final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
358 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg,
359 accelerometerBias, accelerometerMa, listener);
360 }
361
362 /**
363 * Constructor.
364 *
365 * @param position position where body kinematics measures
366 * have been taken.
367 * @param turntableRotationRate constant rotation rate at which the
368 * turntable is spinning. Must be
369 * expressed in radians per second (rad/s).
370 * @param timeInterval time interval between measurements being
371 * captured expressed in seconds (s).
372 * @param measurements collection of body kinematics
373 * measurements with standard deviations
374 * taken at the same position with zero
375 * velocity and unknown different
376 * orientations.
377 * @param bias known gyroscope bias. This must be 3x1 and
378 * is expressed in radians per second
379 * (rad/s).
380 * @param initialMg initial gyroscope scale factors and
381 * cross coupling errors matrix. Must
382 * be 3x3.
383 * @param initialGg initial gyroscope G-dependent cross
384 * biases introduced on the gyroscope by
385 * the specific forces sensed by the
386 * accelerometer. Must be 3x3.
387 * @param accelerometerBias known accelerometer bias. This must
388 * have length 3 and is expressed in
389 * meters per squared second
390 * (m/s^2).
391 * @param accelerometerMa known accelerometer scale factors and
392 * cross coupling matrix. Must be 3x3.
393 * @throws IllegalArgumentException if any of the provided values does
394 * not have proper size or if either
395 * turntable rotation rate or
396 * time interval is zero or negative.
397 */
398 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
399 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
400 final List<StandardDeviationBodyKinematics> measurements, final Matrix bias, final Matrix initialMg,
401 final Matrix initialGg, final Matrix accelerometerBias, final Matrix accelerometerMa) {
402 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg,
403 accelerometerBias, accelerometerMa);
404 }
405
406 /**
407 * Constructor.
408 *
409 * @param position position where body kinematics measures
410 * have been taken.
411 * @param turntableRotationRate constant rotation rate at which the
412 * turntable is spinning. Must be
413 * expressed in radians per second (rad/s).
414 * @param timeInterval time interval between measurements being
415 * captured expressed in seconds (s).
416 * @param measurements collection of body kinematics
417 * measurements with standard deviations
418 * taken at the same position with zero
419 * velocity and unknown different
420 * orientations.
421 * @param bias known gyroscope bias. This must be 3x1 and
422 * is expressed in radians per second
423 * (rad/s).
424 * @param initialMg initial gyroscope scale factors and
425 * cross coupling errors matrix. Must
426 * be 3x3.
427 * @param initialGg initial gyroscope G-dependent cross
428 * biases introduced on the gyroscope by
429 * the specific forces sensed by the
430 * accelerometer. Must be 3x3.
431 * @param accelerometerBias known accelerometer bias. This must
432 * have length 3 and is expressed in
433 * meters per squared second (m/s^2).
434 * @param accelerometerMa known accelerometer scale factors and
435 * cross coupling matrix. Must be 3x3.
436 * @param listener listener to handle events raised by
437 * this calibrator.
438 * @throws IllegalArgumentException if any of the provided values does
439 * not have proper size or if either
440 * turntable rotation rate or
441 * time interval is zero or negative.
442 */
443 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
444 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
445 final List<StandardDeviationBodyKinematics> measurements, final Matrix bias, final Matrix initialMg,
446 final Matrix initialGg, final Matrix accelerometerBias, final Matrix accelerometerMa,
447 final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
448 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg,
449 accelerometerBias, accelerometerMa, listener);
450 }
451
452 /**
453 * Constructor.
454 *
455 * @param position position where body kinematics
456 * measures have been taken.
457 * @param turntableRotationRate constant rotation rate at which
458 * the turntable is spinning. Must
459 * be expressed in radians per
460 * second (rad/s).
461 * @param timeInterval time interval between measurements
462 * being captured expressed in
463 * seconds (s).
464 * @param measurements collection of body kinematics
465 * measurements with standard
466 * deviations taken at the same
467 * position with zero velocity
468 * and unknown different
469 * orientations.
470 * @param commonAxisUsed indicates whether z-axis is
471 * assumed to be common for
472 * accelerometer and gyroscope.
473 * @param estimateGDependentCrossBiases true if G-dependent cross biases
474 * will be estimated, false
475 * otherwise.
476 * @param bias known gyroscope bias. This
477 * must be 3x1 and is expressed in
478 * radians per second (rad/s).
479 * @param initialMg initial gyroscope scale factors
480 * and cross coupling errors matrix.
481 * Must be 3x3.
482 * @param initialGg initial gyroscope G-dependent
483 * cross biases introduced on the
484 * gyroscope by the specific
485 * forces sensed by the
486 * accelerometer. Must be 3x3.
487 * @throws IllegalArgumentException if any of the provided values does
488 * not have proper size or if either
489 * turntable rotation rate or
490 * time interval is zero or negative.
491 */
492 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
493 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
494 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
495 final boolean estimateGDependentCrossBiases, final Matrix bias, final Matrix initialMg,
496 final Matrix initialGg) {
497 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
498 estimateGDependentCrossBiases, bias, initialMg, initialGg);
499 }
500
501 /**
502 * Constructor.
503 *
504 * @param position position where body kinematics
505 * measures have been taken.
506 * @param turntableRotationRate constant rotation rate at which
507 * the turntable is spinning. Must
508 * be expressed in radians per
509 * second (rad/s).
510 * @param timeInterval time interval between measurements
511 * being captured expressed in
512 * seconds (s).
513 * @param measurements collection of body kinematics
514 * measurements with standard
515 * deviations taken at the same
516 * position with zero velocity and
517 * unknown different orientations.
518 * @param commonAxisUsed indicates whether z-axis is
519 * assumed to be common for
520 * accelerometer and gyroscope.
521 * @param estimateGDependentCrossBiases true if G-dependent cross
522 * biases will be estimated, false
523 * otherwise.
524 * @param bias known gyroscope bias. This
525 * must be 3x1 and is expressed in
526 * radians per second (rad/s).
527 * @param initialMg initial gyroscope scale factors
528 * and cross coupling errors
529 * matrix. Must be 3x3.
530 * @param initialGg initial gyroscope G-dependent
531 * cross biases introduced on the
532 * gyroscope by the specific
533 * forces sensed by the
534 * accelerometer. Must be 3x3.
535 * @param listener listener to handle events
536 * raised by this calibrator.
537 * @throws IllegalArgumentException if any of the provided values does
538 * not have proper size or if either
539 * turntable rotation rate or
540 * time interval is zero or negative.
541 */
542 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
543 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
544 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
545 final boolean estimateGDependentCrossBiases, final Matrix bias, final Matrix initialMg,
546 final Matrix initialGg, final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
547 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
548 estimateGDependentCrossBiases, bias, initialMg, initialGg, listener);
549 }
550
551 /**
552 * Constructor.
553 *
554 * @param position position where body kinematics
555 * measures have been taken.
556 * @param turntableRotationRate constant rotation rate at which
557 * the turntable is spinning. Must
558 * be expressed in radians per
559 * second (rad/s).
560 * @param timeInterval time interval between measurements
561 * being captured expressed in
562 * seconds (s).
563 * @param measurements collection of body kinematics
564 * measurements with standard
565 * deviations taken at the same
566 * position with zero velocity
567 * and unknown different
568 * orientations.
569 * @param commonAxisUsed indicates whether z-axis is
570 * assumed to be common for
571 * accelerometer and gyroscope.
572 * @param estimateGDependentCrossBiases true if G-dependent cross biases
573 * will be estimated, false
574 * otherwise.
575 * @param bias known gyroscope bias. This
576 * must have length 3 and is
577 * expressed in radians per second
578 * (rad/s).
579 * @param initialMg initial gyroscope scale factors
580 * and cross coupling errors matrix.
581 * Must be 3x3.
582 * @param initialGg initial gyroscope G-dependent
583 * cross biases introduced on the
584 * gyroscope by the specific forces
585 * sensed by the accelerometer.
586 * Must be 3x3.
587 * @throws IllegalArgumentException if any of the provided values does
588 * not have proper size or if either
589 * turntable rotation rate or
590 * time interval is zero or negative.
591 */
592 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
593 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
594 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
595 final boolean estimateGDependentCrossBiases, final double[] bias, final Matrix initialMg,
596 final Matrix initialGg) {
597 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
598 estimateGDependentCrossBiases, bias, initialMg, initialGg);
599 }
600
601 /**
602 * Constructor.
603 *
604 * @param position position where body kinematics
605 * measures have been taken.
606 * @param turntableRotationRate constant rotation rate at which
607 * the turntable is spinning. Must
608 * be expressed in radians per
609 * second (rad/s).
610 * @param timeInterval time interval between measurements
611 * being captured expressed in
612 * seconds (s).
613 * @param measurements collection of body kinematics
614 * measurements with standard
615 * deviations taken at the same
616 * position with zero velocity
617 * and unknown different
618 * orientations.
619 * @param commonAxisUsed indicates whether z-axis is
620 * assumed to be common for
621 * accelerometer and gyroscope.
622 * @param estimateGDependentCrossBiases true if G-dependent cross biases
623 * will be estimated, false
624 * otherwise.
625 * @param bias known gyroscope bias. This
626 * must have length 3 and is
627 * expressed in radians per second
628 * (rad/s).
629 * @param initialMg initial gyroscope scale factors
630 * and cross coupling errors
631 * matrix. Must be 3x3.
632 * @param initialGg initial gyroscope G-dependent
633 * cross biases introduced on the
634 * gyroscope by the specific forces
635 * sensed by the accelerometer.
636 * Must be 3x3.
637 * @param listener listener to handle events raised
638 * by this calibrator.
639 * @throws IllegalArgumentException if any of the provided values does
640 * not have proper size or if either
641 * turntable rotation rate or
642 * time interval is zero or negative.
643 */
644 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
645 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
646 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
647 final boolean estimateGDependentCrossBiases, final double[] bias, final Matrix initialMg,
648 final Matrix initialGg, final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
649 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
650 estimateGDependentCrossBiases, bias, initialMg, initialGg, listener);
651 }
652
653 /**
654 * Constructor.
655 *
656 * @param position position where body kinematics
657 * measures have been taken.
658 * @param turntableRotationRate constant rotation rate at which
659 * the turntable is spinning. Must
660 * be expressed in radians per
661 * second (rad/s).
662 * @param timeInterval time interval between measurements
663 * being captured expressed in
664 * seconds (s).
665 * @param measurements collection of body kinematics
666 * measurements with standard
667 * deviations taken at the same
668 * position with zero velocity
669 * and unknown different
670 * orientations.
671 * @param commonAxisUsed indicates whether z-axis is
672 * assumed to be common for
673 * accelerometer and gyroscope.
674 * @param estimateGDependentCrossBiases true if G-dependent cross
675 * biases will be estimated,
676 * false otherwise.
677 * @param bias known gyroscope bias. This
678 * must have length 3 and is
679 * expressed in radians per second
680 * (rad/s).
681 * @param initialMg initial gyroscope scale factors
682 * and cross coupling errors
683 * matrix. Must be 3x3.
684 * @param initialGg initial gyroscope G-dependent
685 * cross biases introduced on the
686 * gyroscope by the specific forces
687 * sensed by the accelerometer.
688 * Must be 3x3.
689 * @param accelerometerBias known accelerometer bias. This
690 * must have length 3 and is
691 * expressed in meters per squared
692 * second (m/s^2).
693 * @param accelerometerMa known accelerometer scale factors
694 * and cross coupling matrix. Must
695 * be 3x3.
696 * @throws IllegalArgumentException if any of the provided values does
697 * not have proper size or if either
698 * turntable rotation rate or
699 * time interval is zero or negative.
700 */
701 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
702 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
703 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
704 final boolean estimateGDependentCrossBiases, final double[] bias, final Matrix initialMg,
705 final Matrix initialGg, final double[] accelerometerBias, final Matrix accelerometerMa) {
706 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
707 estimateGDependentCrossBiases, bias, initialMg, initialGg, accelerometerBias, accelerometerMa);
708 }
709
710 /**
711 * Constructor.
712 *
713 * @param position position where body kinematics
714 * measures have been taken.
715 * @param turntableRotationRate constant rotation rate at which
716 * the turntable is spinning. Must
717 * be expressed in radians per
718 * second (rad/s).
719 * @param timeInterval time interval between measurements
720 * being captured expressed in
721 * seconds (s).
722 * @param measurements collection of body kinematics
723 * measurements with standard
724 * deviations taken at the same
725 * position with zero velocity
726 * and unknown different
727 * orientations.
728 * @param commonAxisUsed indicates whether z-axis is
729 * assumed to be common for
730 * accelerometer and gyroscope.
731 * @param estimateGDependentCrossBiases true if G-dependent cross biases
732 * will be estimated, false
733 * otherwise.
734 * @param bias known gyroscope bias. This must
735 * have length 3 and is expressed
736 * in radians per second (rad/s).
737 * @param initialMg initial gyroscope scale factors
738 * and cross coupling errors matrix.
739 * Must be 3x3.
740 * @param initialGg initial gyroscope G-dependent
741 * cross biases introduced on the
742 * gyroscope by the specific forces
743 * sensed by the accelerometer. Must
744 * be 3x3.
745 * @param accelerometerBias known accelerometer bias. This
746 * must have length 3 and is
747 * expressed in meters per squared
748 * second (m/s^2).
749 * @param accelerometerMa known accelerometer scale factors
750 * and cross coupling matrix. Must
751 * be 3x3.
752 * @param listener listener to handle events raised
753 * by this calibrator.
754 * @throws IllegalArgumentException if any of the provided values does
755 * not have proper size or if either
756 * turntable rotation rate or
757 * time interval is zero or negative.
758 */
759 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
760 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
761 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
762 final boolean estimateGDependentCrossBiases, final double[] bias, final Matrix initialMg,
763 final Matrix initialGg, final double[] accelerometerBias, final Matrix accelerometerMa,
764 final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
765 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
766 estimateGDependentCrossBiases, bias, initialMg, initialGg, accelerometerBias, accelerometerMa,
767 listener);
768 }
769
770 /**
771 * Constructor.
772 *
773 * @param position position where body kinematics
774 * measures have been taken.
775 * @param turntableRotationRate constant rotation rate at which
776 * the turntable is spinning. Must
777 * be expressed in radians per
778 * second (rad/s).
779 * @param timeInterval time interval between measurements
780 * being captured expressed in
781 * seconds (s).
782 * @param measurements collection of body kinematics
783 * measurements with standard
784 * deviations taken at the same
785 * position with zero velocity and
786 * unknown different orientations.
787 * @param commonAxisUsed indicates whether z-axis is
788 * assumed to be common for
789 * accelerometer and gyroscope.
790 * @param estimateGDependentCrossBiases true if G-dependent cross biases
791 * will be estimated, false
792 * otherwise.
793 * @param bias known gyroscope bias. This
794 * must be 3x1 and is expressed in
795 * radians per second (rad/s).
796 * @param initialMg initial gyroscope scale factors
797 * and cross coupling errors matrix.
798 * Must be 3x3.
799 * @param initialGg initial gyroscope G-dependent
800 * cross biases introduced on the
801 * gyroscope by the specific forces
802 * sensed by the accelerometer. Must
803 * be 3x3.
804 * @param accelerometerBias known accelerometer bias. This
805 * must have length 3 and is
806 * expressed in meters per squared
807 * second (m/s^2).
808 * @param accelerometerMa known accelerometer scale factors
809 * and cross coupling matrix. Must
810 * be 3x3.
811 * @throws IllegalArgumentException if any of the provided values does
812 * not have proper size or if either
813 * turntable rotation rate or
814 * time interval is zero or negative.
815 */
816 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
817 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
818 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
819 final boolean estimateGDependentCrossBiases, final Matrix bias, final Matrix initialMg,
820 final Matrix initialGg, final Matrix accelerometerBias, final Matrix accelerometerMa) {
821 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
822 estimateGDependentCrossBiases, bias, initialMg, initialGg, accelerometerBias, accelerometerMa);
823 }
824
825 /**
826 * Constructor.
827 *
828 * @param position position where body kinematics
829 * measures have been taken.
830 * @param turntableRotationRate constant rotation rate at which
831 * the turntable is spinning. Must
832 * be expressed in radians per
833 * second (rad/s).
834 * @param timeInterval time interval between measurements
835 * being captured expressed in
836 * seconds (s).
837 * @param measurements collection of body kinematics
838 * measurements with standard
839 * deviations taken at the same
840 * position with zero velocity and
841 * unknown different orientations.
842 * @param commonAxisUsed indicates whether z-axis is
843 * assumed to be common for
844 * accelerometer and gyroscope.
845 * @param estimateGDependentCrossBiases true if G-dependent cross biases
846 * will be estimated, false
847 * otherwise.
848 * @param bias known gyroscope bias. This must be
849 * 3x1 and is expressed in radians
850 * per second (rad/s).
851 * @param initialMg initial gyroscope scale factors
852 * and cross coupling errors matrix.
853 * Must be 3x3.
854 * @param initialGg initial gyroscope G-dependent
855 * cross biases introduced on the
856 * gyroscope by the specific forces
857 * sensed by the accelerometer. Must
858 * be 3x3.
859 * @param accelerometerBias known accelerometer bias. This
860 * must have length 3 and is
861 * expressed in meters per squared
862 * second (m/s^2).
863 * @param accelerometerMa known accelerometer scale factors
864 * and cross coupling matrix. Must
865 * be 3x3.
866 * @param listener listener to handle events raised
867 * by this calibrator.
868 * @throws IllegalArgumentException if any of the provided values does
869 * not have proper size or if either
870 * turntable rotation rate or
871 * time interval is zero or negative.
872 */
873 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
874 final ECEFPosition position, final double turntableRotationRate, final double timeInterval,
875 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
876 final boolean estimateGDependentCrossBiases, final Matrix bias, final Matrix initialMg,
877 final Matrix initialGg, final Matrix accelerometerBias, final Matrix accelerometerMa,
878 final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
879 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
880 estimateGDependentCrossBiases, bias, initialMg, initialGg, accelerometerBias, accelerometerMa,
881 listener);
882 }
883
884 /**
885 * Constructor.
886 *
887 * @param position position where body kinematics measures
888 * have been taken.
889 * @param turntableRotationRate constant rotation rate at which the
890 * turntable is spinning. Must be
891 * expressed in radians per second (rad/s).
892 * @param timeInterval time interval between measurements being
893 * captured expressed in seconds (s).
894 * @param measurements collection of body kinematics
895 * measurements with standard deviations
896 * taken at the same position with zero
897 * velocity and unknown different
898 * orientations.
899 * @param bias known gyroscope bias. This must be 3x1 and
900 * is expressed in radians per second
901 * (rad/s).
902 * @param initialMg initial gyroscope scale factors and
903 * cross coupling errors matrix. Must
904 * be 3x3.
905 * @param initialGg initial gyroscope G-dependent cross
906 * biases introduced on the gyroscope by
907 * the specific forces sensed by the
908 * accelerometer. Must be 3x3.
909 * @throws IllegalArgumentException if any of the provided values does
910 * not have proper size or if either
911 * turntable rotation rate or
912 * time interval is zero or negative.
913 */
914 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
915 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
916 final List<StandardDeviationBodyKinematics> measurements, final Matrix bias, final Matrix initialMg,
917 final Matrix initialGg) {
918 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg);
919 }
920
921 /**
922 * Constructor.
923 *
924 * @param position position where body kinematics measures
925 * have been taken.
926 * @param turntableRotationRate constant rotation rate at which the
927 * turntable is spinning. Must be
928 * expressed in radians per second (rad/s).
929 * @param timeInterval time interval between measurements being
930 * captured expressed in seconds (s).
931 * @param measurements collection of body kinematics
932 * measurements with standard deviations
933 * taken at the same position with zero
934 * velocity and unknown different
935 * orientations.
936 * @param bias known gyroscope bias. This must be 3x1 and
937 * is expressed in radians per second
938 * (rad/s).
939 * @param initialMg initial gyroscope scale factors and
940 * cross coupling errors matrix. Must
941 * be 3x3.
942 * @param initialGg initial gyroscope G-dependent cross
943 * biases introduced on the gyroscope by
944 * the specific forces sensed by the
945 * accelerometer. Must be 3x3.
946 * @param listener listener to handle events raised by this
947 * calibrator.
948 * @throws IllegalArgumentException if any of the provided values does
949 * not have proper size or if either
950 * turntable rotation rate or
951 * time interval is zero or negative.
952 */
953 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
954 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
955 final List<StandardDeviationBodyKinematics> measurements, final Matrix bias, final Matrix initialMg,
956 final Matrix initialGg, final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
957 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg, listener);
958 }
959
960 /**
961 * Constructor.
962 *
963 * @param position position where body kinematics measures
964 * have been taken.
965 * @param turntableRotationRate constant rotation rate at which the
966 * turntable is spinning. Must be
967 * expressed in radians per second (rad/s).
968 * @param timeInterval time interval between measurements being
969 * captured expressed in seconds (s).
970 * @param measurements collection of body kinematics
971 * measurements with standard deviations
972 * taken at the same position with zero
973 * velocity and unknown different
974 * orientations.
975 * @param bias known gyroscope bias. This must have
976 * length 3 and is expressed in radians
977 * per second (rad/s).
978 * @param initialMg initial gyroscope scale factors and
979 * cross coupling errors matrix. Must
980 * be 3x3.
981 * @param initialGg initial gyroscope G-dependent cross
982 * biases introduced on the gyroscope by
983 * the specific forces sensed by the
984 * accelerometer. Must be 3x3.
985 * @throws IllegalArgumentException if any of the provided values does
986 * not have proper size or if either
987 * turntable rotation rate or
988 * time interval is zero or negative.
989 */
990 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
991 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
992 final List<StandardDeviationBodyKinematics> measurements, final double[] bias, final Matrix initialMg,
993 final Matrix initialGg) {
994 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg);
995 }
996
997 /**
998 * Constructor.
999 *
1000 * @param position position where body kinematics measures
1001 * have been taken.
1002 * @param turntableRotationRate constant rotation rate at which the
1003 * turntable is spinning. Must be
1004 * expressed in radians per second (rad/s).
1005 * @param timeInterval time interval between measurements being
1006 * captured expressed in seconds (s).
1007 * @param measurements collection of body kinematics
1008 * measurements with standard deviations
1009 * taken at the same position with zero
1010 * velocity and unknown different
1011 * orientations.
1012 * @param bias known gyroscope bias. This must have length
1013 * 3 and is expressed in radians
1014 * per second (rad/s).
1015 * @param initialMg initial gyroscope scale factors and
1016 * cross coupling errors matrix. Must
1017 * be 3x3.
1018 * @param initialGg initial gyroscope G-dependent cross
1019 * biases introduced on the gyroscope by
1020 * the specific forces sensed by the
1021 * accelerometer. Must be 3x3.
1022 * @param listener listener to handle events raised by
1023 * this calibrator.
1024 * @throws IllegalArgumentException if any of the provided values does
1025 * not have proper size or if either
1026 * turntable rotation rate or
1027 * time interval is zero or negative.
1028 */
1029 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1030 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1031 final List<StandardDeviationBodyKinematics> measurements, final double[] bias, final Matrix initialMg,
1032 final Matrix initialGg, final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
1033 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg, listener);
1034 }
1035
1036 /**
1037 * Constructor.
1038 *
1039 * @param position position where body kinematics measures
1040 * have been taken.
1041 * @param turntableRotationRate constant rotation rate at which the
1042 * turntable is spinning. Must be
1043 * expressed in radians per second (rad/s).
1044 * @param timeInterval time interval between measurements being
1045 * captured expressed in seconds (s).
1046 * @param measurements collection of body kinematics
1047 * measurements with standard deviations
1048 * taken at the same position with zero
1049 * velocity and unknown different
1050 * orientations.
1051 * @param bias known gyroscope bias. This must have length
1052 * 3 and is expressed in radians per
1053 * second (rad/s).
1054 * @param initialMg initial gyroscope scale factors and
1055 * cross coupling errors matrix. Must
1056 * be 3x3.
1057 * @param initialGg initial gyroscope G-dependent cross
1058 * biases introduced on the gyroscope by
1059 * the specific forces sensed by the
1060 * accelerometer. Must be 3x3.
1061 * @param accelerometerBias known accelerometer bias. This must
1062 * have length 3 and is expressed in
1063 * meters per squared second
1064 * (m/s^2).
1065 * @param accelerometerMa known accelerometer scale factors and
1066 * cross coupling matrix. Must be 3x3.
1067 * @throws IllegalArgumentException if any of the provided values does
1068 * not have proper size or if either
1069 * turntable rotation rate or
1070 * time interval is zero or negative.
1071 */
1072 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1073 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1074 final List<StandardDeviationBodyKinematics> measurements, final double[] bias,
1075 final Matrix initialMg, final Matrix initialGg, final double[] accelerometerBias,
1076 final Matrix accelerometerMa) {
1077 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg,
1078 accelerometerBias, accelerometerMa);
1079 }
1080
1081 /**
1082 * Constructor.
1083 *
1084 * @param position position where body kinematics measures
1085 * have been taken.
1086 * @param turntableRotationRate constant rotation rate at which the
1087 * turntable is spinning. Must be
1088 * expressed in radians per second (rad/s).
1089 * @param timeInterval time interval between measurements being
1090 * captured expressed in seconds (s).
1091 * @param measurements collection of body kinematics
1092 * measurements with standard deviations
1093 * taken at the same position with zero
1094 * velocity and unknown different
1095 * orientations.
1096 * @param bias known gyroscope bias. This must have length
1097 * 3 and is expressed in radians per
1098 * second (rad/s).
1099 * @param initialMg initial gyroscope scale factors and
1100 * cross coupling errors matrix. Must
1101 * be 3x3.
1102 * @param initialGg initial gyroscope G-dependent cross
1103 * biases introduced on the gyroscope by
1104 * the specific forces sensed by the
1105 * accelerometer. Must be 3x3.
1106 * @param accelerometerBias known accelerometer bias. This must
1107 * have length 3 and is expressed in
1108 * meters per squared second (m/s^2).
1109 * @param accelerometerMa known accelerometer scale factors and
1110 * cross coupling matrix. Must be 3x3.
1111 * @param listener listener to handle events raised by
1112 * this calibrator.
1113 * @throws IllegalArgumentException if any of the provided values does
1114 * not have proper size or if either
1115 * turntable rotation rate or
1116 * time interval is zero or negative.
1117 */
1118 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1119 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1120 final List<StandardDeviationBodyKinematics> measurements, final double[] bias, final Matrix initialMg,
1121 final Matrix initialGg, final double[] accelerometerBias, final Matrix accelerometerMa,
1122 final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
1123 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg,
1124 accelerometerBias, accelerometerMa, listener);
1125 }
1126
1127 /**
1128 * Constructor.
1129 *
1130 * @param position position where body kinematics measures
1131 * have been taken.
1132 * @param turntableRotationRate constant rotation rate at which the
1133 * turntable is spinning. Must be
1134 * expressed in radians per second (rad/s).
1135 * @param timeInterval time interval between measurements being
1136 * captured expressed in seconds (s).
1137 * @param measurements collection of body kinematics
1138 * measurements with standard deviations
1139 * taken at the same position with zero
1140 * velocity and unknown different
1141 * orientations.
1142 * @param bias known gyroscope bias. This must be 3x1 and
1143 * is expressed in radians per second
1144 * (rad/s).
1145 * @param initialMg initial gyroscope scale factors and
1146 * cross coupling errors matrix. Must
1147 * be 3x3.
1148 * @param initialGg initial gyroscope G-dependent cross
1149 * biases introduced on the gyroscope by
1150 * the specific forces sensed by the
1151 * accelerometer. Must be 3x3.
1152 * @param accelerometerBias known accelerometer bias. This must
1153 * have length 3 and is expressed in
1154 * meters per squared second
1155 * (m/s^2).
1156 * @param accelerometerMa known accelerometer scale factors and
1157 * cross coupling matrix. Must be 3x3.
1158 * @throws IllegalArgumentException if any of the provided values does
1159 * not have proper size or if either
1160 * turntable rotation rate or
1161 * time interval is zero or negative.
1162 */
1163 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1164 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1165 final List<StandardDeviationBodyKinematics> measurements, final Matrix bias, final Matrix initialMg,
1166 final Matrix initialGg, final Matrix accelerometerBias, final Matrix accelerometerMa) {
1167 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg,
1168 accelerometerBias, accelerometerMa);
1169 }
1170
1171 /**
1172 * Constructor.
1173 *
1174 * @param position position where body kinematics measures
1175 * have been taken.
1176 * @param turntableRotationRate constant rotation rate at which the
1177 * turntable is spinning. Must be
1178 * expressed in radians per second (rad/s).
1179 * @param timeInterval time interval between measurements being
1180 * captured expressed in seconds (s).
1181 * @param measurements collection of body kinematics
1182 * measurements with standard deviations
1183 * taken at the same position with zero
1184 * velocity and unknown different
1185 * orientations.
1186 * @param bias known gyroscope bias. This must be 3x1 and
1187 * is expressed in radians per second
1188 * (rad/s).
1189 * @param initialMg initial gyroscope scale factors and
1190 * cross coupling errors matrix. Must
1191 * be 3x3.
1192 * @param initialGg initial gyroscope G-dependent cross
1193 * biases introduced on the gyroscope by
1194 * the specific forces sensed by the
1195 * accelerometer. Must be 3x3.
1196 * @param accelerometerBias known accelerometer bias. This must
1197 * have length 3 and is expressed in
1198 * meters per squared second (m/s^2).
1199 * @param accelerometerMa known accelerometer scale factors and
1200 * cross coupling matrix. Must be 3x3.
1201 * @param listener listener to handle events raised by
1202 * this calibrator.
1203 * @throws IllegalArgumentException if any of the provided values does
1204 * not have proper size or if either
1205 * turntable rotation rate or
1206 * time interval is zero or negative.
1207 */
1208 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1209 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1210 final List<StandardDeviationBodyKinematics> measurements, final Matrix bias, final Matrix initialMg,
1211 final Matrix initialGg, final Matrix accelerometerBias, final Matrix accelerometerMa,
1212 final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
1213 super(position, turntableRotationRate, timeInterval, measurements, bias, initialMg, initialGg,
1214 accelerometerBias, accelerometerMa, listener);
1215 }
1216
1217 /**
1218 * Constructor.
1219 *
1220 * @param position position where body kinematics
1221 * measures have been taken.
1222 * @param turntableRotationRate constant rotation rate at which
1223 * the turntable is spinning. Must
1224 * be expressed in radians per
1225 * second (rad/s).
1226 * @param timeInterval time interval between measurements
1227 * being captured expressed in
1228 * seconds (s).
1229 * @param measurements collection of body kinematics
1230 * measurements with standard
1231 * deviations taken at the same
1232 * position with zero velocity
1233 * and unknown different
1234 * orientations.
1235 * @param commonAxisUsed indicates whether z-axis is
1236 * assumed to be common for
1237 * accelerometer and gyroscope.
1238 * @param estimateGDependentCrossBiases true if G-dependent cross biases
1239 * will be estimated, false
1240 * otherwise.
1241 * @param bias known gyroscope bias. This
1242 * must be 3x1 and is expressed in
1243 * radians per second (rad/s).
1244 * @param initialMg initial gyroscope scale factors
1245 * and cross coupling errors matrix.
1246 * Must be 3x3.
1247 * @param initialGg initial gyroscope G-dependent
1248 * cross biases introduced on the
1249 * gyroscope by the specific
1250 * forces sensed by the
1251 * accelerometer. Must be 3x3.
1252 * @throws IllegalArgumentException if any of the provided values does
1253 * not have proper size or if either
1254 * turntable rotation rate or
1255 * time interval is zero or negative.
1256 */
1257 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1258 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1259 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
1260 final boolean estimateGDependentCrossBiases, final Matrix bias, final Matrix initialMg,
1261 final Matrix initialGg) {
1262 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
1263 estimateGDependentCrossBiases, bias, initialMg, initialGg);
1264 }
1265
1266 /**
1267 * Constructor.
1268 *
1269 * @param position position where body kinematics
1270 * measures have been taken.
1271 * @param turntableRotationRate constant rotation rate at which
1272 * the turntable is spinning. Must
1273 * be expressed in radians per
1274 * second (rad/s).
1275 * @param timeInterval time interval between measurements
1276 * being captured expressed in
1277 * seconds (s).
1278 * @param measurements collection of body kinematics
1279 * measurements with standard
1280 * deviations taken at the same
1281 * position with zero velocity and
1282 * unknown different orientations.
1283 * @param commonAxisUsed indicates whether z-axis is
1284 * assumed to be common for
1285 * accelerometer and gyroscope.
1286 * @param estimateGDependentCrossBiases true if G-dependent cross
1287 * biases will be estimated, false
1288 * otherwise.
1289 * @param bias known gyroscope bias. This
1290 * must be 3x1 and is expressed in
1291 * radians per second (rad/s).
1292 * @param initialMg initial gyroscope scale factors
1293 * and cross coupling errors
1294 * matrix. Must be 3x3.
1295 * @param initialGg initial gyroscope G-dependent
1296 * cross biases introduced on the
1297 * gyroscope by the specific
1298 * forces sensed by the
1299 * accelerometer. Must be 3x3.
1300 * @param listener listener to handle events
1301 * raised by this calibrator.
1302 * @throws IllegalArgumentException if any of the provided values does
1303 * not have proper size or if either
1304 * turntable rotation rate or
1305 * time interval is zero or negative.
1306 */
1307 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1308 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1309 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
1310 final boolean estimateGDependentCrossBiases, final Matrix bias, final Matrix initialMg,
1311 final Matrix initialGg, final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
1312 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
1313 estimateGDependentCrossBiases, bias, initialMg, initialGg, listener);
1314 }
1315
1316 /**
1317 * Constructor.
1318 *
1319 * @param position position where body kinematics
1320 * measures have been taken.
1321 * @param turntableRotationRate constant rotation rate at which
1322 * the turntable is spinning. Must
1323 * be expressed in radians per
1324 * second (rad/s).
1325 * @param timeInterval time interval between measurements
1326 * being captured expressed in
1327 * seconds (s).
1328 * @param measurements collection of body kinematics
1329 * measurements with standard
1330 * deviations taken at the same
1331 * position with zero velocity
1332 * and unknown different
1333 * orientations.
1334 * @param commonAxisUsed indicates whether z-axis is
1335 * assumed to be common for
1336 * accelerometer and gyroscope.
1337 * @param estimateGDependentCrossBiases true if G-dependent cross biases
1338 * will be estimated, false
1339 * otherwise.
1340 * @param bias known gyroscope bias. This
1341 * must have length 3 and is
1342 * expressed in radians per second
1343 * (rad/s).
1344 * @param initialMg initial gyroscope scale factors
1345 * and cross coupling errors matrix.
1346 * Must be 3x3.
1347 * @param initialGg initial gyroscope G-dependent
1348 * cross biases introduced on the
1349 * gyroscope by the specific forces
1350 * sensed by the accelerometer.
1351 * Must be 3x3.
1352 * @throws IllegalArgumentException if any of the provided values does
1353 * not have proper size or if either
1354 * turntable rotation rate or
1355 * time interval is zero or negative.
1356 */
1357 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1358 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1359 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
1360 final boolean estimateGDependentCrossBiases, final double[] bias, final Matrix initialMg,
1361 final Matrix initialGg) {
1362 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
1363 estimateGDependentCrossBiases, bias, initialMg, initialGg);
1364 }
1365
1366 /**
1367 * Constructor.
1368 *
1369 * @param position position where body kinematics
1370 * measures have been taken.
1371 * @param turntableRotationRate constant rotation rate at which
1372 * the turntable is spinning. Must
1373 * be expressed in radians per
1374 * second (rad/s).
1375 * @param timeInterval time interval between measurements
1376 * being captured expressed in
1377 * seconds (s).
1378 * @param measurements collection of body kinematics
1379 * measurements with standard
1380 * deviations taken at the same
1381 * position with zero velocity
1382 * and unknown different
1383 * orientations.
1384 * @param commonAxisUsed indicates whether z-axis is
1385 * assumed to be common for
1386 * accelerometer and gyroscope.
1387 * @param estimateGDependentCrossBiases true if G-dependent cross biases
1388 * will be estimated, false
1389 * otherwise.
1390 * @param bias known gyroscope bias. This
1391 * must have length 3 and is
1392 * expressed in radians per second
1393 * (rad/s).
1394 * @param initialMg initial gyroscope scale factors
1395 * and cross coupling errors
1396 * matrix. Must be 3x3.
1397 * @param initialGg initial gyroscope G-dependent
1398 * cross biases introduced on the
1399 * gyroscope by the specific forces
1400 * sensed by the accelerometer.
1401 * Must be 3x3.
1402 * @param listener listener to handle events raised
1403 * by this calibrator.
1404 * @throws IllegalArgumentException if any of the provided values does
1405 * not have proper size or if either
1406 * turntable rotation rate or
1407 * time interval is zero or negative.
1408 */
1409 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1410 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1411 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
1412 final boolean estimateGDependentCrossBiases, final double[] bias, final Matrix initialMg,
1413 final Matrix initialGg, final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
1414 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
1415 estimateGDependentCrossBiases, bias, initialMg, initialGg, listener);
1416 }
1417
1418 /**
1419 * Constructor.
1420 *
1421 * @param position position where body kinematics
1422 * measures have been taken.
1423 * @param turntableRotationRate constant rotation rate at which
1424 * the turntable is spinning. Must
1425 * be expressed in radians per
1426 * second (rad/s).
1427 * @param timeInterval time interval between measurements
1428 * being captured expressed in
1429 * seconds (s).
1430 * @param measurements collection of body kinematics
1431 * measurements with standard
1432 * deviations taken at the same
1433 * position with zero velocity
1434 * and unknown different
1435 * orientations.
1436 * @param commonAxisUsed indicates whether z-axis is
1437 * assumed to be common for
1438 * accelerometer and gyroscope.
1439 * @param estimateGDependentCrossBiases true if G-dependent cross
1440 * biases will be estimated,
1441 * false otherwise.
1442 * @param bias known gyroscope bias. This
1443 * must have length 3 and is
1444 * expressed in radians per second
1445 * (rad/s).
1446 * @param initialMg initial gyroscope scale factors
1447 * and cross coupling errors
1448 * matrix. Must be 3x3.
1449 * @param initialGg initial gyroscope G-dependent
1450 * cross biases introduced on the
1451 * gyroscope by the specific forces
1452 * sensed by the accelerometer.
1453 * Must be 3x3.
1454 * @param accelerometerBias known accelerometer bias. This
1455 * must have length 3 and is
1456 * expressed in meters per squared
1457 * second (m/s^2).
1458 * @param accelerometerMa known accelerometer scale factors
1459 * and cross coupling matrix. Must
1460 * be 3x3.
1461 * @throws IllegalArgumentException if any of the provided values does
1462 * not have proper size or if either
1463 * turntable rotation rate or
1464 * time interval is zero or negative.
1465 */
1466 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1467 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1468 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
1469 final boolean estimateGDependentCrossBiases, final double[] bias, final Matrix initialMg,
1470 final Matrix initialGg, final double[] accelerometerBias, final Matrix accelerometerMa) {
1471 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
1472 estimateGDependentCrossBiases, bias, initialMg, initialGg, accelerometerBias, accelerometerMa);
1473 }
1474
1475 /**
1476 * Constructor.
1477 *
1478 * @param position position where body kinematics
1479 * measures have been taken.
1480 * @param turntableRotationRate constant rotation rate at which
1481 * the turntable is spinning. Must
1482 * be expressed in radians per
1483 * second (rad/s).
1484 * @param timeInterval time interval between measurements
1485 * being captured expressed in
1486 * seconds (s).
1487 * @param measurements collection of body kinematics
1488 * measurements with standard
1489 * deviations taken at the same
1490 * position with zero velocity
1491 * and unknown different
1492 * orientations.
1493 * @param commonAxisUsed indicates whether z-axis is
1494 * assumed to be common for
1495 * accelerometer and gyroscope.
1496 * @param estimateGDependentCrossBiases true if G-dependent cross biases
1497 * will be estimated, false
1498 * otherwise.
1499 * @param bias known gyroscope bias. This must
1500 * have length 3 and is expressed
1501 * in radians per second (rad/s).
1502 * @param initialMg initial gyroscope scale factors
1503 * and cross coupling errors matrix.
1504 * Must be 3x3.
1505 * @param initialGg initial gyroscope G-dependent
1506 * cross biases introduced on the
1507 * gyroscope by the specific forces
1508 * sensed by the accelerometer. Must
1509 * be 3x3.
1510 * @param accelerometerBias known accelerometer bias. This
1511 * must have length 3 and is
1512 * expressed in meters per squared
1513 * second (m/s^2).
1514 * @param accelerometerMa known accelerometer scale factors
1515 * and cross coupling matrix. Must
1516 * be 3x3.
1517 * @param listener listener to handle events raised
1518 * by this calibrator.
1519 * @throws IllegalArgumentException if any of the provided values does
1520 * not have proper size or if either
1521 * turntable rotation rate or
1522 * time interval is zero or negative.
1523 */
1524 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1525 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1526 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
1527 final boolean estimateGDependentCrossBiases, final double[] bias, final Matrix initialMg,
1528 final Matrix initialGg, final double[] accelerometerBias, final Matrix accelerometerMa,
1529 final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
1530 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
1531 estimateGDependentCrossBiases, bias, initialMg, initialGg, accelerometerBias, accelerometerMa,
1532 listener);
1533 }
1534
1535 /**
1536 * Constructor.
1537 *
1538 * @param position position where body kinematics
1539 * measures have been taken.
1540 * @param turntableRotationRate constant rotation rate at which
1541 * the turntable is spinning. Must
1542 * be expressed in radians per
1543 * second (rad/s).
1544 * @param timeInterval time interval between measurements
1545 * being captured expressed in
1546 * seconds (s).
1547 * @param measurements collection of body kinematics
1548 * measurements with standard
1549 * deviations taken at the same
1550 * position with zero velocity and
1551 * unknown different orientations.
1552 * @param commonAxisUsed indicates whether z-axis is
1553 * assumed to be common for
1554 * accelerometer and gyroscope.
1555 * @param estimateGDependentCrossBiases true if G-dependent cross biases
1556 * will be estimated, false
1557 * otherwise.
1558 * @param bias known gyroscope bias. This
1559 * must be 3x1 and is expressed in
1560 * radians per second (rad/s).
1561 * @param initialMg initial gyroscope scale factors
1562 * and cross coupling errors matrix.
1563 * Must be 3x3.
1564 * @param initialGg initial gyroscope G-dependent
1565 * cross biases introduced on the
1566 * gyroscope by the specific forces
1567 * sensed by the accelerometer. Must
1568 * be 3x3.
1569 * @param accelerometerBias known accelerometer bias. This
1570 * must have length 3 and is
1571 * expressed in meters per squared
1572 * second (m/s^2).
1573 * @param accelerometerMa known accelerometer scale factors
1574 * and cross coupling matrix. Must
1575 * be 3x3.
1576 * @throws IllegalArgumentException if any of the provided values does
1577 * not have proper size or if either
1578 * turntable rotation rate or
1579 * time interval is zero or negative.
1580 */
1581 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1582 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1583 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
1584 final boolean estimateGDependentCrossBiases, final Matrix bias, final Matrix initialMg,
1585 final Matrix initialGg, final Matrix accelerometerBias, final Matrix accelerometerMa) {
1586 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
1587 estimateGDependentCrossBiases, bias, initialMg, initialGg, accelerometerBias, accelerometerMa);
1588 }
1589
1590 /**
1591 * Constructor.
1592 *
1593 * @param position position where body kinematics
1594 * measures have been taken.
1595 * @param turntableRotationRate constant rotation rate at which
1596 * the turntable is spinning. Must
1597 * be expressed in radians per
1598 * second (rad/s).
1599 * @param timeInterval time interval between measurements
1600 * being captured expressed in
1601 * seconds (s).
1602 * @param measurements collection of body kinematics
1603 * measurements with standard
1604 * deviations taken at the same
1605 * position with zero velocity and
1606 * unknown different orientations.
1607 * @param commonAxisUsed indicates whether z-axis is
1608 * assumed to be common for
1609 * accelerometer and gyroscope.
1610 * @param estimateGDependentCrossBiases true if G-dependent cross biases
1611 * will be estimated, false
1612 * otherwise.
1613 * @param bias known gyroscope bias. This must be
1614 * 3x1 and is expressed in radians
1615 * per second (rad/s).
1616 * @param initialMg initial gyroscope scale factors
1617 * and cross coupling errors matrix.
1618 * Must be 3x3.
1619 * @param initialGg initial gyroscope G-dependent
1620 * cross biases introduced on the
1621 * gyroscope by the specific forces
1622 * sensed by the accelerometer. Must
1623 * be 3x3.
1624 * @param accelerometerBias known accelerometer bias. This
1625 * must have length 3 and is
1626 * expressed in meters per squared
1627 * second (m/s^2).
1628 * @param accelerometerMa known accelerometer scale factors
1629 * and cross coupling matrix. Must
1630 * be 3x3.
1631 * @param listener listener to handle events raised
1632 * by this calibrator.
1633 * @throws IllegalArgumentException if any of the provided values does
1634 * not have proper size or if either
1635 * turntable rotation rate or
1636 * time interval is zero or negative.
1637 */
1638 public LMedSRobustKnownBiasTurntableGyroscopeCalibrator(
1639 final NEDPosition position, final double turntableRotationRate, final double timeInterval,
1640 final List<StandardDeviationBodyKinematics> measurements, final boolean commonAxisUsed,
1641 final boolean estimateGDependentCrossBiases, final Matrix bias, final Matrix initialMg,
1642 final Matrix initialGg, final Matrix accelerometerBias, final Matrix accelerometerMa,
1643 final RobustKnownBiasTurntableGyroscopeCalibratorListener listener) {
1644 super(position, turntableRotationRate, timeInterval, measurements, commonAxisUsed,
1645 estimateGDependentCrossBiases, bias, initialMg, initialGg, accelerometerBias, accelerometerMa,
1646 listener);
1647 }
1648
1649 /**
1650 * Returns threshold to be used to keep the algorithm iterating in case that
1651 * best estimated threshold using median of residuals is not small enough.
1652 * Once a solution is found that generates a threshold below this value, the
1653 * algorithm will stop.
1654 * The stop threshold can be used to prevent the LMedS algorithm to iterate
1655 * too many times in cases where samples have a very similar accuracy.
1656 * For instance, in cases where proportion of outliers is very small (close
1657 * to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
1658 * iterate for a long time trying to find the best solution when indeed
1659 * there is no need to do that if a reasonable threshold has already been
1660 * reached.
1661 * Because of this behaviour the stop threshold can be set to a value much
1662 * lower than the one typically used in RANSAC, and yet the algorithm could
1663 * still produce even smaller thresholds in estimated results.
1664 *
1665 * @return stop threshold to stop the algorithm prematurely when a certain
1666 * accuracy has been reached.
1667 */
1668 public double getStopThreshold() {
1669 return stopThreshold;
1670 }
1671
1672 /**
1673 * Sets threshold to be used to keep the algorithm iterating in case that
1674 * best estimated threshold using median of residuals is not small enough.
1675 * Once a solution is found that generates a threshold below this value,
1676 * the algorithm will stop.
1677 * The stop threshold can be used to prevent the LMedS algorithm to iterate
1678 * too many times in cases where samples have a very similar accuracy.
1679 * For instance, in cases where proportion of outliers is very small (close
1680 * to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
1681 * iterate for a long time trying to find the best solution when indeed
1682 * there is no need to do that if a reasonable threshold has already been
1683 * reached.
1684 * Because of this behaviour the stop threshold can be set to a value much
1685 * lower than the one typically used in RANSAC, and yet the algorithm could
1686 * still produce even smaller thresholds in estimated results.
1687 *
1688 * @param stopThreshold stop threshold to stop the algorithm prematurely
1689 * when a certain accuracy has been reached.
1690 * @throws IllegalArgumentException if provided value is zero or negative.
1691 * @throws LockedException if calibrator is currently running.
1692 */
1693 public void setStopThreshold(final double stopThreshold) throws LockedException {
1694 if (running) {
1695 throw new LockedException();
1696 }
1697 if (stopThreshold <= MIN_STOP_THRESHOLD) {
1698 throw new IllegalArgumentException();
1699 }
1700
1701 this.stopThreshold = stopThreshold;
1702 }
1703
1704 /**
1705 * Estimates gyroscope calibration parameters containing scale factors
1706 * cross-coupling errors and g-dependant cross biases.
1707 *
1708 * @throws LockedException if calibrator is currently running.
1709 * @throws NotReadyException if calibrator is not ready.
1710 * @throws CalibrationException if estimation fails for numerical reasons.
1711 */
1712 @Override
1713 public void calibrate() throws LockedException, NotReadyException, CalibrationException {
1714 if (running) {
1715 throw new LockedException();
1716 }
1717 if (!isReady()) {
1718 throw new NotReadyException();
1719 }
1720
1721 final var innerEstimator = new LMedSRobustEstimator<>(new LMedSRobustEstimatorListener<PreliminaryResult>() {
1722 @Override
1723 public int getTotalSamples() {
1724 return measurements.size();
1725 }
1726
1727 @Override
1728 public int getSubsetSize() {
1729 return preliminarySubsetSize;
1730 }
1731
1732 @Override
1733 public void estimatePreliminarSolutions(
1734 final int[] samplesIndices, final List<PreliminaryResult> solutions) {
1735 computePreliminarySolutions(samplesIndices, solutions);
1736 }
1737
1738 @Override
1739 public double computeResidual(final PreliminaryResult currentEstimation, final int i) {
1740 return computeError(measurements.get(i), currentEstimation);
1741 }
1742
1743 @Override
1744 public boolean isReady() {
1745 return LMedSRobustKnownBiasTurntableGyroscopeCalibrator.super.isReady();
1746 }
1747
1748 @Override
1749 public void onEstimateStart(final RobustEstimator<PreliminaryResult> estimator) {
1750 // no action needed
1751 }
1752
1753 @Override
1754 public void onEstimateEnd(final RobustEstimator<PreliminaryResult> estimator) {
1755 // no action needed
1756 }
1757
1758 @Override
1759 public void onEstimateNextIteration(
1760 final RobustEstimator<PreliminaryResult> estimator, final int iteration) {
1761 if (listener != null) {
1762 listener.onCalibrateNextIteration(
1763 LMedSRobustKnownBiasTurntableGyroscopeCalibrator.this, iteration);
1764 }
1765 }
1766
1767 @Override
1768 public void onEstimateProgressChange(
1769 final RobustEstimator<PreliminaryResult> estimator, final float progress) {
1770 if (listener != null) {
1771 listener.onCalibrateProgressChange(
1772 LMedSRobustKnownBiasTurntableGyroscopeCalibrator.this, progress);
1773 }
1774 }
1775 });
1776
1777 try {
1778 running = true;
1779
1780 if (listener != null) {
1781 listener.onCalibrateStart(this);
1782 }
1783
1784 inliersData = null;
1785 innerEstimator.setConfidence(confidence);
1786 innerEstimator.setMaxIterations(maxIterations);
1787 innerEstimator.setProgressDelta(progressDelta);
1788 innerEstimator.setStopThreshold(stopThreshold);
1789 final var preliminaryResult = innerEstimator.estimate();
1790 inliersData = innerEstimator.getInliersData();
1791
1792 attemptRefine(preliminaryResult);
1793
1794 if (listener != null) {
1795 listener.onCalibrateEnd(this);
1796 }
1797
1798 } catch (final com.irurueta.numerical.LockedException e) {
1799 throw new LockedException(e);
1800 } catch (final com.irurueta.numerical.NotReadyException e) {
1801 throw new NotReadyException(e);
1802 } catch (final RobustEstimatorException e) {
1803 throw new CalibrationException(e);
1804 } finally {
1805 running = false;
1806 }
1807 }
1808
1809 /**
1810 * Returns method being used for robust estimation.
1811 *
1812 * @return method being used for robust estimation.
1813 */
1814 @Override
1815 public RobustEstimatorMethod getMethod() {
1816 return RobustEstimatorMethod.LMEDS;
1817 }
1818
1819 /**
1820 * Indicates whether this calibrator requires quality scores for each
1821 * measurement/sequence or not.
1822 *
1823 * @return true if quality scores are required, false otherwise.
1824 */
1825 @Override
1826 public boolean isQualityScoresRequired() {
1827 return false;
1828 }
1829 }