View Javadoc
1   /*
2    * Copyright (C) 2019 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;
17  
18  import com.irurueta.units.*;
19  
20  import java.io.Serial;
21  import java.io.Serializable;
22  import java.util.Objects;
23  
24  /**
25   * Contains INS/GNS Tightly Coupled Kalman filter configuration parameters (usually
26   * obtained through calibration) to determine the system noise covariance matrix.
27   */
28  public class INSTightlyCoupledKalmanInitializerConfig implements Serializable, Cloneable {
29  
30      /**
31       * Serialization version. This is used to ensure compatibility of deserialization of permanently stored serialized
32       * instances.
33       */
34      @Serial
35      private static final long serialVersionUID = 0L;
36  
37      /**
38       * Initial attitude uncertainty per axis expressed in radians (rad).
39       */
40      private double initialAttitudeUncertainty;
41  
42      /**
43       * Initial velocity uncertainty per axis expressed in meters per second (m/s).
44       */
45      private double initialVelocityUncertainty;
46  
47      /**
48       * Initial position uncertainty per axis expressed in meters (m).
49       */
50      private double initialPositionUncertainty;
51  
52      /**
53       * Initial acceleration bias uncertainty expressed in meters per squared second (m/s^2).
54       */
55      private double initialAccelerationBiasUncertainty;
56  
57      /**
58       * Initial gyroscope bias uncertainty expressed in radians per second (rad/s).
59       */
60      private double initialGyroscopeBiasUncertainty;
61  
62      /**
63       * Initial clock offset uncertainty per axis expressed in meters (m).
64       */
65      private double initialClockOffsetUncertainty;
66  
67      /**
68       * Initial clock drift uncertainty per axis expressed in meters per second (m/s).
69       */
70      private double initialClockDriftUncertainty;
71  
72      /**
73       * Constructor.
74       */
75      public INSTightlyCoupledKalmanInitializerConfig() {
76      }
77  
78      /**
79       * Constructor.
80       *
81       * @param initialAttitudeUncertainty         initial attitude uncertainty per axis
82       *                                           expressed in radians (rad).
83       * @param initialVelocityUncertainty         initial velocity uncertainty per axis
84       *                                           expressed in meters per second (m/s).
85       * @param initialPositionUncertainty         initial position uncertainty per axis
86       *                                           expressed in meters (m).
87       * @param initialAccelerationBiasUncertainty initial acceleration bias uncertainty
88       *                                           expressed in meters per squared second (m/s^2).
89       * @param initialGyroscopeBiasUncertainty    initial gyroscope bias uncertainty
90       *                                           expressed in radians per second (rad/s).
91       * @param initialClockOffsetUncertainty      initial clock offset uncertainty per axis
92       *                                           expressed in meters (m).
93       * @param initialClockDriftUncertainty       initial clock drift uncertainty per axis
94       *                                           expressed in meters per second (m/s).
95       */
96      public INSTightlyCoupledKalmanInitializerConfig(
97              final double initialAttitudeUncertainty, final double initialVelocityUncertainty,
98              final double initialPositionUncertainty, final double initialAccelerationBiasUncertainty,
99              final double initialGyroscopeBiasUncertainty, final double initialClockOffsetUncertainty,
100             final double initialClockDriftUncertainty) {
101         setValues(initialAttitudeUncertainty, initialVelocityUncertainty, initialPositionUncertainty,
102                 initialAccelerationBiasUncertainty, initialGyroscopeBiasUncertainty, initialClockOffsetUncertainty,
103                 initialClockDriftUncertainty);
104     }
105 
106     /**
107      * Constructor.
108      *
109      * @param initialAttitudeUncertainty         initial attitude uncertainty per axis.
110      * @param initialVelocityUncertainty         initial velocity uncertainty per axis.
111      * @param initialPositionUncertainty         initial position uncertainty per axis.
112      * @param initialAccelerationBiasUncertainty initial acceleration bias uncertainty.
113      * @param initialGyroscopeBiasUncertainty    initial gyroscope bias uncertainty.
114      * @param initialClockOffsetUncertainty      initial clock offset uncertainty per axis.
115      * @param initialClockDriftUncertainty       initial clock drift uncertainty per axis.
116      */
117     public INSTightlyCoupledKalmanInitializerConfig(
118             final Angle initialAttitudeUncertainty, final Speed initialVelocityUncertainty,
119             final Distance initialPositionUncertainty, final Acceleration initialAccelerationBiasUncertainty,
120             final AngularSpeed initialGyroscopeBiasUncertainty, final Distance initialClockOffsetUncertainty,
121             final Speed initialClockDriftUncertainty) {
122         setValues(initialAttitudeUncertainty, initialVelocityUncertainty, initialPositionUncertainty,
123                 initialAccelerationBiasUncertainty, initialGyroscopeBiasUncertainty, initialClockOffsetUncertainty,
124                 initialClockDriftUncertainty);
125     }
126 
127     /**
128      * Copy constructor.
129      *
130      * @param input input instance to copy data from.
131      */
132     public INSTightlyCoupledKalmanInitializerConfig(final INSTightlyCoupledKalmanInitializerConfig input) {
133         copyFrom(input);
134     }
135 
136     /**
137      * Gets initial attitude uncertainty per axis expressed in radians (rad).
138      *
139      * @return initial attitude uncertainty per axis expressed in radians (rad).
140      */
141     public double getInitialAttitudeUncertainty() {
142         return initialAttitudeUncertainty;
143     }
144 
145     /**
146      * Sets initial attitude uncertainty per axis expressed in radians (rad).
147      *
148      * @param initialAttitudeUncertainty initial attitude uncertainty per axis expressed
149      *                                   in radians (rad).
150      */
151     public void setInitialAttitudeUncertainty(final double initialAttitudeUncertainty) {
152         this.initialAttitudeUncertainty = initialAttitudeUncertainty;
153     }
154 
155     /**
156      * Gets initial attitude uncertainty per axis.
157      *
158      * @param result instance where initial attitude uncertainty per axis will be stored.
159      */
160     public void getInitialAttitudeUncertaintyAngle(final Angle result) {
161         result.setValue(initialAttitudeUncertainty);
162         result.setUnit(AngleUnit.RADIANS);
163     }
164 
165     /**
166      * Gets initial attitude uncertainty per axis.
167      *
168      * @return initial attitude uncertainty per axis.
169      */
170     public Angle getInitialAttitudeUncertaintyAngle() {
171         return new Angle(initialAttitudeUncertainty, AngleUnit.RADIANS);
172     }
173 
174     /**
175      * Sets initial attitude uncertainty per axis.
176      *
177      * @param initialAttitudeUncertainty initial attitude uncertainty per axis.
178      */
179     public void setInitialAttitudeUncertainty(final Angle initialAttitudeUncertainty) {
180         this.initialAttitudeUncertainty = AngleConverter.convert(initialAttitudeUncertainty.getValue().doubleValue(),
181                 initialAttitudeUncertainty.getUnit(), AngleUnit.RADIANS);
182     }
183 
184     /**
185      * Gets initial velocity uncertainty per axis expressed in meters per second (m/s).
186      *
187      * @return initial velocity uncertainty per axis expressed in meters per second (m/s).
188      */
189     public double getInitialVelocityUncertainty() {
190         return initialVelocityUncertainty;
191     }
192 
193     /**
194      * Sets initial velocity uncertainty per axis expressed in meters per second (m/s).
195      *
196      * @param initialVelocityUncertainty initial velocity uncertainty per axis expressed
197      *                                   in meters per second (m/s).
198      */
199     public void setInitialVelocityUncertainty(final double initialVelocityUncertainty) {
200         this.initialVelocityUncertainty = initialVelocityUncertainty;
201     }
202 
203     /**
204      * Gets initial velocity uncertainty per axis.
205      *
206      * @param result instance where initial attitude uncertainty per axis will be stored.
207      */
208     public void getInitialVelocityUncertaintySpeed(final Speed result) {
209         result.setValue(initialVelocityUncertainty);
210         result.setUnit(SpeedUnit.METERS_PER_SECOND);
211     }
212 
213     /**
214      * Gets initial velocity uncertainty per axis.
215      *
216      * @return initial velocity uncertainty per axis.
217      */
218     public Speed getInitialVelocityUncertaintySpeed() {
219         return new Speed(initialVelocityUncertainty, SpeedUnit.METERS_PER_SECOND);
220     }
221 
222     /**
223      * Sets initial velocity uncertainty per axis.
224      *
225      * @param initialVelocityUncertainty initial velocity uncertainty per axis.
226      */
227     public void setInitialVelocityUncertainty(final Speed initialVelocityUncertainty) {
228         this.initialVelocityUncertainty = SpeedConverter.convert(
229                 initialVelocityUncertainty.getValue().doubleValue(), initialVelocityUncertainty.getUnit(),
230                 SpeedUnit.METERS_PER_SECOND);
231     }
232 
233     /**
234      * Gets initial position uncertainty per axis expressed in meters (m)
235      *
236      * @return initial position uncertainty per axis expressed in meters (m).
237      */
238     public double getInitialPositionUncertainty() {
239         return initialPositionUncertainty;
240     }
241 
242     /**
243      * Sets initial position uncertainty per axis expressed in meters (m)
244      *
245      * @param initialPositionUncertainty initial position uncertainty per axis expressed
246      *                                   in meters (m).
247      */
248     public void setInitialPositionUncertainty(final double initialPositionUncertainty) {
249         this.initialPositionUncertainty = initialPositionUncertainty;
250     }
251 
252     /**
253      * Gets initial position uncertainty per axis.
254      *
255      * @param result instance where initial position uncertainty per axis will be stored.
256      */
257     public void getInitialPositionUncertaintyDistance(final Distance result) {
258         result.setValue(initialPositionUncertainty);
259         result.setUnit(DistanceUnit.METER);
260     }
261 
262     /**
263      * Gets initial position uncertainty per axis.
264      *
265      * @return initial position uncertainty per axis.
266      */
267     public Distance getInitialPositionUncertaintyDistance() {
268         return new Distance(initialPositionUncertainty, DistanceUnit.METER);
269     }
270 
271     /**
272      * Sets initial position uncertainty per axis.
273      *
274      * @param initialPositionUncertainty initial position uncertainty per axis.
275      */
276     public void setInitialPositionUncertainty(final Distance initialPositionUncertainty) {
277         this.initialPositionUncertainty = DistanceConverter.convert(initialPositionUncertainty.getValue().doubleValue(),
278                 initialPositionUncertainty.getUnit(), DistanceUnit.METER);
279     }
280 
281     /**
282      * Gets initial acceleration bias uncertainty expressed in meters per squared second (m/s^2).
283      *
284      * @return initial acceleration bias uncertainty expressed in meters per squared second (m/s^2).
285      */
286     public double getInitialAccelerationBiasUncertainty() {
287         return initialAccelerationBiasUncertainty;
288     }
289 
290     /**
291      * Sets initial acceleration bias uncertainty expressed in meters per squared second (m/s^2).
292      *
293      * @param initialAccelerationBiasUncertainty initial acceleration bias uncertainty expressed in
294      *                                           meters per squared second (m/s^2).
295      */
296     public void setInitialAccelerationBiasUncertainty(final double initialAccelerationBiasUncertainty) {
297         this.initialAccelerationBiasUncertainty = initialAccelerationBiasUncertainty;
298     }
299 
300     /**
301      * Gets initial acceleration bias uncertainty.
302      *
303      * @param result instance where initial acceleration bias uncertainty will be stored.
304      */
305     public void getInitialAccelerationBiasUncertaintyAcceleration(final Acceleration result) {
306         result.setValue(initialAccelerationBiasUncertainty);
307         result.setUnit(AccelerationUnit.METERS_PER_SQUARED_SECOND);
308     }
309 
310     /**
311      * Gets initial acceleration bias uncertainty.
312      *
313      * @return initial acceleration bias uncertainty.
314      */
315     public Acceleration getInitialAccelerationBiasUncertaintyAcceleration() {
316         return new Acceleration(initialAccelerationBiasUncertainty, AccelerationUnit.METERS_PER_SQUARED_SECOND);
317     }
318 
319     /**
320      * Sets initial acceleration bias uncertainty.
321      *
322      * @param initialAccelerationUncertainty initial acceleration bias uncertainty.
323      */
324     public void setInitialAccelerationBiasUncertainty(final Acceleration initialAccelerationUncertainty) {
325         initialAccelerationBiasUncertainty = AccelerationConverter.convert(
326                 initialAccelerationUncertainty.getValue().doubleValue(), initialAccelerationUncertainty.getUnit(),
327                 AccelerationUnit.METERS_PER_SQUARED_SECOND);
328     }
329 
330     /**
331      * Gets initial gyroscope bias uncertainty expressed in radians per second (rad/s).
332      *
333      * @return initial gyroscope bias uncertainty expressed in radians per second (rad/s).
334      */
335     public double getInitialGyroscopeBiasUncertainty() {
336         return initialGyroscopeBiasUncertainty;
337     }
338 
339     /**
340      * Sets initial gyroscope bias uncertainty expressed in radians per second (rad/s).
341      *
342      * @param initialGyroscopeBiasUncertainty initial gyroscope bias uncertainty expressed
343      *                                        in radians per second (rad/s).
344      */
345     public void setInitialGyroscopeBiasUncertainty(final double initialGyroscopeBiasUncertainty) {
346         this.initialGyroscopeBiasUncertainty = initialGyroscopeBiasUncertainty;
347     }
348 
349     /**
350      * Gets initial gyroscope bias uncertainty.
351      *
352      * @param result instance where initial gyroscope bias uncertainty will be stored.
353      */
354     public void getInitialGyroscopeBiasUncertaintyAngularSpeed(final AngularSpeed result) {
355         result.setValue(initialGyroscopeBiasUncertainty);
356         result.setUnit(AngularSpeedUnit.RADIANS_PER_SECOND);
357     }
358 
359     /**
360      * Gets initial gyroscope bias uncertainty.
361      *
362      * @return initial gyroscope bias uncertainty.
363      */
364     public AngularSpeed getInitialGyroscopeBiasUncertaintyAngularSpeed() {
365         return new AngularSpeed(initialGyroscopeBiasUncertainty, AngularSpeedUnit.RADIANS_PER_SECOND);
366     }
367 
368     /**
369      * Sets initial gyroscope bias uncertainty.
370      *
371      * @param initialGyroscopeBiasUncertainty initial gyroscope bias uncertainty.
372      */
373     public void setInitialGyroscopeBiasUncertainty(final AngularSpeed initialGyroscopeBiasUncertainty) {
374         this.initialGyroscopeBiasUncertainty = AngularSpeedConverter.convert(
375                 initialGyroscopeBiasUncertainty.getValue().doubleValue(), initialGyroscopeBiasUncertainty.getUnit(),
376                 AngularSpeedUnit.RADIANS_PER_SECOND);
377     }
378 
379     /**
380      * Gets initial clock offset uncertainty per axis expressed in meters (m).
381      *
382      * @return initial clock offset uncertainty per axis expressed in meters (m).
383      */
384     public double getInitialClockOffsetUncertainty() {
385         return initialClockOffsetUncertainty;
386     }
387 
388     /**
389      * Sets initial clock offset uncertainty per axis expressed in meters (m).
390      *
391      * @param initialClockOffsetUncertainty initial clock offset uncertainty per
392      *                                      axis expressed in meters (m).
393      */
394     public void setInitialClockOffsetUncertainty(final double initialClockOffsetUncertainty) {
395         this.initialClockOffsetUncertainty = initialClockOffsetUncertainty;
396     }
397 
398     /**
399      * Gets initial clock offset uncertainty per axis.
400      *
401      * @param result instance where initial clock offset uncertainty per axis will be stored.
402      */
403     public void getInitialClockOffsetUncertaintyDistance(final Distance result) {
404         result.setValue(initialClockOffsetUncertainty);
405         result.setUnit(DistanceUnit.METER);
406     }
407 
408     /**
409      * Gets initial clock offset uncertainty per axis.
410      *
411      * @return initial clock offset uncertainty per axis.
412      */
413     public Distance getInitialClockOffsetUncertaintyDistance() {
414         return new Distance(initialClockOffsetUncertainty, DistanceUnit.METER);
415     }
416 
417     /**
418      * Sets initial clock offset uncertainty per axis.
419      *
420      * @param initialClockOffsetUncertainty initial clock offset uncertainty per axis.
421      */
422     public void setInitialClockOffsetUncertainty(final Distance initialClockOffsetUncertainty) {
423         this.initialClockOffsetUncertainty = DistanceConverter.convert(
424                 initialClockOffsetUncertainty.getValue().doubleValue(), initialClockOffsetUncertainty.getUnit(),
425                 DistanceUnit.METER);
426     }
427 
428     /**
429      * Gets initial clock drift uncertainty per axis expressed in meters per second (m/s).
430      *
431      * @return initial clock drift uncertainty per axis expressed in meters per second (m/s).
432      */
433     public double getInitialClockDriftUncertainty() {
434         return initialClockDriftUncertainty;
435     }
436 
437     /**
438      * Sets initial clock drift uncertainty per axis expressed in meters per second (m/s).
439      *
440      * @param initialClockDriftUncertainty initial clock drift uncertainty per axis expressed
441      *                                     in meters per second (m/s).
442      */
443     public void setInitialClockDriftUncertainty(final double initialClockDriftUncertainty) {
444         this.initialClockDriftUncertainty = initialClockDriftUncertainty;
445     }
446 
447     /**
448      * Gets initial clock drift uncertainty per axis.
449      *
450      * @param result instance where initial clock drift uncertainty per axis will be stored.
451      */
452     public void getInitialClockDriftUncertaintySpeed(final Speed result) {
453         result.setValue(initialClockDriftUncertainty);
454         result.setUnit(SpeedUnit.METERS_PER_SECOND);
455     }
456 
457     /**
458      * Gets initial clock drift uncertainty per axis.
459      *
460      * @return initial clock drift uncertainty per axis.
461      */
462     public Speed getInitialClockDriftUncertaintySpeed() {
463         return new Speed(initialClockDriftUncertainty, SpeedUnit.METERS_PER_SECOND);
464     }
465 
466     /**
467      * Sets initial clock drift uncertainty per axis.
468      *
469      * @param initialClockDriftUncertainty initial clock drift uncertainty per axis.
470      */
471     public void setInitialClockDriftUncertainty(final Speed initialClockDriftUncertainty) {
472         this.initialClockDriftUncertainty = SpeedConverter.convert(
473                 initialClockDriftUncertainty.getValue().doubleValue(),
474                 initialClockDriftUncertainty.getUnit(),
475                 SpeedUnit.METERS_PER_SECOND);
476     }
477 
478     /**
479      * Sets configuration parameters.
480      *
481      * @param initialAttitudeUncertainty         initial attitude uncertainty per axis
482      *                                           expressed in radians (rad).
483      * @param initialVelocityUncertainty         initial velocity uncertainty per axis
484      *                                           expressed in meters per second (m/s).
485      * @param initialPositionUncertainty         initial position uncertainty per axis
486      *                                           expressed in meters (m).
487      * @param initialAccelerationBiasUncertainty initial acceleration bias uncertainty
488      *                                           expressed in meters per squared second (m/s^2).
489      * @param initialGyroscopeBiasUncertainty    initial gyroscope bias uncertainty
490      *                                           expressed in radians per second (rad/s).
491      * @param initialClockOffsetUncertainty      initial clock offset uncertainty per axis
492      *                                           expressed in meters (m).
493      * @param initialClockDriftUncertainty       initial clock drift uncertainty per axis
494      *                                           expressed in meters per second (m/s).
495      */
496     public void setValues(
497             final double initialAttitudeUncertainty, final double initialVelocityUncertainty,
498             final double initialPositionUncertainty, final double initialAccelerationBiasUncertainty,
499             final double initialGyroscopeBiasUncertainty, final double initialClockOffsetUncertainty,
500             final double initialClockDriftUncertainty) {
501         this.initialAttitudeUncertainty = initialAttitudeUncertainty;
502         this.initialVelocityUncertainty = initialVelocityUncertainty;
503         this.initialPositionUncertainty = initialPositionUncertainty;
504         this.initialAccelerationBiasUncertainty = initialAccelerationBiasUncertainty;
505         this.initialGyroscopeBiasUncertainty = initialGyroscopeBiasUncertainty;
506         this.initialClockOffsetUncertainty = initialClockOffsetUncertainty;
507         this.initialClockDriftUncertainty = initialClockDriftUncertainty;
508     }
509 
510     /**
511      * Sets configuration parameters.
512      *
513      * @param initialAttitudeUncertainty         initial attitude uncertainty per axis.
514      * @param initialVelocityUncertainty         initial velocity uncertainty per axis.
515      * @param initialPositionUncertainty         initial position uncertainty per axis.
516      * @param initialAccelerationBiasUncertainty initial acceleration bias uncertainty.
517      * @param initialGyroscopeBiasUncertainty    initial gyroscope bias uncertainty.
518      * @param initialClockOffsetUncertainty      initial clock offset uncertainty per axis.
519      * @param initialClockDriftUncertainty       initial clock drift uncertainty per axis.
520      */
521     public void setValues(
522             final Angle initialAttitudeUncertainty, final Speed initialVelocityUncertainty,
523             final Distance initialPositionUncertainty, final Acceleration initialAccelerationBiasUncertainty,
524             final AngularSpeed initialGyroscopeBiasUncertainty, final Distance initialClockOffsetUncertainty,
525             final Speed initialClockDriftUncertainty) {
526         setInitialAttitudeUncertainty(initialAttitudeUncertainty);
527         setInitialVelocityUncertainty(initialVelocityUncertainty);
528         setInitialPositionUncertainty(initialPositionUncertainty);
529         setInitialAccelerationBiasUncertainty(initialAccelerationBiasUncertainty);
530         setInitialGyroscopeBiasUncertainty(initialGyroscopeBiasUncertainty);
531         setInitialClockOffsetUncertainty(initialClockOffsetUncertainty);
532         setInitialClockDriftUncertainty(initialClockDriftUncertainty);
533     }
534 
535     /**
536      * Copies this instance data into provided instance.
537      *
538      * @param output destination instance where data will be copied to.
539      */
540     public void copyTo(final INSTightlyCoupledKalmanInitializerConfig output) {
541         output.initialAttitudeUncertainty = initialAttitudeUncertainty;
542         output.initialVelocityUncertainty = initialVelocityUncertainty;
543         output.initialPositionUncertainty = initialPositionUncertainty;
544         output.initialAccelerationBiasUncertainty = initialAccelerationBiasUncertainty;
545         output.initialGyroscopeBiasUncertainty = initialGyroscopeBiasUncertainty;
546         output.initialClockOffsetUncertainty = initialClockOffsetUncertainty;
547         output.initialClockDriftUncertainty = initialClockDriftUncertainty;
548     }
549 
550     /**
551      * Copies data of provided instance into this instance.
552      *
553      * @param input instance to copy data from.
554      */
555     public void copyFrom(final INSTightlyCoupledKalmanInitializerConfig input) {
556         initialAttitudeUncertainty = input.initialAttitudeUncertainty;
557         initialVelocityUncertainty = input.initialVelocityUncertainty;
558         initialPositionUncertainty = input.initialPositionUncertainty;
559         initialAccelerationBiasUncertainty = input.initialAccelerationBiasUncertainty;
560         initialGyroscopeBiasUncertainty = input.initialGyroscopeBiasUncertainty;
561         initialClockOffsetUncertainty = input.initialClockOffsetUncertainty;
562         initialClockDriftUncertainty = input.initialClockDriftUncertainty;
563     }
564 
565     /**
566      * Computes and returns hash code for this instance. Hash codes are almost unique
567      * values that are useful for fast classification and storage of objects in collections.
568      *
569      * @return Hash code.
570      */
571     @Override
572     public int hashCode() {
573         return Objects.hash(initialAttitudeUncertainty, initialVelocityUncertainty,
574                 initialPositionUncertainty, initialAccelerationBiasUncertainty,
575                 initialGyroscopeBiasUncertainty, initialClockOffsetUncertainty,
576                 initialClockDriftUncertainty);
577     }
578 
579     /**
580      * Checks if provided instance has exactly the same contents as this instance.
581      *
582      * @param obj instance to be compared.
583      * @return true if both instances are considered to be equal, false otherwise.
584      */
585     @Override
586     public boolean equals(final Object obj) {
587         if (this == obj) {
588             return true;
589         }
590         if (obj == null || getClass() != obj.getClass()) {
591             return false;
592         }
593         final var other = (INSTightlyCoupledKalmanInitializerConfig) obj;
594         return equals(other);
595     }
596 
597     /**
598      * Checks if provided instance has exactly the same contents as this instance.
599      *
600      * @param other instance to be compared.
601      * @return true if both instances are considered to be equal, false otherwise.
602      */
603     public boolean equals(final INSTightlyCoupledKalmanInitializerConfig other) {
604         return equals(other, 0.0);
605     }
606 
607     /**
608      * Checks if provided instance has contents similar to this instance up to provided
609      * threshold value.
610      *
611      * @param other     instance to be compared.
612      * @param threshold maximum difference allowed for values.
613      * @return true if both instances are considered to be equal (up to provided threshold),
614      * false otherwise.
615      */
616     public boolean equals(final INSTightlyCoupledKalmanInitializerConfig other, final double threshold) {
617         if (other == null) {
618             return false;
619         }
620 
621         return Math.abs(initialAttitudeUncertainty - other.initialAttitudeUncertainty) <= threshold
622                 && Math.abs(initialVelocityUncertainty - other.initialVelocityUncertainty) <= threshold
623                 && Math.abs(initialPositionUncertainty - other.initialPositionUncertainty) <= threshold
624                 && Math.abs(initialAccelerationBiasUncertainty - other.initialAccelerationBiasUncertainty) <= threshold
625                 && Math.abs(initialGyroscopeBiasUncertainty - other.initialGyroscopeBiasUncertainty) <= threshold
626                 && Math.abs(initialClockOffsetUncertainty - other.initialClockOffsetUncertainty) <= threshold
627                 && Math.abs(initialClockDriftUncertainty - other.initialClockDriftUncertainty) <= threshold;
628     }
629 
630     /**
631      * Makes a copy of this instance.
632      *
633      * @return a copy of this instance.
634      * @throws CloneNotSupportedException if clone fails for some reason.
635      */
636     @Override
637     protected Object clone() throws CloneNotSupportedException {
638         final var result = (INSTightlyCoupledKalmanInitializerConfig) super.clone();
639         copyTo(result);
640         return result;
641     }
642 }