Wednesday, August 2, 2017

Don't reinvent the wheel - non reinventiamo la ruota, CSPICE toolkit è perfetto anche per un astrologo

Nei post passati ho posto spesso l'enfasi sull'autoproduzione di software. Se avete cominciato a programmare, come me, alla fine degli anni '80, ricorderete che i compilatori dell'epoca non erano sempre facilmente disponibili e, almeno in ambiente Windows, nemmeno gratuiti. Il primo software di astrologia che ho usato per il DOS di allora era copiato da un numero della rivista del CIDA, scritto in basic, che avevo dotato di una misera interfaccia grafica, completato da alcune routine scritte da me e compilato con Quick Basic. Ne ho ancora la copia, che gira sotto DosBox, e questa a fianco è la sua immagine in esecuzione.

Sono andato sempre un po' di corsa, per cui il programma non ha un titolo decente, l'avevo chiamato Prova70 in base al numero di release, e tale è rimasto.

Da metà anni 80 in avanti ho iniziato a usare visual basic versione 5 poi 6, che è rimasto un po' l'unica piattaforma fino all'avvento di .NET e Visual Basic 2005, 2008 e successivi. Oggi uso soprattutto linux Debian, Ubuntu e derivate, che mettono a disposizione una quantità di software di elevata qualità che fa buona concorrenza a sistemi operativi più diffusi presso gli utenti desktop (mi riferisco a Windows e Mac, ovviamente), linguaggio di programmazione python per quasi tutto (ma pasticcio volentieri con Tcl/Tk, l'ho scoperto da poco meno di un anno ma me ne sono innamorato subito), Android Studio per i sistemi mobile e Debian ARMhf per la raspberry pi come ambiente di sperimentazione (ve ne parlo tra poco, a proposito).

Non c'è maggiore soddisfazione che farsi le cose da sè ma, come scrivo nel titolo, non è che dobbiamo sempre reinventare la ruota, proprio oggi che internet ci dà accesso alle migliori librerie software disponibili. Per questo motivo oggi vi mostro come sono riuscito a installare il toolkit CSPICE, che è lo standard per il calcolo astronomico e non solo, visto che ci mette in grado, volendo, di calcolare il movimento della nostra astronave e farcela parcheggiare, con discreta approssimazione, nel giardino di casa.

CSPICE è la versione in linguaggio C del toolkit elaborato dalla NASA/JPL come "an ancillary information system that provides scientists and engineers the capability to include space geometry and event data into mission design, science observation planning, and science data analysis software."

E' molto esteso e complesso, il solo core contiene più di 1500 funzioni, che spaziano dalla gestione e conversione di data e ora, al calcolo di posizione e movimento di oggetti quali pianeti, asteroidi, satelliti e astronavi, anche nelle relazioni geometriche tra loro e altri oggetti vicini e lontani, alla conversione tra sistemi di coordinate celesti e altro ancora. Per un'esposizione dettagliata delle funzioni disponibili vi invito a leggere la pagina della documentazione di CSPICE.

A questo punto pero' devo fare un

DISCLAIMER - AVVERTENZA

Non so quanto l'astrologia sia considerata conforme alla dignità scientifica delle istituzioni che hanno creato il software. Alcune importanti effemeridi basate su kernel JPL sono utilizzate da software open source e commerciali (vedi Swiss Ephemeris, di cui vi ho parlato in precedenza), per cui mi sento relativamente sicuro di non abusare dei termini della licenza. In ogni caso non fornisco software basato su librerie NASA/JPL ma mi limito a dare qualche suggerimento per un libero e disinteressato utilizzo (volendo anche in campo astronomico, l'astrologo si accontenta di poco, qualcuno dei metodi che descrivo puo' essere benefico anche per astronomi dilettanti e professionisti). Se le mie procedure risultassero in qualche modo difettose, comunque, non me ne faccio carico oltre i limiti ragionevoli della sperimentazione. Ognuno di voi è libero di prendere quello che faccio, copiarlo, modificarlo, venderlo (ammesso che abbia un valore commerciale), sono anche disponibile a dare qualche suggerimento in privato, ma non assumo la responsabilità che deriva dall'uso di queste procedure, ripeto, sono anch'io uno sperimentatore e un dilettante.

Passiamo alle cose divertenti.

Premessa

Non so perchè la NASA/JPL mette a disposizione toolkit in C e FORTRAN per ambienti x86 e x64, per PC, MAC Solaris e SPARC e si dimentica dei processori ARM, se volete compilare il toolkit in una raspberry PI 2 dovete fare qualche piccolo ritocco alla procedura di compilazione. Per prendere il caso più generale (se siete fanatici come me e volete installare il toolkit in uno smartphone cinese da 100 euro, come ho fatto io, siete i benvenuti) dovete in primo luogo trovare il software e compilarlo nel vostro ambiente operativo. Facciamo qualche caso, guardando la tabella delle versioni disponibili per il linguaggio C:

Download e decompressione

  • Mac/Intel, OSX, Apple C, 32bit
  • Mac/Intel, OSX, Apple C, 64bit
  • PC, CYGWIN, gCC, 32bit
  • PC, CYGWIN, gCC, 64bit
  • PC, Linux, gCC, 32bit
  • PC, Linux, gCC, 64bit
  • PC, Windows, MS Visual C, 32bit
  • PC, Windows, MS Visual C, 64bit
  • Sun/Intel, Solaris, Sun C, 32bit
  • Sun/Intel, Solaris, Sun C, 64bit
  • Sun/SPARC, Solaris, gCC, 32bit
  • Sun/SPARC, Solaris, gCC, 64bit
  • Sun/SPARC, Solaris, Sun C, 32bit
  • Sun/SPARC, Solaris, Sun C, 64bit

Io uso una Linux Mint 18.2 64bit, basata su Ubuntu 16.04, per cui la versione PC; Linux, gCC, 64bit mi va benissimo. Cliccando il link si apre una nuova pagina, dove vediamo, in prima posizione nell'elenco, la voce cspice.tar.Z. Facciamo il download dove preferiamo, magari sul desktop.

Apriamo una finestra terminale nella directory di salvataggio e lanciamo il comando:

tar xvf cspice.tar.Z

Diamo invio e aspettiamo che venga costruita una nuova directory contenente tutti i file del toolkit.

Compilazione statica

Nella directory cspice appena creata troviamo un file di installazione makeall.csh. Vi prego di notare l'estensione csh, si tratta di uno script per la shell csh, che è un po' diversa dalla bash che usiamo abitualmente in ambiente linux. Procediamo al suo download, la useremo forse solo per questa procedura, ma ne vale la pena:

sudo apt install csh

Ora possiamo lanciare la compilazione, con il comando

sudo csh ./makeall.csh

Ci vorrà un po', abbiate pazienza.

Al termine del processo, nella sottodirectory lib troviamo il file cspice.a, che è la libreria statica per il linker di C. Non è quella che ci serve per Python, dobbiamo compilare diversamente. Il lancio dello script ha però consentito di decomprimere ulteriormente i file, creandone di nuovi. Di questi abbiamo bisogno per il prossimo passaggio procedurale.

Variante per processori ARM

In una raspberry pi è installato, di solito, il sistema operativo linux Debian jessie sotto distribuzione Raspbian. Non è affatto diverso dalla Debian per x86 nel funzionamento, ma lo è in relazione all'architettura del sistema. Se lanciamo lo script di cui al paragrafo precedente su raspberry pi va subito in crash. Lo script dovrebbe consentire di rimuovere i riferimenti a tale tipo di architettura, ma dopo alcuni tentativi ho scelto una via più semplice e funzionale. Entrate da teminale nella directory cspice e lanciate il seguente comando:

grep -rl "m64" . --include "*.csh" | sudo xargs sed -i "s/\-m64//g"

oppure, se avete scaricato la versione 32 bit del toolkit

grep -rl "m32" . --include "*.csh" | sudo xargs sed -i "s/\-m32//g"

Il comando rimuoverà in modo ricorsivo tutti i riferimenti del compilatore alle architetture 64 o 32bit, per cui abiliterà il funzionamento dello script makeall.csh che abbiamo già visto in precedenza. In questo modo avremo effettuato una compilazione statica del toolkit anche in ambiente ARM, con grande gioia di tutti gli astrofili possessori di raspberry pi (o di smartphone cinesi).

Compilazione dinamica

Per usare python nel calcolo astronomico ci sono diverse interessanti possibilità:

  • La libreria AstroPy è una community based library, complessa e articolata, decisamente orientata all'osservazione astronomica e al relativo imaging. Per un astrologo è eccessiva e, a mio parere, piuttosto difficile da capire e usare

  • La libreria Skyfield di Brandon Rhodes, elegante e pitonica, utilizza i kernel (ne parliamo presto) della JPL e quindi assicura un'elevata precisione di calcolo. Fa seguito alla libreria pyephem dello stesso autore, prevalentemente basata sul wrapping di funzioni c, mentre l'attuale è basata su pure python e utilizza la libreria numerica numpy per l'elevata efficienza nel calcolo numerico.

  • Utile segnalare anche SpiceyPy di Andrew Annex, che è un python wrapper per lo SPICE toolkit.

Ho parlato, in un precedente post, del modulo ctypes di Python (incluso nella standard library) e ho fatto vedere come si puo' compilare dinamicamente le Swiss Ephemeris e utilizzare ctypes per scrivere delle funzioni wrapper. Il metodo che illustrero', applicato al JPL toolkit, è proprio questo. Pur compilando l'intera libreria, avremo una shared library di basso peso (meno di cinque Mb nella mia raspberry, con tutte le 1500 e oltre funzioni del toolkit, ma potremo artigianalmente scrivere solo i wrapper che ci interessano per il calcolo di posizione, lasciando agli astronomi funzioni più elaborate e complesse.

Per fare la compilazione dinamica della libreria CSPICE entriamo, tramite terminale, nella directory src, quindi nella sottodirectory cspice, dove troviamo molti file sorgenti in c (estensione .c) e file header (estensione .h). Per creare una libreria dinamica non dobbiamo fare altro che usare il seguente comando:

gcc -Wall -fPIC -shared -o libcspice.so *.c -lm -ldl

Vedrete un sacco di warnings ma nulla che blocchi la compilazione, probabilmente ci sono piccole anomalie non corrette nei sorgenti. Anche stavolta, portate pazienza, ci vorrà un po' di tempo. In questo caso sia che lavoriate su PC sia che usiate una raspberry, il comando è identico.

Una volta creata la libreria libcspice.so, copiatela in una nuova directory a cui darete il nome che preferite, relativo al vostro progetto python.

Per iniziare, ci servono altri due file, che metterete nella stessa directory:

  • uno dei file kernel planetari di JPL, suggerisco il de421.bsp, che è abbastanza leggero (16 mega) e che trovate a questo indirizzo.

  • un kernel che contiene informazioni relative al deltat, lo scarto temporale fra tempo degli orologi atomici e il tempo terrestre, che è fissato periodicamente da una autorità (IERS), ve ne ho anticipato in un post precedente, attualmente vale 37 secondi (leapseconds). Lo trovate a quest'altro indirizzo.

Con questi strumenti nella directory abbiamo quanto ci serve per cominciare a sviluppare codice python usando il JPL toolkit. Il prossimo post (credo più d'uno) sarà proprio dedicato a questo. Al prossimo post.

No comments:

Post a Comment

How to create a virtual linux machine with qemu under Debian or Ubuntu with near native graphics performance

It's been a long time since my latest post. I know, I'm lazy. But every now and then I like to publish something that other people c...