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 }