Comment récupérer la trajectoire MSL EDL à l'aide de Javascript et de l'API webgeocalc ?

Jan 18 2021

J'ai trouvé une " passerelle javascript" vers les données NASA SPICE , l'API web "webgeocalc":

https://wgc2.jpl.nasa.gov:8443/webgeocalc/example/perform-calculation.html

Cela fonctionne à la fois en ligne et hors ligne (mais hors ligne, je dois utiliser une solution de contournement pour la politique CORS ), mais je ne peux pas obtenir de données pour la trajectoire EDL du Mars Science Laboratory.

Pour l'une des nombreuses tentatives, j'ai utilisé cette entrée:

{
  "kernels": [
    {
      "type": "KERNEL",
      "path": "pds/wgc/kernels/lsk/naif0012.tls"
    },
    {
      "type": "KERNEL",
      "path": "pds/wgc/kernels/spk/de430.bsp"
    },
    {
      "type": "KERNEL",
      "path": "/MSL/kernels/sclk/MSL_76_SCLKSCET.00017.tsc"
    },
    {
      "type": "KERNEL",
      "path": "/MSL/kernels/sclk/msl_lmst_ops120808_v1.tsc"
    },
    {
      "type": "KERNEL",
      "path": "/MSL/kernels/pck/pck00008.tpc"
    },
    {
      "type": "KERNEL",
      "path": "/MSL/kernels/spk/msl_cruise.bsp"
    },
    {
      "type": "KERNEL",
      "path": "/MSL/kernels/spk/msl_edl_v01.bsp"
    },
    {
      "type": "KERNEL",
      "path": "/MSL/kernels/spk/msl_ls_ops120808_iau2000_v1.bsp"
    },
    {
      "type": "KERNEL",
      "path": "/MSL/kernels/spk/msl_atls_ops120808_v1.bsp"
    },
    {
      "type": "KERNEL",
      "path": "/MSL/kernels/fk/msl_v08.tf"
    },
    {
      "type": "KERNEL",
      "path": "/MSL/kernels/spk/mar085s.bsp"
    }
],
  "timeSystem": "UTC",
  "timeFormat": "CALENDAR",
  "times": [
    "2012-08-06T05:00:00.000"
  ],
  "timeStep": 1,
  "timeStepUnits": "SECONDS",
  "calculationType": "STATE_VECTOR",
  "targetType": "FIXED_POINT",
  "targetLocation": {
    "centerBody": "-76030",
    "referenceFrame": "MSL_TOPO",
    "coordinateRepresentation": "RECTANGULAR",
    "x": 0,
    "y": 0,
    "z": 248.3
  },
  "observerType": "OBJECT",
  "observer": "MARS",
  "referenceFrame": "MSL_TOPO",
  "frameLocus": "OBSERVER",
  "aberrationCorrection": "NONE",
  "stateRepresentation": "RECTANGULAR"
}

Mais j'obtiens cette erreur ("Des données d'éphémérides insuffisantes ont été chargées") :

{
  "status": "ERROR",
  "message": "The request has failed.",
  "calculationId": "cbcab756-f854-41d1-95e2-077b840155ec",
  "error": {
    "shortDescription": "CSPICE_N0066: CSPICE.spkcpt: SPICE(SPKINSUFFDATA): [spkcpt_c --> SPKCPT --> SPKCVT --> ZZSPKFZT --> SPKGEO] Insufficient ephemeris data has been loaded to compute the state of -76030 (MSL_DESCENT_STAGE) relative to 499 (MARS) at the ephemeris epoch 2012 AUG 01 05:01:07.183."
  }
}

Ce noyau contient tous les référentiels disponibles pour MSL :

https://naif.jpl.nasa.gov/pub/naif/MSL/kernels/fk/msl_v08.tf

Par exemple:

   Landing site and sites:
   -----------------------

      MSL_LANDING_SITE         -76900

      MSL_SITE_1...399         -76501...-76899

   Cruise and descent stages and the rover:
   ----------------------------------------

      MSL                      -76

      MSL_ROVER                -76000

      MSL_SPACECRAFT           -76010
      MSL_CRUISE_STAGE         -76020
      MSL_DESCENT_STAGE        -76030
      MSL_ROVER_MECH           -76040
      MSL_CACS                 -76050

      MSL_DIMU_A               -76031

Les données doivent être disponibles pour une date spécifiée, car NASA Horizons est en mesure de les fournir :http://win98.altervista.org/space/exploration/3d/space-explorer-tracker.html?orbiter=-76&body=@499&start=2012-08-06%2005:10:04&stop=2012-08-06%2005:19:00&step=1m

J'ai inclus les noyaux répertoriés dans cet exemple à partir de la bibliothèque Timecraft.js, mais il me manque peut-être encore certains :

https://github.com/NASA-AMMOS/timecraftjs/blob/master/example/index.js

Chemins des noyaux (interface webgeocalc vs serveur NASA NAIF vs serveur webgeocal) :

  • "MSL/" -->https://naif.jpl.nasa.gov/pub/naif/MSL/--> /group/naif/critical/naifweb/pub/naif/MSL
  • "pds/wgc/noyaux/" -->https://naif.jpl.nasa.gov/pub/naif/generic_kernels/--> /group/naif/critical/naifweb/pub/naif/pds/wgc/kernels/

Réponses

1 jumpjack Jan 19 2021 at 15:30

Après des dizaines d'essais, j'ai trouvé le chemin.

Charge utile à envoyer via la requête POST :

{
  "kernels": [
     {
      "type": "KERNEL",
      "path": "pds/wgc/mk/latest_lsk_v0004.tm"
    },
    {
      "type": "KERNEL",
      "path": "pds/data/msl-m-spice-6-v1.0/mslsp_1000/extras/mk/msl_v25.tm"
    }


],
  "timeSystem": "UTC",
  "timeFormat": "CALENDAR",
     "intervals": [
       {
         "startTime": "2012-08-06T05:10:00",
         "endTime":   "2012-08-06T05:19:00"
       }
     ],
  "timeStep": 1,
  "timeStepUnits": "SECONDS",

  "calculationType": "STATE_VECTOR",

  "target" : "-76000",
  "targetType": "OBJECT",

  "observer": "MARS",
  "observerType": "OBJECT",

  "referenceFrame": "IAU_MARS",
  "frameLocus": "OBSERVER",
  "aberrationCorrection": "NONE",
  "stateRepresentation": "RECTANGULAR"
}

Veuillez noter que les noyaux spécifiés ne sont pas de vrais noyaux mais en fait des listes de noyaux :

Contenu de pds/wgc/mk/latest_lsk_v0004.tm (https://naif.jpl.nasa.gov/pub/naif/pds/wgc/mk/latest_lsk_v0004.tm)

KPL/MK

   This meta-kernel lists the latest generic LSK file available at the time
   when this meta-kernel was created.

   \begindata

      PATH_VALUES       = (
                           '../kernels'
                          )
      PATH_SYMBOLS      = (
                           'DATA'
                          )

      KERNELS_TO_LOAD   = (
                           '$DATA/lsk/naif0012.tls'
                          )

   \begintext

 

Contenu de pds/data/msl-m-spice-6-v1.0/mslsp_1000/extras/mk/msl_v25.tm (https://naif.jpl.nasa.gov/pub/naif/pds/data/msl-m-spice-6-v1.0/mslsp_1000/extras/mk/msl_v25.tm) (tous ces noyaux ne sont probablement pas nécessaires pour l'EDL) :

 \begindata
  PATH_VALUES     = ( './data' )
  PATH_SYMBOLS    = ( 'KERNELS' )
  KERNELS_TO_LOAD = (
                      '$KERNELS/lsk/naif0012.tls' '$KERNELS/pck/pck00008.tpc'
                      '$KERNELS/sclk/msl_lmst_ops120808_v1.tsc' '$KERNELS/sclk/msl_76_sclkscet_refit_s2.tsc'
                      '$KERNELS/fk/msl_v08.tf'

                      '$KERNELS/ik/msl_aux_v00.ti' '$KERNELS/ik/msl_chrmi_20120731_c03.ti'
                      '$KERNELS/ik/msl_hbla_20120731_c03.ti' '$KERNELS/ik/msl_hblb_20120731_c03.ti'
                      '$KERNELS/ik/msl_hbra_20120731_c03.ti' '$KERNELS/ik/msl_hbrb_20120731_c03.ti'
                      '$KERNELS/ik/msl_hfla_20120731_c03.ti' '$KERNELS/ik/msl_hflb_20120731_c03.ti'
                      '$KERNELS/ik/msl_hfra_20120731_c03.ti' '$KERNELS/ik/msl_hfrb_20120731_c03.ti'
                      '$KERNELS/ik/msl_mahli_20120731_c02.ti' '$KERNELS/ik/msl_mardi_20120731_c02.ti'
                      '$KERNELS/ik/msl_ml_20120731_c03.ti' '$KERNELS/ik/msl_mr_20120731_c03.ti'
                      '$KERNELS/ik/msl_nla_20120731_c04.ti' '$KERNELS/ik/msl_nlb_20130530_c05.ti'
                      '$KERNELS/ik/msl_nra_20120731_c04.ti' '$KERNELS/ik/msl_nrb_20130530_c05.ti'
                      '$KERNELS/ik/msl_struct_v01.ti' '$KERNELS/spk/msl_struct_v02.bsp'

                      '$KERNELS/spk/de425s.bsp' '$KERNELS/spk/mar085s.bsp'

                      '$KERNELS/spk/msl_cruise_v1.bsp' '$KERNELS/spk/msl_edl_v01.bsp'

                      '$KERNELS/spk/msl_ls_ops120808_iau2000_v1.bsp'
                      (...cut.... rover kernels for each sol ..... cut ...)

Mettez la charge utile ci-dessus dans cette page et cliquez sur SOUMETTRE LE CALCUL. Une fois les résultats prêts, vous obtiendrez un identifiant de calcul ; cliquez sur GET RESULTS pour télécharger la réponse.

La page fonctionne également hors ligne tant que vous ajoutez cette ligne :

baseURL = "https://cors-anywhere.herokuapp.com/https://wgc2.jpl.nasa.gov:8443/webgeocalc/api/"; 

après celui-ci :

var baseURL = ourLocation.substring(0, splicePoint) + "/api/"

Comment ça fonctionne:

Appelez la fonction performRequest(urlSuffix, payload, onComplete) une première fois en utilisant performRequest("calculation/new", payloadText, showProgress) , ce qui signifie que showProgress() sera appelé une fois la réponse reçue ; la réponse préliminaire ressemblera (une fois le calcul terminé):

{
  "status": "OK",
  "message": "The request was successful.",
  "calculationId": "7a304773-50f2-45c1-bb5a-bfd9fcbd063c",
  "result": {
    "phase": "COMPLETE",
    "expiresIn": 600
  }
}

Vous devez cocher "phase" pendant qu'elle passe de "LOADING KERNELS" à "COMPLETE".

Une fois le calcul terminé, la réponse contiendra l'identifiant ("calculationId") à utiliser pour demander la réponse réelle avec les résultats, qui ne sera disponible que pendant "expiresIn" secondes.

Pour demander les résultats du calcul, appelez à nouveau performRequest(urlSuffix, payload, onComplete) par performRequest("calculation/" + calculateID + "/results, null, showProgress)

Dans la réponse finale, response.columns sera un tableau des colonnes de vos données.

== Remarques supplémentaires ==

Noyauhttps://naif.jpl.nasa.gov/pub/naif/pds/data/msl-m-spice-6-v1.0/mslsp_1000/data/fk/msl_v08.tfcontient la liste des référentiels disponibles pour MSL ; les plus importants sont :

  • MSL_LANDING_SITE -76900
  • MSL_SITE_1...399 -76501...-76899
  • MSL-76
  • MSL_ROVER -76000
  • MSL_SPACECRAFT -76010 (skycrane + rover + backshell + heatshield ?)
  • MSL_CRUISE_STAGE -76020
  • MSL_DESCENT_STAGE -76030 (skycrane ou skycrane + rover ?)
  • MSL_ROVER_MECH -76040
  • MSL_CACS -76050 (trame MSL Cruise ACS (système de contrôle d'attitude ?))
  • MSL_DIMU_A -76031 (IMU de l'étage de descente)

Création d'une page spécifique pour télécharger les données EDL :

http://win98.altervista.org/space/exploration/EDL/(Plus précisémenthttp://win98.altervista.org/space/exploration/EDL/edl-retriever.html

)