diff --git a/src/main/java/org/orekit/rugged/api/Rugged.java b/src/main/java/org/orekit/rugged/api/Rugged.java index 2c17f835c0675b8f064b0b9df282afc6674847d0..fa1cffd06eb88c3315c79f6be0b1fa6eda0efaf0 100644 --- a/src/main/java/org/orekit/rugged/api/Rugged.java +++ b/src/main/java/org/orekit/rugged/api/Rugged.java @@ -590,6 +590,7 @@ public class Rugged { * @param sensorA line sensor A * @param dateA current date for sensor A * @param pixelA pixel index for sensor A + * @param scToBodyA spacecraftToBody transform for sensor A * @param sensorB line sensor B * @param dateB current date for sensor B * @param pixelB pixel index for sensor B @@ -598,6 +599,7 @@ public class Rugged { */ public double distanceBetweenLOS(final LineSensor sensorA, final AbsoluteDate dateA, final int pixelA, + final SpacecraftToObservedBody scToBodyA, final LineSensor sensorB, final AbsoluteDate dateB, final int pixelB) throws RuggedException { @@ -605,34 +607,21 @@ public class Rugged { //final LineSensor sensorA = getLineSensor(sensorNameA); //final LineSensor sensorB = getLineSensor(sensorNameB); - // Get sensors's position and LOS - // compute the approximate transform between spacecraft and observed body - - final Transform scToInertA = scToBody.getScToInertial(dateA); - //final Transform inertToBodyA = scToBody.getInertialToBody(dateA); - //final Transform approximate = new Transform(dateA, scToInertA, inertToBodyA); - - - // compute location of each pixel - final Vector3D sA = scToInertA.transformPosition(sensorA.getPosition()); - final Vector3D vA = scToInertA.transformVector(sensorA.getLOS(dateA, pixelA)); - - //TODO scToBody should be found from ruggedB instance - final Transform scToInertB = scToBody.getScToInertial(dateB); - //final Transform inertToBodyB = scToBody.getInertialToBody(dateB); - //final Transform approximate = new Transform(dateA, scToInert, inertToBody); - - // compute location of each pixel - final Vector3D sB = scToInertB.transformPosition(sensorB.getPosition()); - final Vector3D vB = scToInertB.transformVector(sensorB.getLOS(dateB, pixelB)); - - - - - //final Vector3D vA = sensorA.getLOS(dateA, pixelA); // V_a : line of sight's vectorA - //final Vector3D vB = sensorB.getLOS(dateB, pixelB); // V_b - //final Vector3D sA = sensorA.getPosition(); // S_a : sensorA 's position - //final Vector3D sB = sensorB.getPosition(); // S_b + // Compute the approximate transforms between spacecraft and observed body + final Transform scToInertA = scToBodyA.getScToInertial(dateA); // from rugged instance A + final Transform scToInertB = scToBody.getScToInertial(dateB); // from (current) rugged instance B + + // Get sensors's position and LOS into local frame + final Vector3D vALocal = sensorA.getLOS(dateA, pixelA); // V_a : line of sight's vectorA + final Vector3D vBLocal = sensorB.getLOS(dateB, pixelB); // V_b + final Vector3D sALocal = sensorA.getPosition(); // S_a : sensorA 's position + final Vector3D sBLocal = sensorB.getPosition(); // S_b + + // Get sensors's position and LOS into inertial frame + final Vector3D sA = scToInertA.transformPosition(sALocal); + final Vector3D vA = scToInertA.transformVector(vALocal); + final Vector3D sB = scToInertB.transformPosition(sBLocal); + final Vector3D vB = scToInertB.transformVector(vBLocal); final Vector3D vBase= sB.subtract(sA); // S_b - S_a final double svA = Vector3D.dotProduct(vBase, vA); // SV_a = (S_b - S_a).V_a @@ -659,6 +648,7 @@ public class Rugged { * @param sensorA line sensor A * @param dateA current date for sensor A * @param pixelA pixel index for sensor A + * @param scToBodyA spacecraftToBody transform for sensor A * @param sensorB line sensor B * @param dateB current date for sensor B * @param pixelB pixel index for sensor B @@ -669,6 +659,7 @@ public class Rugged { */ private DerivativeStructure[] distanceBetweenLOSDerivatives(final LineSensor sensorA, final AbsoluteDate dateA, final int pixelA, + final SpacecraftToObservedBody scToBodyA, final LineSensor sensorB, final AbsoluteDate dateB, final int pixelB, final DSGenerator generator) @@ -677,18 +668,31 @@ public class Rugged { //final LineSensor sensorA = getLineSensor(sensorNameA); //final LineSensor sensorB = getLineSensor(sensorNameB); - // Get sensors's LOS - final FieldVector3D<DerivativeStructure> vA = sensorA.getLOSDerivatives(dateA, pixelA, generator); // V_a : line of sight's vectorA - final FieldVector3D<DerivativeStructure> vB = sensorB.getLOSDerivatives(dateB, pixelB, generator); // V_b + // Compute the approximate transforms between spacecraft and observed body + final Transform scToInertA = scToBodyA.getScToInertial(dateA); // from rugged instance A + final Transform scToInertB = scToBody.getScToInertial(dateB); // from (current) rugged instance B + + // Get sensors's LOS into local frame + final FieldVector3D<DerivativeStructure> vALocal = sensorA.getLOSDerivatives(dateA, pixelA, generator); + final FieldVector3D<DerivativeStructure> vBLocal = sensorB.getLOSDerivatives(dateB, pixelB, generator); + + // Get sensors's LOS into inertial frame + final FieldVector3D<DerivativeStructure> vA = scToInertA.transformPosition(vALocal); // V_a : line of sight's vectorA + final FieldVector3D<DerivativeStructure> vB = scToInertB.transformPosition(vBLocal); // V_b - // Get sensors's position. TODO: check if we have to implement getPositionDerivatives() method & CO + // Get sensors's position into local frame TODO: check if we have to implement getPositionDerivatives() method & CO final Vector3D sAtmp = sensorA.getPosition(); // S_a : sensorA 's position - final Vector3D sBtmp = sensorB.getPosition(); // S_b + final Vector3D sBtmp = sensorB.getPosition(); // S_b : sensorB 's position final DerivativeStructure scaleFactor = FieldVector3D.dotProduct(vA.normalize(), vA.normalize()); // V_a.V_a=1 // Build a vector from position vector and a scale factor (equals to 1). - // The vector built will be scaleFactor * sA for example. - final FieldVector3D<DerivativeStructure> sA = new FieldVector3D<DerivativeStructure>(scaleFactor, sAtmp); - final FieldVector3D<DerivativeStructure> sB = new FieldVector3D<DerivativeStructure>(scaleFactor, sBtmp); + // The vector built will be scaleFactor * sAtmp for example. + final FieldVector3D<DerivativeStructure> sALocal = new FieldVector3D<DerivativeStructure>(scaleFactor, sAtmp); + final FieldVector3D<DerivativeStructure> sBLocal = new FieldVector3D<DerivativeStructure>(scaleFactor, sBtmp); + + // Get sensors's position into inertial frame + final FieldVector3D<DerivativeStructure> sA = scToInertA.transformPosition(sALocal); + final FieldVector3D<DerivativeStructure> sB = scToInertB.transformPosition(sBLocal); + // final FieldVector3D<DerivativeStructure> sA = sensorA.getPositionDerivatives(); // S_a : sensorA 's position // final FieldVector3D<DerivativeStructure> sB = sensorB.getPositionDerivatives(); // S_b @@ -815,11 +819,13 @@ public class Rugged { final AbsoluteDate dateB = lineSensorB.getDate(spB.getLineNumber()); final int pixelA = (int)spA.getPixelNumber(); // Note: Rugged don't deal with half-pixel final int pixelB = (int)spB.getPixelNumber(); + final SpacecraftToObservedBody scToBodyA = ruggedA.getScToBody(); final DerivativeStructure[] ilResult = distanceBetweenLOSDerivatives(lineSensorA, dateA, pixelA, + scToBodyA, lineSensorB, dateB, pixelB, @@ -1296,5 +1302,12 @@ public class Rugged { } return sensor; } + + /** Get converter between spacecraft and body + * @return the scToBody + */ + public SpacecraftToObservedBody getScToBody() { + return scToBody; + } } diff --git a/src/tutorials/java/AffinagePleiades/SensorToSensorMeasureGenerator.java b/src/tutorials/java/AffinagePleiades/SensorToSensorMeasureGenerator.java index 53c16350e1a9eb6af7ac8bd6da2f2110a2a8032c..57d80ebbdbc503ddc18a3e24223f4aa228de644c 100644 --- a/src/tutorials/java/AffinagePleiades/SensorToSensorMeasureGenerator.java +++ b/src/tutorials/java/AffinagePleiades/SensorToSensorMeasureGenerator.java @@ -32,6 +32,7 @@ import org.hipparchus.random.Well19937a; import org.hipparchus.util.FastMath; import org.orekit.bodies.GeodeticPoint; import org.orekit.rugged.utils.DSGenerator; +import org.orekit.rugged.utils.SpacecraftToObservedBody; import java.util.Locale; @@ -133,8 +134,12 @@ public class SensorToSensorMeasureGenerator { // TODO test if distance is 0.0 with crossing LOS final AbsoluteDate dateB = sensorB.getDate(sensorPixelB.getLineNumber()); double pixelB = sensorPixelB.getPixelNumber(); + + // Get spacecraft to body transform of rugged instance A + final SpacecraftToObservedBody scToBodyA = ruggedA.getScToBody(); + //TODO work with double pixel values - double distance = ruggedA.distanceBetweenLOS(sensorA,dateA, pixelA, sensorB ,dateB,(int) pixelB); + double distance = ruggedB.distanceBetweenLOS(sensorA,dateA, pixelA, scToBodyA, sensorB ,dateB,(int) pixelB); System.out.format(Locale.US,"distance %f %n",distance); mapping.addMapping(new SensorPixel(line, pixelA),