AccelerationTriadStaticIntervalDetector.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.AccelerationTriad;
import com.irurueta.navigation.inertial.calibration.AccelerometerNoiseRootPsdSource;
import com.irurueta.navigation.inertial.calibration.noise.AccumulatedAccelerationTriadNoiseEstimator;
import com.irurueta.navigation.inertial.calibration.noise.WindowedAccelerationTriadNoiseEstimator;
import com.irurueta.units.Acceleration;
import com.irurueta.units.AccelerationConverter;
import com.irurueta.units.AccelerationUnit;

/**
 * This detector is in charge of determining when a static period of
 * acceleration 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 AccelerationTriadStaticIntervalDetector extends TriadStaticIntervalDetector<AccelerationUnit,
        Acceleration, AccelerationTriad, AccelerationTriadStaticIntervalDetector,
        AccelerationTriadStaticIntervalDetectorListener> implements AccelerometerNoiseRootPsdSource {

    /**
     * Constructor.
     */
    public AccelerationTriadStaticIntervalDetector() {
        super(new WindowedAccelerationTriadNoiseEstimator(), new AccumulatedAccelerationTriadNoiseEstimator());
    }

    /**
     * Constructor.
     *
     * @param listener listener to handle events generated by this detector.
     */
    public AccelerationTriadStaticIntervalDetector(final AccelerationTriadStaticIntervalDetectorListener listener) {
        super(new WindowedAccelerationTriadNoiseEstimator(), new AccumulatedAccelerationTriadNoiseEstimator(),
                listener);
    }

    /**
     * Converts provided acceleration value expressed in provided unit to
     * meters per squared second (m/s^2).
     *
     * @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 AccelerationUnit unit) {
        return AccelerationConverter.convert(value, unit, AccelerationUnit.METERS_PER_SQUARED_SECOND);
    }

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

    /**
     * Gets default unit for acceleration, which is meters per
     * squared second (m/s^2).
     *
     * @return default unit for acceleration.
     */
    @Override
    protected AccelerationUnit getDefaultUnit() {
        return AccelerationUnit.METERS_PER_SQUARED_SECOND;
    }

    /**
     * Creates an acceleration 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 AccelerationTriad createTriad(final double valueX, final double valueY, final double valueZ,
            final AccelerationUnit unit) {
        return new AccelerationTriad(unit, valueX, valueY, valueZ);
    }

    /**
     * Gets accelerometer base noise level root PSD (Power Spectral Density)
     * expressed in (m * s^-1.5).
     *
     * @return accelerometer base noise level root PSD.
     */
    @Override
    public double getAccelerometerBaseNoiseLevelRootPsd() {
        return getBaseNoiseLevelRootPsd();
    }
}