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 :
+![DEM tiles overlap](../images/DEM-tiles-overlap.png)
+
+This diagram tries to represent the meaning of the different parameters in the definition of a tile :
+
+![tile description](../images/tile-description.png)
+
+## 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