Skip to content
Snippets Groups Projects
Commit 43bb8fd8 authored by Luc Maisonobe's avatar Luc Maisonobe
Browse files

Improved accuracy by taking speed of light into account in transforms.

parent 8d0b513e
No related branches found
No related tags found
No related merge requests found
...@@ -374,17 +374,27 @@ public class RuggedImpl implements Rugged { ...@@ -374,17 +374,27 @@ public class RuggedImpl implements Rugged {
// select the sensor // select the sensor
final Sensor sensor = getSensor(sensorName); final Sensor sensor = getSensor(sensorName);
// compute once the transform between spacecraft and observed body // compute the approximate transform between spacecraft and observed body
final AbsoluteDate date = sensor.getDate(lineNumber); final AbsoluteDate date = sensor.getDate(lineNumber);
final Transform t = scToBody.getTransform(date); final Transform scToInert = scToBody.getScToInertial(date);
final Transform inertToBody = scToBody.getInertialToBody(date);
final Transform approximate = new Transform(date, scToInert, inertToBody);
// compute localization of each pixel // compute localization of each pixel
final GroundPoint[] gp = new GroundPoint[sensor.getNbPixels()]; final GroundPoint[] gp = new GroundPoint[sensor.getNbPixels()];
for (int i = 0; i < gp.length; ++i) { for (int i = 0; i < gp.length; ++i) {
// fix light travel time
final Vector3D sP = approximate.transformPosition(sensor.getPosition(i));
final Vector3D sL = approximate.transformVector(sensor.getLos(i));
final Vector3D eP = ellipsoid.transform(ellipsoid.pointOnGround(sP, sL));
final double deltaT = eP.distance(sP) / Constants.SPEED_OF_LIGHT;
final Transform fixed = new Transform(date, scToInert, inertToBody.shiftedBy(-deltaT));
final GeodeticPoint geodetic = final GeodeticPoint geodetic =
algorithm.intersection(ellipsoid, algorithm.intersection(ellipsoid,
t.transformPosition(sensor.getPosition(i)), fixed.transformPosition(sensor.getPosition(i)),
t.transformVector(sensor.getLos(i))); fixed.transformVector(sensor.getLos(i)));
gp[i] = new GroundPoint(geodetic.getLatitude(), gp[i] = new GroundPoint(geodetic.getLatitude(),
geodetic.getLongitude(), geodetic.getLongitude(),
geodetic.getAltitude()); geodetic.getAltitude());
......
...@@ -21,18 +21,14 @@ import org.orekit.attitudes.AttitudeProvider; ...@@ -21,18 +21,14 @@ import org.orekit.attitudes.AttitudeProvider;
import org.orekit.errors.OrekitException; import org.orekit.errors.OrekitException;
import org.orekit.frames.Frame; import org.orekit.frames.Frame;
import org.orekit.frames.Transform; import org.orekit.frames.Transform;
import org.orekit.frames.TransformProvider;
import org.orekit.time.AbsoluteDate; import org.orekit.time.AbsoluteDate;
import org.orekit.utils.PVCoordinates; import org.orekit.utils.PVCoordinates;
import org.orekit.utils.PVCoordinatesProvider; import org.orekit.utils.PVCoordinatesProvider;
/** Transform provider from Spacecraft frame to observed body frame. /** Provider for observation transforms.
* @author Luc Maisonobe * @author Luc Maisonobe
*/ */
class SpacecraftToObservedBody implements TransformProvider { class SpacecraftToObservedBody {
/** Serializable UID. */
private static final long serialVersionUID = 20140311L;
/** Inertial frame. */ /** Inertial frame. */
private Frame inertialFrame; private Frame inertialFrame;
...@@ -61,9 +57,12 @@ class SpacecraftToObservedBody implements TransformProvider { ...@@ -61,9 +57,12 @@ class SpacecraftToObservedBody implements TransformProvider {
this.aProvider = aProvider; this.aProvider = aProvider;
} }
/** {@inheritDoc} */ /** Get transform from spacecraft to inertial frame.
@Override * @param date date of the transform
public Transform getTransform(final AbsoluteDate date) * @return transform from spacecraft to inertial frame
* @exception OrekitException if spacecraft position or attitude cannot be computed at date
*/
public Transform getScToInertial(final AbsoluteDate date)
throws OrekitException { throws OrekitException {
// propagate/interpolate orbit and attitude // propagate/interpolate orbit and attitude
...@@ -71,15 +70,22 @@ class SpacecraftToObservedBody implements TransformProvider { ...@@ -71,15 +70,22 @@ class SpacecraftToObservedBody implements TransformProvider {
final Attitude attitude = aProvider.getAttitude(pvProvider, date, inertialFrame); final Attitude attitude = aProvider.getAttitude(pvProvider, date, inertialFrame);
// compute transform from spacecraft frame to inertial frame // compute transform from spacecraft frame to inertial frame
final Transform scToInert = new Transform(date, return new Transform(date,
new Transform(date, attitude.getOrientation().revert()), new Transform(date, attitude.getOrientation().revert()),
new Transform(date, pv)); new Transform(date, pv));
// compute transform from inertial frame to body frame }
final Transform inertToBody = inertialFrame.getTransformTo(bodyFrame, date);
// combine transforms /** Get transform from inertial frame to body frame.
return new Transform(date, scToInert, inertToBody); * @param date date of the transform
* @return transform from inertial frame to body frame
* @exception OrekitException if frames cannot be computed at date
*/
public Transform getInertialToBody(final AbsoluteDate date)
throws OrekitException {
// compute transform from inertial frame to body frame
return inertialFrame.getTransformTo(bodyFrame, date);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment