Class AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer

java.lang.Object
com.irurueta.navigation.inertial.calibration.intervals.thresholdfactor.IntervalDetectorThresholdFactorOptimizer<com.irurueta.navigation.inertial.calibration.TimedBodyKinematics,AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizerDataSource>
com.irurueta.navigation.inertial.calibration.intervals.thresholdfactor.AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer
All Implemented Interfaces:
com.irurueta.navigation.inertial.calibration.AccelerometerNoiseRootPsdSource, com.irurueta.navigation.inertial.calibration.GyroscopeNoiseRootPsdSource
Direct Known Subclasses:
BracketedAccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer, ExhaustiveAccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer

public abstract class AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer extends IntervalDetectorThresholdFactorOptimizer<com.irurueta.navigation.inertial.calibration.TimedBodyKinematics,AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizerDataSource> implements com.irurueta.navigation.inertial.calibration.AccelerometerNoiseRootPsdSource, com.irurueta.navigation.inertial.calibration.GyroscopeNoiseRootPsdSource
Optimizes the threshold factor for interval detection of accelerometer and gyroscope data based on results of calibration. Implementations of this class will attempt to find the best threshold factor between the provided range of values. Only accelerometer calibrators based on unknown orientation are supported (in other terms, calibrators must be AccelerometerNonLinearCalibrator and must support AccelerometerCalibratorMeasurementType.STANDARD_DEVIATION_BODY_KINEMATICS). Only gyroscope calibrators based on unknown orientation are supported (in other terms, calibrators must be GyroscopeNonLinearCalibrator and must support GyroscopeCalibratorMeasurementOrSequenceType.BODY_KINEMATICS_SEQUENCE).
  • Field Details

    • DEFAULT_MIN_THRESHOLD_FACTOR

      public static final double DEFAULT_MIN_THRESHOLD_FACTOR
      Default minimum threshold factor.
      See Also:
    • DEFAULT_MAX_THRESHOLD_FACTOR

      public static final double DEFAULT_MAX_THRESHOLD_FACTOR
      Default maximum threshold factor.
      See Also:
    • minThresholdFactor

      protected double minThresholdFactor
      Minimum threshold factor.
    • maxThresholdFactor

      protected double maxThresholdFactor
      Maximum threshold factor.
    • accelerometerCalibrator

      private com.irurueta.navigation.inertial.calibration.accelerometer.AccelerometerNonLinearCalibrator accelerometerCalibrator
      Accelerometer calibrator.
    • gyroscopeCalibrator

      private com.irurueta.navigation.inertial.calibration.gyroscope.GyroscopeNonLinearCalibrator gyroscopeCalibrator
      Gyroscope calibrator.
    • generator

      private com.irurueta.navigation.inertial.calibration.generators.AccelerometerAndGyroscopeMeasurementsGenerator generator
      A measurement generator for accelerometer and gyroscope calibrators.
    • measurements

      private List<com.irurueta.navigation.inertial.calibration.StandardDeviationBodyKinematics> measurements
      Generated measurements to be used for accelerometer calibration.
    • sequences

      private List<com.irurueta.navigation.inertial.calibration.BodyKinematicsSequence<com.irurueta.navigation.inertial.calibration.StandardDeviationTimedBodyKinematics>> sequences
      Generated sequences to be used for gyroscope calibration.
    • accelerometerQualityScoreMapper

      private QualityScoreMapper<com.irurueta.navigation.inertial.calibration.StandardDeviationBodyKinematics> accelerometerQualityScoreMapper
      Mapper to convert StandardDeviationBodyKinematics measurements into quality scores.
    • gyroscopeQualityScoreMapper

      private QualityScoreMapper<com.irurueta.navigation.inertial.calibration.BodyKinematicsSequence<com.irurueta.navigation.inertial.calibration.StandardDeviationTimedBodyKinematics>> gyroscopeQualityScoreMapper
      Mapper to convert BodyKinematicsSequence sequences of StandardDeviationTimedBodyKinematics into quality scores.
    • mseRule

      Rule to convert accelerometer and gyroscope MSE values into a single global MSE value.
    • angularSpeedNoiseRootPsd

      private double angularSpeedNoiseRootPsd
      Estimated norm of gyroscope noise root PSD (Power Spectral Density) expressed as (rad * s^-0.5).
    • baseNoiseLevel

      private double baseNoiseLevel
      Accelerometer base noise level that has been detected during initialization of the best solution that has been found expressed in meters per squared second (m/s^2). This is equal to the standard deviation of the accelerometer measurements during the initialization phase.
    • threshold

      private double threshold
      Threshold to determine static/dynamic period changes expressed in meters per squared second (m/s^2) for the best calibration solution that has been found.
    • estimatedAccelerometerCovariance

      private com.irurueta.algebra.Matrix estimatedAccelerometerCovariance
      Estimated covariance matrix for estimated accelerometer parameters.
    • estimatedAccelerometerMa

      private com.irurueta.algebra.Matrix estimatedAccelerometerMa
      Estimated accelerometer scale factors and cross-coupling errors. This is the product of matrix Ta containing cross-coupling errors and Ka containing scaling factors. So that:
           Ma = [sx    mxy  mxz] = Ta*Ka
                [myx   sy   myz]
                [mzx   mzy  sz ]
       
      Where:
           Ka = [sx 0   0 ]
                [0  sy  0 ]
                [0  0   sz]
       
      and
           Ta = [1          -alphaXy    alphaXz ]
                [alphaYx    1           -alphaYz]
                [-alphaZx   alphaZy     1       ]
       
      Hence:
           Ma = [sx    mxy  mxz] = Ta*Ka =  [sx             -sy * alphaXy   sz * alphaXz ]
                [myx   sy   myz]            [sx * alphaYx   sy              -sz * alphaYz]
                [mzx   mzy  sz ]            [-sx * alphaZx  sy * alphaZy    sz           ]
       
      This instance allows any 3x3 matrix. However, typically alphaYx, alphaZx and alphaZy are considered to be zero if the accelerometer z-axis is assumed to be the same as the body z-axis. When this is assumed, myx = mzx = mzy = 0 and the Ma matrix becomes upper diagonal:
           Ma = [sx    mxy  mxz]
                [0     sy   myz]
                [0     0    sz ]
       
      Values of this matrix are unit-less.
    • estimatedAccelerometerBiases

      private double[] estimatedAccelerometerBiases
      Estimated accelerometer biases for each IMU axis expressed in meter per squared second (m/s^2).
    • estimatedGyroscopeCovariance

      private com.irurueta.algebra.Matrix estimatedGyroscopeCovariance
      Estimated covariance matrix for estimated gyroscope parameters.
    • estimatedGyroscopeBiases

      private double[] estimatedGyroscopeBiases
      Estimated angular rate biases for each IMU axis expressed in radians per second (rad/s).
    • estimatedGyroscopeMg

      private com.irurueta.algebra.Matrix estimatedGyroscopeMg
      Estimated gyroscope scale factors and cross-coupling errors. This is the product of matrix Tg containing cross-coupling errors and Kg containing scaling factors. So that:
           Mg = [sx    mxy  mxz] = Tg*Kg
                [myx   sy   myz]
                [mzx   mzy  sz ]
       
      Where:
           Kg = [sx 0   0 ]
                [0  sy  0 ]
                [0  0   sz]
       
      and
           Tg = [1          -alphaXy    alphaXz ]
                [alphaYx    1           -alphaYz]
                [-alphaZx   alphaZy     1       ]
       
      Hence:
           Mg = [sx    mxy  mxz] = Tg*Kg =  [sx             -sy * alphaXy   sz * alphaXz ]
                [myx   sy   myz]            [sx * alphaYx   sy              -sz * alphaYz]
                [mzx   mzy  sz ]            [-sx * alphaZx  sy * alphaZy    sz           ]
       
      This instance allows any 3x3 matrix. However, typically alphaYx, alphaZx and alphaZy are considered to be zero if the gyroscope z-axis is assumed to be the same as the body z-axis. When this is assumed, myx = mzx = mzy = 0 and the Mg matrix becomes upper diagonal:
           Mg = [sx    mxy  mxz]
                [0     sy   myz]
                [0     0    sz ]
       
      Values of this matrix are unit-less.
    • estimatedGyroscopeGg

      private com.irurueta.algebra.Matrix estimatedGyroscopeGg
      Estimated G-dependent cross-biases introduced on the gyroscope by the specific forces sensed by the accelerometer. This instance allows any 3x3 matrix.
  • Constructor Details

    • AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer

      protected AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer()
      Constructor.
    • AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer

      protected AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer(AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizerDataSource dataSource)
      Constructor.
      Parameters:
      dataSource - instance in charge of retrieving data for this optimizer.
    • AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer

      protected AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer(com.irurueta.navigation.inertial.calibration.accelerometer.AccelerometerNonLinearCalibrator accelerometerCalibrator, com.irurueta.navigation.inertial.calibration.gyroscope.GyroscopeNonLinearCalibrator gyroscopeCalibrator)
      Constructor.
      Parameters:
      accelerometerCalibrator - an accelerometer calibrator to be used to optimize its Mean Square Error (MSE).
      gyroscopeCalibrator - a gyroscope calibrator to be used to optimize its Mean Square Error (MSE).
      Throws:
      IllegalArgumentException - if accelerometer calibrator does not use StandardDeviationBodyKinematics measurements or if gyroscope calibrator does not use BodyKinematicsSequence sequences of StandardDeviationTimedBodyKinematics.
    • AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer

      protected AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizer(AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizerDataSource dataSource, com.irurueta.navigation.inertial.calibration.accelerometer.AccelerometerNonLinearCalibrator accelerometerCalibrator, com.irurueta.navigation.inertial.calibration.gyroscope.GyroscopeNonLinearCalibrator gyroscopeCalibrator)
      Constructor.
      Parameters:
      dataSource - instance in charge of retrieving data for this optimizer.
      accelerometerCalibrator - an accelerometer calibrator to be used to optimize its Mean Square Error (MSE).
      gyroscopeCalibrator - a gyroscope calibrator to be used to optimize its Mean Square Error (MSE).
      Throws:
      IllegalArgumentException - if accelerometer calibrator does not use StandardDeviationBodyKinematics measurements or if gyroscope calibrator does not use BodyKinematicsSequence sequences of StandardDeviationTimedBodyKinematics.
  • Method Details

    • getAccelerometerCalibrator

      public com.irurueta.navigation.inertial.calibration.accelerometer.AccelerometerNonLinearCalibrator getAccelerometerCalibrator()
      Gets provided accelerometer calibrator to be used to optimize its Mean Square Error (MSE).
      Returns:
      accelerometer calibrator to be used to optimize its MSE.
    • setAccelerometerCalibrator

      public void setAccelerometerCalibrator(com.irurueta.navigation.inertial.calibration.accelerometer.AccelerometerNonLinearCalibrator accelerometerCalibrator) throws com.irurueta.navigation.LockedException
      Sets accelerometer calibrator to be used to optimize its Mean Square Error (MSE).
      Parameters:
      accelerometerCalibrator - accelerometer calibrator to be used to optimize its MSE.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if accelerometer calibrator does not use StandardDeviationBodyKinematics measurements.
    • getGyroscopeCalibrator

      public com.irurueta.navigation.inertial.calibration.gyroscope.GyroscopeNonLinearCalibrator getGyroscopeCalibrator()
      Gets provided gyroscope calibrator to be used to optimize its Mean Square Error (MSE).
      Returns:
      gyroscope calibrator to be used to optimize its MSE.
    • setGyroscopeCalibrator

      public void setGyroscopeCalibrator(com.irurueta.navigation.inertial.calibration.gyroscope.GyroscopeNonLinearCalibrator gyroscopeCalibrator) throws com.irurueta.navigation.LockedException
      Sets gyroscope calibrator to be used to optimize its Mean Square Error (MSE).
      Parameters:
      gyroscopeCalibrator - gyroscope calibrator to be use dto optimize its MSE.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if gyroscope calibrator does not use BodyKinematicsSequence sequences of StandardDeviationTimedBodyKinematics.
    • getAccelerometerQualityScoreMapper

      public QualityScoreMapper<com.irurueta.navigation.inertial.calibration.StandardDeviationBodyKinematics> getAccelerometerQualityScoreMapper()
      Gets mapper to convert StandardDeviationBodyKinematics accelerometer measurements into quality scores.
      Returns:
      mapper to convert accelerometer measurements into quality scores.
    • setAccelerometerQualityScoreMapper

      public void setAccelerometerQualityScoreMapper(QualityScoreMapper<com.irurueta.navigation.inertial.calibration.StandardDeviationBodyKinematics> accelerometerQualityScoreMapper) throws com.irurueta.navigation.LockedException
      Sets mapper to convert StandardDeviationBodyKinematics accelerometer measurements into quality scores.
      Parameters:
      accelerometerQualityScoreMapper - mapper to convert accelerometer measurements into quality scores.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
    • getGyroscopeQualityScoreMapper

      public QualityScoreMapper<com.irurueta.navigation.inertial.calibration.BodyKinematicsSequence<com.irurueta.navigation.inertial.calibration.StandardDeviationTimedBodyKinematics>> getGyroscopeQualityScoreMapper()
      Gets mapper to convert BodyKinematicsSequence gyroscope sequences of StandardDeviationTimedBodyKinematics into quality scores.
      Returns:
      mapper to convert gyroscope sequences into quality scores.
    • setGyroscopeQualityScoreMapper

      public void setGyroscopeQualityScoreMapper(QualityScoreMapper<com.irurueta.navigation.inertial.calibration.BodyKinematicsSequence<com.irurueta.navigation.inertial.calibration.StandardDeviationTimedBodyKinematics>> gyroscopeQualityScoreMapper) throws com.irurueta.navigation.LockedException
      Sets mapper to convert BodyKinematicsSequence gyroscope sequences of StandardDeviationTimedBodyKinematics into quality scores.
      Parameters:
      gyroscopeQualityScoreMapper - mapper to convert gyroscope sequences into quality scores.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
    • getMseRule

      public AccelerometerAndGyroscopeMseRule getMseRule()
      Gets rule to convert accelerometer and gyroscope MSE values into a single global MSE value.
      Returns:
      rule to convert accelerometer and gyroscope MSE values into a single global MSE value.
    • setMseRule

      public void setMseRule(AccelerometerAndGyroscopeMseRule mseRule) throws com.irurueta.navigation.LockedException
      Sets rule to convert accelerometer and gyroscope MSE values into a single global MSE value.
      Parameters:
      mseRule - rule to convert accelerometer and gyroscope MSE values into a single global MSE value.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
    • getMinThresholdFactor

      public double getMinThresholdFactor()
      Gets the minimum threshold factor.
      Returns:
      minimum threshold factor.
    • getMaxThresholdFactor

      public double getMaxThresholdFactor()
      Gets the maximum threshold factor.
      Returns:
      maximum threshold factor.
    • setThresholdFactorRange

      public void setThresholdFactorRange(double minThresholdFactor, double maxThresholdFactor) throws com.irurueta.navigation.LockedException
      Sets a range of threshold factor values to get an optimized threshold factor value.
      Parameters:
      minThresholdFactor - minimum threshold.
      maxThresholdFactor - maximum threshold.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if either minimum or maximum values are negative, or if the minimum value is larger than the maximum one.
    • isReady

      public boolean isReady()
      Indicates whether this optimizer is ready to start optimization.
      Overrides:
      isReady in class IntervalDetectorThresholdFactorOptimizer<com.irurueta.navigation.inertial.calibration.TimedBodyKinematics,AccelerometerAndGyroscopeIntervalDetectorThresholdFactorOptimizerDataSource>
      Returns:
      true if this optimizer is ready, false otherwise.
    • getTimeInterval

      public double getTimeInterval()
      Gets the time interval between input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() expressed in seconds (s).
      Returns:
      time interval between input measurements.
    • setTimeInterval

      public void setTimeInterval(double timeInterval) throws com.irurueta.navigation.LockedException
      Sets time interval between input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() expressed in seconds (s).
      Parameters:
      timeInterval - time interval between input measurements.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if provided value is negative.
    • getTimeIntervalAsTime

      public com.irurueta.units.Time getTimeIntervalAsTime()
      Gets the time interval between input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource().
      Returns:
      time interval between input measurements.
    • getTimeIntervalAsTime

      public void getTimeIntervalAsTime(com.irurueta.units.Time result)
      Gets the time interval between input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource().
      Parameters:
      result - instance where the time interval will be stored.
    • setTimeInterval

      public void setTimeInterval(com.irurueta.units.Time timeInterval) throws com.irurueta.navigation.LockedException
      Sets time interval between input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource().
      Parameters:
      timeInterval - time interval between input measurements.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if provided value is negative.
    • getMinStaticSamples

      public int getMinStaticSamples()
      Gets minimum number of input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() required in a static interval to be taken into account. Smaller static intervals will be discarded.
      Returns:
      a minimum number of input measurements required in a static interval to be taken into account.
    • setMinStaticSamples

      public void setMinStaticSamples(int minStaticSamples) throws com.irurueta.navigation.LockedException
      Sets minimum number of input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() required in a static interval to be taken into account. Smaller static intervals will be discarded.
      Parameters:
      minStaticSamples - a minimum number of input measurements required in a static interval to be taken into account.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if provided value is less than 2.
    • getMaxDynamicSamples

      public int getMaxDynamicSamples()
      Gets maximum number of input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() allowed in dynamic intervals.
      Returns:
      maximum number of input measurements allowed in dynamic intervals.
    • setMaxDynamicSamples

      public void setMaxDynamicSamples(int maxDynamicSamples) throws com.irurueta.navigation.LockedException
      Sets maximum number of input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() allowed in dynamic intervals.
      Parameters:
      maxDynamicSamples - maximum number of input measurements allowed in dynamic intervals.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if provided value is less than 2.
    • getWindowSize

      public int getWindowSize()
      Gets length of number of input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() to keep within the window being processed to determine instantaneous accelerometer noise level.
      Returns:
      length of input measurements to keep within the window.
    • setWindowSize

      public void setWindowSize(int windowSize) throws com.irurueta.navigation.LockedException
      Sets length of number of input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() to keep within the window being processed to determine instantaneous noise level. Window size must always be larger than the allowed minimum value, which is 2 and must have an odd value.
      Parameters:
      windowSize - length of number of samples to keep within the window.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if provided value is not valid.
    • getInitialStaticSamples

      public int getInitialStaticSamples()
      Gets number of input measurements provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() to be processed initially while keeping the sensor static to find the base noise level when the device is static.
      Returns:
      number of samples to be processed initially.
    • setInitialStaticSamples

      public void setInitialStaticSamples(int initialStaticSamples) throws com.irurueta.navigation.LockedException
      Sets number of input parameters provided to the IntervalDetectorThresholdFactorOptimizer.getDataSource() to be processed initially while keeping the sensor static to find the base noise level when the device is static.
      Parameters:
      initialStaticSamples - number of samples ot be processed initially.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if provided value is less than TriadStaticIntervalDetector.MINIMUM_INITIAL_STATIC_SAMPLES.
    • getInstantaneousNoiseLevelFactor

      public double getInstantaneousNoiseLevelFactor()
      Gets factor to determine that a sudden movement has occurred during initialization if instantaneous noise level exceeds accumulated noise level by this factor amount. This factor is unit-less.
      Returns:
      factor to determine that a sudden movement has occurred.
    • setInstantaneousNoiseLevelFactor

      public void setInstantaneousNoiseLevelFactor(double instantaneousNoiseLevelFactor) throws com.irurueta.navigation.LockedException
      Sets factor to determine that a sudden movement has occurred during initialization if instantaneous noise level exceeds accumulated noise level by this factor amount. This factor is unit-less.
      Parameters:
      instantaneousNoiseLevelFactor - factor to determine that a sudden movement has occurred during initialization.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if provided value is zero or negative.
    • getBaseNoiseLevelAbsoluteThreshold

      public double getBaseNoiseLevelAbsoluteThreshold()
      Gets the overall absolute threshold to determine whether there has been excessive motion during the whole initialization phase. This threshold is expressed in meters per squared second (m/s^2).
      Returns:
      overall absolute threshold to determine whether there has been excessive motion.
    • setBaseNoiseLevelAbsoluteThreshold

      public void setBaseNoiseLevelAbsoluteThreshold(double baseNoiseLevelAbsoluteThreshold) throws com.irurueta.navigation.LockedException
      Sets the overall absolute threshold to determine whether there has been excessive motion during the whole initialization phase. This threshold is expressed in meters per squared second (m/s^2).
      Parameters:
      baseNoiseLevelAbsoluteThreshold - overall absolute threshold to determine whether there has been excessive motion.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if provided value is zero or negative.
    • getBaseNoiseLevelAbsoluteThresholdAsMeasurement

      public com.irurueta.units.Acceleration getBaseNoiseLevelAbsoluteThresholdAsMeasurement()
      Gets the overall absolute threshold to determine whether there has been excessive motion during the whole initialization phase.
      Returns:
      overall absolute threshold to determine whether there has been excessive motion.
    • getBaseNoiseLevelAbsoluteThresholdAsMeasurement

      public void getBaseNoiseLevelAbsoluteThresholdAsMeasurement(com.irurueta.units.Acceleration result)
      Gets the overall absolute threshold to determine whether there has been excessive motion during the whole initialization phase.
      Parameters:
      result - instance where the result will be stored.
    • setBaseNoiseLevelAbsoluteThreshold

      public void setBaseNoiseLevelAbsoluteThreshold(com.irurueta.units.Acceleration baseNoiseLevelAbsoluteThreshold) throws com.irurueta.navigation.LockedException
      Sets the overall absolute threshold to determine whether there has been excessive motion during the whole initialization phase.
      Parameters:
      baseNoiseLevelAbsoluteThreshold - overall absolute threshold to determine whether there has been excessive motion.
      Throws:
      com.irurueta.navigation.LockedException - if optimizer is already running.
      IllegalArgumentException - if provided value is zero or negative.
    • getAccelerometerBaseNoiseLevel

      public double getAccelerometerBaseNoiseLevel()
      Gets accelerometer base noise level that has been detected during initialization of the best solution that has been found expressed in meters per squared second (m/s^2). This is equal to the standard deviation of the accelerometer measurements during the initialization phase.
      Returns:
      accelerometer base noise level of the best solution that has been found.
    • getAccelerometerBaseNoiseLevelAsMeasurement

      public com.irurueta.units.Acceleration getAccelerometerBaseNoiseLevelAsMeasurement()
      Gets accelerometer base noise level that has been detected during initialization of the best solution that has been found. This is equal to the standard deviation of the accelerometer measurements during the initialization phase.
      Returns:
      accelerometer base noise level of the best solution that has been found.
    • getAccelerometerBaseNoiseLevelAsMeasurement

      public void getAccelerometerBaseNoiseLevelAsMeasurement(com.irurueta.units.Acceleration result)
      Gets accelerometer base noise level that has been detected during initialization of the best solution that has been found. This is equal to the standard deviation of the accelerometer measurements during the initialization phase.
      Parameters:
      result - instance where the result will be stored.
    • getGyroscopeBaseNoiseLevelPsd

      public double getGyroscopeBaseNoiseLevelPsd()
      Gets gyroscope base noise level PSD (Power Spectral Density) expressed in (rad^2/s).
      Returns:
      gyroscope base noise level PSD.
    • getGyroscopeBaseNoiseLevelRootPsd

      public double getGyroscopeBaseNoiseLevelRootPsd()
      Gets gyroscope base noise level root PSD (Power Spectral Density) expressed in (rad * s^-0.5)
      Specified by:
      getGyroscopeBaseNoiseLevelRootPsd in interface com.irurueta.navigation.inertial.calibration.GyroscopeNoiseRootPsdSource
      Returns:
      gyroscope base noise level root PSD.
    • getAccelerometerBaseNoiseLevelPsd

      public double getAccelerometerBaseNoiseLevelPsd()
      Gets accelerometer base noise level PSD (Power Spectral Density) expressed in (m^2 * s^-3).
      Returns:
      accelerometer base noise level PSD.
    • getAccelerometerBaseNoiseLevelRootPsd

      public double getAccelerometerBaseNoiseLevelRootPsd()
      Gets accelerometer base noise level root PSD (Power Spectral Density) expressed in (m * s^-1.5).
      Specified by:
      getAccelerometerBaseNoiseLevelRootPsd in interface com.irurueta.navigation.inertial.calibration.AccelerometerNoiseRootPsdSource
      Returns:
      accelerometer base noise level root PSD.
    • getThreshold

      public double getThreshold()
      Gets the threshold to determine static/dynamic period changes expressed in meters per squared second (m/s^2) for the best calibration solution that has been found.
      Returns:
      threshold to determine static/dynamic period changes for the best solution.
    • getThresholdAsMeasurement

      public com.irurueta.units.Acceleration getThresholdAsMeasurement()
      Gets the threshold to determine static/dynamic period changes for the best calibration solution that has been found.
      Returns:
      threshold to determine static/dynamic period changes for the best solution.
    • getThresholdAsMeasurement

      public void getThresholdAsMeasurement(com.irurueta.units.Acceleration result)
      Get the threshold to determine static/dynamic period changes for the best calibration solution that has been found.
      Parameters:
      result - instance where the result will be stored.
    • getEstimatedAccelerometerBiasStandardDeviationNorm

      public Double getEstimatedAccelerometerBiasStandardDeviationNorm()
      Gets estimated standard deviation norm of accelerometer bias expressed in meters per squared second (m/s^2). This can be used as the initial accelerometer bias uncertainty for INSLooselyCoupledKalmanInitializerConfig or INSTightlyCoupledKalmanInitializerConfig.
      Returns:
      estimated standard deviation norm of accelerometer bias or null if not available.
    • getEstimatedAccelerometerBiasFxVariance

      public Double getEstimatedAccelerometerBiasFxVariance()
      Gets estimated x coordinate variance of accelerometer bias expressed in (m^2/s^4).
      Returns:
      estimated x coordinate variance of accelerometer bias or null if not available.
    • getEstimatedAccelerometerBiasFyVariance

      public Double getEstimatedAccelerometerBiasFyVariance()
      Gets estimated y coordinate variance of accelerometer bias expressed in (m^2/s^4).
      Returns:
      estimated y coordinate variance of accelerometer bias or null if not available.
    • getEstimatedAccelerometerBiasFzVariance

      public Double getEstimatedAccelerometerBiasFzVariance()
      Gets estimated z coordinate variance of accelerometer bias expressed in (m^2/s^4).
      Returns:
      estimated z coordinate variance of accelerometer bias or null if not available.
    • getEstimatedAccelerometerBiases

      public double[] getEstimatedAccelerometerBiases()
      Gets an array containing x,y,z components of estimated accelerometer biases expressed in meters per squared second (m/s^2).
      Returns:
      array containing x,y,z components of estimated accelerometer biases.
    • getEstimatedAccelerometerMa

      public com.irurueta.algebra.Matrix getEstimatedAccelerometerMa()
      Gets estimated accelerometer scale factors and cross-coupling errors. This is the product of matrix Ta containing cross-coupling errors and Ka containing scaling factors. So that:
           Ma = [sx    mxy  mxz] = Ta*Ka
                [myx   sy   myz]
                [mzx   mzy  sz ]
       
      Where:
           Ka = [sx 0   0 ]
                [0  sy  0 ]
                [0  0   sz]
       
      and
           Ta = [1          -alphaXy    alphaXz ]
                [alphaYx    1           -alphaYz]
                [-alphaZx   alphaZy     1       ]
       
      Hence:
           Ma = [sx    mxy  mxz] = Ta*Ka =  [sx             -sy * alphaXy   sz * alphaXz ]
                [myx   sy   myz]            [sx * alphaYx   sy              -sz * alphaYz]
                [mzx   mzy  sz ]            [-sx * alphaZx  sy * alphaZy    sz           ]
       
      This instance allows any 3x3 matrix. However, typically alphaYx, alphaZx and alphaZy are considered to be zero if the accelerometer z-axis is assumed to be the same as the body z-axis. When this is assumed, myx = mzx = mzy = 0 and the Ma matrix becomes upper diagonal:
           Ma = [sx    mxy  mxz]
                [0     sy   myz]
                [0     0    sz ]
       
      Values of this matrix are unit-less.
      Returns:
      estimated accelerometer scale factors and cross-coupling errors, or null if not available.
    • getEstimatedGyroscopeBiasStandardDeviationNorm

      public Double getEstimatedGyroscopeBiasStandardDeviationNorm()
      Gets estimated standard deviation norm of gyroscope bias expressed in radians per second (rad/s). This can be used as the initial gyroscope bias uncertainty for INSLooselyCoupledKalmanInitializerConfig or INSTightlyCoupledKalmanInitializerConfig.
      Returns:
      estimated standard deviation norm of gyroscope bias or null if not available.
    • getEstimatedGyroscopeBiasXVariance

      public Double getEstimatedGyroscopeBiasXVariance()
      Gets estimated x coordinate variance of gyroscope bias expressed in (rad^2/s^2).
      Returns:
      estimated x coordinate variance of gyroscope bias or null if not available.
    • getEstimatedGyroscopeBiasYVariance

      public Double getEstimatedGyroscopeBiasYVariance()
      Gets estimated y coordinate variance of gyroscope bias expressed in (rad^2/s^2).
      Returns:
      estimated y coordinate variance of gyroscope bias or null if not available.
    • getEstimatedGyroscopeBiasZVariance

      public Double getEstimatedGyroscopeBiasZVariance()
      Gets estimated z coordinate variance of gyroscope bias expressed in (rad^2/s^2).
      Returns:
      estimated z coordinate variance of gyroscope bias or null if not available.
    • getEstimatedGyroscopeBiases

      public double[] getEstimatedGyroscopeBiases()
      Gets the array containing x,y,z components of estimated gyroscope biases expressed in radians per second (rad/s).
      Returns:
      array containing x,y,z components of estimated gyroscope biases.
    • getEstimatedGyroscopeMg

      public com.irurueta.algebra.Matrix getEstimatedGyroscopeMg()
      Gets estimated gyroscope scale factors and cross-coupling errors. This is the product of matrix Tg containing cross-coupling errors and Kg containing scaling factors. So that:
           Mg = [sx    mxy  mxz] = Tg*Kg
                [myx   sy   myz]
                [mzx   mzy  sz ]
       
      Where:
           Kg = [sx 0   0 ]
                [0  sy  0 ]
                [0  0   sz]
       
      and
           Tg = [1          -alphaXy    alphaXz ]
                [alphaYx    1           -alphaYz]
                [-alphaZx   alphaZy     1       ]
       
      Hence:
           Mg = [sx    mxy  mxz] = Tg*Kg =  [sx             -sy * alphaXy   sz * alphaXz ]
                [myx   sy   myz]            [sx * alphaYx   sy              -sz * alphaYz]
                [mzx   mzy  sz ]            [-sx * alphaZx  sy * alphaZy    sz           ]
       
      This instance allows any 3x3 matrix. However, typically alphaYx, alphaZx and alphaZy are considered to be zero if the gyroscope z-axis is assumed to be the same as the body z-axis. When this is assumed, myx = mzx = mzy = 0 and the Mg matrix becomes upper diagonal:
           Mg = [sx    mxy  mxz]
                [0     sy   myz]
                [0     0    sz ]
       
      Values of this matrix are unit-less.
      Returns:
      estimated gyroscope scale factors and cross-coupling errors.
    • getEstimatedGyroscopeGg

      public com.irurueta.algebra.Matrix getEstimatedGyroscopeGg()
      Gets estimated G-dependent cross-biases introduced on the gyroscope by the specific forces sensed by the accelerometer.
      Returns:
      a 3x3 matrix containing g-dependent cross biases.
    • evaluateForThresholdFactor

      protected double evaluateForThresholdFactor(double thresholdFactor) throws com.irurueta.navigation.LockedException, com.irurueta.navigation.inertial.calibration.CalibrationException, com.irurueta.navigation.NotReadyException, IntervalDetectorThresholdFactorOptimizerException
      Evaluates calibration Mean Square Error (MSE) for the provided threshold factor.
      Parameters:
      thresholdFactor - threshold factor to be used for interval detection and measurement generation to be used for calibration.
      Returns:
      calibration MSE.
      Throws:
      com.irurueta.navigation.LockedException - if the generator is busy.
      com.irurueta.navigation.inertial.calibration.CalibrationException - if calibration fails.
      com.irurueta.navigation.NotReadyException - if the calibrator is not ready.
      IntervalDetectorThresholdFactorOptimizerException - interval detection failed.
    • initialize

      private void initialize()
      Initializes accelerometer + gyroscope measurement generator to convert timed body kinematics measurements after interval detection into measurements and sequences used for accelerometer and gyroscope calibration.
    • keepBestResult

      private void keepBestResult(double mse, double thresholdFactor)
      Keeps the best calibration solution found so far.
      Parameters:
      mse - Estimated Mean Square Error during calibration.
      thresholdFactor - threshold factor to be kept.
    • createMeasurement

      private com.irurueta.units.Acceleration createMeasurement(double value, com.irurueta.units.AccelerationUnit unit)
      Creates an acceleration instance using the provided value and unit.
      Parameters:
      value - value of measurement.
      unit - unit of value.
      Returns:
      created acceleration.
    • getDefaultUnit

      private com.irurueta.units.AccelerationUnit getDefaultUnit()
      Gets the default unit for acceleration, which is meters per squared second (m/s^2).
      Returns:
      default unit for acceleration.