Jumping Jack Flash weblog

Hacking Hayabusa 2 ;-)

Posted in astronomia by jumpjack on 29 settembre 2018

La pagina del simulatore di Hayabusa 2 contiene tantissimi dati ma per la maggior parte di scarso interesse (alba e tramonto di H2 sulle antenne DSN, frequenze usate,…).

C’è però una piccola, insospettabile parte della pagina che contiene un’informazione molto importante: il box che rappresenta in modo stilizzato come Hayabusa appare nel campo visivo (FOV) della telecamera grandangolare ONC-W1:

 

Esaminando il complicatissimo codice sorgente si scopre che il box è un oggetto che si chiama “onc-w1__screen”, che contiene al suo interno un oggetto “onc-w1__target”, cioè il dischetto che rappresenta Ryugu stilizzato.

Le dimensioni di quest’oggetto sono fissate mediante codice HTML5 come percentuale delle dimensioni dell’oggetto padre onc-w1__screen. Questa percentuale è ottenuta tramite una serie di complessi calcoli, implementati tramite un codice Javascript estremamente complicato da decodificare; tuttavia, usando il debugger di chrome ho scoperto che la pagina carica continuamente questo file: http://haya2now.jp/data/data.json ; inserendolo in un convertitore JSON/XML per facilitarne la lettura, e incrociandone il contenuto con alcune parti del codice javascript, ho scoperto questa struttura dati nel file:

 <status>
      <connections>
         <MLG>
            <band>Ka</band>
            <endAt>2018-09-29T22:00:00.000Z</endAt>
            <pass>180929-0200</pass>
            <startAt>2018-09-29T14:00:00.000Z</startAt>
         </MLG>
      </connections>
      <spacecraft>
         <Bus-P>703.391</Bus-P>
         <CMDBitrate1>1000</CMDBitrate1>
         <CMDBitrate2>15.625</CMDBitrate2>
         <COH>COH</COH>
         <CSAS>
            <element>13.009</element>
            <element>-0.128</element>
            <element>0.019</element>
            <element>-nan</element>
         </CSAS>
         <MGA>
            <element>-85.003</element>
            <element>-66.000</element>
         </MGA>
         <ModIndex>1.25</ModIndex>
         <ONC_A>297</ONC_A>
         <ONC_XY>
            <element>262</element>
            <element>260</element>
         </ONC_XY>
         <RNG_LIDAR>52</RNG_LIDAR>
         <RX-ANT1>XMGA</RX-ANT1>
         <RX-ANT2>XLGA-A</RX-ANT2>
         <RX1-Lock>CRR+DEM</RX1-Lock>
         <RX2-Lock>CRR</RX2-Lock>
         <RXLv1>-97.836</RXLv1>
         <RXLv2>-99.381</RXLv2>
         <THR>
            <element>60.561523</element>
            <element>24.645508</element>
            <element>0.759766</element>
            <element>23.698242</element>
            <element>6.846680</element>
            <element>37.575195</element>
            <element>13.926758</element>
            <element>32.855469</element>
            <element>0.926758</element>
            <element>59.537109</element>
            <element>56.843750</element>
            <element>61.607422</element>
         </THR>
         <TLMBitrate>8192</TLMBitrate>
         <TX-AMP>KaPA</TX-AMP>
         <TX-ANT>KaHGA</TX-ANT>
         <TX-XTRP>XTRP1</TX-XTRP>
         <TxMode>TLM</TxMode>
         <generatedAt>2018-09-29T16:28:14.138Z</generatedAt>
         <receivedAt>2018-09-29T16:46:16.895Z</receivedAt>
      </spacecraft>
      <updatedAt>2018-09-29T16:50:07.000Z</updatedAt>
   </status>

Si ha cioè un oggetto status che contiene le proprietà:

  • connections
  • spacecraft
  • updatedAt

La proprietà spacecraft contiene una molteplicità di sottoproprietà; ho evidenziato quella che mi interessa, cioè l’oggetto ONC_A, che quindi in javascript risponde al nome di status.spacecraft.ONC_A .

Dai sorgenti si intuisce che questo dato rappresenta l’area del dischetto che rappresenta Ryugu, e viene utilizzato per calcolare le dimensioni del dischetto in percentuale rispetto al box.

E’ possibile verificarlo osservando che nei giorni in cui H2 era in orbita di parcheggio a 20.000 metri di distanza dalla superficie, il valore di ONC_A oscillava intorno a 297, e quello della percentuale intorno a 3.76%. Sapendo che il diametro di Ryugu è di circa 900 metri, con un po’ di matematica e trigonometria si può calcolare che l’angolo sotteso da Ryugu nella telecamera è pari a beta = 2 * arctan (Diam/2  / Alt) = 2 * arctan (450/20.000) = 2 * arctan (0,0225) = 2,57788°

Dividendo quest’angolo per il campo visivo di 60° della telecamera si ottiene una percentuale pari al 4.2%, molto vicina al 3.76% visibile nella pagina web.

Questo significa che è possibile procedere a ritroso: noto il diametro di Ryugu e il valore di ONC_A, si può calcolare la distanza di H2 dalla superficie.

I calcoli non sono per niente banali, e sono illustrati in questa figura:

Cioè in breve:

Con l’argomento della tangente espresso in gradi.

Usando i radianti, invece:

calcolo-finale-rad

In termini più generici, validi cioè per un corpo celeste di qualunque diametro D e una telecamera con qualunque angolo visuale FOV che genera immagini larghe W pixel:
calcolo-finale-gen.png

Non essendo specificata l’unità di misura del FOV, la formula va bene sia per gradi che per radianti.

 

Grazie a questo semplice calcolo e a molta trigonometria sto allestendo una pagina che permetterà di seguire in tempo reale le varie prossime discese di H2 durante il rilascio di MASCOT, durante le prove di atterraggio, ecc..

Il suddetto file .json contiene anche altre due sottoproprietà di spacecraft:

 <generatedAt>2018-09-29T16:28:14.138Z</generatedAt>
 <receivedAt>2018-09-29T16:46:16.895Z</receivedAt>

Vista la distanza di circa 20 minuti  tra i due orari, dovrebbero essere gli orari di invio dati e di ricezione a terra.

 

Infine, questa tag nei sorgenti lascia supporre che la pagina venga aggiornata ogni 8 ore:

<meta http-equiv=”refresh” content=”10800″>

In realtà osservando l’esecuzione si vede un aggiornamento ogni pochi secondi, e il file viene ricaricato, stando al timestamp dell’url di chiamata, ogni 5 minuti:

http://haya2now.jp/data/data.json?1538249547553

http://haya2now.jp/data/data.json?1538249622621


In realtà la distanza di H2 da Ryugu è calcolata nella pagina in un altro modo, ma usando un codice Javascript complicatissimo che non sono riuscito a decodificare.

Se qualcuno vuole cimentarsi nell’impresa, il calcolo è nel codice racchiuso nella riga 155 del file http://haya2now.jp/js/app.js

var calcDistance = function (x, i1, i2) {
   return Math.sqrt(
      Math.pow(i1.x.interpolate(x) - i2.x.interpolate(x), 2) + Math.pow(i1.y.interpolate(x) - i2.y.interpolate(x), 2) + Math.pow(i1.z.interpolate(x) - i2.z.interpolate(x), 2)
   );
};

var distHaya2Ryugu = calcDistance(now.valueOf(), __WEBPACK_IMPORTED_MODULE_4__Util_js__[\"a\" /* default */].getInterpolators('hayabusa2'), __WEBPACK_IMPORTED_MODULE_4__Util_js__[\"a\" /* default */].getInterpolators('ryugu'));

AGGIORNAMENTO 2 OTTOBRE 2018

Ho scoperto che da quando è iniziata la discesa di Hayabusa per il rilascio del rover MASCOT, il dato RNG_LIDAR, che prima conteneva valori insensati intorno a 50, ha iniziato a contenere valori compatibili con la quota di Hayabusa, come facilmente verificabile confrontando i valori con quelli comunicati via via tramite account twitter dalla JAXA.

La pagina interattiva, quindi, durante la discesa mostra la “quota LIDAR” anzichè quella dedotta dal valore di ONC_A.

SIMULATORE


Aggiornamento 3 ottobre 2018

Ho scoperto altri dati utili nel f ile .json: vengono fornite le coordinate di Hayabusa, Terra e Ryugu nello spazio; quelle di Hayabusa in questa fase sono poco utili perchè rilevate da terra e quindi approssimate di +/-200 km (dichiarato da JAXA da qualche parte), ma sarà interessante usarle per seguire il rientro a terra a fine missione, quando Hayabusa riporterà i campioni analizzati; chissà fino a che quota da terra continueranno ad aggiornare i dati: se non sbaglio, la sonda si sfracellerà nell’atmosfera poco dopo aver rilasciato la capsula di rientro, che sarà l’unico pezzo a tornare a terra sano e salvo.

Non è però molto chiaro QUALI coordinate tenere in considerazione, perchè ci sono 7 gruppi di coordinate ma 6 stazioni, boh…:

  • data.geometry[i].hayabusa2.x
  • data.geometry[i].hayabusa2.y
  • data.geometry[i].hayabusa2.z

“i” varia da 0 a 6.

Un altro dato interessante è la distanza in secondi-luce tra hayabusa e la terra; qui ce n’è uno per ognuna delle 6 stazioni: data.geometry[x].obs[y].hayabusa2.delay_from ; in realtà c’è anche il tempo di ritorno (data.geometry[x].obs[y].hayabusa2.delay_to), ma ovviamente è identico; forse durante il viaggio terra-ryugu ad alta velocità però cambia per effetto doppler? “x” può valere da 0 a 6 e non so cosa significhi; y varia da 0 a 5 e ogni “obs” è un “observer”, cioè una stazione DSN.

Gli altri dati elencati in precedenza sono:

ONC_A: area in pixel^2 del cerchio che rappresenta Ryugu in un quadrato 1024×104:

  • data.status.spacecraft.ONC_A

RNG_LIDAR: distanza in metri di Hayabusa dalla superficie di Ryugu in metri; il LIDAR però non è sempre attivo; funziona per certo durante le operazioni di discesa sotto i 20.000:

  • data.status.spacecraft.RNG_LIDAR

Ci sono infine i “tempi cumulativi dei 12 thrusters di bordo”; forse potrebbero essere utili per simulare i cambiamenti di assetto di Hayabusa… ma solo sapendo dove si trova e dove punta ogni thruster! Comunque i dati sono:

  • data.status.spacecraft.THR[i]

Con “i” che va da 0 a 11.

In teoria, esaminando il log nei momenti di accelerazione/decelerazione, dovrebbe essere possibile capire almeno quali sono i thrusters che puntano in alti e quelli che puntano in basso.

Puoi inserire un commento qui sotto; diventerà visibile dopo la moderazione dell'amministratore

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: