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.intervals;
17  
18  import com.irurueta.navigation.inertial.calibration.AngularSpeedTriad;
19  import com.irurueta.navigation.inertial.calibration.GyroscopeNoiseRootPsdSource;
20  import com.irurueta.navigation.inertial.calibration.noise.AccumulatedAngularSpeedTriadNoiseEstimator;
21  import com.irurueta.navigation.inertial.calibration.noise.WindowedAngularSpeedTriadNoiseEstimator;
22  import com.irurueta.units.AngularSpeed;
23  import com.irurueta.units.AngularSpeedConverter;
24  import com.irurueta.units.AngularSpeedUnit;
25  
26  /**
27   * This detector is in charge of determining when a static period of
28   * angular speed measurements starts and finishes.
29   * Static periods are periods of time where the device is considered
30   * to remain static (no movement applied to it).
31   */
32  public class AngularSpeedTriadStaticIntervalDetector extends TriadStaticIntervalDetector<AngularSpeedUnit, AngularSpeed,
33          AngularSpeedTriad, AngularSpeedTriadStaticIntervalDetector, AngularSpeedTriadStaticIntervalDetectorListener>
34          implements GyroscopeNoiseRootPsdSource {
35  
36      /**
37       * Constructor.
38       */
39      public AngularSpeedTriadStaticIntervalDetector() {
40          super(new WindowedAngularSpeedTriadNoiseEstimator(), new AccumulatedAngularSpeedTriadNoiseEstimator());
41      }
42  
43      /**
44       * Constructor.
45       *
46       * @param listener listener to handle events generated by this detector.
47       */
48      public AngularSpeedTriadStaticIntervalDetector(final AngularSpeedTriadStaticIntervalDetectorListener listener) {
49          super(new WindowedAngularSpeedTriadNoiseEstimator(), new AccumulatedAngularSpeedTriadNoiseEstimator(),
50                  listener);
51      }
52  
53      /**
54       * Converts provided angular speed value expressed in provided unit to
55       * radians per second (rad/s).
56       *
57       * @param value value to be converted.
58       * @param unit  unit of value to be converted.
59       * @return converted value.
60       */
61      @Override
62      protected double convertMeasurement(final double value, final AngularSpeedUnit unit) {
63          return AngularSpeedConverter.convert(value, unit, AngularSpeedUnit.RADIANS_PER_SECOND);
64      }
65  
66      /**
67       * Creates an angular speed instance using provided value and unit.
68       *
69       * @param value value of measurement.
70       * @param unit  unit of value.
71       * @return created angular speed.
72       */
73      @Override
74      protected AngularSpeed createMeasurement(final double value, final AngularSpeedUnit unit) {
75          return new AngularSpeed(value, unit);
76      }
77  
78      /**
79       * Gets default unit for angular speed, which is radians per second (rad/s).
80       *
81       * @return default unit for angular speed
82       */
83      @Override
84      protected AngularSpeedUnit getDefaultUnit() {
85          return AngularSpeedUnit.RADIANS_PER_SECOND;
86      }
87  
88      /**
89       * Creates an angular speed triad.
90       *
91       * @param valueX x-coordinate value.
92       * @param valueY y-coordinate value.
93       * @param valueZ z-coordinate value.
94       * @param unit   unit of values.
95       * @return created triad.
96       */
97      @Override
98      protected AngularSpeedTriad createTriad(
99              final double valueX, final double valueY, final double valueZ, final AngularSpeedUnit unit) {
100         return new AngularSpeedTriad(unit, valueX, valueY, valueZ);
101     }
102 
103     /**
104      * Gets gyroscope base noise level root PSD (Power Spectral Density)
105      * expressed in (rad * s^-0.5)
106      *
107      * @return gyroscope base noise level root PSD.
108      */
109     @Override
110     public double getGyroscopeBaseNoiseLevelRootPsd() {
111         return getBaseNoiseLevelRootPsd();
112     }
113 }