A Sensor Geometry Application Re-usable by-Design
Project description
ASGARD
ASGARD is "A Sensor Geometry Application Reusable by-Design".
NOTE: Check ASGARD documentation here
Purpose
Main purposes of the GEOLIB are to:
- Serve as a base geometry bloc for different types of sensors
- Provide a flexible abstraction layer
- Support the generation of L1/L2 products.
- Provide compatibility with Sentinel missions 1, 2, 3 and beyond
The current Legacy codes for geometry application are:
- EOCFI library for Sentinel-1/3,
- S2GEO library, which SXGEO is a simplification for Sentinel-2
However, these codes are not in Python and not Open source. ASGARD was first developed to tackle those points of the Sentinel-1/2/3 geo-libraries, being in Python and Open-source.
Two versions of ASGARD can be used:
- ASGARD (refactored): Full re-implemented library not calling the Legacy code (EOCFI and SXGEO) of Sentinel1/2/3. It contains all the Geometry init schemas and Generic Models presented below
- ASGARD-Legacy: It is based on ASGARD in order to take and have the same the Geometry init schemas than ASGARD. It also uses generic parts of ASGARD as some models for example. It was developed to have a common interface than ASGARD but calling Legacy libraries instead of the Python re-implementation. This version can be used to assess geometric quality and processing performances of ASGARD. However, it will be deprecated at the end, once the ASGARD library will be fully validated and deployed. Note: It is to be noted that ASGARD is already intensively validated as presented in the Validation, but not yet fully deployed.
High-level API
Geometries
This tool is based on a Geometry abstraction, derived into specialized types of sensors. At the
end, you find a geometry object for each Sentinel sensor. These geometries expose the
High-level API. This object is initialized from a JSON-like structure with necessary metadata.
This metadata must be extracted from products, auxiliary data files.
Each geometry builds a set of coherent Low-level Models.
Geometries initialization
The abstract class AbstractGeometry is derived for each sensor:
- {class}
S1SARGeometry <asgard.sensors.sentinel1.csar.S1SARGeometry> - {class}
S2MSIGeometry <asgard.sensors.sentinel2.msi.S2MSIGeometry> - {class}
S3OLCIGeometry <asgard.sensors.sentinel3.olci.S3OLCIGeometry> - {class}
S3SLSTRGeometry <asgard.sensors.sentinel3.slstr.S3SLSTRGeometry> - ...
Each class is initialized with a custom dictionary. This dictionary must match the JSON schema
given by the init_schema method. This will look like:
from asgard.sensors.sentinel3 import S3OLCIGeometry
config = {
"sat": "SENTINEL_3",
"orbit_aux_info": {
"orbit_state_vectors": [
{
"times": {
"TAI": {"offsets": np.array([...])},
"UTC": {"offsets": np.array([...])},
"UT1": {"offsets": np.array([...])},
},
"positions": np.array([...]),
"velocities": np.array([...]),
"absolute_orbit": np.array([...]),
},
],
},
"dem_config_file": "path_to_dem",
"pointing_vectors": {
"X": np.array([...]),
"Y": np.array([...]),
},
"thermoelastic": {
"julian_days": np.array([...]),
"quaternions_1": np.array([...]),
"quaternions_2": np.array([...]),
"quaternions_3": np.array([...]),
"quaternions_4": np.array([...]),
"on_orbit_positions_angle": np.array([...]),
},
"frame": {
"times": {"offsets": np.array([...])},
},
}
my_product = S3OLCIGeometry(**config)
The input dictionary should contain all numeric and string values necessary to initialize the geometry. Most of the parsing from L0/L1 product tree metadata files should be done before. When the input data is large, Numpy arrays will be used instead of plain Python Lists.
High-level functions
Each class implementing the Geometry abstraction should provide the following features:
direct_loc(): perform direct location for a set of measurementsinverse_loc(): perform inverse location for a set of ground locationssun_angles(): compute Sun angles for a set of ground locations and timessun_distances(): compute Sun distances given times and optional ground locationsincidence_angles(): compute the viewing angles (ground to satellite) for a set of ground locations and timesfootprint(): compute the ground footprint of a geometric unit
Low-level models
Each geometry builds a set of coherent models. For example for Sentinel-2:
These models are an abstraction layers to provide a set of features:
- TimestampModel:
- Give a timestamp for each measurement
- OrbitModel:
- Propagates the orbit
- Interpolates the orbit to retrieve position, velocity and acceleration
- PlatformModel:
- Models the different frame transformation between the satellite orbital frame and the instrument frame
- Computes the attitude of the instrument frame at a given time
- PointingModel:
- Models the directions where the instrument can look. Examples:
- field of view of an optical sensor
- synthetic antenna orientation
- Computes the line of sight (at the sensor side) for a given measurement/detector/time.
- Models the directions where the instrument can look. Examples:
- PropagationModel:
- Handles the propagation of a signal (micro-wave, light, ...) from a target (Earth, Moon, star) to the sensor.
- Examples:
- Intersection of a line-of-sight (estimated at the instrument side) with a DEM.
- Intersection of a range/azimuth SAR pointing with a DEM
Other objects provide some base functions:
- Frame:
- Handles frames and coordinate system
- Transform:
- Handles frames transforms (maybe time dependant)
- Body:
- Model of the Earth, Moon and Sun
- Handles Earth position bulletin
- Handle surface models (ellipsoid, DEM)
- TimeReference:
- Handles conversion between time references
Low-level API
The low-level API rely on the Model abstraction. Each model will implement a part of the
"georeferencing pipeline". Most of them use the Rugged/Orekit wrappers as backend. Only two are
also available with the EOCFI backend:
- {class}
ExplorerTimeReference <asgard-legacy.models.explorer.ExplorerTimeReference> - {class}
ExplorerEarthBody <asgard-legacy.models.explorer.ExplorerEarthBody>
All the models are initialized based on keyword arguments, which conform to the JSON schema returned
by init_schema(). Here is a list of low-level models, by category:
| Category | Model | Role |
|---|---|---|
| Time | {class}TimeReference <asgard.models.time.TimeReference> |
Conversion between timescales leap seconds Conversion from ascii, cuc, transport |
| Body | {class}EarthBody <asgard.models.body.EarthBody> |
Cartesian geodetic conversion Frame conversion Sun position Topocentric conversion |
| Timestamp | {class}LineDetectorTimestampModel <asgard.models.lineardetector.LineDetectorTimestampModel> |
Line datation for line detector sensors |
| Timestamp | {class}ScanningDetectorTimestampModel <asgard.models.scanningdetector.ScanningDetectorTimestampModel> |
Sample datation for scanning detector (used for SLSTR) |
| Orbit | {class}GenericOrbitModel <asgard.models.orbit.GenericOrbitModel> |
Interpolate OSV Interpolate attitude Orbit information (ANX, ...) |
| Platform | {class}GenericPlatformModel <asgard.models.platform.GenericPlatformModel> |
Transform instrument frame to satellite frame |
| Pointing | {class}LineDetectorPointingModel <asgard.models.lineardetector.LineDetectorPointingModel> |
Poining vector for line detector sensors |
| Pointing | {class}ScanningDetectorPointingModel <asgard.models.scanningdetector.ScanningDetectorPointingModel> |
SLSTR pointing model |
| Propagation | {class}PropagationModel <asgard.models.propagation.PropagationModel> |
Line of sight propagation DEM and ellipsoid intersection |
| Propagation | {class}GroundRangePropagationModel <asgard.models.range.GroundRangePropagationModel> |
Ground range propagation Replacement of xp_target_ground_range |
Validation
The validation of ASGARD and ASGARD-Legacy implementations is presented in the validation document.
Some complementary and new results (overwriting the ones from the validation document) for 0.5.2 are available in the Additional_results_for_V5_2024-12
Additional comparisons/validations were performed (0.5.2) to compare asgard-legacy behaviour versus EOCFI and are available in EOCFI_ASGARD_Comparison_TechnicalNote.pdf
New dedicated L0 footprints validation (0.7.0) is available here:FootprintL0Validation.pdf Please note that this is in complement to the tests implemented directly in ASGARD.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file asgard_eopf-1.3.10.tar.gz.
File metadata
- Download URL: asgard_eopf-1.3.10.tar.gz
- Upload date:
- Size: 82.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c83cf377cd2f20c2ee55d60e230d09fd327a963e66275663a55ae6645711277c
|
|
| MD5 |
18cf9a764a5eca19ca961c3b44a9cb0d
|
|
| BLAKE2b-256 |
22c05e82b21c64d1e1642a0676b01b133680a221809f0acc9ba45a8f683119b5
|
File details
Details for the file asgard_eopf-1.3.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: asgard_eopf-1.3.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 378.2 kB
- Tags: CPython 3.14, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51d393919304a9f40a1186832f9c6615eaa7fb2295bac91d25fe3d00dfca5e05
|
|
| MD5 |
73daf002bbc5d13eae23a86a49d2a80c
|
|
| BLAKE2b-256 |
1ac964ae1480115a5d5c0b14ca95091f2f0c034a80ac524dcdb0ae9babbebb6c
|
File details
Details for the file asgard_eopf-1.3.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: asgard_eopf-1.3.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 370.0 kB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ffe26300d45132ae97f80a979d5b8108f465b02af80a615d5a63c153851ffb46
|
|
| MD5 |
30e66deecead9e095fe68b8a259915c6
|
|
| BLAKE2b-256 |
f0ea277706e9d3572feadb3820075da943ebb32c3c5604f6e421f27d76ffd224
|
File details
Details for the file asgard_eopf-1.3.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: asgard_eopf-1.3.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 378.0 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
501034904d2f2b7905f98cf7a630ad16e5936d7fd0cbd4b2d982753df0efa26b
|
|
| MD5 |
7e2ee18fa7eecbfb00d67325988312f4
|
|
| BLAKE2b-256 |
292cc72eaedee6a86f03357489ba499004400b1331bfa7430bd6f3a1ebcb73ec
|
File details
Details for the file asgard_eopf-1.3.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: asgard_eopf-1.3.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 376.3 kB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8257369adb06d474bb2e1d4b59456cfd72669234bef1995e5236a9a49475ece6
|
|
| MD5 |
b09856ea1db8bf4e8fc18c75af722d5e
|
|
| BLAKE2b-256 |
ad3cb2a22b4ef56ed26a203e7425c5931f819255cb6edc961982de2218905da5
|