View Javadoc
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 }