CPD Results
The following document contains the results of PMD's CPD 7.14.0.
Duplications
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/SequentialRobustMixedPositionEstimator.java | 706 |
| com/irurueta/navigation/indoor/position/SequentialRobustRangingAndRssiPositionEstimator.java | 687 |
final SequentialRobustMixedPositionEstimatorListener<P> listener) {
this(sourceQualityScores, fingerprintReadingQualityScores, sources, fingerprint);
this.listener = listener;
}
/**
* Gets robust method used for robust position estimation using ranging data.
*
* @return robust method used for robust position estimation using ranging data.
*/
public RobustEstimatorMethod getRangingRobustMethod() {
return rangingRobustMethod;
}
/**
* Sets robust method for robust position estimation using ranging data.
*
* @param rangingRobustMethod robust method used for robust position estimation
* using ranging data.
* @throws LockedException if this instance is locked.
*/
public void setRangingRobustMethod(final RobustEstimatorMethod rangingRobustMethod) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rangingRobustMethod = rangingRobustMethod;
}
/**
* Gets robust method used for coarse robust position estimation using RSSI data.
*
* @return robust method used for coarse robust position estimation using RSSI
* data.
*/
public RobustEstimatorMethod getRssiRobustMethod() {
return rssiRobustMethod;
}
/**
* Sets robust method used for coarse robust position estimation using RSSI data.
*
* @param rssiRobustMethod robust method used for coarse robust position estimation
* using RSSI data.
* @throws LockedException if this instance is locked.
*/
public void setRssiRobustMethod(final RobustEstimatorMethod rssiRobustMethod) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rssiRobustMethod = rssiRobustMethod;
}
/**
* Indicates whether located radio source position covariance is taken into account
* (if available) to determine distance standard deviation for ranging measurements.
*
* @return true to take into account radio source position covariance during ranging
* position estimation, false otherwise.
*/
public boolean isRangingRadioSourcePositionCovarianceUsed() {
return useRangingRadioSourcePositionCovariance;
}
/**
* Specifies whether located radio source position covariance is taken into account
* (if available) to determine distance standard deviation for ranging measurements.
*
* @param useRangingRadioSourcePositionCovariance true to take into account radio
* source position covariance during
* ranging position estimation,
* false otherwise.
* @throws LockedException if this instance is locked.
*/
public void setRangingRadioSourcePositionCovarianceUsed(
final boolean useRangingRadioSourcePositionCovariance) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useRangingRadioSourcePositionCovariance =
useRangingRadioSourcePositionCovariance;
}
/**
* Indicates whether located radio source position covariance is taken into account
* (if available) to determine distance standard deviation for RSSI measurements.
*
* @return true to take into account radio source position covariance during RSSI
* position estimation, false otherwise.
*/
public boolean isRssiRadioSourcePositionCovarianceUsed() {
return useRssiRadioSourcePositionCovariance;
}
/**
* Specifies whether located radio source position covariance is taken into account
* (if available) to determine distance standard deviation for RSSI measurements.
*
* @param useRssiRadioSourcePositionCovariance true to take into account radio
* source position covariance during
* RSSI position estimation, false
* otherwise.
* @throws LockedException if this instance is locked.
*/
public void setRssiRadioSourcePositionCovarianceUsed(final boolean useRssiRadioSourcePositionCovariance)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useRssiRadioSourcePositionCovariance = useRssiRadioSourcePositionCovariance;
}
/**
* Indicates whether ranging readings are evenly distributed among radio sources
* taking into account quality scores of both radio sources and ranging readings.
*
* @return true if ranging readings are evenly distributed among radio sources,
* false otherwise.
*/
public boolean isRangingReadingsEvenlyDistributed() {
return evenlyDistributeRangingReadings;
}
/**
* Specifies whether ranging readings are evenly distributed among radio sources
* taking into account quality scores of both radio sources and ranging readings.
*
* @param evenlyDistributeRangingReadings true if ranging readings are evenly
* distributed among radio sources, false
* otherwise.
* @throws LockedException if this instance is locked.
*/
public void setRangingReadingsEvenlyDistributed(final boolean evenlyDistributeRangingReadings)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.evenlyDistributeRangingReadings = evenlyDistributeRangingReadings;
}
/**
* Gets distance standard deviation fallback value to use when none can be
* determined from provided RSSI measurements.
*
* @return distance standard deviation fallback value to use when none can be
* determined from provided RSSI measurements.
*/
public double getRssiFallbackDistanceStandardDeviation() {
return rssiFallbackDistanceStandardDeviation;
}
/**
* Sets distance standard deviation fallback value to use when none can be
* determined from provided RSSI measurements.
*
* @param rssiFallbackDistanceStandardDeviation distance standard deviation fallback
* value to use when none can be
* determined from provided RSSI
* measurements.
* @throws LockedException if this instance is locked.
*/
public void setRssiFallbackDistanceStandardDeviation(final double rssiFallbackDistanceStandardDeviation)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rssiFallbackDistanceStandardDeviation = rssiFallbackDistanceStandardDeviation;
}
/**
* Gets distance standard deviation fallback value to use when none can be
* determined from provided ranging measurements.
*
* @return distance standard deviation fallback value to use when none can be
* determined from provided ranging measurements.
*/
public double getRangingFallbackDistanceStandardDeviation() {
return rangingFallbackDistanceStandardDeviation;
}
/**
* Sets distance standard deviation fallback value to use when none can be
* determined from provided ranging measurements.
*
* @param rangingFallbackDistanceStandardDeviation distance standard deviation
* fallback value to use when none
* can be determined from provided
* ranging measurements.
* @throws LockedException if this instance is locked.
*/
public void setRangingFallbackDistanceStandardDeviation(final double rangingFallbackDistanceStandardDeviation)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rangingFallbackDistanceStandardDeviation = rangingFallbackDistanceStandardDeviation;
}
/**
* Indicates whether RSSI readings are evenly distributed among radio sources
* taking into account quality scores of both radio sources and RSSI readings.
*
* @return true if RSSI readings are evenly distributed among radio sources,
* false otherwise.
*/
public boolean isRssiReadingsEvenlyDistributed() {
return evenlyDistributeRssiReadings;
}
/**
* Specifies whether RSSI readings are evenly distributed among radio sources
* taking into account quality scores of both radio sources and RSSI readings.
*
* @param evenlyDistributeRssiReadings true if RSSI readings are evenly distributed
* among radio sources, false otherwise.
* @throws LockedException if this instance is locked.
*/
public void setRssiReadingsEvenlyDistributed(final boolean evenlyDistributeRssiReadings) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.evenlyDistributeRssiReadings = evenlyDistributeRssiReadings;
}
/**
* Gets amount of progress variation before notifying a progress change during
* estimation.
*
* @return amount of progress variation before notifying a progress change during
* estimation.
*/
public float getProgressDelta() {
return progressDelta;
}
/**
* Sets amount of progress variation before notifying a progress change during
* estimation.
*
* @param progressDelta amount of progress variation before notifying a progress
* change during estimation.
* @throws IllegalArgumentException if progress delta is less than zero or
* greater than 1.
* @throws LockedException if this instance is locked.
*/
public void setProgressDelta(final float progressDelta) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (progressDelta < MIN_PROGRESS_DELTA || progressDelta > MAX_PROGRESS_DELTA) {
throw new IllegalArgumentException();
}
this.progressDelta = progressDelta;
}
/**
* Returns amount of confidence expressed as a value between 0.0 and 1.0 (which
* is equivalent to 100%) for robust position estimation on ranging data. The
* amount of confidence indicates the probability that the estimated result is
* correct. Usually this value will be close to 1.0, but not exactly 1.0.
*
* @return amount of confidence for robust position estimation as a value between
* 0.0 and 1.0.
*/
public double getRangingConfidence() {
return rangingConfidence;
}
/**
* Sets amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on ranging data. The amount
* of confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @param rangingConfidence confidence to be set for robust position estimation as
* a value between 0.0 and 1.0.
* @throws IllegalArgumentException if provided value is not between 0.0 and 1.0.
* @throws LockedException if estimator is locked.
*/
public void setRangingConfidence(final double rangingConfidence) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingConfidence < MIN_CONFIDENCE || rangingConfidence > MAX_CONFIDENCE) {
throw new IllegalArgumentException();
}
this.rangingConfidence = rangingConfidence;
}
/**
* Returns amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on RSSI data. The amount of
* confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @return amount of confidence for robust position estimation as a value between
* 0.0 and 1.0.
*/
public double getRssiConfidence() {
return rssiConfidence;
}
/**
* Sets amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on RSSI data. The amount
* of confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @param rssiConfidence amount of confidence for robust position estimation as
* a value between 0.0 and 1.0.
* @throws IllegalArgumentException if provided value is not between 0.0 and 1.0.
* @throws LockedException if estimator is locked.
*/
public void setRssiConfidence(final double rssiConfidence) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiConfidence < MIN_CONFIDENCE || rssiConfidence > MAX_CONFIDENCE) {
throw new IllegalArgumentException();
}
this.rssiConfidence = rssiConfidence;
}
/**
* Gets maximum allowed number of iterations for robust ranging position estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @return maximum allowed number of iterations for position estimation.
*/
public int getRangingMaxIterations() {
return rangingMaxIterations;
}
/**
* Sets maximum allowed number of iterations for robust ranging position
* estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @param rangingMaxIterations maximum allowed number of iterations to be set for
* position estimation.
* @throws IllegalArgumentException if provided value is less than 1.
* @throws LockedException if estimator is locked.
*/
public void setRangingMaxIterations(final int rangingMaxIterations) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingMaxIterations < MIN_ITERATIONS) {
throw new IllegalArgumentException();
}
this.rangingMaxIterations = rangingMaxIterations;
}
/**
* Gets maximum allowed number of iterations for robust RSSI position estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @return maximum allowed number of iterations for position estimation.
*/
public int getRssiMaxIterations() {
return rssiMaxIterations;
}
/**
* Sets maximum allowed number of iterations for robust RSSI position estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @param rssiMaxIterations maximum allowed number of iterations to be set for
* position estimation.
* @throws IllegalArgumentException if provided value is less than 1.
* @throws LockedException if estimator is locked.
*/
public void setRssiMaxIterations(final int rssiMaxIterations) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiMaxIterations < MIN_ITERATIONS) {
throw new IllegalArgumentException();
}
this.rssiMaxIterations = rssiMaxIterations;
}
/**
* Indicates whether result is refined using all found inliers.
*
* @return true if result is refined, false otherwise.
*/
public boolean isResultRefined() {
return refineResult;
}
/**
* Specifies whether result is refined using all found inliers.
*
* @param refineResult true if result is refined, false otherwise.
* @throws LockedException if this instance is locked.
*/
public void setResultRefined(final boolean refineResult) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.refineResult = refineResult;
}
/**
* Indicates whether covariance must be kept after refining result.
* This setting is only taken into account if result is refined.
*
* @return true if covariance must be kept after refining result, false otherwise.
*/
public boolean isCovarianceKept() {
return keepCovariance;
}
/**
* Specifies whether covariance must be kept after refining result.
* This setting is only taken into account if result is refined.
*
* @param keepCovariance true if covariance must be kept after refining result,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setCovarianceKept(final boolean keepCovariance) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.keepCovariance = keepCovariance;
}
/**
* Indicates whether a linear solver is used for preliminary solution estimation
* using ranging measurements.
* The result obtained on each preliminary solution might be later refined.
*
* @return true if a linear solver is used for preliminary solution estimation on
* ranging readings.
*/
public boolean isRangingLinearSolverUsed() {
return useRangingLinearSolver;
}
/**
* Specifies whether a linear solver is used for preliminary solution estimation
* using ranging measurements.
* The result obtained on each preliminary solution might be later refined.
*
* @param useRangingLinearSolver true if a linear solver is used for preliminary
* solution estimation on ranging readings.
* @throws LockedException if estimator is locked.
*/
public void setRangingLinearSolverUsed(final boolean useRangingLinearSolver) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useRangingLinearSolver = useRangingLinearSolver;
}
/**
* Indicates whether a linear solver is used for preliminary solution estimation
* using RSSI measurements.
* The result obtained on each preliminary solution might be later refined.
*
* @return true if a linear solver is used for preliminary solution estimation on
* RSSI readings.
*/
public boolean isRssiLinearSolverUsed() {
return useRssiLinearSolver;
}
/**
* Specifies whether a linear solver is used for preliminary solution estimation
* using RSSI measurements.
* The result obtained on each preliminary solution might be later refined.
*
* @param useRssiLinearSolver true if a linear solver is used for preliminary
* solution estimation on RSSI readings.
* @throws LockedException if estimator is locked.
*/
public void setRssiLinearSolverUsed(final boolean useRssiLinearSolver) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useRssiLinearSolver = useRssiLinearSolver;
}
/**
* Indicates whether an homogeneous linear solver is used either to estimate
* preliminary solutions or an initial solution for preliminary solutions that
* will be later refined on the ranging fine estimation.
*
* @return true to use an homogeneous linear solver for preliminary solutions
* during ranging fine position estimation.
*/
public boolean isRangingHomogeneousLinearSolverUsed() {
return useRangingHomogeneousLinearSolver;
}
/**
* Specifies whether an homogeneous linear solver is used either to estimate
* preliminary solutions or an initial solution for preliminary solutions that
* will be later refined on the ranging fine estimation.
*
* @param useRangingHomogeneousLinearSolver true to use an homogeneous linear
* solver for preliminary solutions during
* ranging fine position estimation.
* @throws LockedException if estimator is locked.
*/
public void setRangingHomogeneousLinearSolverUsed(final boolean useRangingHomogeneousLinearSolver)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useRangingHomogeneousLinearSolver = useRangingHomogeneousLinearSolver;
}
/**
* Indicates whether an homogeneous linear solver is used either to estimate
* preliminary solutions or an initial solution for preliminary solutions that
* will be later refined on the RSSI coarse estimation.
*
* @return true to use an homogeneous linear solver for preliminary solutions
* during RSSI coarse position estimation.
*/
public boolean isRssiHomogeneousLinearSolverUsed() {
return useRssiHomogeneousLinearSolver;
}
/**
* Specifies whether an homogeneous linear solver is used either to estimate
* preliminary solutions or an initial solution for preliminary solutions that
* will be later refined on the RSSI coarse estimation.
*
* @param useRssiHomogeneousLinearSolver true to use an homogeneous linear
* solver for preliminary solutions during
* RSSI fine position estimation.
* @throws LockedException if estimator is locked.
*/
public void setRssiHomogeneousLinearSolverUsed(final boolean useRssiHomogeneousLinearSolver)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useRssiHomogeneousLinearSolver = useRssiHomogeneousLinearSolver;
}
/**
* Indicates whether preliminary ranging solutions are refined after an initial
* linear solution is found.
* If no initial preliminary solution is found using a linear solver, a non-linear
* solver will be used regardless of this value using an average solution
* as the initial value to be refined.
*
* @return true if preliminary ranging solutions must be refined after an initial
* linear solution, false otherwise.
*/
public boolean isRangingPreliminarySolutionRefined() {
return refineRangingPreliminarySolutions;
}
/**
* Specifies whether preliminary ranging solutions are refined after an initial
* linear solution is found.
* If no initial preliminary solution is found using a linear solver, a non-linear
* solver will be used regardless of this value using an average solution
* as the initial value to be refined.
*
* @param refineRangingPreliminarySolutions true if preliminary ranging solutions
* must be refined after an initial linear
* solution, false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setRangingPreliminarySolutionRefined(final boolean refineRangingPreliminarySolutions)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.refineRangingPreliminarySolutions = refineRangingPreliminarySolutions;
}
/**
* Indicates whether preliminary RSSI solutions are refined after an initial
* linear solution is found.
* If no initial preliminary solution is found using a linear solver, a non-linear
* solver will be used regardless of this value using an average solution
* as the initial value to be refined.
*
* @return true if preliminary RSSI solutions must be refined after an initial
* linear solution, false otherwise.
*/
public boolean isRssiPreliminarySolutionRefined() {
return refineRssiPreliminarySolutions;
}
/**
* Specifies whether preliminary RSSI solutions are refined after an initial
* linear solution is found.
* If no initial preliminary solution is found using a linear solver, a non-linear
* solver will be used regardless of this value using an average solution
* as the initial value ot be refined.
*
* @param refineRssiPreliminarySolutions true if preliminary RSSI solutions must
* be refined after an initial linear
* solution, false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setRssiPreliminarySolutionRefined(final boolean refineRssiPreliminarySolutions) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.refineRssiPreliminarySolutions = refineRssiPreliminarySolutions;
}
/**
* Gets size of subsets to be checked during ranging robust estimation.
*
* @return size of subsets to be checked during ranging robust estimation.
*/
public int getRangingPreliminarySubsetSize() {
return rangingPreliminarySubsetSize;
}
/**
* Sets size of subsets to be checked during ranging robust estimation.
*
* @param rangingPreliminarySubsetSize size of subsets to be checked during
* ranging robust estimation.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is less than {@link #getMinRequiredSources()}.
*/
public void setRangingPreliminarySubsetSize(final int rangingPreliminarySubsetSize) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingPreliminarySubsetSize < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.rangingPreliminarySubsetSize = rangingPreliminarySubsetSize;
}
/**
* Gets size of subsets to be checked during RSSI robust estimation.
*
* @return size of subsets to be checked during RSSI robust estimation.
*/
public int getRssiPreliminarySubsetSize() {
return rssiPreliminarySubsetSize;
}
/**
* Sets size of subsets to be checked during RSSI robust estimation.
*
* @param rssiPreliminarySubsetSize size of subsets to be checked during
* RSSI robust estimation.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is less than {@link #getMinRequiredSources()}.
*/
public void setRssiPreliminarySubsetSize(final int rssiPreliminarySubsetSize) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiPreliminarySubsetSize < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.rssiPreliminarySubsetSize = rssiPreliminarySubsetSize;
}
/**
* Gets threshold to determine when samples are inliers or not, used during robust
* fine ranging position estimation.
* If not defined, default threshold will be used.
*
* @return threshold for ranging estimation or null.
*/
public Double getRangingThreshold() {
return rangingThreshold;
}
/**
* Sets threshold to determine when samples are inliers or not, used during robust
* fine ranging position estimation.
* If not defined, default threshold will be used.
*
* @param rangingThreshold threshold for ranging estimation or null.
* @throws LockedException if estimator is locked.
*/
public void setRangingThreshold(final Double rangingThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rangingThreshold = rangingThreshold;
}
/**
* Gets threshold to determine when samples are inliers or not, used during robust
* coarse RSSI position estimation.
* If not defined, default threshold will be used.
*
* @return threshold for RSSI estimation or null.
*/
public Double getRssiThreshold() {
return rssiThreshold;
}
/**
* Sets threshold to determine when samples are inliers or not, used during robust
* coarse RSSI position estimation.
* If not defined, default threshold will be used.
*
* @param rssiThreshold threshold for RSSI estimation or null.
* @throws LockedException if estimator is locked.
*/
public void setRssiThreshold(final Double rssiThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rssiThreshold = rssiThreshold;
}
/**
* Gets located radio sources used for lateration.
*
* @return located radio sources used for lateration.
*/
public List<RadioSourceLocated<P>> getSources() {
//noinspection unchecked
return (List<RadioSourceLocated<P>>) sources;
}
/**
* Sets located radio sources used for lateration.
*
* @param sources located radio sources used for lateration.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is null or the number of
* provided sources is less than the required
* minimum.
*/
public void setSources(final List<? extends RadioSourceLocated<P>> sources) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSources(sources);
}
/**
* Gets fingerprint containing readings at an unknown location for provided located
* radio sources.
*
* @return fingerprint containing readings at an unknown location for provided
* located radio sources.
*/
public Fingerprint<RadioSource, Reading<RadioSource>> getFingerprint() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 1099 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1087 |
final SequentialRobustMixedRadioSourceEstimatorListener<S, P> listener) {
this(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether estimator is locked during estimation.
*
* @return true if estimator is locked, false otherwise.
*/
public boolean isLocked() {
return locked;
}
/**
* Returns amount of progress variation before notifying a progress change during
* estimation.
*
* @return amount of progress variation before notifying a progress change during
* estimation.
*/
public float getProgressDelta() {
return progressDelta;
}
/**
* Sets amount of progress variation before notifying a progress change during
* estimation.
*
* @param progressDelta amount of progress variation before notifying a progress
* change during estimation.
* @throws IllegalArgumentException if progress delta is less than zero or greater than 1.
* @throws LockedException if this estimator is locked.
*/
public void setProgressDelta(final float progressDelta) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (progressDelta < MIN_PROGRESS_DELTA || progressDelta > MAX_PROGRESS_DELTA) {
throw new IllegalArgumentException();
}
this.progressDelta = progressDelta;
}
/**
* Gets robust method used for robust position estimation using ranging data.
*
* @return robust method used for robust position estimation.
*/
public RobustEstimatorMethod getRangingRobustMethod() {
return rangingRobustMethod;
}
/**
* Sets robust method used for robust position estimation using ranging data.
*
* @param rangingRobustMethod robust method used for robust position estimation.
* @throws LockedException if estimator is locked.
*/
public void setRangingRobustMethod(final RobustEstimatorMethod rangingRobustMethod) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rangingRobustMethod = rangingRobustMethod;
}
/**
* Gets robust method used for path-loss exponent and transmitted power estimation
* using RSSI data.
*
* @return robust method used for path-loss exponent and transmitted power
* estimation.
*/
public RobustEstimatorMethod getRssiRobustMethod() {
return rssiRobustMethod;
}
/**
* Sets robust method used for path-loss exponent and transmitted power estimation
* using RSSI data.
*
* @param rssiRobustMethod robust method used for path-loss exponent and transmitted
* power estimation.
* @throws LockedException if estimator is locked.
*/
public void setRssiRobustMethod(final RobustEstimatorMethod rssiRobustMethod) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rssiRobustMethod = rssiRobustMethod;
}
/**
* Gets size of subsets to be checked during ranging robust estimation.
*
* @return size of subsets to be checked during ranging robust estimation.
*/
public int getRangingPreliminarySubsetSize() {
return rangingPreliminarySubsetSize;
}
/**
* Sets size of subsets to be checked during ranging robust estimation.
*
* @param rangingPreliminarySubsetSize size of subsets to be checked during
* ranging robust estimation.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is less than {@link #getMinReadings()}.
*/
public void setRangingPreliminarySubsetSize(final int rangingPreliminarySubsetSize) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingPreliminarySubsetSize < getMinReadings()) {
throw new IllegalArgumentException();
}
this.rangingPreliminarySubsetSize = rangingPreliminarySubsetSize;
}
/**
* Gets size of subsets to be checked during RSSI robust estimation.
*
* @return size of subsets to be checked during RSSI robust estimation.
*/
public int getRssiPreliminarySubsetSize() {
return rssiPreliminarySubsetSize;
}
/**
* Sets size of subsets to be checked during RSSI robust estimation.
*
* @param rssiPreliminarySubsetSize size of subsets to be checked during
* RSSI robust estimation.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is less than {@link #getMinReadings()}.
*/
public void setRssiPreliminarySubsetSize(final int rssiPreliminarySubsetSize) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiPreliminarySubsetSize < getMinReadings()) {
throw new IllegalArgumentException();
}
this.rssiPreliminarySubsetSize = rssiPreliminarySubsetSize;
}
/**
* Gets threshold to determine when samples are inliers or not, used during robust
* position estimation.
* If not defined, default threshold will be used.
*
* @return threshold for ranging estimation or null.
*/
public Double getRangingThreshold() {
return rangingThreshold;
}
/**
* Sets threshold to determine when samples are inliers or not, used during robust
* position estimation.
* If not defined, default threshold will be used.
*
* @param rangingThreshold threshold for ranging estimation or null.
* @throws LockedException if estimator is locked.
*/
public void setRangingThreshold(final Double rangingThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rangingThreshold = rangingThreshold;
}
/**
* Gets threshold to determine when samples are inliers or not, used during robust
* path-loss exponent and transmitted power estimation.
* If not defined, default threshold will be used.
*
* @return threshold for RSSI estimation or null.
*/
public Double getRssiThreshold() {
return rssiThreshold;
}
/**
* Sets threshold to determine when samples are inliers or not, used during robust
* path-loss exponent and transmitted power estimation.
* If not defined, default threshold will be used.
*
* @param rssiThreshold threshold for RSSI estimation or null.
* @throws LockedException if estimator is locked.
*/
public void setRssiThreshold(final Double rssiThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.rssiThreshold = rssiThreshold;
}
/**
* Returns amount of confidence expressed as a value between 0.0 and 1.0
* (which is equivalent to 100%) for robust position estimation. The amount of
* confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @return amount of confidence for robust position estimation as a value
* between 0.0 and 1.0.
*/
public double getRangingConfidence() {
return rangingConfidence;
}
/**
* Sets amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation. The amount of confidence
* indicates the probability that the estimated result is correct. Usually this
* value will be close to 1.0, but not exactly 1.0.
*
* @param rangingConfidence confidence to be set for robust position estimation
* as a value between 0.0 and 1.0.
* @throws IllegalArgumentException if provided value is not between 0.0 and 1.0.
* @throws LockedException if estimator is locked.
*/
public void setRangingConfidence(final double rangingConfidence) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingConfidence < MIN_CONFIDENCE || rangingConfidence > MAX_CONFIDENCE) {
throw new IllegalArgumentException();
}
this.rangingConfidence = rangingConfidence;
}
/**
* Returns amount of confidence expressed as a value between 0.0 and 1.0
* (which is equivalent to 100%) for path-loss exponent and transmitted power
* estimation. The amount of confidence indicates the probability that the
* estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @return amount of confidence for robust path-loss exponent and transmitted power
* estimation as a value between 0.0 and 1.0.
*/
public double getRssiConfidence() {
return rssiConfidence;
}
/**
* Sets amount of confidence expressed as a value between 0.0 and 1.0
* (which is equivalent to 100%) for path-loss exponent and transmitted power
* estimation. The amount of confidence indicates the probability that the
* estimated result is correct. Usually this value will be close to 10.0, but
* not exactly 1.0.
*
* @param rssiConfidence confidence to be set for robust path-loss exponent and
* transmitted power estimation as a value between 0.0 and
* 1.0.
* @throws IllegalArgumentException if provided value is not between 0.0 and 1.0.
* @throws LockedException if estimator is locked.
*/
public void setRssiConfidence(final double rssiConfidence) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiConfidence < MIN_CONFIDENCE || rssiConfidence > MAX_CONFIDENCE) {
throw new IllegalArgumentException();
}
this.rssiConfidence = rssiConfidence;
}
/**
* Returns maximum allowed number of iterations for robust position estimation. If
* maximum allowed number of iterations is achieved without converging to a result
* when calling estimate(), a RobustEstimatorException will be raised.
*
* @return maximum allowed number of iterations for position estimation.
*/
public int getRangingMaxIterations() {
return rangingMaxIterations;
}
/**
* Sets maximum allowed number of iterations for robust position estimation. When
* the maximum number of iterations is exceeded, an approximate result might be
* available for retrieval.
*
* @param rangingMaxIterations maximum allowed number of iterations to be set
* for position estimation.
* @throws IllegalArgumentException if provided value is less than 1.
* @throws LockedException if this estimator is locked.
*/
public void setRangingMaxIterations(final int rangingMaxIterations) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingMaxIterations < MIN_ITERATIONS) {
throw new IllegalArgumentException();
}
this.rangingMaxIterations = rangingMaxIterations;
}
/**
* Returns maximum allowed number of iterations for robust path-loss exponent and
* transmitted power estimation. If maximum allowed number of iterations is achieved
* without converging to a result when calling estimate(), a RobustEstimatorException
* will be raised.
*
* @return maximum allowed number of iterations for path-loss exponent and transmitted
* power estimation.
*/
public int getRssiMaxIterations() {
return rssiMaxIterations;
}
/**
* Sets maximum allowed number of iterations for robust path-loss exponent and
* transmitted power estimation. When the maximum number of iterations is exceeded,
* an approximate result might be available for retrieval.
*
* @param rssiMaxIterations maximum allowed number of iterations to be set for
* path-loss exponent and transmitted power estimation.
* @throws IllegalArgumentException if provided value is less than 1.
* @throws LockedException if this estimator is locked.
*/
public void setRssiMaxIterations(final int rssiMaxIterations) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiMaxIterations < MIN_ITERATIONS) {
throw new IllegalArgumentException();
}
this.rssiMaxIterations = rssiMaxIterations;
}
/**
* Indicates whether result must be refined using a non-linear solver over found inliers.
*
* @return true to refine result, false to simply use result found by robust estimator
* without further refining.
*/
public boolean isResultRefined() {
return refineResult;
}
/**
* Specifies whether result must be refined using a non-linear solver over found inliers.
*
* @param refineResult true to refine result, false to simply use result found by robust
* estimator without further refining.
* @throws LockedException if estimator is locked.
*/
public void setResultRefined(final boolean refineResult) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.refineResult = refineResult;
}
/**
* Indicates whether covariance must be kept after refining result.
* This setting is only taken into account if result is refined.
*
* @return true if covariance must be kept after refining result, false otherwise.
*/
public boolean isCovarianceKept() {
return keepCovariance;
}
/**
* Specifies whether covariance must be kept after refining result.
* This setting is only taken into account if result is refined.
*
* @param keepCovariance true if covariance must be kept after refining result,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setCovarianceKept(final boolean keepCovariance) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.keepCovariance = keepCovariance;
}
/**
* Gets signal readings belonging to the same radio source.
*
* @return signal readings belonging to the same radio source.
*/
public List<ReadingLocated<P>> getReadings() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 1525 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1513 |
public void setListener(final SequentialRobustMixedRadioSourceEstimatorListener<S, P> listener)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.listener = listener;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPowerdBm() {
return initialTransmittedPowerdBm;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
*
* @param initialTransmittedPowerdBm initial transmitted power to start the
* estimation of radio source transmitted
* power.
* @throws LockedException if estimator is locked.
*/
public void setInitialTransmittedPowerdBm(final Double initialTransmittedPowerdBm) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialTransmittedPowerdBm = initialTransmittedPowerdBm;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPower() {
return initialTransmittedPowerdBm != null ? Utils.dBmToPower(initialTransmittedPowerdBm) : null;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
*
* @param initialTransmittedPower initial transmitted power to start the
* estimation of radio source transmitted power.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is negative.
*/
public void setInitialTransmittedPower(final Double initialTransmittedPower) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (initialTransmittedPower != null) {
if (initialTransmittedPower < 0.0) {
throw new IllegalArgumentException();
}
initialTransmittedPowerdBm = Utils.powerTodBm(initialTransmittedPower);
} else {
initialTransmittedPowerdBm = null;
}
}
/**
* Gets initial position to start the estimation of radio source position.
* If not defined, centroid of provided fingerprints will be used.
*
* @return initial position to start the estimation of radio source position.
*/
public P getInitialPosition() {
return initialPosition;
}
/**
* Sets initial position to start the estimation of radio source position.
* If not defined, centroid of provided fingerprints will be used.
*
* @param initialPosition initial position to start the estimation of radio
* source position.
* @throws LockedException if estimator is locked.
*/
public void setInitialPosition(final P initialPosition) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPosition = initialPosition;
}
/**
* Gets initial exponent typically used on free space for path loss propagation
* in terms of distance.
* On different environments path loss exponent might have different value:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* <p>
* If path loss exponent estimation is enabled, estimation will start at this
* value and will converge to the most appropriate value.
* If path loss exponent estimation is disabled, this value will be assumed
* to be exact and the estimated path loss exponent will be equal to this
* value.
*
* @return initial path loss exponent.
*/
public double getInitialPathLossExponent() {
return initialPathLossExponent;
}
/**
* Sets initial exponent typically used on free space for path loss propagation
* in terms of distance.
* On different environments path loss exponent might have different value:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* <p>
* If path loss exponent estimation is enabled, estimation will start at this
* value and will converge to the most appropriate value.
* If path loss exponent estimation is disabled, this value will be assumed
* to be exact and the estimated path loss exponent will be equal to this
* value.
*
* @param initialPathLossExponent initial path loss exponent.
* @throws LockedException if estimator is locked.
*/
public void setInitialPathLossExponent(final double initialPathLossExponent) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPathLossExponent = initialPathLossExponent;
}
/**
* Indicates whether transmitted power estimation is enabled or not.
*
* @return true if transmitted power estimation is enabled, false otherwise.
*/
public boolean isTransmittedPowerEstimationEnabled() {
return transmittedPowerEstimationEnabled;
}
/**
* Specifies whether transmitted power estimation is enabled or not.
*
* @param transmittedPowerEstimationEnabled true if transmitted power estimation is enabled,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setTransmittedPowerEstimationEnabled(final boolean transmittedPowerEstimationEnabled)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.transmittedPowerEstimationEnabled = transmittedPowerEstimationEnabled;
}
/**
* Indicates whether path loss estimation is enabled or not.
*
* @return true if path loss estimation is enabled, false otherwise.
*/
public boolean isPathLossEstimationEnabled() {
return pathLossEstimationEnabled;
}
/**
* Specifies whether path loss estimation is enabled or not.
*
* @param pathLossEstimationEnabled true if path loss estimation is enabled,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setPathLossEstimationEnabled(final boolean pathLossEstimationEnabled) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.pathLossEstimationEnabled = pathLossEstimationEnabled;
}
/**
* Indicates whether position covariances of readings must be taken into account to increase
* the amount of standard deviation of each ranging measure by the amount of position standard
* deviation assuming that both measures are statistically independent.
*
* @return true to take into account reading position covariances, false otherwise.
*/
public boolean getUseReadingPositionCovariance() {
return useReadingPositionCovariances;
}
/**
* Specifies whether position covariances of readings must be taken into account to increase
* the amount of standard deviation of each ranging measure by the amount of position standard
* deviation assuming that both measures are statistically independent.
*
* @param useReadingPositionCovariances true to take into account reading position covariances, false
* otherwise.
* @throws LockedException if estimator is locked.
*/
public void setUseReadingPositionCovariances(final boolean useReadingPositionCovariances) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useReadingPositionCovariances = useReadingPositionCovariances;
}
/**
* Indicates whether an homogeneous ranging linear solver is used to estimate preliminary
* positions.
*
* @return true if homogeneous ranging linear solver is used, false if an inhomogeneous ranging linear
* one is used instead.
*/
public boolean isHomogeneousRangingLinearSolverUsed() {
return useHomogeneousRangingLinearSolver;
}
/**
* Specifies whether an homogeneous ranging linear solver is used to estimate preliminary
* positions.
*
* @param useHomogeneousRangingLinearSolver true if homogeneous ranging linear solver is used, false
* if an inhomogeneous ranging linear one is used instead.
* @throws LockedException if estimator is locked.
*/
public void setHomogeneousRangingLinearSolverUsed(final boolean useHomogeneousRangingLinearSolver)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useHomogeneousRangingLinearSolver = useHomogeneousRangingLinearSolver;
}
/**
* Gets covariance for estimated position and power.
* Matrix contains information in the following order:
* Top-left sub-matrix contains covariance of position,
* then follows transmitted power variance, and finally
* the last element contains path-loss exponent variance.
* This is only available when result has been refined and covariance is kept.
*
* @return covariance for estimated position and power.
*/
public Matrix getCovariance() {
return covariance;
}
/**
* Gets estimated position covariance.
* Size of this matrix will depend on the number of dimensions
* of estimated position (either 2 or 3).
* This is only available when result has been refined and covariance is kept.
*
* @return estimated position covariance.
*/
public Matrix getEstimatedPositionCovariance() {
return estimatedPositionCovariance;
}
/**
* Gets estimated position.
*
* @return estimated position.
*/
public P getEstimatedPosition() {
return estimatedPosition;
}
/**
* Indicates whether readings are valid or not.
* Readings are considered valid when there are enough readings.
*
* @param readings readings to be validated.
* @return true if readings are valid, false otherwise.
*/
public boolean areValidReadings(final List<? extends ReadingLocated<P>> readings) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 482 |
| com/irurueta/navigation/indoor/Utils.java | 1143 |
public static MultivariateNormalDist propagateVariancesToRssiVarianceFirstOrderNonLinear3D(
final double fingerprintRssi, final double pathLossExponent, final Point3D fingerprintPosition,
final Point3D radioSourcePosition, final Point3D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance, final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance, final Matrix estimatedPositionCovariance)
throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 1st order Taylor expression of received power in 3D:
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// - 10*n*(z1 - za)/(ln(10)*d1a^2)*(zi - z1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2 + (z1 - za)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var z1 = fingerprintPosition.getInhomZ();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var za = radioSourcePosition.getInhomZ();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var zi = estimatedPosition.getInhomZ();
final var mean = new double[]{
fingerprintRssi, pathLossExponent, x1, y1, z1, xa, ya, za, xi, yi, zi
};
final var covariance = Matrix.diagonal(new double[]{
fingerprintRssiVariance != null ? fingerprintRssiVariance : 0.0,
pathLossExponentVariance != null ? pathLossExponentVariance : 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
});
if (fingerprintPositionCovariance != null &&
fingerprintPositionCovariance.getRows() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH &&
fingerprintPositionCovariance.getColumns() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(2, 2, 4, 4,
fingerprintPositionCovariance);
}
if (radioSourcePositionCovariance != null
&& radioSourcePositionCovariance.getRows() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH
&& radioSourcePositionCovariance.getColumns() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(5, 5, 7, 7,
radioSourcePositionCovariance);
}
if (estimatedPositionCovariance != null
&& estimatedPositionCovariance.getRows() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH
&& estimatedPositionCovariance.getColumns() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(8, 8, 10, 10,
estimatedPositionCovariance);
}
try {
return MultivariateNormalDist.propagate(new MultivariateNormalDist.JacobianEvaluator() {
@Override
public void evaluate(final double[] x, final double[] y, final Matrix jacobian) {
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// - 10*n*(z1 - za)/(ln(10)*d1a^2)*(zi - z1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2 + (z1 - za)^2
// Hence:
// Pr(pi) = Pr(p1) -10*n*((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1) + (z1 - za)*(zi - z1))/
// (ln(10)*((x1 - xa)^2 + (y1 - ya)^2 + (z1 - za)^2))
final var diffX1a = x1 - xa;
final var diffY1a = y1 - ya;
final var diffZ1a = z1 - za;
final var diffXi1 = xi - x1;
final var diffYi1 = yi - y1;
final var diffZi1 = zi - z1;
final var diffX1a2 = diffX1a * diffX1a;
final var diffY1a2 = diffY1a * diffY1a;
final var diffZ1a2 = diffZ1a * diffZ1a;
final var d1a2 = diffX1a2 + diffY1a2 + diffZ1a2; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 808 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 801 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point3D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double[] getQualityScores() {
return qualityScores;
}
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return PROSACRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/fingerprint/BaseFingerprintPositionAndRadioSourceEstimator.java | 166 |
| com/irurueta/navigation/indoor/fingerprint/BaseFingerprintPositionEstimator.java | 168 |
protected BaseFingerprintPositionAndRadioSourceEstimator(
final List<? extends RssiFingerprintLocated<? extends RadioSource,
? extends RssiReading<? extends RadioSource>, P>> locatedFingerprints,
final RssiFingerprint<? extends RadioSource,
? extends RssiReading<? extends RadioSource>> fingerprint,
final L listener) {
this(listener);
internalSetLocatedFingerprints(locatedFingerprints);
internalSetFingerprint(fingerprint);
}
/**
* Gets located fingerprints containing RSSI readings.
*
* @return located fingerprints containing RSSI readings.
*/
public List<RssiFingerprintLocated<RadioSource, RssiReading<RadioSource>, P>> getLocatedFingerprints() {
//noinspection unchecked
return (List<RssiFingerprintLocated<RadioSource, RssiReading<RadioSource>,P>>) locatedFingerprints;
}
/**
* Sets located fingerprints containing RSSI readings.
*
* @param locatedFingerprints located fingerprints containing RSSI readings.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is null or there are not enough
* fingerprints or readings within provided fingerprints (for 2D position estimation at
* least 2 readings are required in a single fingerprint, or at least 2 fingerprints
* at different locations containing a single reading are required. For 3D position
* estimation 3 reading in a single fingerprint, or 3 fingerprints containing a single
* reading or any combination resulting in at least 3 readings at different locations
* are required).
*/
public void setLocatedFingerprints(
final List<? extends RssiFingerprintLocated<? extends RadioSource,
? extends RssiReading<? extends RadioSource>, P>> locatedFingerprints) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetLocatedFingerprints(locatedFingerprints);
}
/**
* Gets fingerprint containing readings at an unknown location for provided located
* fingerprints.
*
* @return fingerprint containing readings at an unknown location for provided located
* fingerprints.
*/
public RssiFingerprint<RadioSource, RssiReading<RadioSource>> getFingerprint() {
//noinspection unchecked
return (RssiFingerprint<RadioSource, RssiReading<RadioSource>>) fingerprint;
}
/**
* Sets fingerprint containing readings at an unknown location for provided located fingerprints.
*
* @param fingerprint fingerprint containing readings at an unknown location for provided located fingerprints.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is null.
*/
public void setFingerprint(
final RssiFingerprint<? extends RadioSource, ? extends RssiReading<? extends RadioSource>> fingerprint)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprint(fingerprint);
}
/**
* Get minimum number of nearest fingerprints to search.
*
* @return minimum number of nearest fingerprints, -1 indicates to initially use
* all fingerprints needed to estimate available radio sources.
*/
public int getMinNearestFingerprints() {
return minNearestFingerprints;
}
/**
* Gets maximum number of nearest fingerprints to search.
*
* @return maximum number of nearest fingerprints, -1 indicates to use all available
* fingerprints.
*/
public int getMaxNearestFingerprints() {
return maxNearestFingerprints;
}
/**
* Sets minimum and maximum number of nearest fingerprints to search.
* If minimum value is -1, then the minimum required number of fingerprints needed
* to estimate available radio sources is used.
* If maximum value is -1, then the problem is attempted to be solved until all
* available fingerprints are used.
*
* @param minNearestFingerprints minimum number of nearest fingerprints or -1.
* @param maxNearestFingerprints maximum number of nearest fingerprints or -1.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if minimum value is larger than maximum value (as
* long as it has a limit defined), or if maximum value is not negative when
* minimum one is less than 1, or if minimum value is zero.
*/
public void setMinMaxNearestFingerprints(
final int minNearestFingerprints, final int maxNearestFingerprints) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetMinMaxNearestFingerprints(minNearestFingerprints, maxNearestFingerprints);
}
/**
* Gets path loss exponent to be used by default.
* This is typically used on free space for path loss propagation in
* terms of distance.
* On different environments path loss exponent might have different values:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
*
* @return path loss exponent to be used by default.
*/
public double getPathLossExponent() {
return pathLossExponent;
}
/**
* Sets path loss exponent to be used by default.
* This is typically used on free space for path loss propagation in
* terms of distance.
* On different environments path loss exponent might have different values:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
*
* @param pathLossExponent path loss exponent to be used by default.
* @throws LockedException if estimator is locked.
*/
public void setPathLossExponent(final double pathLossExponent) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.pathLossExponent = pathLossExponent;
}
/**
* Gets listener to be notified of events raised by this instance.
*
* @return listener to be notified of events raised by this instance.
*/
public L getListener() {
return listener;
}
/**
* Sets listener to be notified of events raised by this instance.
*
* @param listener listener to be notified of events raised by this instance.
* @throws LockedException if estimator is locked.
*/
public void setListener(final L listener) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.listener = listener;
}
/**
* Gets estimated inhomogeneous position coordinates.
*
* @return estimated inhomogeneous position coordinates.
*/
public double[] getEstimatedPositionCoordinates() {
return estimatedPositionCoordinates;
}
/**
* Gets estimated position and stores result into provided instance.
*
* @param estimatedPosition instance where estimated position will be stored.
*/
public void getEstimatedPosition(final P estimatedPosition) {
if (estimatedPositionCoordinates != null) {
for (var i = 0; i < estimatedPositionCoordinates.length; i++) {
estimatedPosition.setInhomogeneousCoordinate(i, estimatedPositionCoordinates[i]);
}
}
}
/**
* Gets estimated position or null if not available yet.
*
* @return estimated position or null.
*/
public P getEstimatedPosition() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 256 |
| com/irurueta/navigation/indoor/Utils.java | 756 |
public static MultivariateNormalDist propagateVariancesToRssiVarianceFirstOrderNonLinear2D(
final double fingerprintRssi, final double pathLossExponent, final Point2D fingerprintPosition,
final Point2D radioSourcePosition, final Point2D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance, final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance, final Matrix estimatedPositionCovariance)
throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 1st order Taylor expression of received power in 2D:
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var mean = new double[]{
fingerprintRssi, pathLossExponent, x1, y1, xa, ya, xi, yi
};
final var covariance = Matrix.diagonal(new double[]{
fingerprintRssiVariance != null ? fingerprintRssiVariance : 0.0,
pathLossExponentVariance != null ? pathLossExponentVariance : 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0
});
if (fingerprintPositionCovariance != null
&& fingerprintPositionCovariance.getRows() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH
&& fingerprintPositionCovariance.getColumns() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(2, 2, 3, 3,
fingerprintPositionCovariance);
}
if (radioSourcePositionCovariance != null
&& radioSourcePositionCovariance.getRows() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH
&& radioSourcePositionCovariance.getColumns() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(4, 4, 5, 5,
radioSourcePositionCovariance);
}
if (estimatedPositionCovariance != null
&& estimatedPositionCovariance.getRows() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH
&& estimatedPositionCovariance.getColumns() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(6, 6, 7, 7,
estimatedPositionCovariance);
}
try {
return MultivariateNormalDist.propagate(new MultivariateNormalDist.JacobianEvaluator() {
@Override
public void evaluate(final double[] x, final double[] y, final Matrix jacobian) {
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2
// Hence:
// Pr(pi) = Pr(p1) -10*n*((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))/
// (ln(10)*((x1 - xa)^2 + (y1 - ya)^2))
final var diffX1a = x1 - xa;
final var diffY1a = y1 - ya;
final var diffXi1 = xi - x1;
final var diffYi1 = yi - y1;
final var diffX1a2 = diffX1a * diffX1a;
final var diffY1a2 = diffY1a * diffY1a;
final var d1a2 = diffX1a2 + diffY1a2; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator.java | 505 |
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator.java | 496 |
final MixedRadioSourceEstimatorListener<S, P> listener) {
this(readings, initialPosition, initialTransmittedPowerdBm, listener);
this.initialPathLossExponent = initialPathLossExponent;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPowerdBm() {
return initialTransmittedPowerdBm;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPowerdBm initial transmitted power to start the
* estimation of radio source transmitted
* power.
* @throws LockedException if estimator is locked.
*/
public void setInitialTransmittedPowerdBm(final Double initialTransmittedPowerdBm) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialTransmittedPowerdBm = initialTransmittedPowerdBm;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPower() {
return initialTransmittedPowerdBm != null ? Utils.dBmToPower(initialTransmittedPowerdBm) : null;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPower initial transmitted power to start the
* estimation of radio source transmitted power.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is negative.
*/
public void setInitialTransmittedPower(final Double initialTransmittedPower) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (initialTransmittedPower != null) {
if (initialTransmittedPower < 0.0) {
throw new IllegalArgumentException();
}
initialTransmittedPowerdBm = Utils.powerTodBm(initialTransmittedPower);
} else {
initialTransmittedPowerdBm = null;
}
}
/**
* Indicates whether transmitted power estimation is enabled or not.
*
* @return true if transmitted power estimation is enabled, false otherwise.
*/
public boolean isTransmittedPowerEstimationEnabled() {
return transmittedPowerEstimationEnabled;
}
/**
* Specifies whether transmitted power estimation is enabled or not.
*
* @param transmittedPowerEstimationEnabled true if transmitted power estimation is enabled,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setTransmittedPowerEstimationEnabled(final boolean transmittedPowerEstimationEnabled)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.transmittedPowerEstimationEnabled = transmittedPowerEstimationEnabled;
}
/**
* Gets initial position to start the estimation of radio source position.
* If not defined, centroid of provided readings will be used.
* <p>
* If position estimation is enabled, estimation will start at this value
* and will converge to the most appropriate value.
* If position estimation is disabled, this value will be assumed to
* be exact and the estimated position will be equal to this value.
*
* @return initial position to start the estimation of radio source position.
*/
public P getInitialPosition() {
return initialPosition;
}
/**
* Sets initial position to start the estimation of radio source position.
* If not defined, centroid of provided fingerprints will be used.
* <p>
* If position estimation is enabled, estimation will start at this value
* and will converge to the most appropriate value.
* If position estimation is disabled, this value will be assumed to
* be exact and the estimated position will be equal to this value.
*
* @param initialPosition initial position to start the estimation of radio
* source position.
* @throws LockedException if estimator is locked.
*/
public void setInitialPosition(final P initialPosition) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPosition = initialPosition;
}
/**
* Gets initial exponent typically used on free space for path loss propagation
* in terms of distance.
* On different environments path loss exponent might have different value:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* <p>
* If path loss exponent estimation is enabled, estimation will start at this
* value and will converge to the most appropriate value.
* If path loss exponent estimation is disabled, this value will be assumed
* to be exact and the estimated path loss exponent will be equal to this
* value.
*
* @return initial path loss exponent.
*/
public double getInitialPathLossExponent() {
return initialPathLossExponent;
}
/**
* Sets initial exponent typically used on free space for path loss propagation
* in terms of distance.
* On different environments path loss exponent might have different value:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* <p>
* If path loss exponent estimation is enabled, estimation will start at this
* value and will converge to the most appropriate value.
* If path loss exponent estimation is disabled, this value will be assumed
* to be exact and the estimated path loss exponent will be equal to this
* value.
*
* @param initialPathLossExponent initial path loss exponent.
* @throws LockedException if estimator is locked.
*/
public void setInitialPathLossExponent(final double initialPathLossExponent) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPathLossExponent = initialPathLossExponent;
}
/**
* Indicates whether path loss estimation is enabled or not.
*
* @return true if path loss estimation is enabled, false otherwise.
*/
public boolean isPathLossEstimationEnabled() {
return pathLossEstimationEnabled;
}
/**
* Specifies whether path loss estimation is enabled or not.
*
* @param pathLossEstimationEnabled true if path loss estimation is enabled,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setPathLossEstimationEnabled(final boolean pathLossEstimationEnabled) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.pathLossEstimationEnabled = pathLossEstimationEnabled;
}
/**
* Indicates whether position covariances of readings must be taken into account to increase
* the amount of standard deviation of each ranging measure by the amount of position standard
* deviation assuming that both measures are statistically independent.
*
* @return true to take into account reading position covariances, false otherwise.
*/
public boolean getUseReadingPositionCovariance() {
return useReadingPositionCovariances;
}
/**
* Specifies whether position covariances of readings must be taken into account to increase
* the amount of standard deviation of each ranging measure by the amount of position standard
* deviation assuming that both measures are statistically independent.
*
* @param useReadingPositionCovariances true to take into account reading position covariances, false
* otherwise.
* @throws LockedException if estimator is locked.
*/
public void setUseReadingPositionCovariances(final boolean useReadingPositionCovariances) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useReadingPositionCovariances = useReadingPositionCovariances;
}
/**
* Indicates whether an homogeneous linear solver is used to estimate an initial
* position for the internal ranging radio source estimator.
*
* @return true if homogeneous linear solver is used, false if an inhomogeneous linear
* one is used instead.
*/
public boolean isHomogeneousRangingLinearSolverUsed() {
return useHomogeneousRangingLinearSolver;
}
/**
* Specifies whether an homogeneous linear solver is used to estimate an initial
* position for the internal ranging radio source estimator.
*
* @param useHomogeneousLinearSolver true if homogeneous linear solver is used, false
* if an inhomogeneous linear one is used instead.
* @throws LockedException if estimator is locked.
*/
public void setHomogeneousRangingLinearSolverUsed(final boolean useHomogeneousLinearSolver) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
useHomogeneousRangingLinearSolver = useHomogeneousLinearSolver;
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 2451 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 2453 |
protected void attemptRefine(final Solution<Point2D> result) {
final var initialPosition = result.getEstimatedPosition();
final var initialTransmittedPowerdBm = result.getEstimatedTransmittedPowerdBm();
final var initialPathLossExponent = result.getEstimatedPathLossExponent();
if (refineResult && inliersData != null) {
final var inliers = inliersData.getInliers();
final var nSamples = readings.size();
innerReadings.clear();
for (var i = 0; i < nSamples; i++) {
if (inliers.get(i)) {
// sample is inlier
innerReadings.add(readings.get(i));
}
}
try {
innerEstimator.setInitialPosition(initialPosition);
innerEstimator.setInitialTransmittedPowerdBm(initialTransmittedPowerdBm);
innerEstimator.setInitialPathLossExponent(initialPathLossExponent);
innerEstimator.setTransmittedPowerEstimationEnabled(transmittedPowerEstimationEnabled);
innerEstimator.setPathLossEstimationEnabled(pathLossEstimationEnabled);
innerEstimator.setReadings(innerReadings);
innerEstimator.setUseReadingPositionCovariances(useReadingPositionCovariances);
innerEstimator.estimate();
final var cov = innerEstimator.getEstimatedCovariance();
if (keepCovariance && cov != null) {
// keep covariance
covariance = cov;
final var dims = getNumberOfDimensions();
var pos = 0;
final var d = dims - 1;
if (estimatedPositionCovariance == null) {
estimatedPositionCovariance = covariance.getSubmatrix(0, 0, d, d);
} else {
covariance.getSubmatrix(0, 0, d, d, estimatedPositionCovariance);
}
pos += dims;
if (transmittedPowerEstimationEnabled) {
// transmitted power estimation enabled
estimatedTransmittedPowerVariance = covariance.getElementAt(pos, pos);
pos++;
} else {
// transmitted power estimation disabled
estimatedTransmittedPowerVariance = null;
}
if (pathLossEstimationEnabled) {
// path-loss exponent estimation enabled
estimatedPathLossExponentVariance = covariance.getElementAt(pos, pos);
} else {
// path-loss exponent estimation disabled
estimatedPathLossExponentVariance = null;
}
} else {
covariance = null;
estimatedPositionCovariance = null;
estimatedTransmittedPowerVariance = null;
estimatedPathLossExponentVariance = null;
}
estimatedPosition = innerEstimator.getEstimatedPosition();
estimatedTransmittedPowerdBm = innerEstimator.getEstimatedTransmittedPowerdBm();
estimatedPathLossExponent = innerEstimator.getEstimatedPathLossExponent();
} catch (final Exception e) {
// refinement failed, so we return input value, and covariance
// becomes unavailable
covariance = null;
estimatedPositionCovariance = null;
estimatedTransmittedPowerVariance = null;
estimatedPathLossExponentVariance = null;
estimatedPosition = initialPosition;
estimatedTransmittedPowerdBm = initialTransmittedPowerdBm;
estimatedPathLossExponent = initialPathLossExponent;
}
} else {
covariance = null;
estimatedPositionCovariance = null;
estimatedTransmittedPowerVariance = null;
estimatedPathLossExponentVariance = null;
estimatedPosition = initialPosition;
estimatedTransmittedPowerdBm = initialTransmittedPowerdBm;
estimatedPathLossExponent = initialPathLossExponent;
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 482 |
| com/irurueta/navigation/indoor/Utils.java | 2074 |
public static MultivariateNormalDist propagateVariancesToRssiVarianceFirstOrderNonLinear3D(
final double fingerprintRssi, final double pathLossExponent, final Point3D fingerprintPosition,
final Point3D radioSourcePosition, final Point3D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance, final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance, final Matrix estimatedPositionCovariance)
throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 1st order Taylor expression of received power in 3D:
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// - 10*n*(z1 - za)/(ln(10)*d1a^2)*(zi - z1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2 + (z1 - za)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var z1 = fingerprintPosition.getInhomZ();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var za = radioSourcePosition.getInhomZ();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var zi = estimatedPosition.getInhomZ();
final var mean = new double[]{
fingerprintRssi, pathLossExponent, x1, y1, z1, xa, ya, za, xi, yi, zi
};
final var covariance = Matrix.diagonal(new double[]{
fingerprintRssiVariance != null ? fingerprintRssiVariance : 0.0,
pathLossExponentVariance != null ? pathLossExponentVariance : 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
});
if (fingerprintPositionCovariance != null &&
fingerprintPositionCovariance.getRows() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH &&
fingerprintPositionCovariance.getColumns() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(2, 2, 4, 4,
fingerprintPositionCovariance);
}
if (radioSourcePositionCovariance != null
&& radioSourcePositionCovariance.getRows() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH
&& radioSourcePositionCovariance.getColumns() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(5, 5, 7, 7,
radioSourcePositionCovariance);
}
if (estimatedPositionCovariance != null
&& estimatedPositionCovariance.getRows() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH
&& estimatedPositionCovariance.getColumns() == Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(8, 8, 10, 10,
estimatedPositionCovariance);
}
try { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator2D.java | 357 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingAndRssiPositionEstimator2D.java | 367 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator2D.java | 357 |
final RobustMixedPositionEstimatorListener<Point2D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return ((PROSACRobustLateration2DSolver) laterationSolver).getThreshold();
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
((PROSACRobustLateration2DSolver) laterationSolver).setThreshold(threshold);
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return ((PROSACRobustLateration2DSolver) laterationSolver).isComputeAndKeepInliersEnabled();
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
((PROSACRobustLateration2DSolver) laterationSolver).setComputeAndKeepInliersEnabled(computeAndKeepInliers);
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResiduals() {
return ((PROSACRobustLateration2DSolver) laterationSolver).isComputeAndKeepResiduals();
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
((PROSACRobustLateration2DSolver) laterationSolver).setComputeAndKeepResidualsEnabled(computeAndKeepResiduals);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROSAC;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROSACRobustLateration2DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null || fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator3D.java | 357 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator3D.java | 357 |
final RobustMixedPositionEstimatorListener<Point3D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return ((PROSACRobustLateration3DSolver) laterationSolver).getThreshold();
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
((PROSACRobustLateration3DSolver) laterationSolver).setThreshold(threshold);
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return ((PROSACRobustLateration3DSolver) laterationSolver).isComputeAndKeepInliersEnabled();
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
((PROSACRobustLateration3DSolver) laterationSolver).setComputeAndKeepInliersEnabled(computeAndKeepInliers);
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResiduals() {
return ((PROSACRobustLateration3DSolver) laterationSolver).isComputeAndKeepResiduals();
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
((PROSACRobustLateration3DSolver) laterationSolver).setComputeAndKeepResidualsEnabled(computeAndKeepResiduals);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROSAC;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROSACRobustLateration3DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null
|| fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 806 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 808 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point3D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROMedSRobustEstimator<>(
new PROMedSRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double[] getQualityScores() {
return qualityScores;
}
@Override
public double getThreshold() {
return stopThreshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return PROMedSRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearMixedPositionEstimator.java | 115 |
| com/irurueta/navigation/indoor/position/NonLinearRangingAndRssiPositionEstimator.java | 116 |
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator.java | 115 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator.java | 114 |
final P initialPosition, final MixedPositionEstimatorListener<P> listener) {
this(listener);
this.initialPosition = initialPosition;
}
/**
* Gets initial position to start position estimation.
* If not defined, centroid of located sources position will be used to start
* the estimation.
*
* @return initial position to start position estimation.
*/
public P getInitialPosition() {
return initialPosition;
}
/**
* Sets initial position to start position estimation.
* If not defined, centroid of located sources position will be used to start
* the estimation.
*
* @param initialPosition initial position to start position estimation.
* @throws LockedException if estimator is locked.
*/
public void setInitialPosition(final P initialPosition) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPosition = initialPosition;
}
/**
* Indicates whether located radio source position covariance must be taken into
* account (if available) to determine distance standard deviation.
*
* @return true to take radio source position covariance into account, false
* otherwise.
*/
public boolean isRadioSourcePositionCovarianceUsed() {
return useRadioSourcePositionCovariance;
}
/**
* Specifies whether located radio source position covariance must be taken into
* account (if available) to determine distance standard deviation.
*
* @param useRadioSourcePositionCovariance true to take radio source position
* covariance into account, false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setRadioSourcePositionCovarianceUsed(final boolean useRadioSourcePositionCovariance)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useRadioSourcePositionCovariance = useRadioSourcePositionCovariance;
}
/**
* Gets distance standard deviation fallback value to use when none can be
* determined from provided radio sources and fingerprint readings.
*
* @return distance standard deviation to use as fallback.
*/
public double getFallbackDistanceStandardDeviation() {
return fallbackDistanceStandardDeviation;
}
/**
* Sets distance standard deviation fallback value to use when none can be
* determined from provided radio sources and fingerprint readings.
*
* @param fallbackDistanceStandardDeviation distance standard deviation to use
* as fallback.
* @throws LockedException if estimator is locked.
*/
public void setFallbackDistanceStandardDeviation(final double fallbackDistanceStandardDeviation)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.fallbackDistanceStandardDeviation = fallbackDistanceStandardDeviation;
}
/**
* Gets minimum required number of located radio sources to perform lateration.
*
* @return minimum required number of located radio sources to perform lateration.
*/
@Override
public int getMinRequiredSources() {
return trilaterationSolver.getMinRequiredPositionsAndDistances();
}
/**
* Indicates whether estimator is ready to find a solution.
*
* @return true if estimator is ready, false otherwise.
*/
@Override
public boolean isReady() {
return trilaterationSolver.isReady();
}
/**
* Returns boolean indicating whether this estimator is locked because an estimation
* is already in progress.
*
* @return true if estimator is locked, false otherwise.
*/
@Override
public boolean isLocked() {
return trilaterationSolver.isLocked();
}
/**
* Gets standard deviations of distances from known located radio sources to the
* location of provided readings in a fingerprint.
* Distance standard deviations are used internally to solve lateration.
*
* @return standard deviations used internally.
*/
public double[] getDistanceStandardDeviations() {
return trilaterationSolver.getDistanceStandardDeviations();
}
/**
* Estimates position based on provided located radio sources and readings of such
* radio sources at an unknown location.
*
* @throws LockedException if estimator is locked.
* @throws NotReadyException if estimator is not ready.
* @throws PositionEstimationException if estimation fails for some other reason.
*/
@Override
public void estimate() throws LockedException, NotReadyException, PositionEstimationException {
try {
trilaterationSolver.setInitialPosition(initialPosition);
trilaterationSolver.solve();
estimatedPositionCoordinates = trilaterationSolver.getEstimatedPositionCoordinates();
} catch (final LaterationException e) {
throw new PositionEstimationException(e);
}
}
/**
* Gets known positions of radio sources used internally to solve lateration.
*
* @return known positions used internally.
*/
@Override
public P[] getPositions() {
return trilaterationSolver.getPositions();
}
/**
* Gets Euclidean distances from known located radio sources to the location of
* provided readings in a fingerprint.
* Distance values are used internally to solve lateration.
*
* @return Euclidean distances used internally.
*/
@Override
public double[] getDistances() {
return trilaterationSolver.getDistances();
}
/**
* Gets estimated covariance matrix for estimated position.
*
* @return estimated covariance matrix for estimated position.
*/
public Matrix getCovariance() {
return trilaterationSolver.getCovariance();
}
/**
* Internally sets located radio sources used for lateration.
*
* @param sources located radio sources used for lateration.
* @throws IllegalArgumentException if provided value is null or the number of
* provided sources is less than the required minimum.
*/
@Override
protected void internalSetSources(final List<? extends RadioSourceLocated<P>> sources) {
super.internalSetSources(sources);
buildPositionsDistancesAndDistanceStandardDeviations();
}
/**
* Internally sets fingerprint containing readings at an unknown location for provided
* located radio sources.
*
* @param fingerprint fingerprint containing readings at an unknown location for
* provided located radio sources.
* @throws IllegalArgumentException if provided value is null.
*/
@Override
protected void internalSetFingerprint(
final Fingerprint<? extends RadioSource, ? extends Reading<? extends RadioSource>> fingerprint) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 2354 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 2279 |
}
/**
* Gets estimated located radio source with estimated transmitted power.
*
* @return estimated located radio source with estimated transmitted power or null.
*/
@Override
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point2D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated2D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated2D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Solves preliminary solution for a subset of samples.
*
* @param samplesIndices indices of subset samples.
* @param solutions instance where solution will be stored.
*/
@Override
protected void solvePreliminarySolutions(final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
try {
innerReadings.clear();
for (final var samplesIndex : samplesIndices) {
innerReadings.add(readings.get(samplesIndex));
}
// initial transmitted power and position might or might not be available
innerEstimator.setInitialTransmittedPowerdBm(initialTransmittedPowerdBm);
innerEstimator.setInitialPosition(initialPosition);
innerEstimator.setInitialPathLossExponent(initialPathLossExponent);
innerEstimator.setTransmittedPowerEstimationEnabled(transmittedPowerEstimationEnabled);
innerEstimator.setPathLossEstimationEnabled(pathLossEstimationEnabled); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 391 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 395 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this estimator is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new RANSACRobustEstimator<>(new RANSACRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return RANSACRobustRangingAndRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 391 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 395 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point3D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this estimator is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new RANSACRobustEstimator<>(new RANSACRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return RANSACRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator.java | 456 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 1566 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1554 |
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPowerdBm() {
return initialTransmittedPowerdBm;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
*
* @param initialTransmittedPowerdBm initial transmitted power to start the
* estimation of radio source transmitted
* power.
* @throws LockedException if estimator is locked.
*/
public void setInitialTransmittedPowerdBm(final Double initialTransmittedPowerdBm) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialTransmittedPowerdBm = initialTransmittedPowerdBm;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPower() {
return initialTransmittedPowerdBm != null ? Utils.dBmToPower(initialTransmittedPowerdBm) : null;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
*
* @param initialTransmittedPower initial transmitted power to start the
* estimation of radio source transmitted power.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is negative.
*/
public void setInitialTransmittedPower(final Double initialTransmittedPower) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (initialTransmittedPower != null) {
if (initialTransmittedPower < 0.0) {
throw new IllegalArgumentException();
}
initialTransmittedPowerdBm = Utils.powerTodBm(initialTransmittedPower);
} else {
initialTransmittedPowerdBm = null;
}
}
/**
* Gets initial position to start the estimation of radio source position.
* If not defined, centroid of provided fingerprints will be used.
*
* @return initial position to start the estimation of radio source position.
*/
public P getInitialPosition() {
return initialPosition;
}
/**
* Sets initial position to start the estimation of radio source position.
* If not defined, centroid of provided fingerprints will be used.
*
* @param initialPosition initial position to start the estimation of radio
* source position.
* @throws LockedException if estimator is locked.
*/
public void setInitialPosition(final P initialPosition) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPosition = initialPosition;
}
/**
* Gets initial exponent typically used on free space for path loss propagation
* in terms of distance.
* On different environments path loss exponent might have different value:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* <p>
* If path loss exponent estimation is enabled, estimation will start at this
* value and will converge to the most appropriate value.
* If path loss exponent estimation is disabled, this value will be assumed
* to be exact and the estimated path loss exponent will be equal to this
* value.
*
* @return initial path loss exponent.
*/
public double getInitialPathLossExponent() {
return initialPathLossExponent;
}
/**
* Sets initial exponent typically used on free space for path loss propagation
* in terms of distance.
* On different environments path loss exponent might have different value:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* <p>
* If path loss exponent estimation is enabled, estimation will start at this
* value and will converge to the most appropriate value.
* If path loss exponent estimation is disabled, this value will be assumed
* to be exact and the estimated path loss exponent will be equal to this
* value.
*
* @param initialPathLossExponent initial path loss exponent.
* @throws LockedException if estimator is locked.
*/
public void setInitialPathLossExponent(final double initialPathLossExponent) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPathLossExponent = initialPathLossExponent;
}
/**
* Indicates whether transmitted power estimation is enabled or not.
*
* @return true if transmitted power estimation is enabled, false otherwise.
*/
public boolean isTransmittedPowerEstimationEnabled() {
return transmittedPowerEstimationEnabled;
}
/**
* Specifies whether transmitted power estimation is enabled or not.
*
* @param transmittedPowerEstimationEnabled true if transmitted power estimation is enabled,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setTransmittedPowerEstimationEnabled(final boolean transmittedPowerEstimationEnabled)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.transmittedPowerEstimationEnabled = transmittedPowerEstimationEnabled;
}
/**
* Indicates whether path loss estimation is enabled or not.
*
* @return true if path loss estimation is enabled, false otherwise.
*/
public boolean isPathLossEstimationEnabled() {
return pathLossEstimationEnabled;
}
/**
* Specifies whether path loss estimation is enabled or not.
*
* @param pathLossEstimationEnabled true if path loss estimation is enabled,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setPathLossEstimationEnabled(final boolean pathLossEstimationEnabled) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.pathLossEstimationEnabled = pathLossEstimationEnabled;
}
/**
* Indicates whether position covariances of readings must be taken into account to increase
* the amount of standard deviation of each ranging measure by the amount of position standard
* deviation assuming that both measures are statistically independent.
*
* @return true to take into account reading position covariances, false otherwise.
*/
public boolean getUseReadingPositionCovariance() {
return useReadingPositionCovariances;
}
/**
* Specifies whether position covariances of readings must be taken into account to increase
* the amount of standard deviation of each ranging measure by the amount of position standard
* deviation assuming that both measures are statistically independent.
*
* @param useReadingPositionCovariances true to take into account reading position covariances, false
* otherwise.
* @throws LockedException if estimator is locked.
*/
public void setUseReadingPositionCovariances(final boolean useReadingPositionCovariances) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useReadingPositionCovariances = useReadingPositionCovariances;
}
/**
* Indicates whether an homogeneous linear solver is used to estimate an initial
* position for the internal ranging radio source estimator.
*
* @return true if homogeneous linear solver is used, false if an inhomogeneous linear
* one is used instead.
*/
public abstract boolean isHomogeneousRangingLinearSolverUsed(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 806 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 806 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROMedSRobustEstimator<>(
new PROMedSRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double[] getQualityScores() {
return qualityScores;
}
@Override
public double getThreshold() {
return stopThreshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 256 |
| com/irurueta/navigation/indoor/Utils.java | 1884 |
public static MultivariateNormalDist propagateVariancesToRssiVarianceFirstOrderNonLinear2D(
final double fingerprintRssi, final double pathLossExponent, final Point2D fingerprintPosition,
final Point2D radioSourcePosition, final Point2D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance, final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance, final Matrix estimatedPositionCovariance)
throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 1st order Taylor expression of received power in 2D:
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var mean = new double[]{
fingerprintRssi, pathLossExponent, x1, y1, xa, ya, xi, yi
};
final var covariance = Matrix.diagonal(new double[]{
fingerprintRssiVariance != null ? fingerprintRssiVariance : 0.0,
pathLossExponentVariance != null ? pathLossExponentVariance : 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0
});
if (fingerprintPositionCovariance != null
&& fingerprintPositionCovariance.getRows() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH
&& fingerprintPositionCovariance.getColumns() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(2, 2, 3, 3,
fingerprintPositionCovariance);
}
if (radioSourcePositionCovariance != null
&& radioSourcePositionCovariance.getRows() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH
&& radioSourcePositionCovariance.getColumns() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(4, 4, 5, 5,
radioSourcePositionCovariance);
}
if (estimatedPositionCovariance != null
&& estimatedPositionCovariance.getRows() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH
&& estimatedPositionCovariance.getColumns() == Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH) {
covariance.setSubmatrix(6, 6, 7, 7,
estimatedPositionCovariance);
}
try { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/SequentialRobustMixedPositionEstimator.java | 964 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 1297 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1285 |
}
/**
* Returns amount of confidence expressed as a value between 0.0 and 1.0 (which
* is equivalent to 100%) for robust position estimation on ranging data. The
* amount of confidence indicates the probability that the estimated result is
* correct. Usually this value will be close to 1.0, but not exactly 1.0.
*
* @return amount of confidence for robust position estimation as a value between
* 0.0 and 1.0.
*/
public double getRangingConfidence() {
return rangingConfidence;
}
/**
* Sets amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on ranging data. The amount
* of confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @param rangingConfidence confidence to be set for robust position estimation as
* a value between 0.0 and 1.0.
* @throws IllegalArgumentException if provided value is not between 0.0 and 1.0.
* @throws LockedException if estimator is locked.
*/
public void setRangingConfidence(final double rangingConfidence) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingConfidence < MIN_CONFIDENCE || rangingConfidence > MAX_CONFIDENCE) {
throw new IllegalArgumentException();
}
this.rangingConfidence = rangingConfidence;
}
/**
* Returns amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on RSSI data. The amount of
* confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @return amount of confidence for robust position estimation as a value between
* 0.0 and 1.0.
*/
public double getRssiConfidence() {
return rssiConfidence;
}
/**
* Sets amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on RSSI data. The amount
* of confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @param rssiConfidence amount of confidence for robust position estimation as
* a value between 0.0 and 1.0.
* @throws IllegalArgumentException if provided value is not between 0.0 and 1.0.
* @throws LockedException if estimator is locked.
*/
public void setRssiConfidence(final double rssiConfidence) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiConfidence < MIN_CONFIDENCE || rssiConfidence > MAX_CONFIDENCE) {
throw new IllegalArgumentException();
}
this.rssiConfidence = rssiConfidence;
}
/**
* Gets maximum allowed number of iterations for robust ranging position estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @return maximum allowed number of iterations for position estimation.
*/
public int getRangingMaxIterations() {
return rangingMaxIterations;
}
/**
* Sets maximum allowed number of iterations for robust ranging position
* estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @param rangingMaxIterations maximum allowed number of iterations to be set for
* position estimation.
* @throws IllegalArgumentException if provided value is less than 1.
* @throws LockedException if estimator is locked.
*/
public void setRangingMaxIterations(final int rangingMaxIterations) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingMaxIterations < MIN_ITERATIONS) {
throw new IllegalArgumentException();
}
this.rangingMaxIterations = rangingMaxIterations;
}
/**
* Gets maximum allowed number of iterations for robust RSSI position estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @return maximum allowed number of iterations for position estimation.
*/
public int getRssiMaxIterations() {
return rssiMaxIterations;
}
/**
* Sets maximum allowed number of iterations for robust RSSI position estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @param rssiMaxIterations maximum allowed number of iterations to be set for
* position estimation.
* @throws IllegalArgumentException if provided value is less than 1.
* @throws LockedException if estimator is locked.
*/
public void setRssiMaxIterations(final int rssiMaxIterations) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiMaxIterations < MIN_ITERATIONS) {
throw new IllegalArgumentException();
}
this.rssiMaxIterations = rssiMaxIterations;
}
/**
* Indicates whether result is refined using all found inliers.
*
* @return true if result is refined, false otherwise.
*/
public boolean isResultRefined() {
return refineResult;
}
/**
* Specifies whether result is refined using all found inliers.
*
* @param refineResult true if result is refined, false otherwise.
* @throws LockedException if this instance is locked.
*/
public void setResultRefined(final boolean refineResult) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.refineResult = refineResult;
}
/**
* Indicates whether covariance must be kept after refining result.
* This setting is only taken into account if result is refined.
*
* @return true if covariance must be kept after refining result, false otherwise.
*/
public boolean isCovarianceKept() {
return keepCovariance;
}
/**
* Specifies whether covariance must be kept after refining result.
* This setting is only taken into account if result is refined.
*
* @param keepCovariance true if covariance must be kept after refining result,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setCovarianceKept(final boolean keepCovariance) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.keepCovariance = keepCovariance;
}
/**
* Indicates whether a linear solver is used for preliminary solution estimation
* using ranging measurements.
* The result obtained on each preliminary solution might be later refined.
*
* @return true if a linear solver is used for preliminary solution estimation on
* ranging readings.
*/
public boolean isRangingLinearSolverUsed() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/SequentialRobustRangingAndRssiPositionEstimator.java | 944 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 1297 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1285 |
}
/**
* Returns amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on ranging data. The amount
* of confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @return amount of confidence for robust position estimation as a value between
* 0.0 and 1.0.
*/
public double getRangingConfidence() {
return rangingConfidence;
}
/**
* Sets amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on ranging data. The amount
* of confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @param rangingConfidence confidence to be set for robust position estimation
* as a value between 0.0 and 1.0.
* @throws IllegalArgumentException if provided value is not between 0.0 and 1.0.
* @throws LockedException if estimator is locked.
*/
public void setRangingConfidence(final double rangingConfidence) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingConfidence < MIN_CONFIDENCE || rangingConfidence > MAX_CONFIDENCE) {
throw new IllegalArgumentException();
}
this.rangingConfidence = rangingConfidence;
}
/**
* Returns amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on RSSI data. The amount
* of confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @return amount of confidence for robust position estimation as a value between
* 0.0 and 1.0.
*/
public double getRssiConfidence() {
return rssiConfidence;
}
/**
* Sets amount of confidence expressed as a value between 0.0 and 1.0 (which is
* equivalent to 100%) for robust position estimation on RSSI data. The amount
* of confidence indicates the probability that the estimated result is correct.
* Usually this value will be close to 1.0, but not exactly 1.0.
*
* @param rssiConfidence amount of confidence for robust position estimation as a
* value between 0.0 and 1.0.
* @throws IllegalArgumentException if provided value is not between 0.0 and 1.0.
* @throws LockedException if estimator is locked.
*/
public void setRssiConfidence(final double rssiConfidence) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiConfidence < MIN_CONFIDENCE || rssiConfidence > MAX_CONFIDENCE) {
throw new IllegalArgumentException();
}
this.rssiConfidence = rssiConfidence;
}
/**
* Gets maximum allowed number of iterations for robust ranging position estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @return maximum allowed number of iterations for position estimation.
*/
public int getRangingMaxIterations() {
return rangingMaxIterations;
}
/**
* Sets maximum allowed number of iterations for robust ranging position
* estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @param rangingMaxIterations maximum allowed number of iterations to be set for
* position estimation.
* @throws IllegalArgumentException if provided value is less than 1.
* @throws LockedException if estimator is locked.
*/
public void setRangingMaxIterations(final int rangingMaxIterations) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rangingMaxIterations < MIN_ITERATIONS) {
throw new IllegalArgumentException();
}
this.rangingMaxIterations = rangingMaxIterations;
}
/**
* Gets maximum allowed number of iterations for robust RSSI position estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @return maximum allowed number of iterations for position estimation.
*/
public int getRssiMaxIterations() {
return rssiMaxIterations;
}
/**
* Sets maximum allowed number of iterations for robust RSSI position estimation.
* When the maximum number of iterations is exceeded, an approximate result might
* be available for retrieval.
*
* @param rssiMaxIterations maximum allowed number of iterations to be set for
* position estimation.
* @throws IllegalArgumentException if provided value is less than 1.
* @throws LockedException if estimator is locked.
*/
public void setRssiMaxIterations(final int rssiMaxIterations) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (rssiMaxIterations < MIN_ITERATIONS) {
throw new IllegalArgumentException();
}
this.rssiMaxIterations = rssiMaxIterations;
}
/**
* Indicates whether result is refined using all found inliers.
*
* @return true if result is refined, false otherwise.
*/
public boolean isResultRefined() {
return refineResult;
}
/**
* Specifies whether result is refined using all found inliers.
*
* @param refineResult true if result is refined, false otherwise.
* @throws LockedException if this instance is locked.
*/
public void setResultRefined(final boolean refineResult) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.refineResult = refineResult;
}
/**
* Indicates whether covariance must be kept after refining result.
* This setting is only taken into account if result is refined.
*
* @return true if covariance must be kept after refining result, false otherwise.
*/
public boolean isCovarianceKept() {
return keepCovariance;
}
/**
* Specifies whether covariance must be kept after refining result.
* This setting is only taken into account if result is refined.
*
* @param keepCovariance true if covariance must be kept after refining result,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setCovarianceKept(final boolean keepCovariance) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.keepCovariance = keepCovariance;
}
/**
* Indicates whether a linear solver is used for preliminary solution estimation
* using ranging measurements.
* The result obtained on each preliminary solution might be later refined.
*
* @return true if a linear solver is used for preliminary solution estimation on
* ranging readings.
*/
public boolean isRangingLinearSolverUsed() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 318 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 318 |
final Point2D initialPosition, final RobustRangingRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, listener);
internalSetQualityScores(qualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position for a radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@SuppressWarnings("DuplicatedCode")
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/RadioSourceKNearestFinder.java | 128 |
| com/irurueta/navigation/indoor/RadioSourceNoMeanKNearestFinder.java | 131 |
final var sqrDist = f.sqrDistanceTo(fingerprint);
if (sqrDist < bestSqrDist) {
bestSqrDist = sqrDist;
result = f;
}
}
return result;
}
/**
* Finds k-nearest fingerprints to provided one, in terms of signal Euclidean distances, within the collection
* of provided fingerprints.
*
* @param fingerprint fingerprint to find the k-nearest ones to.
* @param fingerprints collection of fingerprints to make the search for the nearest ones.
* @param k number of nearest fingerprints to find.
* @param <P> a {@link Point} type.
* @param <S> a {@link RadioSource} type.
* @return nearest fingerprints ordered from closest to farthest or an empty list if none could be found.
* @throws IllegalArgumentException if either fingerprint or collection of fingerprints is null, or k is less than
* 1.
*/
@SuppressWarnings("DuplicatedCode")
public static <P extends Point<?>, S extends RadioSource> List<RssiFingerprintLocated<S, RssiReading<S>, P>>
findKNearestTo(final RssiFingerprint<S, RssiReading<S>> fingerprint, final Collection<? extends
RssiFingerprintLocated<S, RssiReading<S>, P>> fingerprints, final int k) {
final var result = new ArrayList<RssiFingerprintLocated<S, RssiReading<S>, P>>();
final var nearestSqrDistances = new ArrayList<Double>();
findKNearestTo(fingerprint, fingerprints, k, result, nearestSqrDistances);
return result;
}
/**
* Finds k-nearest fingerprints to provided one, in terms of signal Euclidean distances, within the collection
* of provided fingerprints.
*
* @param fingerprint fingerprint to find the k-nearest ones to.
* @param fingerprints collection of fingerprints ot make the search for the nearest ones.
* @param k number of nearest fingerprints to find.
* @param nearestFingerprints list where found nearest fingerprints will be stored ordered from closest to farthest
* or an empty list if none could be found.
* @param nearestSqrDistances list where squared signal Euclidean distances corresponding to found fingerprints will
* be stored or an empty list if no fingerprint is found.
* @param <P> a {@link Point} type.
* @param <S> a {@link RadioSource} type.
* @throws IllegalArgumentException if any parameter is null or k is less than 1.
*/
@SuppressWarnings("Duplicates")
public static <P extends Point<?>, S extends RadioSource> void findKNearestTo(
final RssiFingerprint<S, RssiReading<S>> fingerprint,
final Collection<? extends RssiFingerprintLocated<S, RssiReading<S>, P>> fingerprints,
final int k,
final List<RssiFingerprintLocated<S, RssiReading<S>, P>> nearestFingerprints,
final List<Double> nearestSqrDistances) {
if (fingerprint == null || fingerprints == null || k < 1 || nearestFingerprints == null
|| nearestSqrDistances == null) {
throw new IllegalArgumentException();
}
nearestSqrDistances.clear();
nearestFingerprints.clear();
var maxSqrDist = Double.MAX_VALUE;
for (final var f : fingerprints) {
final var sqrDist = f.sqrDistanceTo(fingerprint); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 808 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 808 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 801 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustMixedPositionEstimator2D.java | 358 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingAndRssiPositionEstimator2D.java | 367 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingPositionEstimator2D.java | 365 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator2D.java | 357 |
final RobustMixedPositionEstimatorListener<Point2D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration2DSolver) laterationSolver).getStopThreshold();
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
((PROMedSRobustLateration2DSolver) laterationSolver).setStopThreshold(stopThreshold);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROMedSRobustLateration2DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null
|| fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustMixedPositionEstimator3D.java | 358 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingAndRssiPositionEstimator3D.java | 367 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingPositionEstimator3D.java | 365 |
final RobustMixedPositionEstimatorListener<Point3D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration3DSolver) laterationSolver).getStopThreshold();
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
((PROMedSRobustLateration3DSolver) laterationSolver).setStopThreshold(stopThreshold);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROMedSRobustLateration3DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null
|| fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 906 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 900 |
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double[] getQualityScores() {
return qualityScores;
}
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return PROSACRobustRangingAndRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 2354 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator2D.java | 411 |
}
/**
* Gets estimated located radio source with estimated transmitted power.
*
* @return estimated located radio source with estimated transmitted power or null.
*/
@Override
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point2D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated2D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated2D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 2356 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2278 |
}
/**
* Gets estimated located radio source with estimated transmitted power.
*
* @return estimated located radio source with estimated transmitted power or null.
*/
@Override
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point3D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated3D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated3D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 2362 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator2D.java | 834 |
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point2D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated2D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated2D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Solves preliminary solution for a subset of samples.
*
* @param samplesIndices indices of subset samples.
* @param solutions instance where solution will be stored.
*/
@Override
protected void solvePreliminarySolutions(final int[] samplesIndices, final List<Solution<Point2D>> solutions) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 2364 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator3D.java | 834 |
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point3D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated3D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated3D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Solves preliminary solution for a subset of samples.
*
* @param samplesIndices indices of subset samples.
* @param solutions instance where solution will be stored.
*/
@Override
protected void solvePreliminarySolutions(final int[] samplesIndices, final List<Solution<Point3D>> solutions) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 2287 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator2D.java | 834 |
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point2D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated2D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated2D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Solves preliminary solution for a subset of samples.
*
* @param samplesIndices indices of subset samples.
* @param solutions instance where solution will be stored.
*/
@Override
protected void solvePreliminarySolutions(final int[] samplesIndices, final List<Solution<Point2D>> solutions) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustMixedPositionEstimator3D.java | 361 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 361 |
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration3DSolver) laterationSolver).getStopThreshold();
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
((PROMedSRobustLateration3DSolver) laterationSolver).setStopThreshold(stopThreshold);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROMedSRobustLateration3DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null
|| fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingAndRssiPositionEstimator3D.java | 370 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 361 |
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration3DSolver) laterationSolver).getStopThreshold();
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
((PROMedSRobustLateration3DSolver) laterationSolver).setStopThreshold(stopThreshold);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROMedSRobustLateration3DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null || fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingPositionEstimator3D.java | 368 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 361 |
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration3DSolver) laterationSolver).getStopThreshold();
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
((PROMedSRobustLateration3DSolver) laterationSolver).setStopThreshold(stopThreshold);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROMedSRobustLateration3DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null
|| fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 369 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 372 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to determine whether samples are inliers or not.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not.
*
* @param threshold threshold to be set.
* @throws IllegalArgumentException if provided value is equal or less than
* zero.
* @throws LockedException if robust estimator is locked because an
* estimation is already in progress.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRangingAndRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 369 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 372 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point3D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to determine whether samples are inliers or not.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not.
*
* @param threshold threshold to be set.
* @throws IllegalArgumentException if provided value is equal or less than
* zero.
* @throws LockedException if robust estimator is locked because an
* estimation is already in progress.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2286 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator3D.java | 834 |
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point3D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated3D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated3D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator2D.java | 419 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator2D.java | 834 |
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point2D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated2D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated2D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator.java | 446 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 1566 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1554 |
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPowerdBm() {
return initialTransmittedPowerdBm;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
*
* @param initialTransmittedPowerdBm initial transmitted power to start the
* estimation of radio source transmitted
* power.
* @throws LockedException if estimator is locked.
*/
public void setInitialTransmittedPowerdBm(final Double initialTransmittedPowerdBm) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialTransmittedPowerdBm = initialTransmittedPowerdBm;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPower() {
return initialTransmittedPowerdBm != null ? Utils.dBmToPower(initialTransmittedPowerdBm) : null;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
*
* @param initialTransmittedPower initial transmitted power to start the
* estimation of radio source transmitted power.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is negative.
*/
public void setInitialTransmittedPower(final Double initialTransmittedPower) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (initialTransmittedPower != null) {
if (initialTransmittedPower < 0.0) {
throw new IllegalArgumentException();
}
initialTransmittedPowerdBm = Utils.powerTodBm(initialTransmittedPower);
} else {
initialTransmittedPowerdBm = null;
}
}
/**
* Gets initial position to start the estimation of radio source position.
* If not defined, centroid of provided fingerprints will be used.
*
* @return initial position to start the estimation of radio source position.
*/
public P getInitialPosition() {
return initialPosition;
}
/**
* Sets initial position to start the estimation of radio source position.
* If not defined, centroid of provided fingerprints will be used.
*
* @param initialPosition initial position to start the estimation of radio
* source position.
* @throws LockedException if estimator is locked.
*/
public void setInitialPosition(final P initialPosition) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPosition = initialPosition;
}
/**
* Gets initial exponent typically used on free space for path loss propagation
* in terms of distance.
* On different environments path loss exponent might have different value:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* <p>
* If path loss exponent estimation is enabled, estimation will start at this
* value and will converge to the most appropriate value.
* If path loss exponent estimation is disabled, this value will be assumed
* to be exact and the estimated path loss exponent will be equal to this
* value.
*
* @return initial path loss exponent.
*/
public double getInitialPathLossExponent() {
return initialPathLossExponent;
}
/**
* Sets initial exponent typically used on free space for path loss propagation
* in terms of distance.
* On different environments path loss exponent might have different value:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* <p>
* If path loss exponent estimation is enabled, estimation will start at this
* value and will converge to the most appropriate value.
* If path loss exponent estimation is disabled, this value will be assumed
* to be exact and the estimated path loss exponent will be equal to this
* value.
*
* @param initialPathLossExponent initial path loss exponent.
* @throws LockedException if estimator is locked.
*/
public void setInitialPathLossExponent(final double initialPathLossExponent) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPathLossExponent = initialPathLossExponent;
}
/**
* Indicates whether transmitted power estimation is enabled or not.
*
* @return true if transmitted power estimation is enabled, false otherwise.
*/
public boolean isTransmittedPowerEstimationEnabled() {
return transmittedPowerEstimationEnabled;
}
/**
* Specifies whether transmitted power estimation is enabled or not.
*
* @param transmittedPowerEstimationEnabled true if transmitted power estimation is enabled,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setTransmittedPowerEstimationEnabled(final boolean transmittedPowerEstimationEnabled)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.transmittedPowerEstimationEnabled = transmittedPowerEstimationEnabled;
}
/**
* Indicates whether radio source position estimation is enabled or not.
*
* @return true if position estimation is enabled, false otherwise.
*/
public boolean isPositionEstimationEnabled() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator.java | 505 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator.java | 491 |
final MixedRadioSourceEstimatorListener<S, P> listener) {
this(readings, initialPosition, initialTransmittedPowerdBm, listener);
this.initialPathLossExponent = initialPathLossExponent;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPowerdBm() {
return initialTransmittedPowerdBm;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPowerdBm initial transmitted power to start the
* estimation of radio source transmitted
* power.
* @throws LockedException if estimator is locked.
*/
public void setInitialTransmittedPowerdBm(final Double initialTransmittedPowerdBm) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialTransmittedPowerdBm = initialTransmittedPowerdBm;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPower() {
return initialTransmittedPowerdBm != null ? Utils.dBmToPower(initialTransmittedPowerdBm) : null;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPower initial transmitted power to start the
* estimation of radio source transmitted power.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is negative.
*/
public void setInitialTransmittedPower(final Double initialTransmittedPower) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (initialTransmittedPower != null) {
if (initialTransmittedPower < 0.0) {
throw new IllegalArgumentException();
}
initialTransmittedPowerdBm = Utils.powerTodBm(initialTransmittedPower);
} else {
initialTransmittedPowerdBm = null;
}
}
/**
* Indicates whether transmitted power estimation is enabled or not.
*
* @return true if transmitted power estimation is enabled, false otherwise.
*/
public boolean isTransmittedPowerEstimationEnabled() {
return transmittedPowerEstimationEnabled;
}
/**
* Specifies whether transmitted power estimation is enabled or not.
*
* @param transmittedPowerEstimationEnabled true if transmitted power estimation is enabled,
* false otherwise.
* @throws LockedException if estimator is locked.
*/
public void setTransmittedPowerEstimationEnabled(final boolean transmittedPowerEstimationEnabled)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.transmittedPowerEstimationEnabled = transmittedPowerEstimationEnabled;
}
/**
* Gets initial position to start the estimation of radio source position.
* If not defined, centroid of provided readings will be used.
* <p>
* If position estimation is enabled, estimation will start at this value
* and will converge to the most appropriate value.
* If position estimation is disabled, this value will be assumed to
* be exact and the estimated position will be equal to this value.
*
* @return initial position to start the estimation of radio source position.
*/
public P getInitialPosition() {
return initialPosition;
}
/**
* Sets initial position to start the estimation of radio source position.
* If not defined, centroid of provided fingerprints will be used.
* <p>
* If position estimation is enabled, estimation will start at this value
* and will converge to the most appropriate value.
* If position estimation is disabled, this value will be assumed to
* be exact and the estimated position will be equal to this value.
*
* @param initialPosition initial position to start the estimation of radio
* source position.
* @throws LockedException if estimator is locked.
*/
public void setInitialPosition(final P initialPosition) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialPosition = initialPosition;
}
/**
* Gets initial exponent typically used on free space for path loss propagation
* in terms of distance.
* On different environments path loss exponent might have different value:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* <p>
* If path loss exponent estimation is enabled, estimation will start at this
* value and will converge to the most appropriate value.
* If path loss exponent estimation is disabled, this value will be assumed
* to be exact and the estimated path loss exponent will be equal to this
* value.
*
* @return initial path loss exponent.
*/
public double getInitialPathLossExponent() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RobustRangingAndRssiPositionEstimator3D.java | 820 |
| com/irurueta/navigation/indoor/position/RobustRssiPositionEstimator3D.java | 798 |
final RobustRangingAndRssiPositionEstimatorListener<Point3D> listener) {
return create(sourceQualityScores, fingerprintReadingQualityScores, sources, fingerprint, listener,
DEFAULT_ROBUST_METHOD);
}
/**
* Sets positions, distances and standard deviations of distances on internal
* lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @param distanceStandardDeviations standard deviations of distances to be set.
* @param distanceQualityScores distance quality scores or null if not
* required.
*/
@Override
protected void setPositionsDistancesDistanceStandardDeviationsAndQualityScores(
final List<Point3D> positions, List<Double> distances, final List<Double> distanceStandardDeviations,
final List<Double> distanceQualityScores) {
final var size = positions.size();
Point3D[] positionsArray = new InhomogeneousPoint3D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
double[] qualityScoresArray = null;
if (distanceQualityScores != null) {
qualityScoresArray = new double[size];
}
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
if (qualityScoresArray != null) {
qualityScoresArray[i] = distanceQualityScores.get(i);
}
}
try {
laterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
if (qualityScoresArray != null) {
laterationSolver.setQualityScores(qualityScoresArray);
}
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 809 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 319 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 319 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 802 |
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 809 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 319 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 319 |
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearMixedPositionEstimator2D.java | 283 |
| com/irurueta/navigation/indoor/position/NonLinearRangingAndRssiPositionEstimator2D.java | 292 |
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator2D.java | 282 |
final Point2D initialPosition, final MixedPositionEstimatorListener<Point2D> listener) {
super(initialPosition, listener);
initialize();
internalSetSources(sources);
internalSetFingerprint(fingerprint);
}
/**
* Gets estimated position.
*
* @return estimated position.
*/
public Point2D getEstimatedPosition() {
if (estimatedPositionCoordinates == null) {
return null;
}
final var result = new InhomogeneousPoint2D();
getEstimatedPosition(result);
return result;
}
/**
* Sets positions, distances and standard deviations of distances on internal
* lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @param distanceStandardDeviations standard deviations of distances to be set.
*/
@Override
@SuppressWarnings("Duplicates")
protected void setPositionsDistancesAndDistanceStandardDeviations(
final List<Point2D> positions, final List<Double> distances,
final List<Double> distanceStandardDeviations) {
final var size = positions.size();
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
try {
trilaterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
trilaterationSolver = new NonLinearLeastSquaresLateration2DSolver(laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearRangingAndRssiPositionEstimator3D.java | 294 |
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator3D.java | 282 |
final RangingAndRssiPositionEstimatorListener<Point3D> listener) {
super(initialPosition, listener);
initialize();
internalSetSources(sources);
internalSetFingerprint(fingerprint);
}
/**
* Gets estimated position.
*
* @return estimated position.
*/
public Point3D getEstimatedPosition() {
if (estimatedPositionCoordinates == null) {
return null;
}
final var result = new InhomogeneousPoint3D();
getEstimatedPosition(result);
return result;
}
/**
* Sets positions, distances and standard deviations of distances on internal
* lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @param distanceStandardDeviations standard deviations of distances to be set.
*/
@Override
@SuppressWarnings("Duplicates")
protected void setPositionsDistancesAndDistanceStandardDeviations(
final List<Point3D> positions, final List<Double> distances,
final List<Double> distanceStandardDeviations) {
final var size = positions.size();
Point3D[] positionsArray = new InhomogeneousPoint3D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
try {
trilaterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
trilaterationSolver = new NonLinearLeastSquaresLateration3DSolver(laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RobustMixedPositionEstimator2D.java | 797 |
| com/irurueta/navigation/indoor/position/RobustRangingAndRssiPositionEstimator2D.java | 822 |
| com/irurueta/navigation/indoor/position/RobustRangingPositionEstimator2D.java | 818 |
| com/irurueta/navigation/indoor/position/RobustRssiPositionEstimator2D.java | 799 |
final RobustMixedPositionEstimatorListener<Point2D> listener) {
return create(sourceQualityScores, fingerprintReadingQualityScores, sources, fingerprint, listener,
DEFAULT_ROBUST_METHOD);
}
/**
* Sets positions, distances and standard deviations of distances on internal
* lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @param distanceStandardDeviations standard deviations of distances to be set.
* @param distanceQualityScores distance quality scores or null if not
* required.
*/
@Override
protected void setPositionsDistancesDistanceStandardDeviationsAndQualityScores(
final List<Point2D> positions, List<Double> distances, final List<Double> distanceStandardDeviations,
final List<Double> distanceQualityScores) {
final var size = positions.size();
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
double[] qualityScoresArray = null;
if (distanceQualityScores != null) {
qualityScoresArray = new double[size];
}
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
if (qualityScoresArray != null) {
qualityScoresArray[i] = distanceQualityScores.get(i);
}
}
try {
laterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
if (qualityScoresArray != null) {
laterationSolver.setQualityScores(qualityScoresArray);
}
} catch (LockedException e) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/SequentialRobustMixedPositionEstimator.java | 49 |
| com/irurueta/navigation/indoor/position/SequentialRobustRangingAndRssiPositionEstimator.java | 44 |
public abstract class SequentialRobustMixedPositionEstimator<P extends Point<?>> {
/**
* Default robust estimator method for robust position estimation using ranging
* data when no robust method is provided.
*/
public static final RobustEstimatorMethod DEFAULT_RANGING_ROBUST_METHOD = RobustEstimatorMethod.PROMEDS;
/**
* Default robust method for coarse robust position estimation using RSSI
* data when no robust method is provided.
*/
public static final RobustEstimatorMethod DEFAULT_RSSI_ROBUST_METHOD = RobustEstimatorMethod.PROMEDS;
/**
* Indicates that by default located radio source position covariance is taken
* into account (if available) to determine distance standard deviation for ranging
* measurements.
*/
public static final boolean DEFAULT_USE_RANGING_RADIO_SOURCE_POSITION_COVARIANCE = true;
/**
* Indicates that by default located radio source position covariance is taken
* into account (if available) to determine distance standard deviation for RSSI
* measurements.
*/
public static final boolean DEFAULT_USE_RSSI_RADIO_SOURCE_POSITION_COVARIANCE = true;
/**
* Indicates that by default readings are distributed evenly among radio sources
* taking into account quality scores of both radio sources and ranging readings.
*/
public static final boolean DEFAULT_EVENLY_DISTRIBUTE_RANGING_READINGS = true;
/**
* Indicates that by default readings are distributed evenly among radio sources
* taking into account quality scores of both radio sources and RSSI readings.
*/
public static final boolean DEFAULT_EVENLY_DISTRIBUTE_RSSI_READINGS = true;
/**
* Distance standard deviation assumed for provided distances as a fallback when
* none can be determined.
*/
public static final double FALLBACK_DISTANCE_STANDARD_DEVIATION =
RobustPositionEstimator.FALLBACK_DISTANCE_STANDARD_DEVIATION;
/**
* Default amount of progress variation before notifying a change in estimation progress.
* By default, this is set to 5%.
*/
public static final float DEFAULT_PROGRESS_DELTA = 0.05f;
/**
* Minimum allowed value for progress delta.
*/
public static final float MIN_PROGRESS_DELTA = 0.0f;
/**
* Maximum allowed value for progress delta.
*/
public static final float MAX_PROGRESS_DELTA = 1.0f;
/**
* Constant defining default confidence of the estimated result, which is
* 99%. This means that with a probability of 99% estimation will be
* accurate because chosen sub-samples will be inliers.
*/
public static final double DEFAULT_CONFIDENCE = 0.99;
/**
* Default maximum allowed number of iterations.
*/
public static final int DEFAULT_MAX_ITERATIONS = 5000;
/**
* Minimum allowed confidence value.
*/
public static final double MIN_CONFIDENCE = 0.0;
/**
* Maximum allowed confidence value.
*/
public static final double MAX_CONFIDENCE = 1.0;
/**
* Minimum allowed number of iterations.
*/
public static final int MIN_ITERATIONS = 1;
/**
* Indicates that result is refined by default using all found inliers.
*/
public static final boolean DEFAULT_REFINE_RESULT = true;
/**
* Indicates that covariance is kept by default after refining result.
*/
public static final boolean DEFAULT_KEEP_COVARIANCE = true;
/**
* Indicates that by default a linear solver is used for preliminary solution
* estimation using ranging measurements.
* The result obtained on each preliminary solution might be later refined.
*/
public static final boolean DEFAULT_USE_RANGING_LINEAR_SOLVER = true;
/**
* Indicates that by default a linear solver is used for preliminary solution
* estimation using RSSI measurements.
* The result obtained on each preliminary solution might be later refined.
*/
public static final boolean DEFAULT_USE_RSSI_LINEAR_SOLVER = true;
/**
* Indicates that by default an homogeneous linear solver is used either to
* estimate preliminary solutions or an initial solution for preliminary solutions
* that will be later refined on the ranging fine estimation.
*/
public static final boolean DEFAULT_USE_RANGING_HOMOGENEOUS_LINEAR_SOLVER = false;
/**
* Indicates that by default an homogeneous linear solver is used either to
* estimate preliminary solutions or an initial solution for preliminary solutions
* that will be later refined on the RSSI coarse estimation.
*/
public static final boolean DEFAULT_USE_RSSI_HOMOGENEOUS_LINEAR_SOLVER = false;
/**
* Indicates that by default preliminary ranging solutions are refined.
*/
public static final boolean DEFAULT_REFINE_RANGING_PRELIMINARY_SOLUTIONS = true;
/**
* Indicates that by default preliminary RSSI solutions are refined.
*/
public static final boolean DEFAULT_REFINE_RSSI_PRELIMINARY_SOLUTIONS = true;
/**
* Internal robust estimator for position estimation using ranging readings.
*/
protected RobustRangingPositionEstimator<P> rangingEstimator;
/**
* Internal robust estimator for coarse position estimation using RSSI readings.
*/
protected RobustRssiPositionEstimator<P> rssiEstimator;
/**
* Robust method used for robust position estimation using ranging data.
*/
protected RobustEstimatorMethod rangingRobustMethod = DEFAULT_RANGING_ROBUST_METHOD;
/**
* Robust method used for coarse robust position estimation using RSSI data.
*/
protected RobustEstimatorMethod rssiRobustMethod = DEFAULT_RSSI_ROBUST_METHOD;
/**
* Size of subsets to be checked during robust estimation.
*/
protected int rangingPreliminarySubsetSize;
/**
* Size of subsets to be checked during RSSI robust estimation.
*/
protected int rssiPreliminarySubsetSize; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 323 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 323 |
final Point2D initialPosition, final RobustRangingRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, listener);
internalSetQualityScores(qualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Robustly estimates position for a radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@SuppressWarnings("DuplicatedCode")
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROMedSRobustEstimator<>(
new PROMedSRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 806 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 806 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 806 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 808 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROMedSRobustEstimator<>(
new PROMedSRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 172 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 172 |
final RobustRangingRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, listener);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on ranging distances.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on ranging distances.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this estimator is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position for a radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@SuppressWarnings("DuplicatedCode")
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new RANSACRobustEstimator<>(new RANSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 391 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 391 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 395 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 395 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this estimator is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new RANSACRobustEstimator<>(new RANSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/SequentialRobustMixedPositionEstimator.java | 1986 |
| com/irurueta/navigation/indoor/position/SequentialRobustRangingAndRssiPositionEstimator.java | 1878 |
final Fingerprint<? extends RadioSource, ? extends Reading<? extends RadioSource>> fingerprint) {
if (fingerprint == null) {
throw new IllegalArgumentException();
}
this.fingerprint = fingerprint;
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples for 2D or 4 samples for 3D.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null ||
sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than 3 samples for 2D or 4 samples for 3D.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null
|| fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
}
/**
* Creates a ranging reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return a ranging reading containing only the ranging data of input reading.
*/
private RangingReading<RadioSource> createRangingReading(
final RangingAndRssiReading<? extends RadioSource> reading) {
return new RangingReading<>(reading.getSource(), reading.getDistance(), reading.getDistanceStandardDeviation(),
reading.getNumAttemptedMeasurements(), reading.getNumSuccessfulMeasurements());
}
/**
* Creates an RSSI reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return an RSSI reading containing only the RSSI data of input reading.
*/
private RssiReading<RadioSource> createRssiReading(final RangingAndRssiReading<? extends RadioSource> reading) {
return new RssiReading<>(reading.getSource(), reading.getRssi(), reading.getRssiStandardDeviation());
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator2D.java | 357 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator2D.java | 365 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator2D.java | 357 |
final RobustMixedPositionEstimatorListener<Point2D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return ((PROSACRobustLateration2DSolver) laterationSolver).getThreshold();
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
((PROSACRobustLateration2DSolver) laterationSolver).setThreshold(threshold);
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return ((PROSACRobustLateration2DSolver) laterationSolver).isComputeAndKeepInliersEnabled();
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
((PROSACRobustLateration2DSolver) laterationSolver).setComputeAndKeepInliersEnabled(computeAndKeepInliers);
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResiduals() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator3D.java | 365 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator3D.java | 357 |
final RobustRangingPositionEstimatorListener<Point3D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return ((PROSACRobustLateration3DSolver) laterationSolver).getThreshold();
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
((PROSACRobustLateration3DSolver) laterationSolver).setThreshold(threshold);
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return ((PROSACRobustLateration3DSolver) laterationSolver).isComputeAndKeepInliersEnabled();
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
((PROSACRobustLateration3DSolver) laterationSolver).setComputeAndKeepInliersEnabled(computeAndKeepInliers);
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1017 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1017 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1011 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1010 |
PROSACRobustRangingAndRssiRadioSourceEstimator2D.this, progress);
}
}
});
try {
locked = true;
if (listener != null) {
listener.onEstimateStart(this);
}
inliersData = null;
innerEstimator.setComputeAndKeepInliersEnabled(computeAndKeepInliers || refineResult);
innerEstimator.setComputeAndKeepResidualsEnabled(computeAndKeepResiduals || refineResult);
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROSAC;
}
/**
* Sets quality scores corresponding to each provided sample.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param qualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than required minimum.
*/
private void internalSetQualityScores(final double[] qualityScores) {
if (qualityScores == null || qualityScores.length < getMinReadings()) {
throw new IllegalArgumentException();
}
this.qualityScores = qualityScores;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/LinearMixedPositionEstimator2D.java | 151 |
| com/irurueta/navigation/indoor/position/LinearRangingAndRssiPositionEstimator2D.java | 151 |
| com/irurueta/navigation/indoor/position/LinearRangingPositionEstimator2D.java | 151 |
| com/irurueta/navigation/indoor/position/LinearRssiPositionEstimator2D.java | 151 |
final MixedPositionEstimatorListener<Point2D> listener) {
super(listener);
initialize();
internalSetSources(sources);
internalSetFingerprint(fingerprint);
}
/**
* Gets estimated position.
*
* @return estimated position.
*/
@Override
public Point2D getEstimatedPosition() {
if (estimatedPositionCoordinates == null) {
return null;
}
final var result = new InhomogeneousPoint2D();
getEstimatedPosition(result);
return result;
}
/**
* Sets positions and distances on internal lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @throws IllegalArgumentException if something fails.
*/
@Override
@SuppressWarnings("Duplicates")
protected void setPositionsAndDistances(
final List<Point2D> positions, final List<Double> distances) {
final var size = positions.size();
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
}
try {
homogeneousTrilaterationSolver.setPositionsAndDistances(positionsArray, distancesArray);
inhomogeneousTrilaterationSolver.setPositionsAndDistances(positionsArray, distancesArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
homogeneousTrilaterationSolver = new HomogeneousLinearLeastSquaresLateration2DSolver(laterationSolverListener);
inhomogeneousTrilaterationSolver = new InhomogeneousLinearLeastSquaresLateration2DSolver(
laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/LinearMixedPositionEstimator3D.java | 151 |
| com/irurueta/navigation/indoor/position/LinearRangingAndRssiPositionEstimator3D.java | 151 |
| com/irurueta/navigation/indoor/position/LinearRangingPositionEstimator3D.java | 151 |
| com/irurueta/navigation/indoor/position/LinearRssiPositionEstimator3D.java | 151 |
final MixedPositionEstimatorListener<Point3D> listener) {
super(listener);
initialize();
internalSetSources(sources);
internalSetFingerprint(fingerprint);
}
/**
* Gets estimated position.
*
* @return estimated position.
*/
@Override
public Point3D getEstimatedPosition() {
if (estimatedPositionCoordinates == null) {
return null;
}
final var result = new InhomogeneousPoint3D();
getEstimatedPosition(result);
return result;
}
/**
* Sets positions and distances on internal lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @throws IllegalArgumentException if something fails.
*/
@Override
@SuppressWarnings("Duplicates")
protected void setPositionsAndDistances(
final List<Point3D> positions, final List<Double> distances) {
final var size = positions.size();
Point3D[] positionsArray = new InhomogeneousPoint3D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
}
try {
homogeneousTrilaterationSolver.setPositionsAndDistances(positionsArray, distancesArray);
inhomogeneousTrilaterationSolver.setPositionsAndDistances(positionsArray, distancesArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
homogeneousTrilaterationSolver = new HomogeneousLinearLeastSquaresLateration3DSolver(laterationSolverListener);
inhomogeneousTrilaterationSolver = new InhomogeneousLinearLeastSquaresLateration3DSolver(
laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RobustRangingAndRssiPositionEstimator3D.java | 836 |
| com/irurueta/navigation/indoor/position/RobustRangingPositionEstimator3D.java | 830 |
| com/irurueta/navigation/indoor/position/RobustRssiPositionEstimator3D.java | 814 |
protected void setPositionsDistancesDistanceStandardDeviationsAndQualityScores(
final List<Point3D> positions, List<Double> distances, final List<Double> distanceStandardDeviations,
final List<Double> distanceQualityScores) {
final var size = positions.size();
Point3D[] positionsArray = new InhomogeneousPoint3D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
double[] qualityScoresArray = null;
if (distanceQualityScores != null) {
qualityScoresArray = new double[size];
}
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
if (qualityScoresArray != null) {
qualityScoresArray[i] = distanceQualityScores.get(i);
}
}
try {
laterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
if (qualityScoresArray != null) {
laterationSolver.setQualityScores(qualityScoresArray);
}
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator.java | 1096 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 2344 |
private RangingReadingLocated<S, P> createRangingReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RangingReadingLocated<>(reading.getSource(), reading.getDistance(), reading.getPosition(),
reading.getDistanceStandardDeviation(), reading.getPositionCovariance());
}
/**
* Creates an RSSI reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return an RSSI reading containing only the RSSI data of input reading.
*/
private RssiReadingLocated<S, P> createRssiReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RssiReadingLocated<>(reading.getSource(), reading.getRssi(), reading.getPosition(),
reading.getRssiStandardDeviation(), reading.getPositionCovariance());
}
/**
* Checks number of available ranging readings and number of available RSSI readings. Also determines
* whether position must be estimated using ranging data or RSSI data.
*
* @param readings readings to be checked.
*/
private void checkReadings(final List<? extends ReadingLocated<P>> readings) {
numRangingReadings = numRssiReadings = 0;
if (readings == null) {
return;
}
for (final var reading : readings) {
if (reading instanceof RangingReadingLocated) {
numRangingReadings++;
} else if (reading instanceof RssiReadingLocated) {
numRssiReadings++;
} else if (reading instanceof RangingAndRssiReadingLocated) {
numRangingReadings++;
numRssiReadings++;
}
}
rssiPositionEnabled = numRangingReadings < getMinRangingReadings();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 2427 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 2350 |
innerEstimator.setUseReadingPositionCovariances(useReadingPositionCovariances);
innerEstimator.estimate();
final var estimatedPosition = innerEstimator.getEstimatedPosition();
final var estimatedTransmittedPowerdBm = innerEstimator.getEstimatedTransmittedPowerdBm();
final var estimatedPathLossExponent = innerEstimator.getEstimatedPathLossExponent();
solutions.add(new Solution<>(estimatedPosition, estimatedTransmittedPowerdBm, estimatedPathLossExponent));
} catch (final NavigationException ignore) {
// if anything fails, no solution is added
}
}
/**
* Attempts to refine estimated position and transmitted power contained in
* provided solution if refinement is requested.
* This method sets a refined result and transmitted power or provided input
* result if refinement is not requested or has failed.
* If refinement is enabled, and it is requested to keep covariance, this method
* will also keep covariance of refined result.
* solution if not requested or refinement failed.
*
* @param result result to be refined.
*/
protected void attemptRefine(final Solution<Point2D> result) {
final var initialPosition = result.getEstimatedPosition();
final var initialTransmittedPowerdBm = result.getEstimatedTransmittedPowerdBm();
final var initialPathLossExponent = result.getEstimatedPathLossExponent();
if (refineResult && inliersData != null) {
final var inliers = inliersData.getInliers();
final var nSamples = readings.size();
innerReadings.clear();
for (var i = 0; i < nSamples; i++) {
if (inliers.get(i)) {
// sample is inlier
innerReadings.add(readings.get(i));
}
}
try {
innerEstimator.setInitialPosition(initialPosition);
innerEstimator.setInitialTransmittedPowerdBm(initialTransmittedPowerdBm);
innerEstimator.setInitialPathLossExponent(initialPathLossExponent);
innerEstimator.setTransmittedPowerEstimationEnabled(transmittedPowerEstimationEnabled);
innerEstimator.setPathLossEstimationEnabled(pathLossEstimationEnabled); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 2429 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2348 |
innerEstimator.setUseReadingPositionCovariances(useReadingPositionCovariances);
innerEstimator.estimate();
final var estimatedPosition = innerEstimator.getEstimatedPosition();
final var estimatedTransmittedPowerdBm = innerEstimator.getEstimatedTransmittedPowerdBm();
final var estimatedPathLossExponent = innerEstimator.getEstimatedPathLossExponent();
solutions.add(new Solution<>(estimatedPosition, estimatedTransmittedPowerdBm, estimatedPathLossExponent));
} catch (final NavigationException ignore) {
// if anything fails, no solution is added
}
}
/**
* Attempts to refine estimated position and transmitted power contained in
* provided solution if refinement is requested.
* This method sets a refined result and transmitted power or provided input
* result if refinement is not requested or has failed.
* If refinement is enabled, and it is requested to keep covariance, this method
* will also keep covariance of refined result.
* solution if not requested or refinement failed.
*
* @param result result to be refined.
*/
protected void attemptRefine(final Solution<Point3D> result) {
final var initialPosition = result.getEstimatedPosition();
final var initialTransmittedPowerdBm = result.getEstimatedTransmittedPowerdBm();
final var initialPathLossExponent = result.getEstimatedPathLossExponent();
if (refineResult && inliersData != null) {
final var inliers = inliersData.getInliers();
final var nSamples = readings.size();
innerReadings.clear();
for (var i = 0; i < nSamples; i++) {
if (inliers.get(i)) {
// sample is inlier
innerReadings.add(readings.get(i));
}
}
try {
innerEstimator.setInitialPosition(initialPosition);
innerEstimator.setInitialTransmittedPowerdBm(initialTransmittedPowerdBm);
innerEstimator.setInitialPathLossExponent(initialPathLossExponent);
innerEstimator.setTransmittedPowerEstimationEnabled(transmittedPowerEstimationEnabled);
innerEstimator.setPathLossEstimationEnabled(pathLossEstimationEnabled); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 993 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 993 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 510 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 510 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 993 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 995 |
PROMedSRobustRangingAndRssiRadioSourceEstimator2D.this, progress);
}
}
});
try {
locked = true;
if (listener != null) {
listener.onEstimateStart(this);
}
inliersData = null;
// inlier thresholds are disabled to obtain a less restrictive amount of inliers
innerEstimator.setUseInlierThresholds(false);
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS;
}
/**
* Sets quality scores corresponding to each provided sample.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param qualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetQualityScores(final double[] qualityScores) {
if (qualityScores == null || qualityScores.length < getMinReadings()) {
throw new IllegalArgumentException();
}
this.qualityScores = qualityScores;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearMixedPositionEstimator2D.java | 295 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator2D.java | 295 |
public Point2D getEstimatedPosition() {
if (estimatedPositionCoordinates == null) {
return null;
}
final var result = new InhomogeneousPoint2D();
getEstimatedPosition(result);
return result;
}
/**
* Sets positions, distances and standard deviations of distances on internal
* lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @param distanceStandardDeviations standard deviations of distances to be set.
*/
@Override
@SuppressWarnings("Duplicates")
protected void setPositionsDistancesAndDistanceStandardDeviations(
final List<Point2D> positions, final List<Double> distances,
final List<Double> distanceStandardDeviations) {
final var size = positions.size();
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
try {
trilaterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
trilaterationSolver = new NonLinearLeastSquaresLateration2DSolver(laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearRangingAndRssiPositionEstimator2D.java | 304 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator2D.java | 295 |
public Point2D getEstimatedPosition() {
if (estimatedPositionCoordinates == null) {
return null;
}
final var result = new InhomogeneousPoint2D();
getEstimatedPosition(result);
return result;
}
/**
* Sets positions, distances and standard deviations of distances on internal
* lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @param distanceStandardDeviations standard deviations of distances to be set.
*/
@Override
@SuppressWarnings("Duplicates")
protected void setPositionsDistancesAndDistanceStandardDeviations(
final List<Point2D> positions, final List<Double> distances,
final List<Double> distanceStandardDeviations) {
final var size = positions.size();
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
try {
trilaterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
trilaterationSolver = new NonLinearLeastSquaresLateration2DSolver(laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearRangingAndRssiPositionEstimator3D.java | 306 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator3D.java | 295 |
public Point3D getEstimatedPosition() {
if (estimatedPositionCoordinates == null) {
return null;
}
final var result = new InhomogeneousPoint3D();
getEstimatedPosition(result);
return result;
}
/**
* Sets positions, distances and standard deviations of distances on internal
* lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @param distanceStandardDeviations standard deviations of distances to be set.
*/
@Override
@SuppressWarnings("Duplicates")
protected void setPositionsDistancesAndDistanceStandardDeviations(
final List<Point3D> positions, final List<Double> distances,
final List<Double> distanceStandardDeviations) {
final var size = positions.size();
Point3D[] positionsArray = new InhomogeneousPoint3D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
try {
trilaterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
trilaterationSolver = new NonLinearLeastSquaresLateration3DSolver(laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator2D.java | 294 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator2D.java | 295 |
public Point2D getEstimatedPosition() {
if (estimatedPositionCoordinates == null) {
return null;
}
final var result = new InhomogeneousPoint2D();
getEstimatedPosition(result);
return result;
}
/**
* Sets positions, distances and standard deviations of distances on internal
* lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @param distanceStandardDeviations standard deviations of distances to be set.
*/
@Override
@SuppressWarnings("Duplicates")
protected void setPositionsDistancesAndDistanceStandardDeviations(
final List<Point2D> positions, final List<Double> distances,
final List<Double> distanceStandardDeviations) {
final var size = positions.size();
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
try {
trilaterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
trilaterationSolver = new NonLinearLeastSquaresLateration2DSolver(laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator3D.java | 294 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator3D.java | 295 |
public Point3D getEstimatedPosition() {
if (estimatedPositionCoordinates == null) {
return null;
}
final var result = new InhomogeneousPoint3D();
getEstimatedPosition(result);
return result;
}
/**
* Sets positions, distances and standard deviations of distances on internal
* lateration solver.
*
* @param positions positions to be set.
* @param distances distances to be set.
* @param distanceStandardDeviations standard deviations of distances to be set.
*/
@Override
@SuppressWarnings("Duplicates")
protected void setPositionsDistancesAndDistanceStandardDeviations(
final List<Point3D> positions, final List<Double> distances,
final List<Double> distanceStandardDeviations) {
final var size = positions.size();
Point3D[] positionsArray = new InhomogeneousPoint3D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
try {
trilaterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
trilaterationSolver = new NonLinearLeastSquaresLateration3DSolver(laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RobustMixedPositionEstimator3D.java | 816 |
| com/irurueta/navigation/indoor/position/RobustRangingAndRssiPositionEstimator3D.java | 837 |
| com/irurueta/navigation/indoor/position/RobustRangingPositionEstimator3D.java | 831 |
| com/irurueta/navigation/indoor/position/RobustRssiPositionEstimator3D.java | 815 |
final List<Point3D> positions, final List<Double> distances, final List<Double> distanceStandardDeviations,
final List<Double> distanceQualityScores) {
final var size = positions.size();
Point3D[] positionsArray = new InhomogeneousPoint3D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
double[] qualityScoresArray = null;
if (distanceQualityScores != null) {
qualityScoresArray = new double[size];
}
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
if (qualityScoresArray != null) {
qualityScoresArray[i] = distanceQualityScores.get(i);
}
}
try {
laterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
if (qualityScoresArray != null) {
laterationSolver.setQualityScores(qualityScoresArray);
}
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 921 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 438 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROMedSRobustEstimator<>(
new PROMedSRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double[] getQualityScores() {
return qualityScores;
}
@Override
public double getThreshold() {
return stopThreshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return PROMedSRobustRangingAndRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 921 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 438 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 923 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROMedSRobustEstimator<>(
new PROMedSRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double[] getQualityScores() {
return qualityScores;
}
@Override
public double getThreshold() {
return stopThreshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return PROMedSRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 946 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 456 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 940 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double[] getQualityScores() {
return qualityScores;
}
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return PROSACRobustRangingAndRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 946 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 456 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 939 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double[] getQualityScores() {
return qualityScores;
}
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return PROSACRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingRadioSourceEstimator2D.java | 644 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingRadioSourceEstimator3D.java | 644 |
protected void attemptRefine(final Solution<Point2D> result) {
final var initialPosition = result.getEstimatedPosition();
if (refineResult && inliersData != null) {
final var inliers = inliersData.getInliers();
final var nSamples = readings.size();
innerReadings.clear();
for (var i = 0; i < nSamples; i++) {
if (inliers.get(i)) {
// sample is inlier
innerReadings.add(readings.get(i));
}
}
try {
innerEstimator.setInitialPosition(initialPosition);
innerEstimator.setReadings(innerReadings);
innerEstimator.setNonLinearSolverEnabled(true);
innerEstimator.setUseReadingPositionCovariances(useReadingPositionCovariances);
innerEstimator.estimate();
final var cov = innerEstimator.getEstimatedCovariance();
if (keepCovariance && cov != null) {
// keep covariance
estimatedPositionCovariance = covariance = cov;
} else {
covariance = null;
estimatedPositionCovariance = null;
}
estimatedPosition = innerEstimator.getEstimatedPosition();
} catch (final Exception e) {
// refinement failed, so we return input value, and covariance
// becomes unavailable
covariance = null;
estimatedPositionCovariance = null;
estimatedPosition = initialPosition;
}
} else {
covariance = null;
estimatedPositionCovariance = null;
estimatedPosition = initialPosition;
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/LinearMixedPositionEstimator.java | 84 |
| com/irurueta/navigation/indoor/position/LinearRangingAndRssiPositionEstimator.java | 85 |
| com/irurueta/navigation/indoor/position/LinearRangingPositionEstimator.java | 85 |
| com/irurueta/navigation/indoor/position/LinearRssiPositionEstimator.java | 84 |
protected LinearMixedPositionEstimator(final MixedPositionEstimatorListener<P> listener) {
super(listener);
init();
}
/**
* Indicates whether an homogeneous linear solver is used to estimate position.
*
* @return true if homogeneous linear solver is used, false if an inhomogeneous
* linear one is used instead.
*/
public boolean isHomogeneousLinearSolverUsed() {
return useHomogeneousLinearSolver;
}
/**
* Specifies whether an homogeneous linear solver is used to estimate position.
*
* @param useHomogeneousLinearSolver true if homogeneous linear solver is used, false
* if an inhomogeneous linear one is used instead.
* @throws LockedException if estimator is locked.
*/
public void setHomogeneousLinearSolverUsed(final boolean useHomogeneousLinearSolver) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.useHomogeneousLinearSolver = useHomogeneousLinearSolver;
}
/**
* Gets minimum required number of located radio sources to perform lateration.
*
* @return minimum required number of located radio sources to perform lateration.
*/
@Override
public int getMinRequiredSources() {
return useHomogeneousLinearSolver
? homogeneousTrilaterationSolver.getMinRequiredPositionsAndDistances()
: inhomogeneousTrilaterationSolver.getMinRequiredPositionsAndDistances();
}
/**
* Indicates whether estimator is ready to find a solution.
*
* @return true if estimator is ready, false otherwise.
*/
@Override
public boolean isReady() {
return (!useHomogeneousLinearSolver && inhomogeneousTrilaterationSolver.isReady())
|| (useHomogeneousLinearSolver && homogeneousTrilaterationSolver.isReady());
}
/**
* Returns boolean indicating whether this estimator is locked because an estimation is already in progress.
*
* @return true if estimator is locked, false otherwise.
*/
@Override
public boolean isLocked() {
return inhomogeneousTrilaterationSolver.isLocked() || homogeneousTrilaterationSolver.isLocked();
}
/**
* Estimates position based on provided located radio sources and RSSI readings of
* such radio sources at an unknown location.
*
* @throws LockedException if estimator is locked.
* @throws NotReadyException if estimator is not ready.
* @throws PositionEstimationException if estimation fails for some other reason.
*/
@SuppressWarnings("Duplicates")
@Override
public void estimate() throws LockedException, NotReadyException, PositionEstimationException {
try {
if (useHomogeneousLinearSolver) {
homogeneousTrilaterationSolver.solve();
estimatedPositionCoordinates = homogeneousTrilaterationSolver.getEstimatedPositionCoordinates();
} else {
inhomogeneousTrilaterationSolver.solve();
estimatedPositionCoordinates = inhomogeneousTrilaterationSolver.getEstimatedPositionCoordinates();
}
} catch (LaterationException e) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator2D.java | 358 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator2D.java | 826 |
public RadioSourceLocated<Point2D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final S source;
final var reading = readings.get(0);
if (reading instanceof RangingReadingLocated) {
source = ((RangingReadingLocated<S, Point2D>) reading).getSource();
} else if (reading instanceof RssiReadingLocated) {
source = ((RssiReadingLocated<S, Point2D>) reading).getSource();
} else if (reading instanceof RangingAndRssiReadingLocated) {
source = ((RangingAndRssiReadingLocated<S, Point2D>) reading).getSource();
} else {
return null;
}
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerdBm = getEstimatedTransmittedPowerdBm();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathLossExponent = getEstimatedPathLossExponent(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator3D.java | 357 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator3D.java | 825 |
public RadioSourceLocated<Point3D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final S source;
final var reading = readings.get(0);
if (reading instanceof RangingReadingLocated) {
source = ((RangingReadingLocated<S, Point3D>) reading).getSource();
} else if (reading instanceof RssiReadingLocated) {
source = ((RssiReadingLocated<S, Point3D>) reading).getSource();
} else if (reading instanceof RangingAndRssiReadingLocated) {
source = ((RangingAndRssiReadingLocated<S, Point3D>) reading).getSource();
} else {
return null;
}
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerdBm = getEstimatedTransmittedPowerdBm();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathLossExponent = getEstimatedPathLossExponent(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PositionEstimator.java | 74 |
| com/irurueta/navigation/indoor/position/RobustPositionEstimator.java | 137 |
protected PositionEstimator(final L listener) {
this.listener = listener;
}
/**
* Gets located radio sources used for lateration.
*
* @return located radio sources used for lateration.
*/
public List<RadioSourceLocated<P>> getSources() {
//noinspection unchecked
return (List<RadioSourceLocated<P>>) sources;
}
/**
* Sets located radio sources used for lateration.
*
* @param sources located radio sources used for lateration.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is null or the number of provided
* sources is less than the required minimum.
*/
public void setSources(final List<? extends RadioSourceLocated<P>> sources) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSources(sources);
}
/**
* Gets fingerprint containing readings at an unknown location for provided located
* radio sources.
*
* @return fingerprint containing readings at an unknown location for provided
* located radio sources.
*/
public Fingerprint<RadioSource, Reading<RadioSource>> getFingerprint() {
//noinspection unchecked
return (Fingerprint<RadioSource, Reading<RadioSource>>) fingerprint;
}
/**
* Sets fingerprint containing readings at an unknown location for provided located
* radio sources.
*
* @param fingerprint fingerprint containing readings at an unknown location for
* provided located radio sources.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is null.
*/
public void setFingerprint(final Fingerprint<? extends RadioSource, ? extends R> fingerprint)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprint(fingerprint);
}
/**
* Gets listener to be notified of events raised by this instance.
*
* @return listener to be notified of events raised by this instance.
*/
public L getListener() {
return listener;
}
/**
* Sets listener to be notified of events raised by this instance.
*
* @param listener listener to be notified of events raised by this instance.
* @throws LockedException if estimator is locked.
*/
public void setListener(final L listener) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.listener = listener;
}
/**
* Gets estimated inhomogeneous position coordinates.
*
* @return estimated inhomogeneous position coordinates.
*/
public double[] getEstimatedPositionCoordinates() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RangingRadioSourceEstimator2D.java | 185 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingRadioSourceEstimator2D.java | 542 |
public RadioSourceLocated<Point2D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointLocated2D(accessPoint.getBssid(), accessPoint.getFrequency(),
accessPoint.getSsid(), estimatedPosition, estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconLocated2D(beacon.getIdentifiers(), beacon.getTransmittedPower(), beacon.getFrequency(),
beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(), beacon.getManufacturer(),
beacon.getServiceUuid(), beacon.getBluetoothName(), estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Builds an instance of a linear lateration solver if needed.
*/
@Override | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RangingRadioSourceEstimator3D.java | 185 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingRadioSourceEstimator3D.java | 542 |
public RadioSourceLocated<Point3D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointLocated3D(accessPoint.getBssid(), accessPoint.getFrequency(),
accessPoint.getSsid(), estimatedPosition, estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconLocated3D(beacon.getIdentifiers(), beacon.getTransmittedPower(), beacon.getFrequency(),
beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(), beacon.getManufacturer(),
beacon.getServiceUuid(), beacon.getBluetoothName(), estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Builds an instance of a linear lateration solver if needed.
*/
@Override | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/fingerprint/FirstOrderNonLinearFingerprintPositionEstimator3D.java | 161 |
| com/irurueta/navigation/indoor/fingerprint/SecondOrderNonLinearFingerprintPositionEstimator3D.java | 160 |
| com/irurueta/navigation/indoor/fingerprint/ThirdOrderNonLinearFingerprintPositionEstimator3D.java | 157 |
}
/**
* Evaluates a non-linear multi dimension function at provided point using
* provided parameters and returns its evaluation and derivatives of the
* function respect the function parameters.
*
* @param i number of sample being evaluated.
* @param point point where function will be evaluated.
* @param params initial parameters estimation to be tried. These will
* change as the Levenberg-Marquardt algorithm iterates to the best solution.
* These are used as input parameters along with point to evaluate function.
* @param derivatives partial derivatives of the function respect to each
* provided parameter.
* @return function evaluation at provided point.
*/
@Override
@SuppressWarnings("Duplicates")
protected double evaluate(final int i, final double[] point, final double[] params, final double[] derivatives) {
// This method implements received power at point pi = (xi, yi, zi) and its derivatives
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// - 10*n*(z1 - za)/(ln(10)*d1a^2)*(zi - z1)
final var xi = params[0];
final var yi = params[1];
final var zi = params[2];
// received power
final var pr = point[0];
// fingerprint coordinates
final var x1 = point[1];
final var y1 = point[2];
final var z1 = point[3];
//radio source coordinates
final var xa = point[4];
final var ya = point[5];
final var za = point[6];
// path loss exponent
final var n = point[7];
final var ln10 = Math.log(10.0);
final var diffXi1 = xi - x1;
final var diffYi1 = yi - y1;
final var diffZi1 = zi - z1;
final var diffX1a = x1 - xa;
final var diffY1a = y1 - ya;
final var diffZ1a = z1 - za;
final var diffX1a2 = diffX1a * diffX1a; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 2313 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 2195 |
private void internalSetReadings(final List<? extends ReadingLocated<P>> readings) {
if (!areValidReadings(readings)) {
throw new IllegalArgumentException();
}
this.readings = readings;
}
/**
* Sets quality scores corresponding to each provided sample.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param qualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than required minimum.
*/
private void internalSetQualityScores(final double[] qualityScores) {
if (qualityScores == null || qualityScores.length < getMinReadings()) {
throw new IllegalArgumentException();
}
this.qualityScores = qualityScores;
}
/**
* Creates a ranging reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return a ranging reading containing only the ranging data of input reading.
*/
private RangingReadingLocated<S, P> createRangingReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RangingReadingLocated<>(reading.getSource(), reading.getDistance(), reading.getPosition(),
reading.getDistanceStandardDeviation(), reading.getPositionCovariance());
}
/**
* Creates an RSSI reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return an RSSI reading containing only the RSSI data of input reading.
*/
private RssiReadingLocated<S, P> createRssiReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RssiReadingLocated<>(reading.getSource(), reading.getRssi(), reading.getPosition(),
reading.getRssiStandardDeviation(), reading.getPositionCovariance());
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RANSACRobustMixedPositionEstimator2D.java | 146 |
| com/irurueta/navigation/indoor/position/RANSACRobustRangingAndRssiPositionEstimator2D.java | 151 |
| com/irurueta/navigation/indoor/position/RANSACRobustRangingPositionEstimator2D.java | 150 |
| com/irurueta/navigation/indoor/position/RANSACRobustRssiPositionEstimator2D.java | 146 |
final RobustMixedPositionEstimatorListener<Point2D> listener) {
super(listener);
init();
internalSetSources(sources);
internalSetFingerprint(fingerprint);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing
* possible solutions.
* The threshold refers to the amount of error on distance between estimated
* position and distances provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return ((RANSACRobustLateration2DSolver) laterationSolver).getThreshold();
}
/**
* Sets threshold to determine whether samples are inliers or not when testing
* possible solutions.
* The threshold refers to the amount of error on distance between estimated position
* and distances provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this estimator is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
((RANSACRobustLateration2DSolver) laterationSolver).setThreshold(threshold);
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return ((RANSACRobustLateration2DSolver) laterationSolver).isComputeAndKeepInliersEnabled();
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not
* kept.
* @throws LockedException if this estimator is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
((RANSACRobustLateration2DSolver) laterationSolver).setComputeAndKeepInliersEnabled(computeAndKeepInliers);
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResiduals() {
return ((RANSACRobustLateration2DSolver) laterationSolver).isComputeAndKeepResiduals();
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this estimator is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
((RANSACRobustLateration2DSolver) laterationSolver).setComputeAndKeepResidualsEnabled(computeAndKeepResiduals);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.RANSAC;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new RANSACRobustLateration2DSolver(trilaterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RANSACRobustMixedPositionEstimator3D.java | 146 |
| com/irurueta/navigation/indoor/position/RANSACRobustRangingAndRssiPositionEstimator3D.java | 151 |
| com/irurueta/navigation/indoor/position/RANSACRobustRangingPositionEstimator3D.java | 150 |
| com/irurueta/navigation/indoor/position/RANSACRobustRssiPositionEstimator3D.java | 146 |
final RobustMixedPositionEstimatorListener<Point3D> listener) {
super(listener);
init();
internalSetSources(sources);
internalSetFingerprint(fingerprint);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing
* possible solutions.
* The threshold refers to the amount of error on distance between estimated
* position and distances provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return ((RANSACRobustLateration3DSolver) laterationSolver).getThreshold();
}
/**
* Sets threshold to determine whether samples are inliers or not when testing
* possible solutions.
* The threshold refers to the amount of error on distance between estimated position
* and distances provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this estimator is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
((RANSACRobustLateration3DSolver) laterationSolver).setThreshold(threshold);
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return ((RANSACRobustLateration3DSolver) laterationSolver).isComputeAndKeepInliersEnabled();
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not
* kept.
* @throws LockedException if this estimator is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
((RANSACRobustLateration3DSolver) laterationSolver).setComputeAndKeepInliersEnabled(computeAndKeepInliers);
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResiduals() {
return ((RANSACRobustLateration3DSolver) laterationSolver).isComputeAndKeepResiduals();
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this estimator is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
((RANSACRobustLateration3DSolver) laterationSolver).setComputeAndKeepResidualsEnabled(computeAndKeepResiduals);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.RANSAC;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new RANSACRobustLateration3DSolver(trilaterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 485 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 262 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 489 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new RANSACRobustEstimator<>(new RANSACRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return RANSACRobustRangingAndRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 485 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 262 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 488 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new RANSACRobustEstimator<>(new RANSACRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return RANSACRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/fingerprint/SecondOrderNonLinearFingerprintPositionEstimator3D.java | 234 |
| com/irurueta/navigation/indoor/fingerprint/ThirdOrderNonLinearFingerprintPositionEstimator3D.java | 444 |
final var value1 = -10.0 * n * diffX1a / (ln10 * d1a2);
final var value2 = -10.0 * n * diffY1a / (ln10 * d1a2);
final var value3 = -10.0 * n * diffZ1a / (ln10 * d1a2);
final var value4 = -5.0 * n * (-diffX1a2 + diffY1a2 + diffZ1a2) / (ln10 * d1a4);
final var value5 = -5.0 * n * (diffX1a2 - diffY1a2 + diffZ1a2) / (ln10 * d1a4);
final var value6 = -5.0 * n * (diffX1a2 + diffY1a2 - diffZ1a2) / (ln10 * d1a4);
final var value7 = 20.0 * n * diffX1a * diffY1a / (ln10 * d1a4);
final var value8 = 20.0 * n * diffY1a * diffZ1a / (ln10 * d1a4);
final var value9 = 20.0 * n * diffX1a * diffZ1a / (ln10 * d1a4);
final var result = pr | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 808 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 802 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 438 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 921 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROMedSRobustEstimator<>(
new PROMedSRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double[] getQualityScores() {
return qualityScores;
}
@Override
public double getThreshold() {
return stopThreshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 354 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator3D.java | 353 |
public PROMedSRobustRssiPositionEstimator3D(
final double[] sourceQualityScores, final double[] fingerprintReadingQualityScores,
final List<? extends RadioSourceLocated<Point3D>> sources,
final RssiFingerprint<? extends RadioSource, ? extends RssiReading<? extends RadioSource>> fingerprint,
final RobustRssiPositionEstimatorListener<Point3D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 808 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 802 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point3D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 802 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 801 |
final double initialPathLossExponent, final RobustRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(boolean computeAndKeepInliers) throws LockedException { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1017 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 550 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 550 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 327 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 327 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 554 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 551 |
PROSACRobustRangingAndRssiRadioSourceEstimator2D.this, progress);
}
}
});
try {
locked = true;
if (listener != null) {
listener.onEstimateStart(this);
}
inliersData = null;
innerEstimator.setComputeAndKeepInliersEnabled(computeAndKeepInliers || refineResult);
innerEstimator.setComputeAndKeepResidualsEnabled(computeAndKeepResiduals || refineResult);
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROSAC; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 2262 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 2142 |
}
rssiEstimator.setProgressDelta(2.0f * progressDelta);
rssiEstimator.setConfidence(rssiConfidence);
rssiEstimator.setMaxIterations(rssiMaxIterations);
rssiEstimator.setResultRefined(refineResult);
rssiEstimator.setCovarianceKept(keepCovariance);
// initial position is not set because position estimated from ranging measures
// will be later used
rssiEstimator.setInitialTransmittedPowerdBm(initialTransmittedPowerdBm);
rssiEstimator.setInitialPathLossExponent(initialPathLossExponent);
rssiEstimator.setTransmittedPowerEstimationEnabled(transmittedPowerEstimationEnabled);
rssiEstimator.setPathLossEstimationEnabled(pathLossEstimationEnabled);
rssiEstimator.setListener(new RobustRssiRadioSourceEstimatorListener<>() {
@Override
public void onEstimateStart(final RobustRssiRadioSourceEstimator<S, P> estimator) {
// not used
}
@Override
public void onEstimateEnd(final RobustRssiRadioSourceEstimator<S, P> estimator) {
// not used
}
@Override
public void onEstimateNextIteration(
final RobustRssiRadioSourceEstimator<S, P> estimator, final int iteration) {
// not used
}
@Override
public void onEstimateProgressChange(
final RobustRssiRadioSourceEstimator<S, P> estimator, final float progress) {
if (listener != null) {
listener.onEstimateProgressChange( | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator.java | 1042 |
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator.java | 966 |
public Double getEstimatedTransmittedPowerdBm() {
return estimatedTransmittedPowerdBm;
}
/**
* Gets estimated exponent typically used on free space for path loss propagation in
* terms of distance.
* On different environments path loss exponent might have different values:
* - Free space: 2.0
* - Urban Area: 2.7 to 3.5
* - Suburban Area: 3 to 5
* - Indoor (line-of-sight): 1.6 to 1.8
* If path loss exponent estimation is not enabled, this value will always be equal to
* {@link #DEFAULT_PATH_LOSS_EXPONENT}
*
* @return estimated path loss exponent.
*/
public double getEstimatedPathLossExponent() {
return estimatedPathLossExponent;
}
/**
* Gets estimated transmitted power variance.
* This value will only be available when transmitted power
* estimation is enabled.
*
* @return estimated transmitted power variance or null.
*/
public Double getEstimatedTransmittedPowerVariance() {
return estimatedTransmittedPowerVariance;
}
/**
* Gets estimated path loss exponent variance.
* This value will only be available when path-loss
* exponent estimation is enabled.
*
* @return estimated path loss exponent variance or null.
*/
public Double getEstimatedPathLossExponentVariance() {
return estimatedPathLossExponentVariance;
}
/**
* Creates inner estimators if needed.
*/
protected abstract void createInnerEstimatorsIfNeeded();
/**
* Creates a ranging reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return a ranging reading containing only the ranging data of input reading.
*/
private RangingReadingLocated<S, P> createRangingReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RangingReadingLocated<>(reading.getSource(), reading.getDistance(), reading.getPosition(),
reading.getDistanceStandardDeviation(), reading.getPositionCovariance());
}
/**
* Creates an RSSI reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return an RSSI reading containing only the RSSI data of input reading.
*/
private RssiReadingLocated<S, P> createRssiReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RssiReadingLocated<>(reading.getSource(), reading.getRssi(), reading.getPosition(),
reading.getRssiStandardDeviation(), reading.getPositionCovariance());
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 2185 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 2084 |
rssiPositionEnabled = rangingReadings.size() < rangingEstimator.getMinReadings();
}
rangingEstimator.setProgressDelta(2.0f * progressDelta);
rangingEstimator.setConfidence(rangingConfidence);
rangingEstimator.setMaxIterations(rangingMaxIterations);
rangingEstimator.setResultRefined(refineResult);
rangingEstimator.setCovarianceKept(keepCovariance);
rangingEstimator.setUseReadingPositionCovariances(useReadingPositionCovariances);
rangingEstimator.setHomogeneousLinearSolverUsed(useHomogeneousRangingLinearSolver);
rangingEstimator.setInitialPosition(initialPosition);
rangingEstimator.setListener(new RobustRangingRadioSourceEstimatorListener<>() {
@Override
public void onEstimateStart(final RobustRangingRadioSourceEstimator<S, P> estimator) {
// not used
}
@Override
public void onEstimateEnd(final RobustRangingRadioSourceEstimator<S, P> estimator) {
// not used
}
@Override
public void onEstimateNextIteration(
final RobustRangingRadioSourceEstimator<S, P> estimator, final int iteration) {
// not used
}
@Override
public void onEstimateProgressChange(
final RobustRangingRadioSourceEstimator<S, P> estimator, final float progress) {
if (listener != null) {
listener.onEstimateProgressChange( | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator2D.java | 477 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator2D.java | 485 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator2D.java | 477 |
public boolean isComputeAndKeepResiduals() {
return ((PROSACRobustLateration2DSolver) laterationSolver).isComputeAndKeepResiduals();
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
((PROSACRobustLateration2DSolver) laterationSolver).setComputeAndKeepResidualsEnabled(computeAndKeepResiduals);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROSAC;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROSACRobustLateration2DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null || fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator3D.java | 477 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator3D.java | 485 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator3D.java | 477 |
public boolean isComputeAndKeepResiduals() {
return ((PROSACRobustLateration3DSolver) laterationSolver).isComputeAndKeepResiduals();
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
((PROSACRobustLateration3DSolver) laterationSolver).setComputeAndKeepResidualsEnabled(computeAndKeepResiduals);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROSAC;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROSACRobustLateration3DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null
|| fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustRangingAndRssiPositionEstimator2D.java | 487 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator2D.java | 485 |
public boolean isComputeAndKeepResiduals() {
return ((PROSACRobustLateration2DSolver) laterationSolver).isComputeAndKeepResiduals();
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
((PROSACRobustLateration2DSolver) laterationSolver).setComputeAndKeepResidualsEnabled(computeAndKeepResiduals);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROSAC;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROSACRobustLateration2DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null
|| fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustRangingAndRssiPositionEstimator3D.java | 487 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator3D.java | 485 |
public boolean isComputeAndKeepResiduals() {
return ((PROSACRobustLateration3DSolver) laterationSolver).isComputeAndKeepResiduals();
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
((PROSACRobustLateration3DSolver) laterationSolver).setComputeAndKeepResidualsEnabled(computeAndKeepResiduals);
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROSAC;
}
/**
* Initializes robust lateration solver.
*/
private void init() {
laterationSolver = new PROSACRobustLateration3DSolver(trilaterationSolverListener);
}
/**
* Sets quality scores corresponding to each provided located radio source.
* This method is used internally and does not check whether instance is
* locked or not.
*
* @param sourceQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than 3 samples.
*/
private void internalSetSourceQualityScores(final double[] sourceQualityScores) {
if (sourceQualityScores == null || sourceQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.sourceQualityScores = sourceQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
/**
* Sets quality scores corresponding to each provided reading within provided
* fingerprint.
* This method is used internally and does not check whether instance is locked
* or not.
*
* @param fingerprintReadingsQualityScores quality scores to be set.
* @throws IllegalArgumentException if provided quality scores length is
* smaller than 3 samples.
*/
private void internalSetFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores) {
if (fingerprintReadingsQualityScores == null
|| fingerprintReadingsQualityScores.length < getMinRequiredSources()) {
throw new IllegalArgumentException();
}
this.fingerprintReadingsQualityScores = fingerprintReadingsQualityScores;
buildPositionsDistancesDistanceStandardDeviationsAndQualityScores();
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RobustMixedPositionEstimator3D.java | 819 |
| com/irurueta/navigation/indoor/position/RobustRangingAndRssiPositionEstimator2D.java | 842 |
| com/irurueta/navigation/indoor/position/RobustRangingPositionEstimator2D.java | 838 |
| com/irurueta/navigation/indoor/position/RobustRssiPositionEstimator2D.java | 819 |
Point3D[] positionsArray = new InhomogeneousPoint3D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
double[] qualityScoresArray = null;
if (distanceQualityScores != null) {
qualityScoresArray = new double[size];
}
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
if (qualityScoresArray != null) {
qualityScoresArray[i] = distanceQualityScores.get(i);
}
}
try {
laterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
if (qualityScoresArray != null) {
laterationSolver.setQualityScores(qualityScoresArray);
}
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RobustRangingAndRssiPositionEstimator2D.java | 842 |
| com/irurueta/navigation/indoor/position/RobustRangingAndRssiPositionEstimator3D.java | 840 |
| com/irurueta/navigation/indoor/position/RobustRangingPositionEstimator3D.java | 834 |
| com/irurueta/navigation/indoor/position/RobustRssiPositionEstimator3D.java | 818 |
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
double[] qualityScoresArray = null;
if (distanceQualityScores != null) {
qualityScoresArray = new double[size];
}
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
if (qualityScoresArray != null) {
qualityScoresArray[i] = distanceQualityScores.get(i);
}
}
try {
laterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
if (qualityScoresArray != null) {
laterationSolver.setQualityScores(qualityScoresArray);
}
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 319 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 803 |
super(readings, initialPosition, listener);
internalSetQualityScores(qualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this solver is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/fingerprint/LinearFingerprintPositionEstimator.java | 110 |
| com/irurueta/navigation/indoor/fingerprint/NonLinearFingerprintPositionAndRadioSourceEstimator.java | 594 |
| com/irurueta/navigation/indoor/fingerprint/NonLinearFingerprintPositionEstimator.java | 465 |
}
/**
* Estimates position based on provided located radio sources and readings of such radio sources at
* an unknown location.
*
* @throws LockedException if estimator is locked.
* @throws NotReadyException if estimator is not ready.
* @throws FingerprintEstimationException if estimation fails for some other reason.
*/
@Override
@SuppressWarnings("Duplicates")
public void estimate() throws LockedException, NotReadyException, FingerprintEstimationException {
if (!isReady()) {
throw new NotReadyException();
}
if (isLocked()) {
throw new LockedException();
}
try {
locked = true;
if (listener != null) {
listener.onEstimateStart(this);
}
RadioSourceNoMeanKNearestFinder<P, RadioSource> noMeanFinder = null;
RadioSourceKNearestFinder<P, RadioSource> finder = null;
if (useNoMeanNearestFingerprintFinder) {
//noinspection unchecked
noMeanFinder = new RadioSourceNoMeanKNearestFinder<>(
(Collection<RssiFingerprintLocated<RadioSource,
RssiReading<RadioSource>, P>>) locatedFingerprints);
} else {
//noinspection unchecked
finder = new RadioSourceKNearestFinder<>(
(Collection<RssiFingerprintLocated<RadioSource,
RssiReading<RadioSource>, P>>) locatedFingerprints);
}
estimatedPositionCoordinates = null; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator3D.java | 409 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator3D.java | 826 |
}
/**
* Gets estimated located radio source with estimated transmitted power.
*
* @return estimated located radio source with estimated transmitted power or null.
*/
@Override
@SuppressWarnings({"unchecked", "DuplicatedCode"})
public RadioSourceWithPowerAndLocated<Point3D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated3D(accessPoint.getBssid(), accessPoint.getFrequency(), | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 71 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 70 |
public abstract class SequentialRobustMixedRadioSourceEstimator<S extends RadioSource, P extends Point<P>> {
/**
* Default robust estimator method for robust position estimation using ranging
* data when no robust method is provided.
*/
public static final RobustEstimatorMethod DEFAULT_PANGING_ROBUST_METHOD = RobustEstimatorMethod.PROMEDS;
/**
* Default robust estimator method for path-loss exponent and transmitted power
* estimation using RSSI data when no robust method is provided.
*/
public static final RobustEstimatorMethod DEFAULT_RSSI_ROBUST_METHOD = RobustEstimatorMethod.PROMEDS;
/**
* Indicates that result is refined by default using all found inliers.
*/
public static final boolean DEFAULT_REFINE_RESULT = true;
/**
* Indicates that covariance is kept by default after refining result.
*/
public static final boolean DEFAULT_KEEP_COVARIANCE = true;
/**
* Default amount of progress variation before notifying a change in estimation progress.
* By default, this is set to 5%.
*/
public static final float DEFAULT_PROGRESS_DELTA = 0.05f;
/**
* Minimum allowed value for progress delta.
*/
public static final float MIN_PROGRESS_DELTA = 0.0f;
/**
* Maximum allowed value for progress delta.
*/
public static final float MAX_PROGRESS_DELTA = 1.0f;
/**
* Constant defining default confidence of the estimated result, which is
* 99%. This means that with a probability of 99% estimation will be
* accurate because chosen sub-samples will be inliers.
*/
public static final double DEFAULT_CONFIDENCE = 0.99;
/**
* Default maximum allowed number of iterations.
*/
public static final int DEFAULT_MAX_ITERATIONS = 5000;
/**
* Minimum allowed confidence value.
*/
public static final double MIN_CONFIDENCE = 0.0;
/**
* Maximum allowed confidence value.
*/
public static final double MAX_CONFIDENCE = 1.0;
/**
* Minimum allowed number of iterations.
*/
public static final int MIN_ITERATIONS = 1;
/**
* Indicates that by default position covariances of readings must be taken into account to increase
* the amount of standard deviation of each ranging measure by the amount of position standard deviation
* assuming that both measures are statistically independent.
*/
public static final boolean DEFAULT_USE_READING_POSITION_COVARIANCES = true;
/**
* Internal robust estimator for position estimation.
*/
protected RobustRangingRadioSourceEstimator<S, P> rangingEstimator;
/**
* Internal robust estimator for path-loss exponent and transmitted power
* estimation.
*/
protected RobustRssiRadioSourceEstimator<S, P> rssiEstimator;
/**
* Robust method used for robust position estimation using ranging data.
*/
protected RobustEstimatorMethod rangingRobustMethod = DEFAULT_PANGING_ROBUST_METHOD;
/**
* Robust method used for path-loss exponent and transmitted power estimation
* using RSSI data.
*/
protected RobustEstimatorMethod rssiRobustMethod = DEFAULT_RSSI_ROBUST_METHOD;
/**
* Size of subsets to be checked during ranging robust estimation.
*/
protected int rangingPreliminarySubsetSize;
/**
* Size of subsets to be checked during RSSI robust estimation.
*/
protected int rssiPreliminarySubsetSize;
/**
* Threshold to determine when samples are inliers or not used during robust
* position estimation.
* If not defined, default threshold will be used.
*/
protected Double rangingThreshold;
/**
* Threshold to determine when samples are inliers or not used during robust
* path-loss exponent and transmitted power estimation.
*/
protected Double rssiThreshold; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 533 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 534 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator2D.java | 302 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator3D.java | 303 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator2D.java | 525 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator3D.java | 524 |
LMedSRobustRangingAndRssiRadioSourceEstimator2D.this, progress);
}
}
});
try {
locked = true;
if (listener != null) {
listener.onEstimateStart(this);
}
inliersData = null;
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.LMEDS;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator.java | 505 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator.java | 453 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator.java | 443 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator.java | 491 |
final MixedRadioSourceEstimatorListener<S, P> listener) {
this(readings, initialPosition, initialTransmittedPowerdBm, listener);
this.initialPathLossExponent = initialPathLossExponent;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPowerdBm() {
return initialTransmittedPowerdBm;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPowerdBm initial transmitted power to start the
* estimation of radio source transmitted
* power.
* @throws LockedException if estimator is locked.
*/
public void setInitialTransmittedPowerdBm(final Double initialTransmittedPowerdBm) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialTransmittedPowerdBm = initialTransmittedPowerdBm;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPower() {
return initialTransmittedPowerdBm != null ? Utils.dBmToPower(initialTransmittedPowerdBm) : null;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPower initial transmitted power to start the
* estimation of radio source transmitted power.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is negative.
*/
public void setInitialTransmittedPower(final Double initialTransmittedPower) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (initialTransmittedPower != null) {
if (initialTransmittedPower < 0.0) {
throw new IllegalArgumentException();
}
initialTransmittedPowerdBm = Utils.powerTodBm(initialTransmittedPower);
} else {
initialTransmittedPowerdBm = null;
}
}
/**
* Indicates whether transmitted power estimation is enabled or not.
*
* @return true if transmitted power estimation is enabled, false otherwise.
*/
public boolean isTransmittedPowerEstimationEnabled() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 533 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 475 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 475 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator2D.java | 258 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator3D.java | 254 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 476 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 476 |
LMedSRobustRangingAndRssiRadioSourceEstimator2D.this, progress);
}
}
});
try {
locked = true;
if (listener != null) {
listener.onEstimateStart(this);
}
inliersData = null;
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.LMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator2D.java | 873 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator2D.java | 863 |
return new BeaconWithPowerAndLocated2D(beacon.getIdentifiers(), beacon.getTransmittedPower(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Builds ranging estimator.
*/
@Override
protected void buildRangingEstimatorIfNeeded() {
if (rangingEstimator == null || rangingEstimator.getMethod() != rangingRobustMethod) {
rangingEstimator = RobustRangingRadioSourceEstimator2D.create(rangingRobustMethod);
}
}
/**
* build RSSI estimator.
*
* @throws LockedException if estimator is locked.
*/
@Override
protected void buildRssiEstimatorIfNeeded() throws LockedException {
if (rssiEstimator == null || rssiEstimator.getMethod() != rssiRobustMethod) {
rssiEstimator = RobustRssiRadioSourceEstimator2D.create(rssiRobustMethod);
// rssi estimator will never need position estimator, but to
// ensure it is ready we need to provide an initial position
rssiEstimator.setPositionEstimationEnabled(false);
rssiEstimator.setInitialPosition(Point2D.create());
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator3D.java | 871 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator3D.java | 863 |
return new BeaconWithPowerAndLocated3D(beacon.getIdentifiers(), beacon.getTransmittedPower(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Builds ranging estimator.
*/
@Override
protected void buildRangingEstimatorIfNeeded() {
if (rangingEstimator == null || rangingEstimator.getMethod() != rangingRobustMethod) {
rangingEstimator = RobustRangingRadioSourceEstimator3D.create(rangingRobustMethod);
}
}
/**
* Build RSSI estimator.
*
* @throws LockedException if estimator is locked.
*/
@Override
protected void buildRssiEstimatorIfNeeded() throws LockedException {
if (rssiEstimator == null || rssiEstimator.getMethod() != rssiRobustMethod) {
rssiEstimator = RobustRssiRadioSourceEstimator3D.create(rssiRobustMethod);
// rssi estimator will never need position estimator, but to
// ensure it is ready we need to provide an initial position
rssiEstimator.setPositionEstimationEnabled(false);
rssiEstimator.setInitialPosition(Point3D.create());
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 2408 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 2410 |
protected void solvePreliminarySolutions(final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
try {
innerReadings.clear();
for (final var samplesIndex : samplesIndices) {
innerReadings.add(readings.get(samplesIndex));
}
// initial transmitted power and position might or might not be available
innerEstimator.setInitialTransmittedPowerdBm(initialTransmittedPowerdBm);
innerEstimator.setInitialPosition(initialPosition);
innerEstimator.setInitialPathLossExponent(initialPathLossExponent);
innerEstimator.setTransmittedPowerEstimationEnabled(transmittedPowerEstimationEnabled);
innerEstimator.setPathLossEstimationEnabled(pathLossEstimationEnabled);
innerEstimator.setReadings(innerReadings);
// indicates whether readings position covariances must be taken into account
innerEstimator.setUseReadingPositionCovariances(useReadingPositionCovariances);
innerEstimator.estimate();
final var estimatedPosition = innerEstimator.getEstimatedPosition();
final var estimatedTransmittedPowerdBm = innerEstimator.getEstimatedTransmittedPowerdBm();
final var estimatedPathLossExponent = innerEstimator.getEstimatedPathLossExponent();
solutions.add(new Solution<>(estimatedPosition, estimatedTransmittedPowerdBm, estimatedPathLossExponent));
} catch (final NavigationException ignore) {
// if anything fails, no solution is added
}
}
/**
* Attempts to refine estimated position and transmitted power contained in
* provided solution if refinement is requested.
* This method sets a refined result and transmitted power or provided input
* result if refinement is not requested or has failed.
* If refinement is enabled, and it is requested to keep covariance, this method
* will also keep covariance of refined result.
* solution if not requested or refinement failed.
*
* @param result result to be refined.
*/
protected void attemptRefine(final Solution<Point2D> result) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 2496 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 2424 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2422 |
if (transmittedPowerEstimationEnabled) {
// transmitted power estimation enabled
estimatedTransmittedPowerVariance = covariance.getElementAt(pos, pos);
pos++;
} else {
// transmitted power estimation disabled
estimatedTransmittedPowerVariance = null;
}
if (pathLossEstimationEnabled) {
// path-loss exponent estimation enabled
estimatedPathLossExponentVariance = covariance.getElementAt(pos, pos);
} else {
// path-loss exponent estimation disabled
estimatedPathLossExponentVariance = null;
}
} else {
covariance = null;
estimatedPositionCovariance = null;
estimatedTransmittedPowerVariance = null;
estimatedPathLossExponentVariance = null;
}
estimatedPosition = innerEstimator.getEstimatedPosition();
estimatedTransmittedPowerdBm = innerEstimator.getEstimatedTransmittedPowerdBm();
estimatedPathLossExponent = innerEstimator.getEstimatedPathLossExponent();
} catch (final Exception e) {
// refinement failed, so we return input value, and covariance
// becomes unavailable
covariance = null;
estimatedPositionCovariance = null;
estimatedTransmittedPowerVariance = null;
estimatedPathLossExponentVariance = null;
estimatedPosition = initialPosition;
estimatedTransmittedPowerdBm = initialTransmittedPowerdBm;
estimatedPathLossExponent = initialPathLossExponent;
}
} else {
covariance = null;
estimatedPositionCovariance = null;
estimatedTransmittedPowerVariance = null;
estimatedPathLossExponentVariance = null;
estimatedPosition = initialPosition;
estimatedTransmittedPowerdBm = initialTransmittedPowerdBm;
estimatedPathLossExponent = initialPathLossExponent;
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 2498 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 2424 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2422 |
if (transmittedPowerEstimationEnabled) {
// transmitted power estimation enabled
estimatedTransmittedPowerVariance = covariance.getElementAt(pos, pos);
pos++;
} else {
// transmitted power estimation disabled
estimatedTransmittedPowerVariance = null;
}
if (pathLossEstimationEnabled) {
// path-loss exponent estimation enabled
estimatedPathLossExponentVariance = covariance.getElementAt(pos, pos);
} else {
// path-loss exponent estimation disabled
estimatedPathLossExponentVariance = null;
}
} else {
covariance = null;
estimatedPositionCovariance = null;
estimatedTransmittedPowerVariance = null;
estimatedPathLossExponentVariance = null;
}
estimatedPosition = innerEstimator.getEstimatedPosition();
estimatedTransmittedPowerdBm = innerEstimator.getEstimatedTransmittedPowerdBm();
estimatedPathLossExponent = innerEstimator.getEstimatedPathLossExponent();
} catch (final Exception e) {
// refinement failed, so we return input value, and covariance
// becomes unavailable
covariance = null;
estimatedPositionCovariance = null;
estimatedTransmittedPowerVariance = null;
estimatedPathLossExponentVariance = null;
estimatedPosition = initialPosition;
estimatedTransmittedPowerdBm = initialTransmittedPowerdBm;
estimatedPathLossExponent = initialPathLossExponent;
}
} else {
covariance = null;
estimatedPositionCovariance = null;
estimatedTransmittedPowerVariance = null;
estimatedPathLossExponentVariance = null;
estimatedPosition = initialPosition;
estimatedTransmittedPowerdBm = initialTransmittedPowerdBm;
estimatedPathLossExponent = initialPathLossExponent;
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 2333 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2331 |
protected void solvePreliminarySolutions(final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
try {
innerReadings.clear();
for (final var samplesIndex : samplesIndices) {
innerReadings.add(readings.get(samplesIndex));
}
// initial transmitted power and position might or might not be available
innerEstimator.setInitialTransmittedPowerdBm(initialTransmittedPowerdBm);
innerEstimator.setInitialPosition(initialPosition);
innerEstimator.setInitialPathLossExponent(initialPathLossExponent);
innerEstimator.setTransmittedPowerEstimationEnabled(transmittedPowerEstimationEnabled);
innerEstimator.setPositionEstimationEnabled(positionEstimationEnabled);
innerEstimator.setPathLossEstimationEnabled(pathLossEstimationEnabled);
innerEstimator.setReadings(innerReadings);
innerEstimator.estimate();
final var estimatedPosition = innerEstimator.getEstimatedPosition();
final var estimatedTransmittedPowerdBm = innerEstimator.getEstimatedTransmittedPowerdBm();
final var estimatedPathLossExponent = innerEstimator.getEstimatedPathLossExponent();
solutions.add(new Solution<>(estimatedPosition, estimatedTransmittedPowerdBm, estimatedPathLossExponent));
} catch (final NavigationException ignore) {
// if anything fails, no solution is added
}
}
/**
* Attempts to refine estimated position and transmitted power contained in
* provided solution if refinement is requested.
* This method sets a refined result and transmitted power or provided input
* result if refinement is not requested or has failed.
* If refinement is enabled, and it is requested to keep covariance, this method
* will also keep covariance of refined result.
* solution if not requested or refinement failed.
*
* @param result result to be refined.
*/
protected void attemptRefine(final Solution<Point2D> result) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/fingerprint/FirstOrderNonLinearFingerprintPositionEstimator2D.java | 165 |
| com/irurueta/navigation/indoor/fingerprint/SecondOrderNonLinearFingerprintPositionEstimator2D.java | 165 |
| com/irurueta/navigation/indoor/fingerprint/ThirdOrderNonLinearFingerprintPositionEstimator2D.java | 165 |
}
/**
* Evaluates a non-linear multi dimension function at provided point using
* provided parameters and returns its evaluation and derivatives of the
* function respect the function parameters.
*
* @param i number of sample being evaluated.
* @param point point where function will be evaluated.
* @param params initial parameters estimation to be tried. These will
* change as the Levenberg-Marquardt algorithm iterates to the best solution.
* These are used as input parameters along with point to evaluate function.
* @param derivatives partial derivatives of the function respect to each
* provided parameter.
* @return function evaluation at provided point.
*/
@Override
@SuppressWarnings("Duplicates")
protected double evaluate(
final int i, final double[] point, final double[] params, final double[] derivatives) {
// This method implements received power at point pi = (xi, yi) and its derivatives
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
final var xi = params[0];
final var yi = params[1];
// received power
final var pr = point[0];
// fingerprint coordinates
final var x1 = point[1];
final var y1 = point[2];
// radio source coordinates
final var xa = point[3];
final var ya = point[4];
// path loss exponent
final var n = point[5];
final var ln10 = Math.log(10.0);
final var diffXi1 = xi - x1;
final var diffYi1 = yi - y1;
final var diffX1a = x1 - xa;
final var diffY1a = y1 - ya;
final var diffX1a2 = diffX1a * diffX1a; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearMixedPositionEstimator.java | 347 |
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator.java | 347 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator.java | 346 |
listener.onEstimateEnd(NonLinearMixedPositionEstimator.this);
}
}
};
}
/**
* Builds positions, distances and standard deviation of distances for the internal
* lateration solver.
*/
@SuppressWarnings("Duplicates")
private void buildPositionsDistancesAndDistanceStandardDeviations() {
if (trilaterationSolver == null) {
return;
}
final var min = getMinRequiredSources();
if (sources == null || fingerprint == null || sources.size() < min || fingerprint.getReadings() == null
|| fingerprint.getReadings().size() < min) {
return;
}
final var positions = new ArrayList<P>();
final var distances = new ArrayList<Double>();
final var distanceStandardDeviations = new ArrayList<Double>();
PositionEstimatorHelper.buildPositionsDistancesAndDistanceStandardDeviations(sources, fingerprint,
useRadioSourcePositionCovariance, fallbackDistanceStandardDeviation, positions, distances,
distanceStandardDeviations);
setPositionsDistancesAndDistanceStandardDeviations(positions, distances, distanceStandardDeviations);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 807 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 324 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 324 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 807 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 809 |
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 807 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 324 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 324 |
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
internalSetQualityScores(qualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Returns quality scores corresponding to each pair of
* positions and distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each sample.
*/
@Override
public double[] getQualityScores() {
return qualityScores;
}
/**
* Sets quality scores corresponding to each pair of positions and
* distances (i.e. sample).
* The larger the score value the better the quality of the sample.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behaviour.
*
* @param qualityScores quality scores corresponding to each pair of
* matched points.
* @throws IllegalArgumentException if provided quality scores length
* is smaller than minimum required samples.
* @throws LockedException if robust solver is locked because an
* estimation is already in progress.
*/
@Override
public void setQualityScores(final double[] qualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetQualityScores(qualityScores);
}
/**
* Indicates whether solver is ready to find a solution.
*
* @return true if solver is ready, false otherwise.
*/
@Override
public boolean isReady() {
return super.isReady() && qualityScores != null && qualityScores.length == readings.size();
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator2D.java | 374 |
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator3D.java | 374 |
public RadioSourceLocated<Point2D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerdBm = getEstimatedTransmittedPowerdBm();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathLossExponent = getEstimatedPathLossExponent();
final var pathLossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathLossExponentStandardDeviation = pathLossExponentVariance != null
? Math.sqrt(pathLossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated2D(accessPoint.getBssid(), accessPoint.getFrequency(), | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator.java | 769 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator.java | 748 |
protected abstract void solvePreliminarySolutions(final int[] samplesIndices, final List<Solution<P>> solutions);
/**
* Estimates residual for a solution obtained for a subset of samples.
*
* @param currentEstimation solution obtained for a subset of samples.
* @param i i-th fingerprint to obtain residual for.
* @return difference between measured and expected RSSI value.
*/
protected double residual(final Solution<P> currentEstimation, final int i) {
// Model fitted internally is equal to:
// Pr (dBm) = 10 * log(Pte * k^n / d^n) = 10*n*log(k) + 10*log(Pte) - 5*n*log(d^2)
// where:
// Pr is received, expressed in dBm
// Pte is equivalent transmitted power, expressed in dBm
// k is a constant equal to k = c^2 / (pi * f)^2, where c is speed of light
// and d is equal to distance between fingerprint and estimated position
final var reading = readings.get(i);
final var frequency = reading.getSource().getFrequency();
final var pathLossExponent = currentEstimation.getEstimatedPathLossExponent();
// compute k as the constant part of the isotropic received power formula
// so that: Pr = Pte*k^n/d^n
final var k = RssiRadioSourceEstimator.SPEED_OF_LIGHT / (4.0 * Math.PI * frequency);
final var kdB = 10.0 * pathLossExponent * Math.log10(k);
// get distance from estimated radio source position and reading position
final var readingPosition = reading.getPosition();
final var radioSourcePosition = currentEstimation.getEstimatedPosition();
final var sqrDistance = radioSourcePosition.sqrDistanceTo(readingPosition);
final var transmittedPowerdBm = currentEstimation.getEstimatedTransmittedPowerdBm();
// compute expected received power assuming isotropic transmission
// and compare against measured RSSI at fingerprint location
final var expectedRSSI = kdB + transmittedPowerdBm - 5.0 * pathLossExponent * Math.log10(sqrDistance);
final var rssi = reading.getRssi(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 392 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 173 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 173 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 396 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 396 |
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this estimator is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 392 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 173 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 173 |
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on received power (RSSI) expressed
* in dBm's between received value that should have been received on estimated
* iso-tropical model and actual measured value.
*
* @param threshold threshold to determine whether samples are inliers or not.
* @throws IllegalArgumentException if provided value is equal or less than zero.
* @throws LockedException if this estimator is locked.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 2364 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator3D.java | 417 |
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point3D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated3D(accessPoint.getBssid(), source.getFrequency(), | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2286 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator3D.java | 417 |
@SuppressWarnings("unchecked")
public RadioSourceWithPowerAndLocated<Point3D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated3D(accessPoint.getBssid(), source.getFrequency(), | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RobustMixedPositionEstimator2D.java | 817 |
| com/irurueta/navigation/indoor/position/RobustMixedPositionEstimator3D.java | 819 |
| com/irurueta/navigation/indoor/position/RobustRangingAndRssiPositionEstimator3D.java | 840 |
| com/irurueta/navigation/indoor/position/RobustRangingPositionEstimator3D.java | 834 |
| com/irurueta/navigation/indoor/position/RobustRssiPositionEstimator3D.java | 818 |
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
double[] qualityScoresArray = null;
if (distanceQualityScores != null) {
qualityScoresArray = new double[size];
}
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
if (qualityScoresArray != null) {
qualityScoresArray[i] = distanceQualityScores.get(i);
}
}
try {
laterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
if (qualityScoresArray != null) {
laterationSolver.setQualityScores(qualityScoresArray);
}
} catch (LockedException e) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/RadioSourceKNearestFinder.java | 196 |
| com/irurueta/navigation/indoor/RadioSourceNoMeanKNearestFinder.java | 199 |
final var sqrDist = f.sqrDistanceTo(fingerprint);
if (sqrDist < maxSqrDist || nearestSqrDistances.size() < k) {
// find insertion point
var pos = -1;
var i = 0;
for (final var sd : nearestSqrDistances) {
if (sqrDist < sd) {
// insertion point found
pos = i;
break;
}
i++;
}
if (pos >= 0) {
nearestSqrDistances.add(pos, sqrDist);
nearestFingerprints.add(pos, f);
} else {
nearestSqrDistances.add(sqrDist);
nearestFingerprints.add(f);
}
// remove results exceeding required number of k neighbours to be found
if (nearestFingerprints.size() > k) {
nearestSqrDistances.remove(k);
nearestFingerprints.remove(k);
}
// update maxSqrDist to the largest squared distance value contained in result list distances
maxSqrDist = nearestSqrDistances.get(nearestSqrDistances.size() - 1);
}
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/LinearMixedPositionEstimator.java | 248 |
| com/irurueta/navigation/indoor/position/LinearRangingPositionEstimator.java | 248 |
| com/irurueta/navigation/indoor/position/LinearRssiPositionEstimator.java | 247 |
listener.onEstimateEnd(LinearMixedPositionEstimator.this);
}
}
};
}
/**
* Builds positions and distances for the internal lateration solver.
*/
@SuppressWarnings("Duplicates")
private void buildPositionsAndDistances() {
if ((useHomogeneousLinearSolver && homogeneousTrilaterationSolver == null)
|| (!useHomogeneousLinearSolver && inhomogeneousTrilaterationSolver == null)) {
return;
}
final var min = getMinRequiredSources();
if (sources == null || fingerprint == null || sources.size() < min || fingerprint.getReadings() == null
|| fingerprint.getReadings().size() < min) {
return;
}
final var positions = new ArrayList<P>();
final var distances = new ArrayList<Double>();
PositionEstimatorHelper.buildPositionsAndDistances(sources, fingerprint, positions, distances);
setPositionsAndDistances(positions, distances);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 397 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 202 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 202 |
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position for a radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@SuppressWarnings("DuplicatedCode")
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 397 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 202 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 202 |
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position for a radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@SuppressWarnings("DuplicatedCode")
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point3D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RangingRadioSourceEstimator2D.java | 265 |
| com/irurueta/navigation/indoor/radiosource/RangingRadioSourceEstimator3D.java | 265 |
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
if (initialPosition == null || !nonLinearSolverEnabled) {
if (homogeneousLinearSolver != null) {
homogeneousLinearSolver.setPositionsAndDistances(positionsArray, distancesArray);
}
if (inhomogeneousLinearSolver != null) {
inhomogeneousLinearSolver.setPositionsAndDistances(positionsArray, distancesArray);
}
}
if (nonLinearSolver != null && nonLinearSolverEnabled) {
nonLinearSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 484 |
| com/irurueta/navigation/indoor/Utils.java | 2464 |
final Point3D radioSourcePosition, final Point3D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance, final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance, final Matrix estimatedPositionCovariance)
throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 1st order Taylor expression of received power in 3D:
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// - 10*n*(z1 - za)/(ln(10)*d1a^2)*(zi - z1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2 + (z1 - za)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var z1 = fingerprintPosition.getInhomZ();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var za = radioSourcePosition.getInhomZ();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var zi = estimatedPosition.getInhomZ();
final var mean = new double[]{ | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 1145 |
| com/irurueta/navigation/indoor/Utils.java | 2464 |
final Point3D radioSourcePosition, final Point3D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance, final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance, final Matrix estimatedPositionCovariance)
throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 2nd order Taylor expression of received power in 3D:
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// - 10*n*(z1 - za)/(ln(10)*d1a^2)*(zi - z1)
// - 5*n*((y1 - ya)^2 + (z1 - za)^2) - (x1 - xa)^2)/(ln(10)*d1a^4)*(xi - x1)^2
// - 5*n*((x1 - xa)^2 - (y1 - ya)^2 + (z1 - za)^2)/(ln(10)*d1a^4)*(yi - y1)^2
// - 5*n*((x1 - xa)^2 + (y1 - ya)^2 - (z1 - za)^2)/(ln(10)*d1a^4)*(zi - z1)^2
// + 20*n*(x1 - xa)*(y1 - ya)/(ln(10)*d1a^4)*(xi - x1)*(yi - y1)
// + 20*n*(y1 - ya)*(z1 - za)/(ln(10)*d1a^4)*(yi - y1)*(zi - z1)
// + 20*n*(x1 - xa)*(z1 - za)/(ln(10)*d1a^4)*(xi - x1)*(zi - z1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2 + (z1 - za)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var z1 = fingerprintPosition.getInhomZ();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var za = radioSourcePosition.getInhomZ();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var zi = estimatedPosition.getInhomZ();
final var mean = new double[]{ | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 2076 |
| com/irurueta/navigation/indoor/Utils.java | 2464 |
final Point3D radioSourcePosition, final Point3D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance, final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance, final Matrix estimatedPositionCovariance)
throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 1st order Taylor expression of received power in 3D:
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// - 10*n*(z1 - za)/(ln(10)*d1a^2)*(zi - z1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2 + (z1 - za)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var z1 = fingerprintPosition.getInhomZ();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var za = radioSourcePosition.getInhomZ();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var zi = estimatedPosition.getInhomZ();
final var mean = new double[]{ | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 710 |
| com/irurueta/navigation/indoor/Utils.java | 1838 |
jacobian.setElementAtIndex(0, derivativeFingerprintRssi);
jacobian.setElementAtIndex(1, derivativePathLossExponent);
jacobian.setElementAtIndex(2, derivativeX1);
jacobian.setElementAtIndex(3, derivativeY1);
jacobian.setElementAtIndex(4, derivativeZ1);
jacobian.setElementAtIndex(5, derivativeXa);
jacobian.setElementAtIndex(6, derivativeYa);
jacobian.setElementAtIndex(7, derivativeZa);
jacobian.setElementAtIndex(8, derivativeXi);
jacobian.setElementAtIndex(9, derivativeYi);
jacobian.setElementAtIndex(10, derivativeZi);
}
@Override
public int getNumberOfVariables() {
return 1;
}
}, mean, covariance);
} catch (final AlgebraException | StatisticsException e) {
throw new IndoorException(e);
}
}
/**
* Propagates provided variances (fingerprint rssi variance, path-loss exponent variance,
* fingerprint position covariance and radio source position covariance) into
* rssi variance by considering the 2D 2nd order Taylor expression of received power.
* Notice that any unknown variance is assumed to be zero.
*
* @param fingerprintRssi closest located fingerprint reading RSSI expressed in dBm's.
* @param pathLossExponent path-loss exponent.
* @param fingerprintPosition position of closest fingerprint.
* @param radioSourcePosition radio source position associated to fingerprint reading.
* @param estimatedPosition position to be estimated. Usually this is equal to the
* initial position used by a non-linear algorithm.
* @param fingerprintRssiVariance variance of fingerprint RSSI or null if unknown.
* @param pathLossExponentVariance variance of path-loss exponent or null if unknown.
* @param fingerprintPositionCovariance covariance of fingerprint position or null if
* unknown.
* @param radioSourcePositionCovariance covariance of radio source position or null
* if unknown.
* @param estimatedPositionCovariance covariance of position to be estimated or null
* if unknown. (This is usually unknown).
* @return a normal distribution containing expected received RSSI value and its variance.
* @throws IndoorException if something fails.
*/
public static MultivariateNormalDist propagateVariancesToRssiVarianceSecondOrderNonLinear2D( | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator2D.java | 404 |
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator2D.java | 404 |
} else if (source instanceof Beacon beacon) {
// transmitted power does not need to be estimated for beacons because
// they broadcast such information
return new BeaconWithPowerAndLocated2D(beacon.getIdentifiers(), beacon.getTransmittedPower(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(), pathLossExponent,
transmittedPowerStandardDeviation, pathLossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Creates inner estimators if needed.
*/
@Override
protected void createInnerEstimatorsIfNeeded() {
if (rangingInnerEstimator == null) {
rangingInnerEstimator = new RangingRadioSourceEstimator2D<>();
}
if (rssiInnerEstimator == null && (transmittedPowerEstimationEnabled || pathLossEstimationEnabled)) {
rssiInnerEstimator = new RssiRadioSourceEstimator2D<>();
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator3D.java | 403 |
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator3D.java | 404 |
} else if (source instanceof Beacon beacon) {
// transmitted power does not need to be estimated for beacons because
// they broadcast such information
return new BeaconWithPowerAndLocated3D(beacon.getIdentifiers(), beacon.getTransmittedPower(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(), pathLossExponent,
transmittedPowerStandardDeviation, pathLossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Creates inner estimators if needed.
*/
@Override
protected void createInnerEstimatorsIfNeeded() {
if (rangingInnerEstimator == null) {
rangingInnerEstimator = new RangingRadioSourceEstimator3D<>();
}
if (rssiInnerEstimator == null && (transmittedPowerEstimationEnabled || pathLossEstimationEnabled)) {
rssiInnerEstimator = new RssiRadioSourceEstimator3D<>();
}
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 2451 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 2374 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2372 |
protected void attemptRefine(final Solution<Point2D> result) {
final var initialPosition = result.getEstimatedPosition();
final var initialTransmittedPowerdBm = result.getEstimatedTransmittedPowerdBm();
final var initialPathLossExponent = result.getEstimatedPathLossExponent();
if (refineResult && inliersData != null) {
final var inliers = inliersData.getInliers();
final var nSamples = readings.size();
innerReadings.clear();
for (var i = 0; i < nSamples; i++) {
if (inliers.get(i)) {
// sample is inlier
innerReadings.add(readings.get(i));
}
}
try {
innerEstimator.setInitialPosition(initialPosition);
innerEstimator.setInitialTransmittedPowerdBm(initialTransmittedPowerdBm);
innerEstimator.setInitialPathLossExponent(initialPathLossExponent);
innerEstimator.setTransmittedPowerEstimationEnabled(transmittedPowerEstimationEnabled);
innerEstimator.setPathLossEstimationEnabled(pathLossEstimationEnabled); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 392 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator2D.java | 399 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new LMedSRobustEstimator<>(
new LMedSRobustEstimatorListener<RobustRangingAndRssiRadioSourceEstimator.Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 392 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 393 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new LMedSRobustEstimator<>(
new LMedSRobustEstimatorListener<RobustRangingAndRssiRadioSourceEstimator.Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 393 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator3D.java | 398 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point3D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new LMedSRobustEstimator<>(
new LMedSRobustEstimatorListener<RobustRangingAndRssiRadioSourceEstimator.Solution<Point3D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator2D.java | 174 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator3D.java | 175 |
final RobustRangingRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, listener);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Robustly estimates position for a radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@SuppressWarnings("DuplicatedCode")
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new LMedSRobustEstimator<>(new LMedSRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator2D.java | 151 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator3D.java | 150 |
final RobustRangingRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, listener);
}
/**
* Returns threshold to determine whether samples are inliers or not.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not.
*
* @param threshold threshold to be set.
* @throws IllegalArgumentException if provided value is equal or less than
* zero.
* @throws LockedException if robust estimator is locked because an
* estimation is already in progress.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Robustly estimates position for a radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@SuppressWarnings("DuplicatedCode")
@Override
public void estimate() throws LockedException, NotReadyException,
RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 887 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 425 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 425 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 429 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 429 |
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 887 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 425 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 425 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 429 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 429 |
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point3D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 880 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 425 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 425 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 429 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 429 |
}
/**
* Indicates whether inliers must be computed and kept.
*
* @return true if inliers must be computed and kept, false if inliers
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepInliersEnabled() {
return computeAndKeepInliers;
}
/**
* Specifies whether inliers must be computed and kept.
*
* @param computeAndKeepInliers true if inliers must be computed and kept,
* false if inliers only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point3D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingRadioSourceEstimator2D.java | 560 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingRadioSourceEstimator3D.java | 560 |
return new BeaconLocated2D(beacon.getIdentifiers(), beacon.getTransmittedPower(), beacon.getFrequency(),
beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(), beacon.getManufacturer(),
beacon.getServiceUuid(), beacon.getBluetoothName(), estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
}
/**
* Indicates whether an homogeneous linear solver is used to estimate an initial
* position.
*
* @return true if homogeneous linear solver is used, false if an inhomogeneous linear
* one is used instead.
*/
@Override
public boolean isHomogeneousLinearSolverUsed() {
return innerEstimator.isHomogeneousLinearSolverUsed();
}
/**
* Specifies whether an homogeneous linear solver is used to estimate an initial
* position.
*
* @param useHomogeneousLinearSolver true if homogeneous linear solver is used, false
* if an inhomogeneous linear one is used instead.
* @throws LockedException if estimator is locked.
*/
@Override
public void setHomogeneousLinearSolverUsed(final boolean useHomogeneousLinearSolver) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
innerEstimator.setHomogeneousLinearSolverUsed(useHomogeneousLinearSolver);
}
/**
* Solves preliminary solution for a subset of samples.
*
* @param samplesIndices indices of subset samples.
* @param solutions instance where solution will be stored.
*/
@Override
protected void solvePreliminarySolutions(final int[] samplesIndices, final List<Solution<Point2D>> solutions) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 369 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 369 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 372 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 372 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to determine whether samples are inliers or not.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not.
*
* @param threshold threshold to be set.
* @throws IllegalArgumentException if provided value is equal or less than
* zero.
* @throws LockedException if robust estimator is locked because an
* estimation is already in progress.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 2019 |
| com/irurueta/navigation/indoor/Utils.java | 2239 |
}
@Override
public int getNumberOfVariables() {
return 1;
}
};
final var jacobianEstimator = new JacobianEstimator(evaluator);
return MultivariateNormalDist.propagate(new MultivariateNormalDist.JacobianEvaluator() {
@Override
public void evaluate(final double[] x, final double[] y, final Matrix jacobian) {
try {
evaluator.evaluate(x, y);
jacobianEstimator.jacobian(x, jacobian);
} catch (final EvaluationException ignore) {
//never happens
}
}
@Override
public int getNumberOfVariables() {
return 1;
}
}, mean, covariance);
} catch (final AlgebraException | StatisticsException e) {
throw new IndoorException(e);
}
}
/**
* Propagates provided variances (fingerprint rssi variance, path-loss exponent variance,
* fingerprint position covariance and radio source position covariance) into
* rssi variance by considering the 3D 3rd order Taylor expression of received power.
* Notice that any unknown variance is assumed to be zero.
*
* @param fingerprintRssi closest located fingerprint reading RSSI expressed in dBm's.
* @param pathLossExponent path-loss exponent.
* @param fingerprintPosition position of closest fingerprint.
* @param radioSourcePosition radio source position associated to fingerprint reading.
* @param estimatedPosition position to be estimated. Usually this is equal to the
* initial position used by a non-linear algorithm.
* @param fingerprintRssiVariance variance of fingerprint RSSI or null if unknown.
* @param pathLossExponentVariance variance of path-loss exponent or null if unknown.
* @param fingerprintPositionCovariance covariance of fingerprint position or null if
* unknown.
* @param radioSourcePositionCovariance covariance of radio source position or null
* if unknown.
* @param estimatedPositionCovariance covariance of position to be estimated or null
* if unknown. (This is usually unknown).
* @return a normal distribution containing expected received RSSI value and its variance.
* @throws IndoorException if something fails.
*/
public static MultivariateNormalDist propagateVariancesToRssiVarianceThirdOrderNonLinear3D( | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustMixedPositionEstimator2D.java | 358 |
| com/irurueta/navigation/indoor/position/PROMedSRobustMixedPositionEstimator3D.java | 358 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingAndRssiPositionEstimator2D.java | 367 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingAndRssiPositionEstimator3D.java | 367 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingPositionEstimator2D.java | 365 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingPositionEstimator3D.java | 365 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator2D.java | 357 |
final RobustMixedPositionEstimatorListener<Point2D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration2DSolver) laterationSolver).getStopThreshold(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator2D.java | 357 |
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator3D.java | 357 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingAndRssiPositionEstimator3D.java | 367 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator3D.java | 365 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator3D.java | 357 |
final RobustMixedPositionEstimatorListener<Point2D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return ((PROSACRobustLateration2DSolver) laterationSolver).getThreshold(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator3D.java | 357 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingAndRssiPositionEstimator2D.java | 367 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator2D.java | 365 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator2D.java | 357 |
final RobustMixedPositionEstimatorListener<Point3D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Gets threshold to determine whether samples are inliers or not when testing possible solutions.
* The threshold refers to the amount of error on distance between estimated position and distances
* provided for each sample.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return ((PROSACRobustLateration3DSolver) laterationSolver).getThreshold(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 392 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator2D.java | 399 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator3D.java | 398 |
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return stopThreshold;
}
/**
* Sets threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value,
* the algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @param stopThreshold stop threshold to stop the algorithm prematurely
* when a certain accuracy has been reached.
* @throws IllegalArgumentException if provided value is zero or negative.
* @throws LockedException if this solver is locked.
*/
public void setStopThreshold(final double stopThreshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (stopThreshold <= MIN_STOP_THRESHOLD) {
throw new IllegalArgumentException();
}
this.stopThreshold = stopThreshold;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new LMedSRobustEstimator<>(
new LMedSRobustEstimatorListener<RobustRangingAndRssiRadioSourceEstimator.Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 2363 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 2365 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 2288 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2287 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator2D.java | 420 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator3D.java | 418 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator2D.java | 835 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator3D.java | 835 |
public RadioSourceWithPowerAndLocated<Point2D> getEstimatedRadioSource() {
final var readings = getReadings();
if (readings == null || readings.isEmpty()) {
return null;
}
final var source = readings.get(0).getSource();
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
return new WifiAccessPointWithPowerAndLocated2D(accessPoint.getBssid(), source.getFrequency(), | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator.java | 508 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 1566 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1554 |
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPowerdBm() {
return initialTransmittedPowerdBm;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPowerdBm initial transmitted power to start the
* estimation of radio source transmitted
* power.
* @throws LockedException if estimator is locked.
*/
public void setInitialTransmittedPowerdBm(final Double initialTransmittedPowerdBm) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialTransmittedPowerdBm = initialTransmittedPowerdBm;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPower() {
return initialTransmittedPowerdBm != null ? Utils.dBmToPower(initialTransmittedPowerdBm) : null;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPower initial transmitted power to start the
* estimation of radio source transmitted power.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is negative.
*/
public void setInitialTransmittedPower(final Double initialTransmittedPower) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (initialTransmittedPower != null) {
if (initialTransmittedPower < 0.0) {
throw new IllegalArgumentException();
}
initialTransmittedPowerdBm = Utils.powerTodBm(initialTransmittedPower);
} else {
initialTransmittedPowerdBm = null;
}
}
/**
* Indicates whether transmitted power estimation is enabled or not.
*
* @return true if transmitted power estimation is enabled, false otherwise.
*/
public boolean isTransmittedPowerEstimationEnabled() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator.java | 499 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 1566 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1554 |
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPowerdBm() {
return initialTransmittedPowerdBm;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPowerdBm initial transmitted power to start the
* estimation of radio source transmitted
* power.
* @throws LockedException if estimator is locked.
*/
public void setInitialTransmittedPowerdBm(final Double initialTransmittedPowerdBm) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialTransmittedPowerdBm = initialTransmittedPowerdBm;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPower() {
return initialTransmittedPowerdBm != null ? Utils.dBmToPower(initialTransmittedPowerdBm) : null;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPower initial transmitted power to start the
* estimation of radio source transmitted power.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is negative.
*/
public void setInitialTransmittedPower(final Double initialTransmittedPower) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (initialTransmittedPower != null) {
if (initialTransmittedPower < 0.0) {
throw new IllegalArgumentException();
}
initialTransmittedPowerdBm = Utils.powerTodBm(initialTransmittedPower);
} else {
initialTransmittedPowerdBm = null;
}
}
/**
* Indicates whether transmitted power estimation is enabled or not.
*
* @return true if transmitted power estimation is enabled, false otherwise.
*/
public boolean isTransmittedPowerEstimationEnabled() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator.java | 494 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 1566 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1554 |
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPowerdBm() {
return initialTransmittedPowerdBm;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in dBm's).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPowerdBm initial transmitted power to start the
* estimation of radio source transmitted
* power.
* @throws LockedException if estimator is locked.
*/
public void setInitialTransmittedPowerdBm(final Double initialTransmittedPowerdBm) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.initialTransmittedPowerdBm = initialTransmittedPowerdBm;
}
/**
* Gets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @return initial transmitted power to start the estimation of radio source
* transmitted power.
*/
public Double getInitialTransmittedPower() {
return initialTransmittedPowerdBm != null ? Utils.dBmToPower(initialTransmittedPowerdBm) : null;
}
/**
* Sets initial transmitted power to start the estimation of radio source
* transmitted power (expressed in mW).
* If not defined, average value of received power readings will be used.
* <p>
* If transmitted power estimation is enabled, estimation will start at this
* value and will be converted to the most appropriate value.
* If transmitted power estimation is disabled, this value will be assumed to be
* exact and the estimated transmitted power will be equal to this value
* (converted to dBm's).
*
* @param initialTransmittedPower initial transmitted power to start the
* estimation of radio source transmitted power.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is negative.
*/
public void setInitialTransmittedPower(final Double initialTransmittedPower) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (initialTransmittedPower != null) {
if (initialTransmittedPower < 0.0) {
throw new IllegalArgumentException();
}
initialTransmittedPowerdBm = Utils.powerTodBm(initialTransmittedPower);
} else {
initialTransmittedPowerdBm = null;
}
}
/**
* Indicates whether transmitted power estimation is enabled or not.
*
* @return true if transmitted power estimation is enabled, false otherwise.
*/
public boolean isTransmittedPowerEstimationEnabled() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 419 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 494 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 271 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 498 |
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRangingAndRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 419 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 494 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 271 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 497 |
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 422 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 494 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 271 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 498 |
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 422 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 494 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 271 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 497 |
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 906 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 900 |
public void setComputeAndKeepInliersEnabled(final boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point3D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 900 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 899 |
public void setComputeAndKeepInliersEnabled(boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 358 |
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator3D.java | 357 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingAndRssiPositionEstimator3D.java | 367 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator3D.java | 365 |
final RobustRssiPositionEstimatorListener<Point3D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 410 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator2D.java | 192 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 413 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point2D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 410 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator3D.java | 191 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 413 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new MSACRobustEstimator<>(new MSACRobustEstimatorListener<Solution<Point3D>>() {
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 342 |
| com/irurueta/navigation/indoor/Utils.java | 576 |
y[0] = fingerprintRssi - 10.0 * pathLossExponent * crossDiff / (ln10 * d1a2);
// compute gradient (is a jacobian having 1 row and 8 columns)
// derivative of rssi respect to fingerprint rssi
final var derivativeFingerprintRssi = 1.0;
// derivative of rssi respect to path-loss exponent
// diff(Pr(pi))/diff(n) = -10*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// -10*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
final var derivativePathLossExponent = -10.0 * crossDiff / (ln10 * d1a2);
// derivative of rssi respect to x1
// We have
// Pr(pi) = Pr(p1) -10*n*((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))/
// (ln(10)*((x1 - xa)^2 + (y1 - ya)^2))
// and we know that: (f(x)/g(x))' = (f'(x)*g(x) - f(x)*g'(x))/g(x)^2
// and also that (f(x)*g(x))' = f'(x)*g(x) + f(x)*g'(x)
// Hence
// diff((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))/diff(x1) =
// diff(x1*xi -xa*xi -x1^2 + xa*x1)/diff(x1) =
// diff(-x1^2 + (xi + xa)*x1 - xa*xi)/diff(x1) =
// -2*x1 + xi + xa
// diff(Pr(pi))/diff(x1) = -10*n/ln(10)*((-2*x1 + xi + xa)*((x1 - xa)^2 + (y1 - ya)^2) - ((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))*2*(x1 - xa))/((x1 - xa)^2 + (y1 - ya)^2)^2
// diff(Pr(pi))/diff(x1) = -10*n/ln(10)*((-2*x1 + xi + xa)*d1a^2 - ((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))*2*(x1 - xa))/d1a^4
final var tmpX = 2.0 * crossDiff * diffX1a;
final var derivativeX1 = -10.0 * pathLossExponent / ln10 * ((-2.0 * x1 + xi + xa) * d1a2
- tmpX) / d1a4;
// derivative of rssi respect to y1
// diff((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))/diff(y1) =
// diff(y1*yi -ya*yi -y1^2 + ya*y1)/diff(y1) =
// diff(-y1^2 + (yi + ya)*y1 - ya*yi)/diff(y1) =
// -2*y1 + yi + ya
// diff(Pr(pi))/diff(y1) = -10*n/ln(10)*((-2*y1 + yi + ya)*((x1 - xa)^2 + (y1 - ya)^2) - ((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))*2*(y1 - ya))/((x1 - xa)^2 + (y1 - ya)^2)^2
// diff(Pr(pi))/diff(y1) = -10*n/ln(10)*((-2*y1 + yi + ya)*d1a^2 - ((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))*2*(y1 - ya))/d1a^4
final var tmpY = 2.0 * crossDiff * diffY1a;
final var derivativeY1 = -10.0 * pathLossExponent / ln10 * ((-2.0 * y1 + yi + ya) * d1a2
- tmpY) / d1a4;
// derivative of rssi respect to xa
// diff((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))/diff(xa) =
// diff(x1*xi -xa*xi -x1^2 + xa*x1)/diff(xa) =
// x1 - xi
// diff(Pr(pi))/diff(xa) = -10*n/ln(10)*((x1 - xi)*((x1 - xa)^2 + (y1 - ya)^2) - ((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))*-2*(x1 - xa))/((x1 - xa)^2 + (y1 - ya)^2)^2
// diff(Pr(pi))/diff(xa) = -10*n/ln(10)*(-(xi - x1)*d1a^2 + ((x1 - xa)*(xi - x1) + (y1 - ya)*(yi - y1))*2*(x1 - xa))/d1a^4
final var derivativeXa = -10.0 * pathLossExponent / ln10 * (-diffXi1 * d1a2 + tmpX) / d1a4; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 358 |
| com/irurueta/navigation/indoor/position/PROSACRobustMixedPositionEstimator2D.java | 357 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingAndRssiPositionEstimator2D.java | 367 |
| com/irurueta/navigation/indoor/position/PROSACRobustRangingPositionEstimator2D.java | 365 |
| com/irurueta/navigation/indoor/position/PROSACRobustRssiPositionEstimator2D.java | 357 |
final RobustRssiPositionEstimatorListener<Point3D> listener) {
this(sources, fingerprint, listener);
internalSetSourceQualityScores(sourceQualityScores);
internalSetFingerprintReadingsQualityScores(fingerprintReadingQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator2D.java | 371 |
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator3D.java | 370 |
source = ((RangingAndRssiReadingLocated<S, Point2D>) reading).getSource();
} else {
return null;
}
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerdBm = getEstimatedTransmittedPowerdBm();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathLossExponent = getEstimatedPathLossExponent();
final var pathLossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathLossExponentStandardDeviation = pathLossExponentVariance != null
? Math.sqrt(pathLossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
if (transmittedPowerdBm != null) {
return new WifiAccessPointWithPowerAndLocated2D(accessPoint.getBssid(), accessPoint.getFrequency(), | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/SequentialRobustMixedPositionEstimator.java | 1484 |
| com/irurueta/navigation/indoor/position/SequentialRobustRangingAndRssiPositionEstimator.java | 1464 |
final Fingerprint<? extends RadioSource, ? extends Reading<? extends RadioSource>> fingerprint)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprint(fingerprint);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @return quality scores corresponding to each radio source.
*/
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
*
* @return quality scores corresponding to each reading within provided fingerprint.
*/
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Gets listener to be notified of events raised by this instance.
*
* @return listener to be notified of events raised by this instance.
*/
public SequentialRobustMixedPositionEstimatorListener<P> getListener() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator.java | 877 |
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator.java | 823 |
return areValidReadings(readings);
}
/**
* Estimate position, transmitted power and path loss exponent.
*
* @throws RadioSourceEstimationException if estimation fails.
* @throws NotReadyException if estimator is not ready.
* @throws LockedException if estimator is locked.
*/
@SuppressWarnings("DuplicatedCode")
@Override
public void estimate() throws RadioSourceEstimationException, NotReadyException, LockedException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
try {
locked = true;
if (listener != null) {
listener.onEstimateStart(this);
}
createInnerEstimatorsIfNeeded();
final var rangingReadings = new ArrayList<RangingReadingLocated<S, P>>();
final var rssiReadings = new ArrayList<RssiReadingLocated<S, P>>();
for (final var reading : readings) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator.java | 1020 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 2226 |
private RangingReadingLocated<S, P> createRangingReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RangingReadingLocated<>(reading.getSource(), reading.getDistance(), reading.getPosition(),
reading.getDistanceStandardDeviation(), reading.getPositionCovariance());
}
/**
* Creates an RSSI reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return an RSSI reading containing only the RSSI data of input reading.
*/
private RssiReadingLocated<S, P> createRssiReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RssiReadingLocated<>(reading.getSource(), reading.getRssi(), reading.getPosition(),
reading.getRssiStandardDeviation(), reading.getPositionCovariance());
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearMixedPositionEstimator3D.java | 318 |
| com/irurueta/navigation/indoor/position/NonLinearRangingAndRssiPositionEstimator3D.java | 331 |
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator3D.java | 319 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator3D.java | 320 |
var positionsArray = new InhomogeneousPoint3D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
try {
trilaterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
trilaterationSolver = new NonLinearLeastSquaresLateration3DSolver(laterationSolverListener);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MixedRadioSourceEstimator.java | 1096 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 2226 |
private RangingReadingLocated<S, P> createRangingReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RangingReadingLocated<>(reading.getSource(), reading.getDistance(), reading.getPosition(),
reading.getDistanceStandardDeviation(), reading.getPositionCovariance());
}
/**
* Creates an RSSI reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return an RSSI reading containing only the RSSI data of input reading.
*/
private RssiReadingLocated<S, P> createRssiReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RssiReadingLocated<>(reading.getSource(), reading.getRssi(), reading.getPosition(),
reading.getRssiStandardDeviation(), reading.getPositionCovariance());
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1008 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1024 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 568 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 565 |
innerEstimator.setUseInlierThresholds(false);
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1008 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1024 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 568 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 565 |
innerEstimator.setUseInlierThresholds(false);
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 525 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1024 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 568 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 565 |
innerEstimator.setUseInlierThresholds(false);
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 525 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1024 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 568 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 565 |
innerEstimator.setUseInlierThresholds(false);
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1008 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1024 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 568 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 565 |
innerEstimator.setUseInlierThresholds(false);
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1031 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 541 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1024 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 564 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 341 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 568 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 565 |
innerEstimator.setUseInlierThresholds(false);
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.PROMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RangingAndRssiRadioSourceEstimator.java | 1020 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 2344 |
private RangingReadingLocated<S, P> createRangingReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RangingReadingLocated<>(reading.getSource(), reading.getDistance(), reading.getPosition(),
reading.getDistanceStandardDeviation(), reading.getPositionCovariance());
}
/**
* Creates an RSSI reading from a ranging and RSSI reading.
*
* @param reading input reading to convert from.
* @return an RSSI reading containing only the RSSI data of input reading.
*/
private RssiReadingLocated<S, P> createRssiReading(final RangingAndRssiReadingLocated<S, P> reading) {
return new RssiReadingLocated<>(reading.getSource(), reading.getRssi(), reading.getPosition(),
reading.getRssiStandardDeviation(), reading.getPositionCovariance());
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/RadioSourceKNearestFinder.java | 104 |
| com/irurueta/navigation/indoor/RadioSourceNoMeanKNearestFinder.java | 107 |
}
/**
* Finds nearest fingerprint to provided one, in terms of signal Euclidean distances, within the collection of
* provided fingerprints.
*
* @param fingerprint fingerprint to find the nearest to.
* @param fingerprints collection of fingerprints to make the search for the nearest one.
* @param <P> a {@link Point} type.
* @param <S> a {@link RadioSource} type.
* @return nearest fingerprint or null if none could be found.
* @throws IllegalArgumentException if either fingerprint or collection of fingerprints is null.
*/
@SuppressWarnings("Duplicates")
public static <P extends Point<?>, S extends RadioSource> RssiFingerprintLocated<S, RssiReading<S>, P> findNearestTo(
final RssiFingerprint<S, RssiReading<S>> fingerprint,
final Collection<? extends RssiFingerprintLocated<S, RssiReading<S>, P>> fingerprints) {
if (fingerprint == null || fingerprints == null) {
throw new IllegalArgumentException();
}
var bestSqrDist = Double.MAX_VALUE;
RssiFingerprintLocated<S, RssiReading<S>, P> result = null;
for (final var f : fingerprints) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 546 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.LMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 547 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.LMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator2D.java | 315 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.LMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator3D.java | 316 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.LMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator2D.java | 538 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.LMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator3D.java | 537 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.LMEDS; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 420 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 962 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 472 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 956 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 495 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 272 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 499 |
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRangingAndRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 488 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.MSAC; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 420 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 962 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 472 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 955 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 495 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 272 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 498 |
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 488 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.MSAC; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator2D.java | 271 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.MSAC; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator3D.java | 267 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.MSAC; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 423 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 962 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 472 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 956 |
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 489 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.MSAC; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 423 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 962 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 472 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 955 |
@Override
public double getThreshold() {
return threshold;
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 489 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 527 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator2D.java | 1010 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 1012 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 1032 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 542 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 1026 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 1025 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 565 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 342 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 569 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 566 |
innerEstimator.setConfidence(confidence);
innerEstimator.setMaxIterations(maxIterations);
innerEstimator.setProgressDelta(progressDelta);
final var result = innerEstimator.estimate();
inliersData = innerEstimator.getInliersData();
attemptRefine(result);
if (listener != null) {
listener.onEstimateEnd(this);
}
} catch (final com.irurueta.numerical.LockedException e) {
throw new LockedException(e);
} catch (final com.irurueta.numerical.NotReadyException e) {
throw new NotReadyException(e);
} finally {
locked = false;
}
}
/**
* Returns method being used for robust estimation.
*
* @return method being used for robust estimation.
*/
@Override
public RobustEstimatorMethod getMethod() {
return RobustEstimatorMethod.MSAC; | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 900 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 445 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 445 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 449 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 448 |
public void setComputeAndKeepInliersEnabled(boolean computeAndKeepInliers) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepInliers = computeAndKeepInliers;
}
/**
* Indicates whether residuals must be computed and kept.
*
* @return true if residuals must be computed and kept, false if residuals
* only need to be computed but not kept.
*/
public boolean isComputeAndKeepResidualsEnabled() {
return computeAndKeepResiduals;
}
/**
* Specifies whether residuals must be computed and kept.
*
* @param computeAndKeepResiduals true if residuals must be computed and kept,
* false if residuals only need to be computed but not kept.
* @throws LockedException if this solver is locked.
*/
public void setComputeAndKeepResidualsEnabled(final boolean computeAndKeepResiduals) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
this.computeAndKeepResiduals = computeAndKeepResiduals;
}
/**
* Robustly estimates position, transmitted power and path-loss exponent for a
* radio source.
*
* @throws LockedException if instance is busy during estimation.
* @throws NotReadyException if estimator is not ready.
* @throws RobustEstimatorException if estimation fails for any reason
* (i.e. numerical instability, no solution available, etc).
*/
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new PROSACRobustEstimator<>(new PROSACRobustEstimatorListener<Solution<Point2D>>() { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator.java | 1328 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator.java | 1452 |
}
});
final var numReadings = readings.size();
try {
final var x = new Matrix(numReadings, dimsPlus1);
final var y = new double[numReadings];
final var standardDeviations = new double[numReadings];
for (var i = 0; i < numReadings; i++) {
reading = readings.get(i);
final var position = reading.getPosition();
for (var j = 0; j < dims; j++) {
x.setElementAt(i, j, position.getInhomogeneousCoordinate(j));
}
x.setElementAt(i, dims, initialTransmittedPowerdBm); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 901 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator2D.java | 1504 |
final List<? extends RangingAndRssiReadingLocated<S, Point2D>> readings, final Point2D initialPosition,
final Double initialTransmittedPowerdBm, final double initialPathLossExponent,
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener,
final RobustEstimatorMethod method) {
return switch (method) {
case RANSAC -> new RANSACRobustRangingAndRssiRadioSourceEstimator2D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case LMEDS -> new LMedSRobustRangingAndRssiRadioSourceEstimator2D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case MSAC -> new MSACRobustRangingAndRssiRadioSourceEstimator2D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case PROSAC -> new PROSACRobustRangingAndRssiRadioSourceEstimator2D<>(readings, initialPosition, | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 903 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 1506 |
final List<? extends RangingAndRssiReadingLocated<S, Point3D>> readings, final Point3D initialPosition,
final Double initialTransmittedPowerdBm, final double initialPathLossExponent,
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point3D> listener,
final RobustEstimatorMethod method) {
return switch (method) {
case RANSAC -> new RANSACRobustRangingAndRssiRadioSourceEstimator3D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case LMEDS -> new LMedSRobustRangingAndRssiRadioSourceEstimator3D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case MSAC -> new MSACRobustRangingAndRssiRadioSourceEstimator3D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case PROSAC -> new PROSACRobustRangingAndRssiRadioSourceEstimator3D<>(readings, initialPosition, | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 882 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator2D.java | 1465 |
final List<? extends RssiReadingLocated<S, Point2D>> readings, final Point2D initialPosition,
final Double initialTransmittedPowerdBm, final double initialPathLossExponent,
final RobustRssiRadioSourceEstimatorListener<S, Point2D> listener, final RobustEstimatorMethod method) {
return switch (method) {
case RANSAC -> new RANSACRobustRssiRadioSourceEstimator2D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case LMEDS -> new LMedSRobustRssiRadioSourceEstimator2D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case MSAC -> new MSACRobustRssiRadioSourceEstimator2D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case PROSAC -> new PROSACRobustRssiRadioSourceEstimator2D<>(readings, initialPosition, | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 881 |
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 1464 |
final List<? extends RssiReadingLocated<S, Point3D>> readings, final Point3D initialPosition,
final Double initialTransmittedPowerdBm, final double initialPathLossExponent,
final RobustRssiRadioSourceEstimatorListener<S, Point3D> listener, final RobustEstimatorMethod method) {
return switch (method) {
case RANSAC -> new RANSACRobustRssiRadioSourceEstimator3D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case LMEDS -> new LMedSRobustRssiRadioSourceEstimator3D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case MSAC -> new MSACRobustRssiRadioSourceEstimator3D<>(readings, initialPosition,
initialTransmittedPowerdBm, initialPathLossExponent, listener);
case PROSAC -> new PROSACRobustRssiRadioSourceEstimator3D<>(readings, initialPosition, | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator2D.java | 839 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator3D.java | 838 |
source = ((RangingAndRssiReadingLocated<S, Point2D>) reading).getSource();
} else {
return null;
}
final var estimatedPosition = getEstimatedPosition();
if (estimatedPosition == null) {
return null;
}
final var estimatedPositionCovariance = getEstimatedPositionCovariance();
final var transmittedPowerdBm = getEstimatedTransmittedPowerdBm();
final var transmittedPowerVariance = getEstimatedTransmittedPowerVariance();
final var transmittedPowerStandardDeviation = transmittedPowerVariance != null
? Math.sqrt(transmittedPowerVariance) : null;
final var pathlossExponentVariance = getEstimatedPathLossExponentVariance();
final var pathlossExponentStandardDeviation = pathlossExponentVariance != null
? Math.sqrt(pathlossExponentVariance) : null;
if (source instanceof WifiAccessPoint accessPoint) {
if (transmittedPowerdBm != null) {
return new WifiAccessPointWithPowerAndLocated2D(accessPoint.getBssid(), source.getFrequency(), | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearMixedPositionEstimator.java | 363 |
| com/irurueta/navigation/indoor/position/NonLinearRangingAndRssiPositionEstimator.java | 364 |
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator.java | 363 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator.java | 362 |
final var min = getMinRequiredSources();
if (sources == null || fingerprint == null || sources.size() < min || fingerprint.getReadings() == null
|| fingerprint.getReadings().size() < min) {
return;
}
final var positions = new ArrayList<P>();
final var distances = new ArrayList<Double>();
final var distanceStandardDeviations = new ArrayList<Double>();
PositionEstimatorHelper.buildPositionsDistancesAndDistanceStandardDeviations(sources, fingerprint,
useRadioSourcePositionCovariance, fallbackDistanceStandardDeviation, positions, distances,
distanceStandardDeviations);
setPositionsDistancesAndDistanceStandardDeviations(positions, distances, distanceStandardDeviations);
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/LinearMixedPositionEstimator.java | 166 |
| com/irurueta/navigation/indoor/position/LinearRangingAndRssiPositionEstimator.java | 166 |
| com/irurueta/navigation/indoor/position/LinearRangingPositionEstimator.java | 166 |
| com/irurueta/navigation/indoor/position/LinearRssiPositionEstimator.java | 165 |
} catch (LaterationException e) {
throw new PositionEstimationException(e);
}
}
/**
* Gets known positions of radio sources used internally to solve lateration.
*
* @return known positions used internally.
*/
@Override
public P[] getPositions() {
return useHomogeneousLinearSolver
? homogeneousTrilaterationSolver.getPositions() : inhomogeneousTrilaterationSolver.getPositions();
}
/**
* Gets Euclidean distances from known located radio sources to
* the location of provided readings in a fingerprint.
* Distance values are used internally to solve lateration.
*
* @return Euclidean distances used internally.
*/
@Override
public double[] getDistances() {
return useHomogeneousLinearSolver
? homogeneousTrilaterationSolver.getDistances() : inhomogeneousTrilaterationSolver.getDistances();
}
/**
* Internally sets located radio sources used for lateration.
*
* @param sources located radio sources used for lateration.
* @throws IllegalArgumentException if provided value is null or the number of
* provided sources is less than the required
* minimum.
*/
@Override
protected void internalSetSources(final List<? extends RadioSourceLocated<P>> sources) {
super.internalSetSources(sources);
buildPositionsAndDistances();
}
/**
* Internally sets fingerprint containing readings at an unknown location for provided
* located radio sources.
*
* @param fingerprint fingerprint containing readings at an unknown location for
* provided located radio sources.
* @throws IllegalArgumentException if provided value is null.
*/
@Override
protected void internalSetFingerprint(
final Fingerprint<? extends RadioSource, ? extends Reading<? extends RadioSource>> fingerprint) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator2D.java | 242 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator2D.java | 467 |
@Override
public void estimate() throws LockedException, NotReadyException, RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new LMedSRobustEstimator<>(new LMedSRobustEstimatorListener<Solution<Point2D>>() {
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] sampleIndices, final List<Solution<Point2D>> solutions) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator3D.java | 243 |
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator3D.java | 466 |
@Override
public void estimate() throws LockedException, NotReadyException,
RobustEstimatorException {
if (isLocked()) {
throw new LockedException();
}
if (!isReady()) {
throw new NotReadyException();
}
final var innerEstimator = new LMedSRobustEstimator<>(new LMedSRobustEstimatorListener<Solution<Point3D>>() {
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] sampleIndices, final List<Solution<Point3D>> solutions) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingAndRssiRadioSourceEstimator3D.java | 2388 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator3D.java | 441 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator3D.java | 858 |
return new WifiAccessPointWithPowerAndLocated3D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated3D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRssiRadioSourceEstimator3D.java | 2310 |
| com/irurueta/navigation/indoor/radiosource/RssiRadioSourceEstimator3D.java | 441 |
return new WifiAccessPointWithPowerAndLocated3D(accessPoint.getBssid(), source.getFrequency(),
accessPoint.getSsid(), getEstimatedTransmittedPowerdBm(), transmittedPowerStandardDeviation,
getEstimatedPathLossExponent(), pathlossExponentStandardDeviation, estimatedPosition,
estimatedPositionCovariance);
} else if (source instanceof Beacon beacon) {
return new BeaconWithPowerAndLocated3D(beacon.getIdentifiers(), getEstimatedTransmittedPowerdBm(),
beacon.getFrequency(), beacon.getBluetoothAddress(), beacon.getBeaconTypeCode(),
beacon.getManufacturer(), beacon.getServiceUuid(), beacon.getBluetoothName(),
getEstimatedPathLossExponent(), transmittedPowerStandardDeviation,
pathlossExponentStandardDeviation, estimatedPosition, estimatedPositionCovariance);
} else {
return null;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/SequentialRobustMixedRadioSourceEstimator.java | 2068 |
| com/irurueta/navigation/indoor/radiosource/SequentialRobustRangingAndRssiRadioSourceEstimator.java | 1980 |
final var rssiCov = rssiEstimator.getCovariance();
if (estimatedPositionCovariance != null && rssiCov != null) {
final var dims = getNumberOfDimensions();
var n = dims;
if (transmittedPowerEstimationEnabled) {
n++;
}
if (pathLossEstimationEnabled) {
n++;
}
final var dimsMinus1 = dims - 1;
final var nMinus1 = n - 1;
covariance = new Matrix(n, n);
covariance.setSubmatrix(0, 0, dimsMinus1, dimsMinus1,
estimatedPositionCovariance);
covariance.setSubmatrix(dims, dims, nMinus1, nMinus1, rssiCov);
} else {
covariance = null;
}
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 439 |
| com/irurueta/navigation/indoor/Utils.java | 1100 |
jacobian.setElementAtIndex(0, derivativeFingerprintRssi);
jacobian.setElementAtIndex(1, derivativePathLossExponent);
jacobian.setElementAtIndex(2, derivativeX1);
jacobian.setElementAtIndex(3, derivativeY1);
jacobian.setElementAtIndex(4, derivativeXa);
jacobian.setElementAtIndex(5, derivativeYa);
jacobian.setElementAtIndex(6, derivativeXi);
jacobian.setElementAtIndex(7, derivativeYi);
}
@Override
public int getNumberOfVariables() {
return 1;
}
}, mean, covariance);
} catch (final AlgebraException | StatisticsException e) {
throw new IndoorException(e);
}
}
/**
* Propagates provided variances (fingerprint rssi variance, path-loss exponent variance,
* fingerprint position covariance and radio source position covariance) into
* rssi variance by considering the 3D 1st order Taylor expression of received power.
* Notice that any unknown variance is assumed to be zero.
*
* @param fingerprintRssi closest located fingerprint reading RSSI expressed in dBm's.
* @param pathLossExponent path-loss exponent.
* @param fingerprintPosition position of closest fingerprint.
* @param radioSourcePosition radio source position associated to fingerprint reading.
* @param estimatedPosition position to be estimated. Usually this is equal to the
* initial position used by a non-linear algorithm.
* @param fingerprintRssiVariance variance of fingerprint RSSI or null if unknown.
* @param pathLossExponentVariance variance of path-loss exponent or null if unknown.
* @param fingerprintPositionCovariance covariance of fingerprint position or null if
* unknown.
* @param radioSourcePositionCovariance covariance of radio source position or null
* if unknown.
* @param estimatedPositionCovariance covariance of position to be estimated or null
* if unknown. (This is usually unknown).
* @return a normal distribution containing expected received RSSI value and its variance.
* @throws IndoorException if something fails.
*/
public static MultivariateNormalDist propagateVariancesToRssiVarianceFirstOrderNonLinear3D( | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustMixedPositionEstimator2D.java | 361 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 361 |
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration2DSolver) laterationSolver).getStopThreshold(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingAndRssiPositionEstimator2D.java | 370 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 361 |
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration2DSolver) laterationSolver).getStopThreshold(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustRangingPositionEstimator2D.java | 368 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 361 |
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration2DSolver) laterationSolver).getStopThreshold(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator2D.java | 360 |
| com/irurueta/navigation/indoor/position/PROMedSRobustRssiPositionEstimator3D.java | 361 |
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns quality scores corresponding to each radio source.
* The larger the score value the better the quality of the sample.
*
* @return quality scores corresponding to each radio source.
*/
@Override
public double[] getSourceQualityScores() {
return sourceQualityScores;
}
/**
* Sets quality scores corresponding to each radio source.
* The larger the score value the better the quality of the radio source.
*
* @param sourceQualityScores quality scores corresponding to each radio source.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setSourceQualityScores(final double[] sourceQualityScores) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSourceQualityScores(sourceQualityScores);
}
/**
* Gets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation always returns null.
* Subclasses using quality scores must implement proper behavior.
*
* @return quality scores corresponding to each reading within provided
* fingerprint.
*/
@Override
public double[] getFingerprintReadingsQualityScores() {
return fingerprintReadingsQualityScores;
}
/**
* Sets quality scores corresponding to each reading within provided fingerprint.
* The larger the score value the better the quality of the reading.
* This implementation makes no action.
* Subclasses using quality scores must implement proper behavior.
*
* @param fingerprintReadingsQualityScores quality scores corresponding to each
* reading within provided fingerprint.
* @throws LockedException if this instance is locked.
* @throws IllegalArgumentException if provided quality scores length is smaller
* than minimum required samples.
*/
@Override
public void setFingerprintReadingsQualityScores(final double[] fingerprintReadingsQualityScores)
throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetFingerprintReadingsQualityScores(fingerprintReadingsQualityScores);
}
/**
* Returns threshold to be used to keep the algorithm iterating in case that
* best estimated threshold using median of residuals is not small enough.
* Once a solution is found that generates a threshold below this value, the
* algorithm will stop.
* The stop threshold can be used to prevent the LMedS algorithm to iterate
* too many times in cases where samples have a very similar accuracy.
* For instance, in cases where proportion of outliers is very small (close
* to 0%), and samples are very accurate (i.e. 1e-6), the algorithm would
* iterate for a long time trying to find the best solution when indeed
* there is no need to do that if a reasonable threshold has already been
* reached.
* Because of this behaviour the stop threshold can be set to a value much
* lower than the one typically used in RANSAC, and yet the algorithm could
* still produce even smaller thresholds in estimated results.
*
* @return stop threshold to stop the algorithm prematurely when a certain
* accuracy has been reached.
*/
public double getStopThreshold() {
return ((PROMedSRobustLateration2DSolver) laterationSolver).getStopThreshold(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/PositionEstimator.java | 76 |
| com/irurueta/navigation/indoor/position/SequentialRobustMixedPositionEstimator.java | 1434 |
}
/**
* Gets located radio sources used for lateration.
*
* @return located radio sources used for lateration.
*/
public List<RadioSourceLocated<P>> getSources() {
//noinspection unchecked
return (List<RadioSourceLocated<P>>) sources;
}
/**
* Sets located radio sources used for lateration.
*
* @param sources located radio sources used for lateration.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is null or the number of provided
* sources is less than the required minimum.
*/
public void setSources(final List<? extends RadioSourceLocated<P>> sources) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSources(sources);
}
/**
* Gets fingerprint containing readings at an unknown location for provided located
* radio sources.
*
* @return fingerprint containing readings at an unknown location for provided
* located radio sources.
*/
public Fingerprint<RadioSource, Reading<RadioSource>> getFingerprint() {
//noinspection unchecked
return (Fingerprint<RadioSource, Reading<RadioSource>>) fingerprint;
}
/**
* Sets fingerprint containing readings at an unknown location for provided located
* radio sources.
*
* @param fingerprint fingerprint containing readings at an unknown location for
* provided located radio sources.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is null.
*/
public void setFingerprint(final Fingerprint<? extends RadioSource, ? extends R> fingerprint) | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/RobustPositionEstimator.java | 139 |
| com/irurueta/navigation/indoor/position/SequentialRobustMixedPositionEstimator.java | 1434 |
}
/**
* Gets located radio sources used for lateration.
*
* @return located radio sources used for lateration.
*/
public List<RadioSourceLocated<P>> getSources() {
//noinspection unchecked
return (List<RadioSourceLocated<P>>) sources;
}
/**
* Sets located radio sources used for lateration.
*
* @param sources located radio sources used for lateration.
* @throws LockedException if estimator is locked.
* @throws IllegalArgumentException if provided value is null or the number of
* provided sources is less than the required
* minimum.
*/
public void setSources(final List<? extends RadioSourceLocated<P>> sources) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
internalSetSources(sources);
}
/**
* Gets fingerprint containing readings at an unknown location for provided located
* radio sources.
*
* @return fingerprint containing readings at an unknown location for provided
* located radio sources.
*/
public Fingerprint<RadioSource, Reading<RadioSource>> getFingerprint() {
//noinspection unchecked
return (Fingerprint<RadioSource, Reading<RadioSource>>) fingerprint;
}
/**
* Sets fingerprint containing readings at an unknown location for provided located
* radio sources.
*
* @param fingerprint fingerprint containing readings at an unknown location for
* provided located radio sources.
* @throws LockedException if estimator is locked.
*/
public void setFingerprint(
final Fingerprint<? extends RadioSource, ? extends R> fingerprint) throws LockedException { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/position/NonLinearMixedPositionEstimator2D.java | 320 |
| com/irurueta/navigation/indoor/position/NonLinearMixedPositionEstimator3D.java | 318 |
| com/irurueta/navigation/indoor/position/NonLinearRangingAndRssiPositionEstimator2D.java | 329 |
| com/irurueta/navigation/indoor/position/NonLinearRangingAndRssiPositionEstimator3D.java | 331 |
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator2D.java | 319 |
| com/irurueta/navigation/indoor/position/NonLinearRangingPositionEstimator3D.java | 319 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator2D.java | 320 |
| com/irurueta/navigation/indoor/position/NonLinearRssiPositionEstimator3D.java | 320 |
Point2D[] positionsArray = new InhomogeneousPoint2D[size];
positionsArray = positions.toArray(positionsArray);
final var distancesArray = new double[size];
final var distanceStandardDeviationsArray = new double[size];
for (var i = 0; i < size; i++) {
distancesArray[i] = distances.get(i);
distanceStandardDeviationsArray[i] = distanceStandardDeviations.get(i);
}
try {
trilaterationSolver.setPositionsDistancesAndStandardDeviations(positionsArray, distancesArray,
distanceStandardDeviationsArray);
} catch (final LockedException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Initializes lateration solver.
*/
private void initialize() {
trilaterationSolver = new NonLinearLeastSquaresLateration2DSolver(laterationSolverListener); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 366 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 388 |
public MSACRobustRangingAndRssiRadioSourceEstimator2D(
final List<? extends RangingAndRssiReadingLocated<S, Point2D>> readings, final Point2D initialPosition,
final Double initialTransmittedPowerdBm, final double initialPathLossExponent,
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to determine whether samples are inliers or not.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not.
*
* @param threshold threshold to be set.
* @throws IllegalArgumentException if provided value is equal or less than
* zero.
* @throws LockedException if robust estimator is locked because an
* estimation is already in progress.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 366 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 388 |
public MSACRobustRangingAndRssiRadioSourceEstimator3D(
final List<? extends RangingAndRssiReadingLocated<S, Point3D>> readings, final Point3D initialPosition,
final Double initialTransmittedPowerdBm, final double initialPathLossExponent,
final RobustRangingAndRssiRadioSourceEstimatorListener<S, Point3D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to determine whether samples are inliers or not.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not.
*
* @param threshold threshold to be set.
* @throws IllegalArgumentException if provided value is equal or less than
* zero.
* @throws LockedException if robust estimator is locked because an
* estimation is already in progress.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 369 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 392 |
public MSACRobustRssiRadioSourceEstimator2D(
final List<? extends RssiReadingLocated<S, Point2D>> readings, final Point2D initialPosition,
final Double initialTransmittedPowerdBm, final double initialPathLossExponent,
final RobustRssiRadioSourceEstimatorListener<S, Point2D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to determine whether samples are inliers or not.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not.
*
* @param threshold threshold to be set.
* @throws IllegalArgumentException if provided value is equal or less than
* zero.
* @throws LockedException if robust estimator is locked because an
* estimation is already in progress.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 369 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 392 |
public MSACRobustRssiRadioSourceEstimator3D(
final List<? extends RssiReadingLocated<S, Point3D>> readings, final Point3D initialPosition,
final Double initialTransmittedPowerdBm, final double initialPathLossExponent,
final RobustRssiRadioSourceEstimatorListener<S, Point3D> listener) {
super(readings, initialPosition, initialTransmittedPowerdBm, initialPathLossExponent, listener);
}
/**
* Returns threshold to determine whether samples are inliers or not.
*
* @return threshold to determine whether samples are inliers or not.
*/
public double getThreshold() {
return threshold;
}
/**
* Sets threshold to determine whether samples are inliers or not.
*
* @param threshold threshold to be set.
* @throws IllegalArgumentException if provided value is equal or less than
* zero.
* @throws LockedException if robust estimator is locked because an
* estimation is already in progress.
*/
public void setThreshold(final double threshold) throws LockedException {
if (isLocked()) {
throw new LockedException();
}
if (threshold <= MIN_THRESHOLD) {
throw new IllegalArgumentException();
}
this.threshold = threshold;
} | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/RobustRangingRadioSourceEstimator2D.java | 603 |
| com/irurueta/navigation/indoor/radiosource/RobustRangingRadioSourceEstimator3D.java | 603 |
protected void solvePreliminarySolutions(final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
try {
innerReadings.clear();
for (final var samplesIndex : samplesIndices) {
innerReadings.add(readings.get(samplesIndex));
}
// initial position might or might not be available
innerEstimator.setInitialPosition(initialPosition);
innerEstimator.setReadings(innerReadings);
// for preliminary solutions, non-linear solver is not needed, and if no
// initial position is used, we can obtain faster solutions disabling
// non-linear solver and using a linear one only (because covariance is not
// required)
innerEstimator.setNonLinearSolverEnabled(initialPosition != null);
// indicates whether readings position covariances must be taken into account
innerEstimator.setUseReadingPositionCovariances(useReadingPositionCovariances);
innerEstimator.estimate();
final var estimatedPosition = innerEstimator.getEstimatedPosition();
solutions.add(new Solution<>(estimatedPosition));
} catch (final NavigationException ignore) {
// if anything fails, no solution is added
}
}
/**
* Attempts to refine estimated position and transmitted power contained in
* provided solution if refinement is requested.
* This method sets a refined result and transmitted power or provided input
* result if refinement is not requested or has failed.
* If refinement is enabled, and it is requested to keep covariance, this method
* will also keep covariance of refined result.
* solution if not requested or refinement failed.
*
* @param result result to be refined.
*/
protected void attemptRefine(final Solution<Point2D> result) { | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 258 |
| com/irurueta/navigation/indoor/Utils.java | 2294 |
final Point2D radioSourcePosition, final Point2D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance, final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance, final Matrix estimatedPositionCovariance)
throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 1st order Taylor expression of received power in 2D:
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var mean = new double[]{ | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 758 |
| com/irurueta/navigation/indoor/Utils.java | 2294 |
final Point2D radioSourcePosition, final Point2D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance, final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance, final Matrix estimatedPositionCovariance)
throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 2nd order Taylor expression of received power in 2D:
// Pr(pi) = Pr(p1)
// - 10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1)
// - 10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1)
// - 5*n*((y1 - ya)^2 - (x1 - xa)^2)/(ln(10)*d1a^4)*(xi - x1)^2
// - 5*n*((x1 - xa)^2 - (y1 - ya)^2)/(ln(10)*d1a^4)*(yi - y1)^2
// + 20*n*(x1 - xa)*(y1 - ya)/(ln(10)*d1a^4))*(xi - x1)*(yi - y1)
// where d1a^2 = (x1 - xa)^2 + (y1 - ya)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var mean = new double[]{ | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/Utils.java | 1887 |
| com/irurueta/navigation/indoor/Utils.java | 2294 |
final Point2D estimatedPosition, final Double fingerprintRssiVariance,
final Double pathLossExponentVariance,
final Matrix fingerprintPositionCovariance,
final Matrix radioSourcePositionCovariance,
final Matrix estimatedPositionCovariance) throws IndoorException {
if (fingerprintPosition == null || radioSourcePosition == null || estimatedPosition == null) {
return null;
}
// 3rd order Taylor expression of received power in 2D:
// Pr(pi) = Pr(p1)
// -10*n*(x1 - xa)/(ln(10)*d1a^2)*(xi - x1) +
// -10*n*(y1 - ya)/(ln(10)*d1a^2)*(yi - y1) +
// -5*n*((y1 - ya)^2 - (x1 - xa)^2)/(ln(10)*d1a^4)*(xi - x1)^2 +
// -5*n*((x1 - xa)^2 - (y1 - ya)^2)/(ln(10)*d1a^4)*(yi - y1)^2 +
// 20*n*(x1 - xa)*(y1 - ya)/(ln(10)*d1a^4)*(xi - x1)*(yi - y1) +
// -10/6*n/ln(10)*(-2*(x1 - xa)*dia^4 - ((y1 - ya)^2 - (x1 - xa)^2)*4*d1a^2*(x1 - xa))/d1a^8*(xi - x1)^3 +
// -10/6*n/ln(10)*(-2*(y1 - ya)*d1a^4 - ((x1 - xa)^2 - (y1 - ya)^2)*4*d1a^2*(y1 - ya))/d1a^8*(yi - y1)^3 +
// -5*n/ln(10)*(2*(y1 - ya)*d1a^4 - ((y1 - ya)^2 - (x1 - xa)^2)*4*d1a^2*(y1 - ya))/d1a^8*(xi - x1)^2*(yi - y1) +
// -5*n/ln(10)*(2*(x1 - xa)*d1a^4 - ((x1 - xa)^2 - (y1 - ya)^2)*4*d1a^2*(x1 - xa))/d1a^8*(xi - x1)*(yi - y1)^2
// where d1a2 = (x1 - xa)^2 + (y1 - ya)^2
final var x1 = fingerprintPosition.getInhomX();
final var y1 = fingerprintPosition.getInhomY();
final var xa = radioSourcePosition.getInhomX();
final var ya = radioSourcePosition.getInhomY();
final var xi = estimatedPosition.getInhomX();
final var yi = estimatedPosition.getInhomY();
final var mean = new double[]{ | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 423 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 941 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 458 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 965 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 475 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 959 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 498 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 275 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 502 |
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRangingAndRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 423 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 941 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 458 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 943 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 965 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 475 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 958 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 498 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 275 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 501 |
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRangingAndRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 426 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 941 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 458 |
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 426 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 941 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 458 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 943 |
}
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return MSACRobustRssiRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator2D.java | 252 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator2D.java | 208 |
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] sampleIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(sampleIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return LMedSRobustRangingRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRangingRadioSourceEstimator3D.java | 254 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingRadioSourceEstimator3D.java | 206 |
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] sampleIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(sampleIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return LMedSRobustRangingRadioSourceEstimator3D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator2D.java | 477 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator2D.java | 425 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator2D.java | 428 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator2D.java | 943 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator2D.java | 460 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator2D.java | 967 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator2D.java | 477 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator2D.java | 961 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator2D.java | 500 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator2D.java | 277 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator2D.java | 504 |
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point2D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point2D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return LMedSRobustRssiRadioSourceEstimator2D.this.isReady(); | |
| File | Line |
|---|---|
| com/irurueta/navigation/indoor/radiosource/LMedSRobustRssiRadioSourceEstimator3D.java | 476 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRangingAndRssiRadioSourceEstimator3D.java | 425 |
| com/irurueta/navigation/indoor/radiosource/MSACRobustRssiRadioSourceEstimator3D.java | 428 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingAndRssiRadioSourceEstimator3D.java | 943 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRangingRadioSourceEstimator3D.java | 460 |
| com/irurueta/navigation/indoor/radiosource/PROMedSRobustRssiRadioSourceEstimator3D.java | 945 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingAndRssiRadioSourceEstimator3D.java | 967 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRangingRadioSourceEstimator3D.java | 477 |
| com/irurueta/navigation/indoor/radiosource/PROSACRobustRssiRadioSourceEstimator3D.java | 960 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingAndRssiRadioSourceEstimator3D.java | 500 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRangingRadioSourceEstimator3D.java | 277 |
| com/irurueta/navigation/indoor/radiosource/RANSACRobustRssiRadioSourceEstimator3D.java | 503 |
@Override
public int getTotalSamples() {
return readings.size();
}
@Override
public int getSubsetSize() {
return Math.max(preliminarySubsetSize, getMinReadings());
}
@Override
public void estimatePreliminarSolutions(
final int[] samplesIndices, final List<Solution<Point3D>> solutions) {
solvePreliminarySolutions(samplesIndices, solutions);
}
@Override
public double computeResidual(final Solution<Point3D> currentEstimation, final int i) {
return residual(currentEstimation, i);
}
@Override
public boolean isReady() {
return LMedSRobustRssiRadioSourceEstimator3D.this.isReady(); | |
