Newer
Older
/* Copyright 2013-2016 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.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package AffinagePleiades;
import org.orekit.rugged.api.SensorToGroundMapping;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.rugged.linesensor.SensorPixel;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.time.AbsoluteDate;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.random.UncorrelatedRandomVectorGenerator;
import org.hipparchus.random.UniformRandomGenerator;
import org.hipparchus.random.Well19937a;
import org.hipparchus.util.FastMath;
import org.orekit.bodies.GeodeticPoint;
/** class for measure generation
* @author Jonathan Guinet
*/
public class MeasureGenerator {
/** mapping */
private SensorToGroundMapping mapping;
private Rugged rugged;
private LineSensor sensor;
private PleiadesViewingModel viewingModel;
private int measureCount;
/** Simple constructor.
* <p>
*
* </p>
*/
public MeasureGenerator(PleiadesViewingModel viewingModel, Rugged rugged) throws RuggedException
{
// generate reference mapping
String sensorName = viewingModel.getSensorName();
mapping = new SensorToGroundMapping(sensorName);
this.rugged = rugged;
this.viewingModel = viewingModel;
sensor = rugged.getLineSensor(mapping.getSensorName());
}
public SensorToGroundMapping getMapping() {
return mapping;
}
public int getMeasureCount() {
return measureCount;
}
public void CreateMeasure(final int lineSampling,final int pixelSampling) throws RuggedException
{
for (double line = 0; line < viewingModel.dimension; line += lineSampling) {
AbsoluteDate date = sensor.getDate(line);
for (int pixel = 0; pixel < sensor.getNbPixels(); pixel += pixelSampling) {
GeodeticPoint gp2 = rugged.directLocation(date, sensor.getPosition(),
sensor.getLOS(date, pixel));
mapping.addMapping(new SensorPixel(line, pixel), gp2);
measureCount++;
}
}
}
public void CreateNoisyMeasure(final int lineSampling,final int pixelSampling) throws RuggedException
{
Vector3D latLongError = estimateLatLongError();
double latError = FastMath.toRadians(latLongError.getX()); // in line: -0.000002 deg
double lonError = FastMath.toRadians(latLongError.getY()); // in line: 0.000012 deg
System.out.format("Corresponding error estimation on ground: {lat: %1.10f deg, lon: %1.10f deg} %n", latLongError.getX(), latLongError.getY());
// Gaussian random generator
// Build a null mean random uncorrelated vector generator with standard deviation corresponding to the estimated error on ground
double mean[] = {0.0,0.0,0.0};
double std[] = {latError,lonError,0.0};
UniformRandomGenerator rng = new UniformRandomGenerator(new Well19937a(0xefac03d9be4d24b9l));
UncorrelatedRandomVectorGenerator rvg = new UncorrelatedRandomVectorGenerator(mean, std, rng);
System.out.format("Add a gaussian noise to measures without biais (null mean) and standard deviation corresponding to the estimated error on ground.%n");
for (double line = 0; line < viewingModel.dimension; line += lineSampling) {
AbsoluteDate date = sensor.getDate(line);
for (int pixel = 0; pixel < sensor.getNbPixels(); pixel += pixelSampling) {
// Components of generated vector follow (independent) Gaussian distribution
Vector3D vecRandom = new Vector3D(rvg.nextVector());
GeodeticPoint gp2 = rugged.directLocation(date, sensor.getPosition(),
GeodeticPoint gpNoisy = new GeodeticPoint(gp2.getLatitude()+vecRandom.getX(),
gp2.getLongitude()+vecRandom.getY(),
gp2.getAltitude()); // no altitude error introducing
/*if(line == 0) {
System.out.format("Init gp: (%f,%d): %s %n",line,pixel,gp2.toString());
System.out.format("Random: (%f,%d): %s %n",line,pixel,vecRandom.toString());
System.out.format("Final gp: (%f,%d): %s %n",line,pixel,gpNoisy.toString());
}*/
mapping.addMapping(new SensorPixel(line, pixel), gpNoisy);
measureCount++;
}
private Vector3D estimateLatLongError() throws RuggedException {
System.out.format("Uncertainty in pixel (in line) for a real geometric refining: 1 pixel (assumption)%n");
double line=0;
AbsoluteDate date = sensor.getDate(line);
GeodeticPoint gp_pix0 = rugged.directLocation(date, sensor.getPosition(), sensor.getLOS(date, 0));
GeodeticPoint gp_pix1 = rugged.directLocation(date, sensor.getPosition(), sensor.getLOS(date, 1));
double latErr=FastMath.toDegrees(gp_pix0.getLatitude()-gp_pix1.getLatitude());
double lonErr=FastMath.toDegrees(gp_pix0.getLongitude()-gp_pix1.getLongitude());
return new Vector3D(latErr,lonErr,0.0);