From 95b169f587587e65b5975677d2924f4ca4c15947 Mon Sep 17 00:00:00 2001 From: Luc Maisonobe <luc@orekit.org> Date: Tue, 17 Jun 2014 16:50:31 +0200 Subject: [PATCH] New speed improvement for inverse localization! I now ned about 56s for 2000x2000 inverse localization for 3 sensors on my laptop (Intel Core i5-3320M, 2.60GHz, quad-core, linux, 8GB RAM, mono-thread test). This means more than 210000 pixels/second. It's fast! --- .../main/java/org/orekit/rugged/api/Rugged.java | 2 +- .../rugged/utils/SpacecraftToObservedBody.java | 17 +++++++++-------- .../java/org/orekit/rugged/api/RuggedTest.java | 7 +++++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/org/orekit/rugged/api/Rugged.java b/core/src/main/java/org/orekit/rugged/api/Rugged.java index b4779345..74663b29 100644 --- a/core/src/main/java/org/orekit/rugged/api/Rugged.java +++ b/core/src/main/java/org/orekit/rugged/api/Rugged.java @@ -67,7 +67,7 @@ public class Rugged { private static final int MAX_EVAL = 50; /** Time step for frames transforms interpolations. */ - private static final double FRAMES_TRANSFORMS_INTERPOLATION_STEP = 0.01; + private static final double FRAMES_TRANSFORMS_INTERPOLATION_STEP = 0.001; /** Reference ellipsoid. */ private final ExtendedEllipsoid ellipsoid; diff --git a/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java b/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java index 70fb4c38..ac18d675 100644 --- a/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java +++ b/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java @@ -134,7 +134,7 @@ public class SpacecraftToObservedBody { */ public Transform getScToInertial(final AbsoluteDate date) throws OrekitException { - return intepolate(date, scToInertial); + return interpolate(date, scToInertial); } /** Get transform from inertial frame to observed body frame. @@ -144,7 +144,7 @@ public class SpacecraftToObservedBody { */ public Transform getInertialToBody(final AbsoluteDate date) throws OrekitException { - return intepolate(date, inertialToBody); + return interpolate(date, inertialToBody); } /** Get transform from observed body frame to inertial frame. @@ -154,20 +154,21 @@ public class SpacecraftToObservedBody { */ public Transform getBodyToInertial(final AbsoluteDate date) throws OrekitException { - return intepolate(date, bodyToInertial); + return interpolate(date, bodyToInertial); } /** Interpolate transform. * @param date date of the transform * @param list transforms list to interpolate from - * @return interpolated + * @return interpolated transform * @exception OrekitException if frames cannot be computed at date */ - private Transform intepolate(final AbsoluteDate date, final List<Transform> list) + private Transform interpolate(final AbsoluteDate date, final List<Transform> list) throws OrekitException { - final double s = date.durationFrom(list.get(0).getDate()) / tStep; - final int inf = FastMath.max(0, FastMath.min(list.size() - 2, (int) FastMath.floor(s))); - return Transform.interpolate(date, false, false, list.subList(inf, inf + 2)); + final double s = date.durationFrom(list.get(0).getDate()) / tStep; + final int index = FastMath.max(0, FastMath.min(list.size() - 1, (int) FastMath.rint(s))); + final Transform close = list.get(index); + return close.shiftedBy(date.durationFrom(close.getDate())); } } diff --git a/core/src/test/java/org/orekit/rugged/api/RuggedTest.java b/core/src/test/java/org/orekit/rugged/api/RuggedTest.java index 95e43427..f5f7399b 100644 --- a/core/src/test/java/org/orekit/rugged/api/RuggedTest.java +++ b/core/src/test/java/org/orekit/rugged/api/RuggedTest.java @@ -525,8 +525,8 @@ public class RuggedTest { throws RuggedException, OrekitException, URISyntaxException { long t0 = System.currentTimeMillis(); - int dimension = 1000; - int nbSensors = 5; + int dimension = 2000; + int nbSensors = 3; String path = getClass().getClassLoader().getResource("orekit-data").toURI().getPath(); DataProvidersManager.getInstance().addProvider(new DirectoryCrawler(new File(path))); @@ -586,6 +586,9 @@ public class RuggedTest { for (final LineSensor lineSensor : sensors) { for (int i = 0; i < dimension; ++i) { double latitude = lat0 + (i * delta) / dimension; + if (i %100 == 0) { + System.out.println(lineSensor.getName() + " " + i); + } for (int j = 0; j < dimension; ++j) { double longitude = lon0 + (j * delta) / dimension; SensorPixel sp = rugged.inverseLocalization(lineSensor.getName(), latitude, longitude, 0, dimension); -- GitLab