AngularSpeedTriadStaticIntervalDetector.java

/*
 * Copyright (C) 2020 Alberto Irurueta Carro (alberto@irurueta.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.irurueta.navigation.inertial.calibration.intervals;

import com.irurueta.navigation.inertial.calibration.AngularSpeedTriad;
import com.irurueta.navigation.inertial.calibration.GyroscopeNoiseRootPsdSource;
import com.irurueta.navigation.inertial.calibration.noise.AccumulatedAngularSpeedTriadNoiseEstimator;
import com.irurueta.navigation.inertial.calibration.noise.WindowedAngularSpeedTriadNoiseEstimator;
import com.irurueta.units.AngularSpeed;
import com.irurueta.units.AngularSpeedConverter;
import com.irurueta.units.AngularSpeedUnit;

/**
 * This detector is in charge of determining when a static period of
 * angular speed measurements starts and finishes.
 * Static periods are periods of time where the device is considered
 * to remain static (no movement applied to it).
 */
public class AngularSpeedTriadStaticIntervalDetector extends TriadStaticIntervalDetector<AngularSpeedUnit, AngularSpeed,
        AngularSpeedTriad, AngularSpeedTriadStaticIntervalDetector, AngularSpeedTriadStaticIntervalDetectorListener>
        implements GyroscopeNoiseRootPsdSource {

    /**
     * Constructor.
     */
    public AngularSpeedTriadStaticIntervalDetector() {
        super(new WindowedAngularSpeedTriadNoiseEstimator(), new AccumulatedAngularSpeedTriadNoiseEstimator());
    }

    /**
     * Constructor.
     *
     * @param listener listener to handle events generated by this detector.
     */
    public AngularSpeedTriadStaticIntervalDetector(final AngularSpeedTriadStaticIntervalDetectorListener listener) {
        super(new WindowedAngularSpeedTriadNoiseEstimator(), new AccumulatedAngularSpeedTriadNoiseEstimator(),
                listener);
    }

    /**
     * Converts provided angular speed value expressed in provided unit to
     * radians per second (rad/s).
     *
     * @param value value to be converted.
     * @param unit  unit of value to be converted.
     * @return converted value.
     */
    @Override
    protected double convertMeasurement(final double value, final AngularSpeedUnit unit) {
        return AngularSpeedConverter.convert(value, unit, AngularSpeedUnit.RADIANS_PER_SECOND);
    }

    /**
     * Creates an angular speed instance using provided value and unit.
     *
     * @param value value of measurement.
     * @param unit  unit of value.
     * @return created angular speed.
     */
    @Override
    protected AngularSpeed createMeasurement(final double value, final AngularSpeedUnit unit) {
        return new AngularSpeed(value, unit);
    }

    /**
     * Gets default unit for angular speed, which is radians per second (rad/s).
     *
     * @return default unit for angular speed
     */
    @Override
    protected AngularSpeedUnit getDefaultUnit() {
        return AngularSpeedUnit.RADIANS_PER_SECOND;
    }

    /**
     * Creates an angular speed triad.
     *
     * @param valueX x-coordinate value.
     * @param valueY y-coordinate value.
     * @param valueZ z-coordinate value.
     * @param unit   unit of values.
     * @return created triad.
     */
    @Override
    protected AngularSpeedTriad createTriad(
            final double valueX, final double valueY, final double valueZ, final AngularSpeedUnit unit) {
        return new AngularSpeedTriad(unit, valueX, valueY, valueZ);
    }

    /**
     * Gets gyroscope base noise level root PSD (Power Spectral Density)
     * expressed in (rad * s^-0.5)
     *
     * @return gyroscope base noise level root PSD.
     */
    @Override
    public double getGyroscopeBaseNoiseLevelRootPsd() {
        return getBaseNoiseLevelRootPsd();
    }
}