Commit 73c2c9a2 authored by Guylaine Prat's avatar Guylaine Prat

Merge branch 'release-2.1'

parents a5c8cf7e 9b8a4f74
pipeline {
agent any
tools {
maven 'mvn-default'
jdk 'openjdk-8'
}
options {
timeout(time: 60, unit: 'MINUTES')
}
stages {
stage('Cleaning') {
steps {
sh 'git clean -fdx'
}
}
stage('Build') {
steps {
script {
if ( env.BRANCH_NAME ==~ /^release-[.0-9]+$/ ) {
sh 'mvn verify assembly:single'
}
else {
sh 'mvn verify site'
}
}
}
}
}
post {
always {
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
script {
if ( env.BRANCH_NAME ==~ /^release-[.0-9]+$/ ) {
archiveArtifacts artifacts: 'target/*.zip', fingerprint: true
}
}
junit testResults: '**/target/surefire-reports/*.xml'
jacoco execPattern:'target/**.exec', classPattern: '**/classes', sourcePattern: '**/src/main/java'
recordIssues enabledForFailure: true, tools: [mavenConsole(), java(), javaDoc()]
recordIssues enabledForFailure: true, tool: checkStyle()
recordIssues enabledForFailure: true, tool: spotBugs()
}
}
}
RUGGED
Copyright 2013-2017 CS Systèmes d'Information
Copyright 2013-2019 CS Systèmes d'Information
This product includes software developed by
CS Systèmes d'Information (http://www.c-s.fr/)
......
<!--- Copyright 2013-2019 CS Systèmes d'Information
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<h1 style="color:blue;" align="center">
Rugged
</h1>
<h1>
<img src="src/site/resources/images/rugged-logo-small.jpg" alt="Rugged"/>
A sensor-to-terrain mapping tool
</h1>
<h4 align="center">Rugged is a free java library for geolocation and used for satellite imagery.</h4>
Rugged is an add-on for [Orekit](https://www.orekit.org/ "Orekit homepage") handling Digital Elevation Models contribution to
line of sight computation. It is a free software intermediate-level library written in Java.
It mainly provides direct and inverse location, i.e. it allows to compute accurately
which ground point is looked at from a specific pixel in a spacecraft instrument,
and conversely which pixel will see a specified ground point. This mapping between
ground and sensor is computed with a viewing model taking into account:
* ground Digital Elevation Model (DEM),
* Earth rotation will all its tiny irregularities,
* on-board sensor pixels individual line-of-sights,
* spacecraft motion and attitude,
* several physical effects.
Direct and inverse location can be used to perform full ortho-rectification of
images and correlation between sensors observing the same area.
Homepage: [www.orekit.org/rugged/](https://www.orekit.org/rugged/ "Rugged homepage")
......@@ -31,7 +31,7 @@
<module name="IllegalImport"/>
<module name="Indentation">
<property name="basicOffset" value="4"/>
<property name="caseIndent" value="4"/>
<property name="caseIndent" value="4"/>
</module>
<module name="JavadocMethod">
<property name="allowUndeclaredRTE" value="true"/>
......@@ -71,26 +71,35 @@
PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR,
SR_ASSIGN, STAR, STAR_ASSIGN"/>
</module>
<module name="FileContentsHolder"/>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE\: stop JavadocVariable check"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume JavadocVariable check"/>
<property name="checkFormat" value="JavadocVariable"/>
</module>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE\: stop VisibilityModifierCheck"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume VisibilityModifierCheck"/>
<property name="offCommentFormat" value="CHECKSTYLE\: stop VisibilityModifier check"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume VisibilityModifier check"/>
<property name="checkFormat" value="VisibilityModifierCheck"/>
</module>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE\: stop NoWhitespaceAfter"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume NoWhitespaceAfter"/>
<property name="offCommentFormat" value="CHECKSTYLE\: stop NoWhitespaceAfter check"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume NoWhitespaceAfter check"/>
<property name="checkFormat" value="NoWhitespaceAfter"/>
</module>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE\: stop FallThrough check"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume FallThrough check"/>
<property name="checkFormat" value="FallThrough"/>
<property name="offCommentFormat" value="CHECKSTYLE\: stop Indentation check"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume Indentation check"/>
<property name="checkFormat" value="IndentationCheck"/>
</module>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE\: stop MultipleStringLiterals check"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume MultipleStringLiterals check"/>
<property name="checkFormat" value="MultipleStringLiteralsCheck"/>
</module>
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE\: stop UnnecessaryParentheses check"/>
<property name="onCommentFormat" value="CHECKSTYLE\: resume UnnecessaryParentheses check"/>
<property name="checkFormat" value="UnnecessaryParentheses"/>
</module>
</module>
<module name="RegexpHeader">
......
This diff is collapsed.
<?xml version="1.0"?>
<!--
This file contains some false positive bugs detected by findbugs. Their
This file contains some false positive bugs detected by spotbugs. Their
false positive nature has been analyzed individually and they have been
put here to instruct findbugs it must ignore them.
-->
......
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2013-2017 CS Systèmes d'Information
<!-- Copyright 2013-2019 CS Systèmes d'Information
Licensed to CS Systèmes d'Information (CS) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
......@@ -20,7 +20,78 @@
<title>Rugged Changes</title>
</properties>
<body>
<release version="2.0" date="2017-12-22" description="This is a major release.
<release version="2.1" date="2019-03-14" description="This is a minor release.
It adds refraction in inverse location and fixes a few bugs. This version depends
on Orekit 9.3 and Hipparchus 1.4.">
<action dev="guylaine" type="update">
Updated dependencies to Orekit 9.3 and Hipparchus 1.4.
</action>
<action dev="luc" type="fix" issue="376">
Direct location may result to a null result in some very rugged region.
In Duvenhage algorithm, in the refineIntersection method for the DEM,
some rare cases led to no intersection (as a result from SimpleTile.cellIntersection)
with the closeGuess given as input of refineIntersection.By shifting the solution
along the LOS direction, with an iterative process, we are able to find the intersection.
</action>
<action dev="guylaine" type="fix" issue="377">
Add the possibility to suspend and resume the dump.
When performing a dump, in some cases, some extra informations are dumped
but are not relevant.
For instance when updating a tile for a SRTM tile, we need to add the geoid
value of the current point. In the dump file, the geoid tile is also dumped
and it leads to bad results when performing the DumpReplayer, as the geoid
elevations are read instead of the real elevations.
</action>
<action dev="guylaine" type="update">
Enable null in dump of direct or inverse location results.
If direct or inverse location gave "null" as a result, it was not dumped.
</action>
<action dev="guylaine" type="update">
Improve test coverage of classes related to dump (org.orekit.rugged.errors).
</action>
<action dev="guylaine" type="fix" issue="373">
Changed RuggedException from checked to unchecked exception.
Most functions do throw such exceptions. As they are unchecked, they are
not advertised in either `throws` statements in the function signature or
in the javadoc. So users must consider that as soon as they use any Rugged
feature, an unchecked `RuggedException` may be thrown. In most cases, users
will not attempt to recover for this but will only use them to display or
log a meaningful error message.
</action>
<action dev="guylaine" type="fix" issue="372">
Add (optional) atmospheric refraction for inverse location.
In Rugged 2.0, only the direct location can take into account the atmospheric refraction.
</action>
<action dev="guylaine" type="add" due-to="Issam Boukerch">
Changed terms for refining tutorials.
The "fulcrum points" term is changed into "Ground Control Points (GCP)" and
the "liaison points" term into "tie points".
</action>
<action dev="luc" type="fix" issue="371">
For refining computation, correct the constructor of the class
adjustment.measurements.SensorToGroundMapping due to a parameters reversal error.
</action>
<action dev="guylaine" type="fix" issue="256">
Bad check of maxDate validity in utils.SpacecraftToObservedBody.SpacecraftToObservedBody
method.
</action>
<action dev="luc" type="add" due-to="Lars Næsbye Christensen">
Updated Danish translations of error messages.
</action>
<action dev="luc" type="add" due-to="Roberto Alacevich">
Updated Italian translations of error messages.
</action>
<action dev="guylaine" type="add" due-to="Espen Bjørntvedt">
Updated Norwegian translations of error messages.
</action>
<action dev="luc" type="add" due-to="Beatriz Salazar García">
Updated Spanish translations of error messages.
</action>
</release>
<release version="2.0" date="2017-12-19" description="This is a major release.
It mainly provides a refinement feature (i.e. adjusting the viewing model
parameters to match ground control points.">
<action dev="guylaine" type="update">
......
' Copyright 2013-2017 CS Systèmes d'Information
' Copyright 2013-2019 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (CS) under one or more
' contributor license agreements. See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
......
' Copyright 2013-2017 CS Systèmes d'Information
' Copyright 2013-2019 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (CS) under one or more
' contributor license agreements. See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
......
' Copyright 2013-2017 CS Systèmes d'Information
' Copyright 2013-2019 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (CS) under one or more
' contributor license agreements. See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
......
' Copyright 2013-2017 CS Systèmes d'Information
' Copyright 2013-2019 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (CS) under one or more
' contributor license agreements. See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
......
' Copyright 2013-2017 CS Systèmes d'Information
' Copyright 2013-2019 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (CS) under one or more
' contributor license agreements. See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
......
' Copyright 2013-2017 CS Systèmes d'Information
' Copyright 2013-2019 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (CS) under one or more
' contributor license agreements. See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
......
' Copyright 2013-2017 CS Systèmes d'Information
' Copyright 2013-2019 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (CS) under one or more
' contributor license agreements. See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
......
' Copyright 2013-2017 CS Systèmes d'Information
' Copyright 2013-2019 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (CS) under one or more
' contributor license agreements. See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
......
' Copyright 2013-2017 CS Systèmes d'Information
' Copyright 2013-2019 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (CS) under one or more
' contributor license agreements. See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
......
......@@ -12,7 +12,7 @@
<include>BUILDING.txt</include>
<include>pom.xml</include>
<include>checkstyle.xml</include>
<include>findbugs-exclude-filter.xml</include>
<include>spotbugs-exclude-filter.xml</include>
<include>license-header.txt</include>
</includes>
<useDefaultExcludes>true</useDefaultExcludes>
......@@ -22,4 +22,4 @@
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
</fileSets>
</assembly>
\ No newline at end of file
</assembly>
/* Copyright 2013-2017 CS Systèmes d'Information
/* Copyright 2013-2019 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
......@@ -25,14 +25,11 @@ import java.util.Map;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresOptimizer.Optimum;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresProblem;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitExceptionWrapper;
import org.orekit.rugged.adjustment.measurements.Observables;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.errors.RuggedExceptionWrapper;
import org.orekit.rugged.errors.RuggedMessages;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.rugged.adjustment.measurements.Observables;
/** Create adjustment context for viewing model refining.
* @author Lucie LabatAllee
......@@ -118,54 +115,40 @@ public class AdjustmentContext {
* @param parametersConvergenceThreshold convergence threshold on normalized
* parameters (dimensionless, related to parameters scales)
* @return optimum of the least squares problem
* @exception RuggedException if several parameters with the same name
* exist, if no parameters have been selected for estimation, or
* if parameters cannot be estimated (too few measurements,
* ill-conditioned problem ...)
*/
public Optimum estimateFreeParameters(final Collection<String> ruggedNameList, final int maxEvaluations,
final double parametersConvergenceThreshold)
throws RuggedException {
try {
final List<Rugged> ruggedList = new ArrayList<Rugged>();
final List<LineSensor> selectedSensors = new ArrayList<LineSensor>();
for (String ruggedName : ruggedNameList) {
final Rugged rugged = this.viewingModel.get(ruggedName);
if (rugged == null) {
throw new RuggedException(RuggedMessages.INVALID_RUGGED_NAME);
}
ruggedList.add(rugged);
selectedSensors.addAll(rugged.getLineSensors());
final double parametersConvergenceThreshold) {
final List<Rugged> ruggedList = new ArrayList<Rugged>();
final List<LineSensor> selectedSensors = new ArrayList<LineSensor>();
for (String ruggedName : ruggedNameList) {
final Rugged rugged = this.viewingModel.get(ruggedName);
if (rugged == null) {
throw new RuggedException(RuggedMessages.INVALID_RUGGED_NAME);
}
final LeastSquareAdjuster adjuster = new LeastSquareAdjuster(this.optimizerID);
LeastSquaresProblem theProblem = null;
// builder
switch (ruggedList.size()) {
case 1:
final Rugged rugged = ruggedList.get(0);
final GroundOptimizationProblemBuilder groundOptimizationProblem = new GroundOptimizationProblemBuilder(selectedSensors, measurements, rugged);
theProblem = groundOptimizationProblem.build(maxEvaluations, parametersConvergenceThreshold);
break;
case 2:
final InterSensorsOptimizationProblemBuilder interSensorsOptimizationProblem = new InterSensorsOptimizationProblemBuilder(selectedSensors, measurements, ruggedList);
theProblem = interSensorsOptimizationProblem.build(maxEvaluations, parametersConvergenceThreshold);
break;
default :
throw new RuggedException(RuggedMessages.UNSUPPORTED_REFINING_CONTEXT, ruggedList.size());
}
return adjuster.optimize(theProblem);
ruggedList.add(rugged);
selectedSensors.addAll(rugged.getLineSensors());
}
} catch (RuggedExceptionWrapper rew) {
throw rew.getException();
} catch (OrekitExceptionWrapper oew) {
final OrekitException oe = oew.getException();
throw new RuggedException(oe, oe.getSpecifier(), oe.getParts());
final LeastSquareAdjuster adjuster = new LeastSquareAdjuster(this.optimizerID);
LeastSquaresProblem theProblem = null;
// builder
switch (ruggedList.size()) {
case 1:
final Rugged rugged = ruggedList.get(0);
final GroundOptimizationProblemBuilder groundOptimizationProblem = new GroundOptimizationProblemBuilder(selectedSensors, measurements, rugged);
theProblem = groundOptimizationProblem.build(maxEvaluations, parametersConvergenceThreshold);
break;
case 2:
final InterSensorsOptimizationProblemBuilder interSensorsOptimizationProblem = new InterSensorsOptimizationProblemBuilder(selectedSensors, measurements, ruggedList);
theProblem = interSensorsOptimizationProblem.build(maxEvaluations, parametersConvergenceThreshold);
break;
default :
throw new RuggedException(RuggedMessages.UNSUPPORTED_REFINING_CONTEXT, ruggedList.size());
}
return adjuster.optimize(theProblem);
}
}
/* Copyright 2013-2017 CS Systèmes d'Information
/* Copyright 2013-2019 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
......@@ -17,12 +17,14 @@
package org.orekit.rugged.adjustment;
import org.hipparchus.linear.LUDecomposer;
import org.hipparchus.linear.QRDecomposer;
import org.hipparchus.optim.nonlinear.vector.leastsquares.GaussNewtonOptimizer;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresOptimizer;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresOptimizer.Optimum;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresProblem;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LevenbergMarquardtOptimizer;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.errors.RuggedInternalError;
/** LeastSquareAdjuster
* Class for setting least square algorithm chosen for solving optimization problem.
......@@ -75,14 +77,14 @@ public class LeastSquareAdjuster {
return new LevenbergMarquardtOptimizer();
case GAUSS_NEWTON_LU :
return new GaussNewtonOptimizer().withDecomposition(GaussNewtonOptimizer.Decomposition.LU);
return new GaussNewtonOptimizer(new LUDecomposer(1e-11), true);
case GAUSS_NEWTON_QR :
return new GaussNewtonOptimizer().withDecomposition(GaussNewtonOptimizer.Decomposition.QR);
return new GaussNewtonOptimizer(new QRDecomposer(1e-11), false);
default :
// this should never happen
throw RuggedException.createInternalError(null);
throw new RuggedInternalError(null);
}
}
}
/* Copyright 2013-2017 CS Systèmes d'Information
/* Copyright 2013-2019 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
......@@ -30,13 +30,10 @@ import org.hipparchus.optim.ConvergenceChecker;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresProblem;
import org.hipparchus.optim.nonlinear.vector.leastsquares.MultivariateJacobianFunction;
import org.hipparchus.optim.nonlinear.vector.leastsquares.ParameterValidator;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitExceptionWrapper;
import org.orekit.rugged.adjustment.measurements.Observables;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.errors.RuggedExceptionWrapper;
import org.orekit.rugged.errors.RuggedMessages;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.rugged.adjustment.measurements.Observables;
import org.orekit.rugged.utils.DSGenerator;
import org.orekit.utils.ParameterDriver;
......@@ -72,21 +69,15 @@ abstract class OptimizationProblemBuilder {
/** Constructor.
* @param sensors list of sensors to refine
* @param measurements set of observables
* @throws RuggedException an exception is generated if no parameters has been selected for refining
*/
OptimizationProblemBuilder(final List<LineSensor> sensors, final Observables measurements) throws RuggedException {
try {
this.generator = this.createGenerator(sensors);
this.drivers = this.generator.getSelected();
this.nbParams = this.drivers.size();
if (this.nbParams == 0) {
throw new RuggedException(RuggedMessages.NO_PARAMETERS_SELECTED);
}
} catch (RuggedExceptionWrapper rew) {
throw rew.getException();
}
OptimizationProblemBuilder(final List<LineSensor> sensors, final Observables measurements) {
this.generator = this.createGenerator(sensors);
this.drivers = this.generator.getSelected();
this.nbParams = this.drivers.size();
if (this.nbParams == 0) {
throw new RuggedException(RuggedMessages.NO_PARAMETERS_SELECTED);
}
this.measurements = measurements;
this.sensors = sensors;
}
......@@ -94,12 +85,10 @@ abstract class OptimizationProblemBuilder {
/** Least squares problem builder.
* @param maxEvaluations maximum number of evaluations
* @param convergenceThreshold convergence threshold
* @throws RuggedException if sensor is not found
* @return the least squares problem
*/
public abstract LeastSquaresProblem build(int maxEvaluations, double convergenceThreshold)
throws RuggedException;
public abstract LeastSquaresProblem build(int maxEvaluations, double convergenceThreshold);
/** Create the convergence check.
* <p>
......@@ -131,10 +120,8 @@ abstract class OptimizationProblemBuilder {
return start;
}
/** Create targets and weights of optimization problem.
* @throws RuggedException if no reference mappings for parameters estimation are found
*/
protected abstract void createTargetAndWeight() throws RuggedException;
/** Create targets and weights of optimization problem. */
protected abstract void createTargetAndWeight();
/** Create the model function value and its Jacobian.
* @return the model function value and its Jacobian
......@@ -151,19 +138,14 @@ abstract class OptimizationProblemBuilder {
// Prevent parameters to exceed their prescribed bounds
final ParameterValidator validator = params -> {
try {
int i = 0;
for (final ParameterDriver driver : this.drivers) {
// let the parameter handle min/max clipping
driver.setNormalizedValue(params.getEntry(i));
params.setEntry(i++, driver.getNormalizedValue());
}
return params;
int i = 0;
for (final ParameterDriver driver : this.drivers) {
} catch (OrekitException oe) {
throw new OrekitExceptionWrapper(oe);
// let the parameter handle min/max clipping
driver.setNormalizedValue(params.getEntry(i));
params.setEntry(i++, driver.getNormalizedValue());
}
return params;
};
return validator;
......
/* Copyright 2013-2017 CS Systèmes d'Information
/* Copyright 2013-2019 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
......
/* Copyright 2013-2017 CS Systèmes d'Information
/* Copyright 2013-2019 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
......@@ -35,10 +35,10 @@ public class Observables {
/** Separator between sensors. */
private static final String SENSORS_SEPARATOR = "__";
/** Sensor to ground mapping structure (example: for GCP points).*/
/** Sensor to ground mapping structure (example: for Ground Control Points GCP points).*/
private final Map<String, SensorToGroundMapping> groundMappings;
/** Sensor to sensor mappings structure (liaison points). */
/** Sensor to sensor mappings structure (Tie points). */
private final Map<String, SensorToSensorMapping> interMappings;
/** Number of viewing models to map.*/
......
/* Copyright 2013-2017 CS Systèmes d'Information
/* Copyright 2013-2019 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
......
/* Copyright 2013-2017 CS Systèmes d'Information
/* Copyright 2013-2019 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
......@@ -46,7 +46,7 @@ public class SensorToGroundMapping {
* @param sensorName name of the sensor to which mapping applies
*/
public SensorToGroundMapping(final String sensorName) {
this(sensorName, RUGGED);
this(RUGGED, sensorName);
}
/** Build a new instance with a specific Rugged name.
......