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.

Come cancellare migliaia di email dai server Libero in un colpo solo

Posted in Uncategorized by jumpjack on 10 marzo 2016

La mia mailbox su Libero ha ormai 10 anni, e da almeno 2 non riesco più a star dietro alla cancellazione dei messaggi di SPAM: mi limito a marcarli come già letti, e ultimamente neanche tutti.

Risultato: la mia mailbox ha quasi raggiunto quota 1 GB e Libero minaccia di sospenderla!

Selezionare a mano migliaia di mail in Thunderbird e cancellare non funziona: il programma finisce per bloccarsi inesorabilmente, troppi dati!

Dopo ore di ricerche non sono riuscito a trovare un banalissimo programma che semplicemente cancelli tutte le mail su Libero da una certa data a un’altra data… finchè mi sono imbattuto nelle “potenzialità filtranti” di thunderbird!

Ecco quindi come fare per salvare in locale, sul proprio PC, le mail più vecchie, ed eliminarle dal server:

  • Installare Thunderbird e configurarlo con account IMAP in modo da sincronizzarlo col server, cioè in modo da fargli scaricare tutte le mail, ma specificando l’opzione di lasciare le mail sul server.
  • Se si è già utenti di Thunderbird da un po’, si può ovviamente saltare il primo passo e passare a questo: creare una cartella sotto la sezione “Local Folders”, creare un filtro (Tools–> Message Filters) che “catturi” tutte le mail comprese tra due date, fare in modo che sposti nella suddetta cartlla le mail filtrate, e  applicarlo alla mailbox da ripulire.
  • Aspettare MOLTI minuti se i messaggi sono migliaia…. Ma almeno il programma non si bloccherà.

Da notare che un filtro creato per un account non è applicabile ad altri account.

Durante l’esecuzione del filtro, il progresso del lavoro può essere monitorato nella barra di stato in basso:

barra-stato-filtro-thunderbird

barra-stato-filtro-thunderbird3                      barra-stato-filtro-thunderbird2

barra-stato-filtro-thunderbird4

Sulla sinistra si legge l’operazione in corso, sulla destra le dimensioni della mailbox, in calo.

 


Aggiornamento 2017 – Tutorial su accesso manuale a server IMAP

Connettersi tramite telnet al server di posta (la porta IMAP è la 143):

telnet mailserver.domain.com 143

Una volta connessi, inserire il comando:

tizio login user password

“tizio” è un identificatore di sessione: serve a far capire al server che tutti i comandi successivi saranno relativi all’utente “tizio”; cioè, tutti i messaggi marcati come “letti” o “cancellati” risulteranno tali solo a chi, in seguito, si collegherà all’account login+password MA usando anche l’identificatore “tizio”; questo permette a client diversi di collegarsi allo stesso server IMAP.

“login” è il comando vero e proprio.

 

Dopo che il server risponde col messaggio di benvenuto, è possibile inviare ulteriori comandi (con un punto iniziale):

Selezionare cartella:

. SELECT "INBOX"

Cercare un certo messaggio (notare che la stringa inserita è sempre considerata una sottostringa, quindi non servono asterischi o altri caratteri jolly):

. SEARCH FROM "user@example.org" SUBJECT "testo da cercare"

 

Il risultato della ricerca si presenterà in questa forma (l’asterisco indica che la riga è una risposta del server e non un comando)::

* SEARCH 5 10 456

Questa risposta significa che i messaggi corrispondenti ai criteri di ricerca specificati sono il n.5, il n.10 e il n.456.

Se una ricerca per soggetto non è sufficiente, è possibile scaricare il testo completo del messaggio; ciò può essere fatto sia lasciando il messaggio “intonso”…

. FETCH 5  BODY[TEXT].PEEK

… che marcandolo come letto:

. FETCH 5  BODY[TEXT]

In una sessione IMAP un messaggio può essere marcato come “cancellato”, ma non verrà effettivamente cancellato dal server finchè non viene esplicitamente impartito il comando di cancellazione “expunge”; la sequenza necessaria per cancellare un singolo messaggio è:

  • marcarlo col flag \Deleted  (. STORE mexnum +FLAGS \Deleted)
  • Spostarlo in cartella trash (. MOVE mexnum trash)
  • portarsi nella cartella trash (. SELECT trash)
  • confermare la cancellazione (. EXPUNGE )

Ad esempio, per cancellare il messaggio n.1 dalla casella inbox si possono semplicemente copiare nella finestra telnet queste righe:

. STORE 1 +FLAGS \Deleted
. MOVE 1 trash
. SELECT trash
. EXPUNGE

Per essere sicuri che sia proprio il messaggio che volete cancellare, magari prima è meglio impartire il comando:

. Fetch 1 ( flags body[header.fields (subject)])

 

Con questo comando è possibile visualizzare qual è lo spazio disponbile e qual è quello utilizzato:

. GETQUOTA ""

Risposta:

* QUOTA "" (STORAGE 123456 1048576)

Significa che sono usati 123456 bytes su 1048576 (cioè su 1 GB).

 

La sessione va terminata con:

. logout

Programmi utili:

Reference:

https://www.skytale.net/blog/archives/23-Manual-IMAP.html