View Javadoc
1   /*
2    * Copyright (C) 2021 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;
17  
18  import com.irurueta.navigation.NotReadyException;
19  import com.irurueta.navigation.inertial.INSLooselyCoupledKalmanConfig;
20  import com.irurueta.navigation.inertial.calibration.generators.AccelerometerAndGyroscopeMeasurementsGenerator;
21  import com.irurueta.navigation.inertial.calibration.generators.AccelerometerGyroscopeAndMagnetometerMeasurementsGenerator;
22  import com.irurueta.navigation.inertial.calibration.intervals.thresholdfactor.AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer;
23  import com.irurueta.navigation.inertial.calibration.intervals.thresholdfactor.AccelerometerGyroscopeAndMagnetometerIntervalDetectorThresholdFactorOptimizer;
24  
25  /**
26   * Utility class to create {@link INSLooselyCoupledKalmanConfig} by combining
27   * different sources of estimated data.
28   * Sources of data can be any measurement generator, static interval detector or
29   * noise estimator implementing {@link AccelerometerNoiseRootPsdSource}
30   * or {@link GyroscopeNoiseRootPsdSource}.
31   */
32  public class INSLooselyCoupledKalmanConfigCreator {
33  
34      /**
35       * A source of estimated accelerometer noise root PSD.
36       */
37      private AccelerometerNoiseRootPsdSource accelerometerNoiseRootPsdSource;
38  
39      /**
40       * A source of estimated gyroscope noise root PSD.
41       */
42      private GyroscopeNoiseRootPsdSource gyroscopeNoiseRootPsdSource;
43  
44      /**
45       * A source of estimated accelerometer bias random walk PSD.
46       */
47      private AccelerometerBiasRandomWalkSource accelerometerBiasRandomWalkSource;
48  
49      /**
50       * A source of estimated gyroscope bias random walk PSD.
51       */
52      private GyroscopeBiasRandomWalkSource gyroscopeBiasRandomWalkSource;
53  
54      /**
55       * A source of position noise standard deviation.
56       */
57      private PositionNoiseStandardDeviationSource positionNoiseStandardDeviationSource;
58  
59      /**
60       * A source of velocity noise standard deviation.
61       */
62      private VelocityNoiseStandardDeviationSource velocityNoiseStandardDeviationSource;
63  
64      /**
65       * Constructor.
66       */
67      public INSLooselyCoupledKalmanConfigCreator() {
68      }
69  
70      /**
71       * Constructor.
72       *
73       * @param accelerometerNoiseRootPsdSource      a source of estimated accelerometer noise root PSD.
74       * @param gyroscopeNoiseRootPsdSource          a source of estimated gyroscope noise root PSD.
75       * @param accelerometerBiasRandomWalkSource    a source of estimated accelerometer bias random walk PSD.
76       * @param gyroscopeBiasRandomWalkSource        a source of estimated gyroscope bias random walk PSD.
77       * @param positionNoiseStandardDeviationSource a source of position noise standard deviation.
78       * @param velocityNoiseStandardDeviationSource a source of velocity noise standard deviation.
79       */
80      public INSLooselyCoupledKalmanConfigCreator(
81              final AccelerometerNoiseRootPsdSource accelerometerNoiseRootPsdSource,
82              final GyroscopeNoiseRootPsdSource gyroscopeNoiseRootPsdSource,
83              final AccelerometerBiasRandomWalkSource accelerometerBiasRandomWalkSource,
84              final GyroscopeBiasRandomWalkSource gyroscopeBiasRandomWalkSource,
85              final PositionNoiseStandardDeviationSource positionNoiseStandardDeviationSource,
86              final VelocityNoiseStandardDeviationSource velocityNoiseStandardDeviationSource) {
87          this.accelerometerNoiseRootPsdSource = accelerometerNoiseRootPsdSource;
88          this.gyroscopeNoiseRootPsdSource = gyroscopeNoiseRootPsdSource;
89          this.accelerometerBiasRandomWalkSource = accelerometerBiasRandomWalkSource;
90          this.gyroscopeBiasRandomWalkSource = gyroscopeBiasRandomWalkSource;
91          this.positionNoiseStandardDeviationSource = positionNoiseStandardDeviationSource;
92          this.velocityNoiseStandardDeviationSource = velocityNoiseStandardDeviationSource;
93      }
94  
95      /**
96       * Constructor.
97       *
98       * @param generator           an accelerometer + gyroscope measurement
99       *                            generator.
100      * @param randomWalkEstimator a random walk estimator.
101      */
102     public INSLooselyCoupledKalmanConfigCreator(
103             final AccelerometerAndGyroscopeMeasurementsGenerator generator,
104             final RandomWalkEstimator randomWalkEstimator) {
105         this(generator, generator, randomWalkEstimator, randomWalkEstimator, randomWalkEstimator, randomWalkEstimator);
106     }
107 
108     /**
109      * Constructor.
110      *
111      * @param generator           an accelerometer + gyroscope + magnetometer
112      *                            measurement generator.
113      * @param randomWalkEstimator a random walk estimator.
114      */
115     public INSLooselyCoupledKalmanConfigCreator(
116             final AccelerometerGyroscopeAndMagnetometerMeasurementsGenerator generator,
117             final RandomWalkEstimator randomWalkEstimator) {
118         this(generator, generator, randomWalkEstimator, randomWalkEstimator, randomWalkEstimator, randomWalkEstimator);
119     }
120 
121     /**
122      * Constructor.
123      *
124      * @param optimizer           an accelerometer and gyroscope threshold factor
125      *                            optimizer.
126      * @param randomWalkEstimator a random walk estimator.
127      */
128     public INSLooselyCoupledKalmanConfigCreator(
129             final AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer optimizer,
130             final RandomWalkEstimator randomWalkEstimator) {
131         this(optimizer, optimizer, randomWalkEstimator, randomWalkEstimator, randomWalkEstimator, randomWalkEstimator);
132     }
133 
134     /**
135      * Constructor.
136      *
137      * @param optimizer           an accelerometer + gyroscope + magnetometer
138      *                            threshold factor optimizer.
139      * @param randomWalkEstimator a random walk estimator.
140      */
141     public INSLooselyCoupledKalmanConfigCreator(
142             final AccelerometerGyroscopeAndMagnetometerIntervalDetectorThresholdFactorOptimizer optimizer,
143             final RandomWalkEstimator randomWalkEstimator) {
144         this(optimizer, optimizer, randomWalkEstimator, randomWalkEstimator, randomWalkEstimator, randomWalkEstimator);
145     }
146 
147     /**
148      * Gets the source of estimated accelerometer noise root PSD.
149      *
150      * @return source of estimated accelerometer noise root PSD.
151      */
152     public AccelerometerNoiseRootPsdSource getAccelerometerNoiseRootPsdSource() {
153         return accelerometerNoiseRootPsdSource;
154     }
155 
156     /**
157      * Sets source of estimated accelerometer noise root PSD.
158      *
159      * @param accelerometerNoiseRootPsdSource source of estimated accelerometer
160      *                                        noise root PSD.
161      */
162     public void setAccelerometerNoiseRootPsdSource(
163             final AccelerometerNoiseRootPsdSource accelerometerNoiseRootPsdSource) {
164         this.accelerometerNoiseRootPsdSource = accelerometerNoiseRootPsdSource;
165     }
166 
167     /**
168      * Gets the source of estimated gyroscope noise root PSD.
169      *
170      * @return source of estimated gyroscope noise root PSD.
171      */
172     public GyroscopeNoiseRootPsdSource getGyroscopeNoiseRootPsdSource() {
173         return gyroscopeNoiseRootPsdSource;
174     }
175 
176     /**
177      * Sets source of estimated gyroscope noise root PSD.
178      *
179      * @param gyroscopeNoiseRootPsdSource source of estimated gyroscope noise
180      *                                    root PSD.
181      */
182     public void sstGyroscopeNoiseRootPsdSource(final GyroscopeNoiseRootPsdSource gyroscopeNoiseRootPsdSource) {
183         this.gyroscopeNoiseRootPsdSource = gyroscopeNoiseRootPsdSource;
184     }
185 
186     /**
187      * Gets the source of estimated accelerometer bias random walk PSD.
188      *
189      * @return source of estimated accelerometer bias random walk PSD.
190      */
191     public AccelerometerBiasRandomWalkSource getAccelerometerBiasRandomWalkSource() {
192         return accelerometerBiasRandomWalkSource;
193     }
194 
195     /**
196      * Sets source of estimated accelerometer bias random walk PSD.
197      *
198      * @param accelerometerBiasRandomWalkSource source of estimated accelerometer
199      *                                          bias random walk PSD.
200      */
201     public void setAccelerometerBiasRandomWalkSource(
202             final AccelerometerBiasRandomWalkSource accelerometerBiasRandomWalkSource) {
203         this.accelerometerBiasRandomWalkSource = accelerometerBiasRandomWalkSource;
204     }
205 
206     /**
207      * Gets the source of estimated gyroscope bias random walk PSD.
208      *
209      * @return source of estimated gyroscope bias random walk PSD.
210      */
211     public GyroscopeBiasRandomWalkSource getGyroscopeBiasRandomWalkSource() {
212         return gyroscopeBiasRandomWalkSource;
213     }
214 
215     /**
216      * Sets source of estimated gyroscope bias random walk PSD.
217      *
218      * @param gyroscopeBiasRandomWalkSource source of estimated gyroscope bias
219      *                                      random walk PSD.
220      */
221     public void setGyroscopeBiasRandomWalkSource(final GyroscopeBiasRandomWalkSource gyroscopeBiasRandomWalkSource) {
222         this.gyroscopeBiasRandomWalkSource = gyroscopeBiasRandomWalkSource;
223     }
224 
225     /**
226      * Gets the source of position noise standard deviation.
227      *
228      * @return source of position noise standard deviation.
229      */
230     public PositionNoiseStandardDeviationSource getPositionNoiseStandardDeviationSource() {
231         return positionNoiseStandardDeviationSource;
232     }
233 
234     /**
235      * Sets source of position noise standard deviation.
236      *
237      * @param positionUncertaintySource source of position noise standard
238      *                                  deviation.
239      */
240     public void setPositionNoiseStandardDeviationSource(
241             final PositionNoiseStandardDeviationSource positionUncertaintySource) {
242         positionNoiseStandardDeviationSource = positionUncertaintySource;
243     }
244 
245     /**
246      * Gets the source of velocity noise standard deviation.
247      *
248      * @return source of velocity noise standard deviation.
249      */
250     public VelocityNoiseStandardDeviationSource getVelocityNoiseStandardDeviationSource() {
251         return velocityNoiseStandardDeviationSource;
252     }
253 
254     /**
255      * Sets source of velocity noise standard deviation.
256      *
257      * @param velocityUncertaintySource source of velocity noise standard
258      *                                  deviation.
259      */
260     public void setVelocityNoiseStandardDeviationSource(
261             final VelocityNoiseStandardDeviationSource velocityUncertaintySource) {
262         velocityNoiseStandardDeviationSource = velocityUncertaintySource;
263     }
264 
265     /**
266      * Indicates whether all sources have been provided to be able to
267      * create a {@link INSLooselyCoupledKalmanConfig} instance.
268      *
269      * @return true if the creator is ready, false otherwise.
270      */
271     public boolean isReady() {
272         return accelerometerNoiseRootPsdSource != null
273                 && gyroscopeNoiseRootPsdSource != null
274                 && accelerometerBiasRandomWalkSource != null
275                 && gyroscopeBiasRandomWalkSource != null
276                 && positionNoiseStandardDeviationSource != null
277                 && velocityNoiseStandardDeviationSource != null;
278     }
279 
280     /**
281      * Creates a {@link INSLooselyCoupledKalmanConfig} instance containing estimated
282      * parameters during calibration.
283      *
284      * @return instance containing configuration data.
285      * @throws NotReadyException if the creator is not ready.
286      */
287     public INSLooselyCoupledKalmanConfig create() throws NotReadyException {
288         if (!isReady()) {
289             throw new NotReadyException();
290         }
291 
292         final var gyroNoisePsd = Math.pow(gyroscopeNoiseRootPsdSource.getGyroscopeBaseNoiseLevelRootPsd(), 2.0);
293         final var accelNoisePsd = Math.pow(accelerometerNoiseRootPsdSource.getAccelerometerBaseNoiseLevelRootPsd(),
294                 2.0);
295         final var accelRandomWalkBiasPsd = accelerometerBiasRandomWalkSource.getAccelerometerBiasPSD();
296         final var gyroRandomWalkBiasPsd = gyroscopeBiasRandomWalkSource.getGyroBiasPSD();
297         final var positionNoiseSd = positionNoiseStandardDeviationSource.getPositionNoiseStandardDeviation();
298         final var velocityNoiseSd = velocityNoiseStandardDeviationSource.getVelocityNoiseStandardDeviation();
299         return new INSLooselyCoupledKalmanConfig(gyroNoisePsd, accelNoisePsd, accelRandomWalkBiasPsd,
300                 gyroRandomWalkBiasPsd, positionNoiseSd, velocityNoiseSd);
301     }
302 }