Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
R
Rugged
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Orekit
Rugged
Commits
2767ddaa
Commit
2767ddaa
authored
10 years ago
by
Luc Maisonobe
Browse files
Options
Downloads
Patches
Plain Diff
Improved test coverage.
parent
0b2aea71
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
core/src/main/java/org/orekit/rugged/api/Rugged.java
+34
-7
34 additions, 7 deletions
core/src/main/java/org/orekit/rugged/api/Rugged.java
core/src/test/java/org/orekit/rugged/api/RuggedTest.java
+183
-9
183 additions, 9 deletions
core/src/test/java/org/orekit/rugged/api/RuggedTest.java
with
217 additions
and
16 deletions
core/src/main/java/org/orekit/rugged/api/Rugged.java
+
34
−
7
View file @
2767ddaa
...
@@ -798,7 +798,11 @@ public class Rugged {
...
@@ -798,7 +798,11 @@ public class Rugged {
}
}
}
}
/** Inverse localization of a ground point.
/** Find the date at which sensor sees a ground point.
* <p>
* This method is a partial {@link #inverseLocalization(String,
* GeodeticPoint, int, int) inverse localization} focusing only on date.
* </p>
* <p>
* <p>
* The point is given only by its latitude and longitude, the elevation is
* The point is given only by its latitude and longitude, the elevation is
* computed from the Digital Elevation Model.
* computed from the Digital Elevation Model.
...
@@ -808,17 +812,17 @@ public class Rugged {
...
@@ -808,17 +812,17 @@ public class Rugged {
* @param longitude ground point longitude
* @param longitude ground point longitude
* @param minLine minimum line number
* @param minLine minimum line number
* @param maxLine maximum line number
* @param maxLine maximum line number
* @return sensor pixel seeing ground point, or null if ground point cannot
* @return date at which ground point is seen by line sensor
* be seen between the prescribed line numbers
* @exception RuggedException if line cannot be localized, or sensor is unknown
* @exception RuggedException if line cannot be localized, or sensor is unknown
* @see #inverseLocalization(String, double, double, int, int)
*/
*/
public
SensorPixel
invers
eLocalization
(
final
String
sensorName
,
public
AbsoluteDate
dat
eLocalization
(
final
String
sensorName
,
final
double
latitude
,
final
double
longitude
,
final
double
latitude
,
final
double
longitude
,
final
int
minLine
,
final
int
maxLine
)
final
int
minLine
,
final
int
maxLine
)
throws
RuggedException
{
throws
RuggedException
{
final
GeodeticPoint
groundPoint
=
final
GeodeticPoint
groundPoint
=
new
GeodeticPoint
(
latitude
,
longitude
,
algorithm
.
getElevation
(
latitude
,
longitude
));
new
GeodeticPoint
(
latitude
,
longitude
,
algorithm
.
getElevation
(
latitude
,
longitude
));
return
invers
eLocalization
(
sensorName
,
groundPoint
,
minLine
,
maxLine
);
return
dat
eLocalization
(
sensorName
,
groundPoint
,
minLine
,
maxLine
);
}
}
/** Find the date at which sensor sees a ground point.
/** Find the date at which sensor sees a ground point.
...
@@ -867,6 +871,29 @@ public class Rugged {
...
@@ -867,6 +871,29 @@ public class Rugged {
}
}
/** Inverse localization of a ground point.
* <p>
* The point is given only by its latitude and longitude, the elevation is
* computed from the Digital Elevation Model.
* </p>
* @param sensorName name of the line sensor
* @param latitude ground point latitude
* @param longitude ground point longitude
* @param minLine minimum line number
* @param maxLine maximum line number
* @return sensor pixel seeing ground point, or null if ground point cannot
* be seen between the prescribed line numbers
* @exception RuggedException if line cannot be localized, or sensor is unknown
*/
public
SensorPixel
inverseLocalization
(
final
String
sensorName
,
final
double
latitude
,
final
double
longitude
,
final
int
minLine
,
final
int
maxLine
)
throws
RuggedException
{
final
GeodeticPoint
groundPoint
=
new
GeodeticPoint
(
latitude
,
longitude
,
algorithm
.
getElevation
(
latitude
,
longitude
));
return
inverseLocalization
(
sensorName
,
groundPoint
,
minLine
,
maxLine
);
}
/** Inverse localization of a point.
/** Inverse localization of a point.
* @param sensorName name of the line sensor
* @param sensorName name of the line sensor
* @param point point to localize
* @param point point to localize
...
...
This diff is collapsed.
Click to expand it.
core/src/test/java/org/orekit/rugged/api/RuggedTest.java
+
183
−
9
View file @
2767ddaa
...
@@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream;
...
@@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream
;
import
java.io.ByteArrayOutputStream
;
import
java.io.EOFException
;
import
java.io.EOFException
;
import
java.io.File
;
import
java.io.File
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.RandomAccessFile
;
import
java.io.RandomAccessFile
;
import
java.io.StreamCorruptedException
;
import
java.io.StreamCorruptedException
;
...
@@ -188,6 +189,9 @@ public class RuggedTest {
...
@@ -188,6 +189,9 @@ public class RuggedTest {
Assert
.
assertTrue
(
rugged
.
isAberrationOfLightCorrected
());
Assert
.
assertTrue
(
rugged
.
isAberrationOfLightCorrected
());
rugged
.
setAberrationOfLightCorrection
(
false
);
rugged
.
setAberrationOfLightCorrection
(
false
);
Assert
.
assertFalse
(
rugged
.
isAberrationOfLightCorrected
());
Assert
.
assertFalse
(
rugged
.
isAberrationOfLightCorrected
());
Assert
.
assertEquals
(
orbit
.
getDate
().
shiftedBy
(-
10.0
),
rugged
.
getMinDate
());
Assert
.
assertEquals
(
orbit
.
getDate
().
shiftedBy
(+
10.0
),
rugged
.
getMaxDate
());
Assert
.
assertEquals
(
0
,
rugged
.
getLineSensors
().
size
());
}
}
...
@@ -400,6 +404,18 @@ public class RuggedTest {
...
@@ -400,6 +404,18 @@ public class RuggedTest {
AngularDerivativesFilter
.
USE_R
,
0.001
);
AngularDerivativesFilter
.
USE_R
,
0.001
);
rugged
.
addLineSensor
(
lineSensor
);
rugged
.
addLineSensor
(
lineSensor
);
Assert
.
assertEquals
(
1
,
rugged
.
getLineSensors
().
size
());
Assert
.
assertTrue
(
lineSensor
==
rugged
.
getLineSensor
(
"line"
));
try
{
rugged
.
getLineSensor
(
"dummy"
);
Assert
.
fail
(
"an exception should have been thrown"
);
}
catch
(
RuggedException
re
)
{
Assert
.
assertEquals
(
RuggedMessages
.
UNKNOWN_SENSOR
,
re
.
getSpecifier
());
Assert
.
assertEquals
(
"dummy"
,
re
.
getParts
()[
0
]);
}
Assert
.
assertEquals
(
7176419.526
,
rugged
.
getScToInertial
(
lineSensor
.
getDate
(
dimension
/
2
)).
getTranslation
().
getNorm
(),
1.0
e
-
3
);
Assert
.
assertEquals
(
0.0
,
rugged
.
getBodyToInertial
(
lineSensor
.
getDate
(
dimension
/
2
)).
getTranslation
().
getNorm
(),
1.0
e
-
3
);
Assert
.
assertEquals
(
0.0
,
rugged
.
getInertialToBody
(
lineSensor
.
getDate
(
dimension
/
2
)).
getTranslation
().
getNorm
(),
1.0
e
-
3
);
rugged
.
setLightTimeCorrection
(
true
);
rugged
.
setLightTimeCorrection
(
true
);
rugged
.
setAberrationOfLightCorrection
(
false
);
rugged
.
setAberrationOfLightCorrection
(
false
);
...
@@ -662,6 +678,53 @@ public class RuggedTest {
...
@@ -662,6 +678,53 @@ public class RuggedTest {
}
}
@Test
public
void
testInterpolatorCannotDump
()
throws
RuggedException
,
OrekitException
,
URISyntaxException
,
IOException
{
int
dimension
=
200
;
String
path
=
getClass
().
getClassLoader
().
getResource
(
"orekit-data"
).
toURI
().
getPath
();
DataProvidersManager
.
getInstance
().
addProvider
(
new
DirectoryCrawler
(
new
File
(
path
)));
final
BodyShape
earth
=
createEarth
();
final
Orbit
orbit
=
createOrbit
(
Constants
.
EIGEN5C_EARTH_MU
);
AbsoluteDate
crossing
=
new
AbsoluteDate
(
"2012-01-01T12:30:00.000"
,
TimeScalesFactory
.
getUTC
());
// one line sensor
// position: 1.5m in front (+X) and 20 cm above (-Z) of the S/C center of mass
// los: swath in the (YZ) plane, looking at 50° roll, ±1° aperture
Vector3D
position
=
new
Vector3D
(
1.5
,
0
,
-
0.2
);
List
<
Vector3D
>
los
=
createLOS
(
new
Rotation
(
Vector3D
.
PLUS_I
,
FastMath
.
toRadians
(
50.0
)).
applyTo
(
Vector3D
.
PLUS_K
),
Vector3D
.
PLUS_I
,
FastMath
.
toRadians
(
1.0
),
dimension
);
// linear datation model: at reference time we get line 100, and the rate is one line every 1.5ms
LineDatation
lineDatation
=
new
LinearLineDatation
(
crossing
,
dimension
/
2
,
1.0
/
1.5
e
-
3
);
int
firstLine
=
0
;
int
lastLine
=
dimension
;
LineSensor
lineSensor
=
new
LineSensor
(
"line"
,
lineDatation
,
position
,
los
);
AbsoluteDate
minDate
=
lineSensor
.
getDate
(
firstLine
);
AbsoluteDate
maxDate
=
lineSensor
.
getDate
(
lastLine
);
Rugged
ruggedOriginal
=
new
Rugged
(
null
,
-
1
,
AlgorithmId
.
IGNORE_DEM_USE_ELLIPSOID
,
EllipsoidId
.
WGS84
,
InertialFrameId
.
EME2000
,
BodyRotatingFrameId
.
ITRF
,
minDate
,
maxDate
,
5.0
,
orbitToPV
(
orbit
,
earth
,
minDate
.
shiftedBy
(-
1.0
),
maxDate
.
shiftedBy
(+
1.0
),
0.25
),
8
,
CartesianDerivativesFilter
.
USE_PV
,
orbitToQ
(
orbit
,
earth
,
minDate
.
shiftedBy
(-
1.0
),
maxDate
.
shiftedBy
(+
1.0
),
0.25
),
2
,
AngularDerivativesFilter
.
USE_R
,
0.001
);
FileOutputStream
fos
=
new
FileOutputStream
(
tempFolder
.
newFile
());
fos
.
close
();
try
{
ruggedOriginal
.
dumpInterpolator
(
fos
);
Assert
.
fail
(
"an exception should have been thrown"
);
}
catch
(
RuggedException
re
)
{
Assert
.
assertEquals
(
IOException
.
class
,
re
.
getCause
().
getClass
());
}
}
@Test
@Test
public
void
testInterpolatorDumpWrongFrame
()
public
void
testInterpolatorDumpWrongFrame
()
throws
RuggedException
,
OrekitException
,
URISyntaxException
{
throws
RuggedException
,
OrekitException
,
URISyntaxException
{
...
@@ -917,10 +980,19 @@ public class RuggedTest {
...
@@ -917,10 +980,19 @@ public class RuggedTest {
@Test
@Test
public
void
testInverseLocalization
()
public
void
testInverseLocalization
()
throws
RuggedException
,
OrekitException
,
URISyntaxException
{
throws
RuggedException
,
OrekitException
,
URISyntaxException
{
checkInverseLocalization
(
2000
,
false
,
false
,
5.0
e
-
5
,
8.0
e
-
5
);
checkInverseLocalization
(
2000
,
false
,
false
,
7.0
e
-
6
,
6.0
e
-
6
);
checkInverseLocalization
(
2000
,
false
,
true
,
5.0
e
-
5
,
8.0
e
-
5
);
checkInverseLocalization
(
2000
,
false
,
true
,
1.0
e
-
5
,
8.0
e
-
4
);
checkInverseLocalization
(
2000
,
true
,
false
,
5.0
e
-
5
,
8.0
e
-
5
);
checkInverseLocalization
(
2000
,
true
,
false
,
6.0
e
-
6
,
5.0
e
-
3
);
checkInverseLocalization
(
2000
,
true
,
true
,
5.0
e
-
5
,
8.0
e
-
5
);
checkInverseLocalization
(
2000
,
true
,
true
,
8.0
e
-
6
,
9.0
e
-
4
);
}
@Test
public
void
testDateLocalization
()
throws
RuggedException
,
OrekitException
,
URISyntaxException
{
checkDateLocalization
(
2000
,
false
,
false
,
2.0
e
-
8
);
checkDateLocalization
(
2000
,
false
,
true
,
2.0
e
-
8
);
checkDateLocalization
(
2000
,
true
,
false
,
8.0
e
-
9
);
checkDateLocalization
(
2000
,
true
,
true
,
2.0
e
-
8
);
}
}
@Test
@Test
...
@@ -1130,14 +1202,116 @@ public class RuggedTest {
...
@@ -1130,14 +1202,116 @@ public class RuggedTest {
for
(
double
p
=
0
;
p
<
gp
.
length
-
1
;
p
+=
1.0
)
{
for
(
double
p
=
0
;
p
<
gp
.
length
-
1
;
p
+=
1.0
)
{
int
i
=
(
int
)
FastMath
.
floor
(
p
);
int
i
=
(
int
)
FastMath
.
floor
(
p
);
double
d
=
p
-
i
;
double
d
=
p
-
i
;
GeodeticPoint
g
=
new
GeodeticPoint
((
1
-
d
)
*
gp
[
i
].
getLatitude
()
+
d
*
gp
[
i
+
1
].
getLatitude
()
,
SensorPixel
sp
=
rugged
.
inverseLocalization
(
"line"
,
(
1
-
d
)
*
gp
[
i
].
getL
ong
itude
()
+
d
*
gp
[
i
+
1
].
getL
ong
itude
(),
(
1
-
d
)
*
gp
[
i
].
getL
at
itude
()
+
d
*
gp
[
i
+
1
].
getL
at
itude
(),
(
1
-
d
)
*
gp
[
i
].
get
Alt
itude
()
+
d
*
gp
[
i
+
1
].
get
Alt
itude
()
);
(
1
-
d
)
*
gp
[
i
].
get
Long
itude
()
+
d
*
gp
[
i
+
1
].
get
Long
itude
()
,
SensorPixel
sp
=
rugged
.
inverseLocalization
(
"line"
,
g
,
0
,
dimension
);
0
,
dimension
);
Assert
.
assertEquals
(
referenceLine
,
sp
.
getLineNumber
(),
maxLineError
);
Assert
.
assertEquals
(
referenceLine
,
sp
.
getLineNumber
(),
maxLineError
);
Assert
.
assertEquals
(
p
,
sp
.
getPixelNumber
(),
maxPixelError
);
Assert
.
assertEquals
(
p
,
sp
.
getPixelNumber
(),
maxPixelError
);
}
}
}
// point out of line (20 pixels before first pixel)
Assert
.
assertNull
(
rugged
.
inverseLocalization
(
"line"
,
21
*
gp
[
0
].
getLatitude
()
-
20
*
gp
[
1
].
getLatitude
(),
21
*
gp
[
0
].
getLongitude
()
-
20
*
gp
[
1
].
getLongitude
(),
0
,
dimension
));
// point out of line (20 pixels after last pixel)
Assert
.
assertNull
(
rugged
.
inverseLocalization
(
"line"
,
-
20
*
gp
[
gp
.
length
-
2
].
getLatitude
()
+
21
*
gp
[
gp
.
length
-
1
].
getLatitude
(),
-
20
*
gp
[
gp
.
length
-
2
].
getLongitude
()
+
21
*
gp
[
gp
.
length
-
1
].
getLongitude
(),
0
,
dimension
));
// point out of line (20 lines before first line)
GeodeticPoint
[]
gp0
=
rugged
.
directLocalization
(
"line"
,
0
);
GeodeticPoint
[]
gp1
=
rugged
.
directLocalization
(
"line"
,
1
);
Assert
.
assertNull
(
rugged
.
inverseLocalization
(
"line"
,
21
*
gp0
[
dimension
/
2
].
getLatitude
()
-
20
*
gp1
[
dimension
/
2
].
getLatitude
(),
21
*
gp0
[
dimension
/
2
].
getLongitude
()
-
20
*
gp1
[
dimension
/
2
].
getLongitude
(),
0
,
dimension
));
// point out of line (20 lines after last line)
GeodeticPoint
[]
gp2
=
rugged
.
directLocalization
(
"line"
,
dimension
-
2
);
GeodeticPoint
[]
gp3
=
rugged
.
directLocalization
(
"line"
,
dimension
-
1
);
Assert
.
assertNull
(
rugged
.
inverseLocalization
(
"line"
,
-
20
*
gp2
[
dimension
/
2
].
getLatitude
()
+
21
*
gp3
[
dimension
/
2
].
getLatitude
(),
-
20
*
gp2
[
dimension
/
2
].
getLongitude
()
+
21
*
gp3
[
dimension
/
2
].
getLongitude
(),
0
,
dimension
));
}
private
void
checkDateLocalization
(
int
dimension
,
boolean
lightTimeCorrection
,
boolean
aberrationOfLightCorrection
,
double
maxDateError
)
throws
RuggedException
,
OrekitException
,
URISyntaxException
{
String
path
=
getClass
().
getClassLoader
().
getResource
(
"orekit-data"
).
toURI
().
getPath
();
DataProvidersManager
.
getInstance
().
addProvider
(
new
DirectoryCrawler
(
new
File
(
path
)));
final
BodyShape
earth
=
createEarth
();
final
Orbit
orbit
=
createOrbit
(
Constants
.
EIGEN5C_EARTH_MU
);
AbsoluteDate
crossing
=
new
AbsoluteDate
(
"2012-01-01T12:30:00.000"
,
TimeScalesFactory
.
getUTC
());
// one line sensor
// position: 1.5m in front (+X) and 20 cm above (-Z) of the S/C center of mass
// los: swath in the (YZ) plane, looking at 50° roll, 2.6" per pixel
Vector3D
position
=
new
Vector3D
(
1.5
,
0
,
-
0.2
);
List
<
Vector3D
>
los
=
createLOS
(
new
Rotation
(
Vector3D
.
PLUS_I
,
FastMath
.
toRadians
(
50.0
)).
applyTo
(
Vector3D
.
PLUS_K
),
Vector3D
.
PLUS_I
,
FastMath
.
toRadians
(
dimension
*
2.6
/
3600.0
),
dimension
);
// linear datation model: at reference time we get line 100, and the rate is one line every 1.5ms
LineDatation
lineDatation
=
new
LinearLineDatation
(
crossing
,
dimension
/
2
,
1.0
/
1.5
e
-
3
);
int
firstLine
=
0
;
int
lastLine
=
dimension
;
LineSensor
lineSensor
=
new
LineSensor
(
"line"
,
lineDatation
,
position
,
los
);
AbsoluteDate
minDate
=
lineSensor
.
getDate
(
firstLine
).
shiftedBy
(-
1.0
);
AbsoluteDate
maxDate
=
lineSensor
.
getDate
(
lastLine
).
shiftedBy
(+
1.0
);
TileUpdater
updater
=
new
RandomLandscapeUpdater
(
0.0
,
9000.0
,
0.5
,
0xf0a401650191f9f6
l
,
FastMath
.
toRadians
(
1.0
),
257
);
Rugged
rugged
=
new
Rugged
(
updater
,
8
,
AlgorithmId
.
DUVENHAGE
,
EllipsoidId
.
WGS84
,
InertialFrameId
.
EME2000
,
BodyRotatingFrameId
.
ITRF
,
minDate
,
maxDate
,
5.0
,
orbitToPV
(
orbit
,
earth
,
minDate
.
shiftedBy
(-
1.0
),
maxDate
.
shiftedBy
(+
1.0
),
0.25
),
8
,
CartesianDerivativesFilter
.
USE_PV
,
orbitToQ
(
orbit
,
earth
,
minDate
.
shiftedBy
(-
1.0
),
maxDate
.
shiftedBy
(+
1.0
),
0.25
),
2
,
AngularDerivativesFilter
.
USE_R
,
0.001
);
rugged
.
setLightTimeCorrection
(
lightTimeCorrection
);
rugged
.
setAberrationOfLightCorrection
(
aberrationOfLightCorrection
);
rugged
.
addLineSensor
(
lineSensor
);
double
referenceLine
=
0.87654
*
dimension
;
GeodeticPoint
[]
gp
=
rugged
.
directLocalization
(
"line"
,
referenceLine
);
for
(
double
p
=
0
;
p
<
gp
.
length
-
1
;
p
+=
1.0
)
{
int
i
=
(
int
)
FastMath
.
floor
(
p
);
double
d
=
p
-
i
;
AbsoluteDate
date
=
rugged
.
dateLocalization
(
"line"
,
(
1
-
d
)
*
gp
[
i
].
getLatitude
()
+
d
*
gp
[
i
+
1
].
getLatitude
(),
(
1
-
d
)
*
gp
[
i
].
getLongitude
()
+
d
*
gp
[
i
+
1
].
getLongitude
(),
0
,
dimension
);
Assert
.
assertEquals
(
0.0
,
date
.
durationFrom
(
lineSensor
.
getDate
(
referenceLine
)),
maxDateError
);
}
// point out of line (20 lines before first line)
GeodeticPoint
[]
gp0
=
rugged
.
directLocalization
(
"line"
,
0
);
GeodeticPoint
[]
gp1
=
rugged
.
directLocalization
(
"line"
,
1
);
Assert
.
assertNull
(
rugged
.
dateLocalization
(
"line"
,
21
*
gp0
[
dimension
/
2
].
getLatitude
()
-
20
*
gp1
[
dimension
/
2
].
getLatitude
(),
21
*
gp0
[
dimension
/
2
].
getLongitude
()
-
20
*
gp1
[
dimension
/
2
].
getLongitude
(),
0
,
dimension
));
// point out of line (20 lines after last line)
GeodeticPoint
[]
gp2
=
rugged
.
directLocalization
(
"line"
,
dimension
-
2
);
GeodeticPoint
[]
gp3
=
rugged
.
directLocalization
(
"line"
,
dimension
-
1
);
Assert
.
assertNull
(
rugged
.
dateLocalization
(
"line"
,
-
20
*
gp2
[
dimension
/
2
].
getLatitude
()
+
21
*
gp3
[
dimension
/
2
].
getLatitude
(),
-
20
*
gp2
[
dimension
/
2
].
getLongitude
()
+
21
*
gp3
[
dimension
/
2
].
getLongitude
(),
0
,
dimension
));
}
private
BodyShape
createEarth
()
private
BodyShape
createEarth
()
throws
OrekitException
{
throws
OrekitException
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment