From 07b49291a929a44e7d3cb0af8a9dd4fa47094eb5 Mon Sep 17 00:00:00 2001 From: Luc Maisonobe <luc@orekit.org> Date: Tue, 25 Nov 2014 13:19:02 +0100 Subject: [PATCH] Updated tutorials from forge wiki. --- .../tutorials/direct-location-with-DEM.md | 165 ++++++++++++++++++ .../markdown/tutorials/direct-location.md | 67 ++++--- .../resources/images/DEM-tiles-overlap.png | Bin 0 -> 9425 bytes .../resources/images/tile-description.png | Bin 0 -> 15212 bytes src/site/site.xml | 35 ++-- 5 files changed, 215 insertions(+), 52 deletions(-) create mode 100644 src/site/markdown/tutorials/direct-location-with-DEM.md create mode 100644 src/site/resources/images/DEM-tiles-overlap.png create mode 100644 src/site/resources/images/tile-description.png diff --git a/src/site/markdown/tutorials/direct-location-with-DEM.md b/src/site/markdown/tutorials/direct-location-with-DEM.md new file mode 100644 index 00000000..904aa126 --- /dev/null +++ b/src/site/markdown/tutorials/direct-location-with-DEM.md @@ -0,0 +1,165 @@ +<!--- Copyright 2013-2014 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. +--> + +# Direct Location with a DEM + +The aim of this tutorial is to compute a direct location grid by intersection of the line of sight with a DEM (Digital Elevation Model), using Duvenhage's algorithm. This algorithm is the most performant one in Rugged. + + +## Feeding Rugged with DEM tiles + +Rugged does not parse DEM files but takes buffers of elevation data as input. It is up to the calling application to read the DEM and load the data into buffers. Rugged provides a tile mecanism with cache for large DEMs allowing the user to load one tile at a time. This is in line with the format of world coverage DEMs such as SRTM. Rugged offers an interface for updating the DEM tiles in cache with a callback function triggered everytime a coordinate falls outside the current region. + +The calling application must implement the callback function for loading the tiles. We recommend to use GDAL (http://www.gdal.org/) to parse the DEM files as it handles most formats (including geoTIFF for Aster DEM or DTED for SRTM). Rugged does not include the parsing of the DEM, by design, and yet we could have used GDAL. We want Rugged to remain a low-level library that does not pull too many third-party libraries. + + +### Implementing the interface TileUpdater for DEM loading. + +In this tutorial, we will not include real DEM data. Instead we are going to create a fake DEM representing a volcanoe in a form of a perfect cone, similar to the Mayon volcano in the Philippines, except that we will locate it somewhere just below our satellite. This example is already part of Rugged tests cases, the source code is available in the package `org.orekit.rugged.raster`, file VolcanicConeElevationUpdater.java. + +The class `VolcanicConeElevationUpdater` implements the interface `TileUpdater` with its method `updateTile`. The method is in charge of loading a tile. The extent of the tile must be such that it covers at least the ground point with coordinates (latitude, longitude) which are passed as arguments to the method. The tile is an object of type `UpdatableTile` which has two methods : + +* `setGeometry(minLatitude, minLongitude, latitudeStep, longitudeStep, latitudeRows, longitudeRows)` : initializes the extent of the new tile before loading + +* `setElevation(latIdx, longIdx, elevation)` : fills the tile buffer at indices (latIdx, lonIdx) with value elevation + +Here's the source code of the class `VolcanicConeElevationUpdater` : + + import org.apache.commons.math3.util.FastMath; + import org.orekit.bodies.GeodeticPoint; + import org.orekit.rugged.api.RuggedException; + import org.orekit.utils.Constants; + + public class VolcanicConeElevationUpdater implements TileUpdater { + + private GeodeticPoint summit; + private double slope; + private double base; + private double size; + private int n; + + public VolcanicConeElevationUpdater(GeodeticPoint summit, double slope, double base, + double size, int n) { + this.summit = summit; + this.slope = slope; + this.base = base; + this.size = size; + this.n = n; + } + + public void updateTile(double latitude, double longitude, UpdatableTile tile) + throws RuggedException { + double step = size / (n - 1); + double minLatitude = size * FastMath.floor(latitude / size); + double minLongitude = size * FastMath.floor(longitude / size); + double sinSlope = FastMath.sin(slope); + tile.setGeometry(minLatitude, minLongitude, step, step, n, n); + for (int i = 0; i < n; ++i) { + double cellLatitude = minLatitude + i * step; + for (int j = 0; j < n; ++j) { + double cellLongitude = minLongitude + j * step; + double distance = Constants.WGS84_EARTH_EQUATORIAL_RADIUS * + FastMath.hypot(cellLatitude - summit.getLatitude(), + cellLongitude - summit.getLongitude()); + double altitude = FastMath.max(summit.getAltitude() - distance * sinSlope, + base); + tile.setElevation(i, j, altitude); + } + } + } + + } + +### Important notes on DEM tiles : + +* Ground point elevation are obtained by bilinear interpolation between 4 neighbouring cells. There is no specific algorithm for border management. As a consequence, a point falling on the border of the tile is considered outside. DEM tiles must be overlapping by at least one line/column in all directions, in a similar way as for the SRTM DEMs. + +* In Rugged terminology, the minimum latitude and longitude correspond to the centre of the farthest Southwest cell of the DEM. Be careful if using GDAL to pass the correct information as there is half a pixel shift with respect to the lower left corner coordinates in gdalinfo. + +The following diagram illustrates proper DEM tiling with one line/column overlaps between neighbouring tiles : + + +This diagram tries to represent the meaning of the different parameters in the definition of a tile : + + + +## Initializing Rugged with a DEM + +The initialization step differs slightly from the first tutorial [[DirectLocation|Direct location]], as we need to pass the information about our TileUpdater. + +Instantiate an object derived from TileUpdater : + + TileUpdater updater = new VolcanicConeElevationUpdater(summit, slope, base, FastMath.toRadians(1.0), 100); + + int nbTiles = 8 ; //number max of tiles in Rugged cache + AlgorithmId algoId = AlgorithmId.DUVENHAGE; + + +Initialize Rugged with these parameters : + + Rugged rugged = new Rugged(updater, nbTiles, algoId, + EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, + startDate, stopDate, 0.1, 10.0, + satellitePVList, 6, CartesianDerivativesFilter.USE_P, + satelliteQList, 8, AngularDerivativesFilter.USE_R); + + + +## Computing a direct location grid + +In a similar way as in the first tutorial [direct location](./direct-location.html), we call Rugged direct location method. This time it is called in a loop so as to generate a full grid on disk. + + DataOutputStream dos = new DataOutputStream(new FileOutputStream("demDirectLoc.c1")); + int lineStep = (maxLine - minLine) / nbLineStep; + int pxStep = (maxPx - minPx) / nbPxStep; + + ArrayList<GeodeticPoint> pointList = new ArrayList<GeodeticPoint>(); + for (int i = 0; i < nbLineStep; i++) { + int currentLine = minLine + i * lineStep; + for (int j = 0; j < nbPxStep; j++) { + int currentPx = minPx + j * pxStep; + // Call to direct localization on current line + Vector3D position = lineSensor.getPosition(); + AbsoluteDate currentLineDate = lineSensor.getDate(currentLine); + Vector3D los = lineSensor.getLos(absDate, currentPx); + GeodeticPoint point = rugged.directLocation(currentLineDate, position, los); + + // Write latitude + if (point != null) { + dos.writeFloat((float) FastMath.toDegrees(point.getLatitude())); + } else { + dos.writeFloat((float) base); + } + // Store the GeodeticPoint to write longitude and altitude later + pointList.add(point); + } + } + for (GeodeticPoint point : pointList) { + if (point != null) { + dos.writeFloat((float) FastMath.toDegrees(point.getLongitude())); + } else { + dos.writeFloat((float) base); + } + } + for (GeodeticPoint point : pointList) { + if (point != null) { + dos.writeFloat((float) point.getAltitude()); + } else { + dos.writeFloat((float) base); + } + } + + +## Source code +The source code is available in DirectLocationGrid.java diff --git a/src/site/markdown/tutorials/direct-location.md b/src/site/markdown/tutorials/direct-location.md index cb6cce46..56c3c9ae 100644 --- a/src/site/markdown/tutorials/direct-location.md +++ b/src/site/markdown/tutorials/direct-location.md @@ -21,8 +21,9 @@ list of positions, velocities and attitude quaternions recorded during the acqui passing all this information to Rugged, we will be able to precisely locate each point of the image on the Earth. Well, not exactly precise, as this first tutorial does not use a Digital Elevation Model, but considers the Earth as an ellipsoid. The DEM will be added in -a second tutorial. The objective here is limited to explain how to initialize everything -Rugged needs to know about the sensor and the acquisition. +a second tutorial [Direct location with DEM](./direct-location-with-DEM.html). The objective +here is limited to explain how to initialize everything Rugged needs to know about the sensor +and the acquisition. ## Sensor's definition @@ -31,7 +32,6 @@ Rugged needs to know about the sensor and the acquisition. Let's start by defining the imager. The sensor model is described by its viewing geometry (i.e. the line of sight of each physical pixel) and by its datation model. - ### Line of sight @@ -58,8 +58,8 @@ The viewing direction of pixel i with respect to the instrument is defined by th The instrument is oriented 10° off nadir around the X-axis, we need to rotate the viewing direction to obtain the line of sight in the satellite frame - Rotation rotation = new Rotation(axis, FastMath.toRadians(10)); - viewDir = rotation.applyTo(viewDir); + Rotation rotation = new Rotation(Vector3D.PLUS_I, FastMath.toRadians(10)); + Vector3D los = rotation.applyTo(viewDir); The viewing direction is the line of sight of one pixel. In the case of a single line sensor, Rugged expects to receive an array of LOS. The LOS can be time dependent (useful when applying @@ -70,7 +70,6 @@ instantiated from the viewing direction vector. List<TimeDependentLOS> lineOfSight = new ArrayList<TimeDependentLOS>(); lineOfSight.add(new FixedLOS(los)); - ### Datation model The datation model gives the line number in the image as a function of time, and vice-versa the @@ -115,13 +114,12 @@ auxiliary telemetry. Note that for simulation purpose, we could also use Orekit to simulate the orbit. It offers very convenient functions to propagate sun-synchronous orbits with yaw steering compensation (typical -orbits for Earth Observation satellites). - +orbits for Earth Observation satellites). ### Reference frames -Rugged expects the positions, velocities and quaternions to be expressed in an inertial frame. +Rugged expects the positions (unit: m), velocities (unit: m/s) and quaternions to be expressed in an inertial frame. All standard inertial and terrestrial frames are implemented in Orekit, so we just need to specify which frames we are using and convert if necessary. @@ -131,49 +129,54 @@ bulletins and other physical data are provided within the orekit-data folder. Th to configure Orekit to use this data. More information is given [here](https://www.orekit.org/forge/projects/orekit/wiki/Configuration). -In our application, we simply need to know the name of the frames we are working with. Position and +In our application, we simply need to know the name of the frames we are working with. Positions and velocities are given in the ITRF terrestrial frame, while the quaternions are given in EME2000 inertial frame. import org.orekit.frames.Frame; import org.orekit.frames.FramesFactory; + import org.orekit.utils.IERSConventions; Frame eme2000 = FramesFactory.getEME2000(); boolean simpleEOP = true; // we don't want to compute tiny tidal effects at millimeter level Frame itrf = FramesFactory.getITRF(IERSConventions.IERS_2010, simpleEOP); - ### Satellite attitude The attitude quaternions are grouped in a list of TimeStampedAngularCoordinates objects: import org.orekit.utils.TimeStampedAngularCoordinates; - List<TimeStampedAngularCoordinates> satelliteQList = new ArrayList<TimeStampedAngularCoordinates>();` + List<TimeStampedAngularCoordinates> satelliteQList = new ArrayList<TimeStampedAngularCoordinates>(); -Each attitude sample (quaternion, time) is added to the list +Each attitude sample (quaternion, time) is added to the list, AbsoluteDate attitudeDate = new AbsoluteDate(gpsDateAsString, TimeScalesFactory.getGPS()); - Rotation rotation = new Rotation(q0, q1, q2, q3, true); //q0 is the scalar term + Rotation rotation = new Rotation(q0, q1, q2, q3, true); // q0 is the scalar term Vector3D rotationRate = Vector3D.ZERO; - TimeStampedAngularCoordinates pair = new TimeStampedAngularCoordinates(attitudeDate, rotation, rotationRate); - satelliteQList.add(pair);` + Vector3D rotationAcceleration = Vector3D.ZERO; + TimeStampedAngularCoordinates pair = new TimeStampedAngularCoordinates(attitudeDate, rotation, rotationRate, rotationAcceleration); + satelliteQList.add(pair); + +where, for instance, gpsDateAsString is set to "2009-12-11T10:49:55.899994" ### Position and velocities -Similarly the position and velocities will be set in a list of `TimeStampedPVCoordinates`. Before being +Similarly the positions and velocities will be set in a list of `TimeStampedPVCoordinates`. Before being added to the list, they must be transformed to EME2000: + import org.orekit.utils.TimeStampedPVCoordinates; + import org.orekit.utils.PVCoordinates; + import org.orekit.frames.Transform; List<TimeStampedPVCoordinates> satellitePVList = new ArrayList<TimeStampedPVCoordinates>(); AbsoluteDate ephemerisDate = new AbsoluteDate(gpsDateAsString, TimeScalesFactory.getGPS()); - Vector3D position = new Vector3D(px, py, pz); - Vector3D velocity = new Vector3D(vx, vy, vz); + Vector3D position = new Vector3D(px, py, pz); // in ITRF, unit: m + Vector3D velocity = new Vector3D(vx, vy, vz); // in ITRF, unit: m/s PVCoordinates pvITRF = new PVCoordinates(position, velocity); Transform transform = itrf.getTransformTo(eme2000, ephemerisDate); - PVCoordinates pvEME2000 = transform.transformPVCoordinates(pITRF); - satellitePVList.add(new TimeStampedPVCoordinates(ephemerisDate, pEME2000, vEME2000)); + PVCoordinates pvEME2000 = transform.transformPVCoordinates(pvITRF); + satellitePVList.add(new TimeStampedPVCoordinates(ephemerisDate, pvEME2000.getPosition(), pvEME2000.getVelocity(), Vector3D.ZERO))); - ## Rugged initialization @@ -190,13 +193,13 @@ Finally we can initialize Rugged. It looks like this: import org.orekit.utils.IERSConventions; Rugged rugged = new Rugged (demTileUpdater, nbTiles, demAlgoId, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, - acquisitionStartDate, acquisitionStopDate, timeTolerance, + acquisitionStartDate, acquisitionStopDate, tStep, timeTolerance, satellitePVList, nbPVPoints, CartesianDerivativesFilter.USE_P, - satelliteQList, nbQPoints, AngularDerivativesFilter.USE_R, 0.1); + satelliteQList, nbQPoints, AngularDerivativesFilter.USE_R); Argh, that sounds complicated. It is not so difficult since we have already defined most of what is needed. Let's describe the arguments line by line: - + The first 3 are related to the DEM. Since we are ignoring the DEM, they can be set respectively to `null`, `0` and `AlgorithmId.IGNORE_DEM_USE_ELLIPSOID`. @@ -204,7 +207,8 @@ The next 3 arguments defines the ellipsoid and the reference frames: `EllipsoidI `InertialFrameId.EME2000`, `BodyRotatingFrameId.ITRF` On the third line, we find the time interval of the acquisition: acquisitionStartDate, acquisitionStopDate, -timeTolerance (margin allowed for extrapolation, in seconds). This is an important information as Rugged +tStep (step at which the pre-computed frames transforms cache will be filled), timeTolerance (margin +allowed for extrapolation, in seconds). This is an important information as Rugged will pre-compute a lot of stuff at initialization in order to optimize further calls to the direct and inverse location functions. @@ -217,25 +221,18 @@ The sensor models are added after initialization. We can add as many as we want. rugged.addLineSensor(lineSensor); - - ## Direct location Finally everything is set to do some real work. Let's try to locate a point on Earth Upper left point (first line, first pixel): + import org.orekit.bodies.GeodeticPoint; Vector3D position = lineSensor.getPosition(); // This returns a zero vector since we set the relative position of the sensor w.r.T the satellite to 0. AbsoluteDate firstLineDate = lineSensor.getDate(1); Vector3D los = lineSensor.getLos(firstLineDate, 0); GeodeticPoint upLeftPoint = rugged.directLocation(firstLineDate, position, los); - -The results are .... - - - - ## Source code -The source code is available in .... +The source code is available in DirectLocation.java diff --git a/src/site/resources/images/DEM-tiles-overlap.png b/src/site/resources/images/DEM-tiles-overlap.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ea0e42a5c5597c758d8c627c87f7927e765365 GIT binary patch literal 9425 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 D|6y(* literal 0 HcmV?d00001 diff --git a/src/site/resources/images/tile-description.png b/src/site/resources/images/tile-description.png new file mode 100644 index 0000000000000000000000000000000000000000..8df2bfd12fcb4177ae4b8f8d2fb8a328e4fa33c7 GIT binary patch literal 15212 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 literal 0 HcmV?d00001 diff --git a/src/site/site.xml b/src/site/site.xml index 77decb66..f3bf35b0 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -26,29 +26,30 @@ </bannerRight> <body> <menu name="Rugged"> - <item name="Overview" href="/index.html" /> - <item name="Getting the sources" href="/sources.html" /> - <item name="Building" href="/building.html" /> - <item name="Configuration" href="/configuration.html" /> - <item name="FAQ" href="/faq.html" /> - <item name="License" href="/license.html" /> - <item name="Downloads" href="/downloads.html" /> - <item name="Changes" href="/changes-report.html" /> - <item name="Contact" href="/contact.html" /> + <item name="Overview" href="/index.html" /> + <item name="Getting the sources" href="/sources.html" /> + <item name="Building" href="/building.html" /> + <item name="Configuration" href="/configuration.html" /> + <item name="FAQ" href="/faq.html" /> + <item name="License" href="/license.html" /> + <item name="Downloads" href="/downloads.html" /> + <item name="Changes" href="/changes-report.html" /> + <item name="Contact" href="/contact.html" /> </menu> <menu name="Design"> - <item name="Overview" href="/design/overview.html" /> - <item name="Technical choices" href="/design/technical-choices.html" /> - <item name="Digital Elevation Model" href="/design/digital-elevation-model.html" /> - <item name="Preliminary design" href="/design/preliminary-design.html" /> + <item name="Overview" href="/design/overview.html" /> + <item name="Technical choices" href="/design/technical-choices.html" /> + <item name="Digital Elevation Model" href="/design/digital-elevation-model.html" /> + <item name="Preliminary design" href="/design/preliminary-design.html" /> </menu> <menu name="Tutorials"> - <item name="Direct location" href="/tutorials/direct-location.html" /> + <item name="Direct location" href="/tutorials/direct-location.html" /> + <item name="Direct location with DEM" href="/tutorials/direct-location-with-DEM.html" /> </menu> <menu name="Development"> - <item name="Contributing" href="/contributing.html" /> - <item name="Guidelines" href="/guidelines.html" /> - <item name="Javadoc" href="/apidocs/index.html" /> + <item name="Contributing" href="/contributing.html" /> + <item name="Guidelines" href="/guidelines.html" /> + <item name="Javadoc" href="/apidocs/index.html" /> </menu> <menu ref="reports"/> </body> -- GitLab