¿Cómo recuperar la trayectoria de MSL EDL usando Javascript y la API webgeocalc?

Jan 18 2021

Encontré una " puerta de enlace javascript" a los datos de NASA SPICE , la API web "webgeocalc":

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

Funciona tanto en línea como fuera de línea (pero fuera de línea tengo que usar una solución alternativa para la política CORS ), pero no puedo obtener datos para la trayectoria EDL del Laboratorio de Ciencias de Marte.

Para uno de los muchos intentos, utilicé esta entrada:

{
  "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"
}

Pero recibo este error ("Se han cargado datos de efemérides insuficientes"):

{
  "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."
  }
}

Este núcleo contiene todos los marcos de referencia disponibles para MSL:

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

Por ejemplo:

   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

Los datos deben estar disponibles para la fecha especificada, ya que NASA Horizons puede proporcionarlos: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

Incluí los núcleos enumerados en este ejemplo de la biblioteca Timecraft.js, pero tal vez todavía me faltan algunos:

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

Rutas de kernels (interfaz webgeocalc vs servidor NASA NAIF vs servidor webgeocal):

  • "MSL/" -->https://naif.jpl.nasa.gov/pub/naif/MSL/--> /grupo/naif/critical/naifweb/pub/naif/MSL
  • "pds/wgc/núcleos/" -->https://naif.jpl.nasa.gov/pub/naif/generic_kernels/--> /grupo/naif/critical/naifweb/pub/naif/pds/wgc/kernels/

Respuestas

1 jumpjack Jan 19 2021 at 15:30

Después de decenas de pruebas, encontré el camino.

Carga útil que se enviará a través de la consulta 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"
}

Tenga en cuenta que los núcleos especificados no son núcleos reales, sino listas de núcleos:

Contenido 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

 

Contenido 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) (probablemente no todos estos núcleos sean necesarios para 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 ...)

Coloque la carga útil anterior en esta página y haga clic en ENVIAR CÁLCULO. Una vez que los resultados estén listos, obtendrá una identificación de cálculo; haga clic en OBTENER RESULTADOS para descargar la respuesta.

La página también funciona sin conexión siempre que agregue esta línea:

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

despues de este:

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

Cómo funciona:

Llame a la función performRequest(urlSuffix, payload, onComplete) por primera vez usando performRequest("calculation/new", payloadText, showProgress) , lo que significa que se llamará a showProgress() una vez que se reciba la respuesta; la respuesta preliminar se verá así (una vez que se complete el cálculo):

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

Debe marcar "fase" mientras pasa de "CARGANDO NÚCLEO" a "COMPLETO".

Una vez que se completa el cálculo, la respuesta contendrá el identificador ("calculationId") que se usará para solicitar la respuesta real con los resultados, que estará disponible solo durante "expiresIn" segundos.

Para solicitar los resultados del cálculo, vuelva a llamar a performRequest(urlSuffix, payload, onComplete) mediante performRequest("calculation/" +calculationID + "/results, null, showProgress)

En la respuesta final, response.columns será una matriz de las columnas de sus datos.

== Notas adicionales ==

Núcleohttps://naif.jpl.nasa.gov/pub/naif/pds/data/msl-m-spice-6-v1.0/mslsp_1000/data/fk/msl_v08.tfcontiene la lista de marcos de referencia disponibles para MSL; más importantes son:

  • MSL_LANDING_SITE -76900
  • MSL_SITE_1...399 -76501...-76899
  • MSL-76
  • MSL_ROVER-76000
  • MSL_SPACECRAFT -76010 (¿skycrane + rover + carcasa trasera + escudo térmico?)
  • MSL_CRUISE_ETAPA -76020
  • MSL_DESCENT_STAGE -76030 (¿grúa aérea o grúa aérea + rover?)
  • MSL_ROVER_MECH-76040
  • MSL_CACS -76050 (marco MSL Cruise ACS (¿Sistema de control de actitud?))
  • MSL_DIMU_A -76031 (IMU de etapa de descenso)

Creó una página específica para descargar datos de EDL:

http://win98.altervista.org/space/exploration/EDL/(específicamentehttp://win98.altervista.org/space/exploration/EDL/edl-retriever.html

)