Decodifica telemetria LEDSAT

Spinto dall’entusiasmo di @RikyUnreal ho creato in quattro e quattr’otto un decoder embrionale, che si aspetta in ingresso un file di testo con i pacchetti di telemetria in formato esadecimale, per ora esattamente come nel file messo da Riccardo qui sopra

In sostanza, i pacchetti esadecimali uno per riga, ogni byte (due lettere) separato da 1 spazio. Linee vuote o contenenti altro che non sia puro esadecimale vengono ignorate.

Il decoder per ora supporta solo pacchetti di telemetria e non le immagini, ma se qualcuno mi fornisse un esempio di telemetria reale o altri formati di file, posso provare a migliorare via via il decoder.

L’eseguibile deriva da codice python troppo orribile per essere condiviso per ora.
Ho compilato per Win64 e Linux amd64.

Metto a disposizione anche un eseguibile per Win32, ma in alcuni casi potrebbe dare un falso positivo come affetto da virus.

Ver. 0.4 alpha (2021-08-19)

Come usare l’utility

Dopo aver ottenuto un file contenente i frame di telemetria in formato testuale, aprite una linea di comando , sul vostro OS preferito tra Ms Windows e GNU/Linux e digitate

Windows:

# Esempio Win64
LEDSAT_TM_decoder.exe <file_telemetria.txt>

# Esempio Win32
LEDSAT_TM_decoder_win32.exe <file_telemetria.txt>

Linux:

# Esempio
./LEDSAT_TM_decoder <file_telemetria.txt>

7 Mi Piace

Provo subito. Ho decodificato il secondo passaggio, ed ho 365kB di file. Marco, te lo giro :wink:

1 Mi Piace

Bello, funziona.

Number of arguments: 3 arguments.
Argument List: [‘LEDSAT_TM_decoder.exe’, ‘mon1.txt’, ‘1000’]
144 [‘82’, ‘92’, ‘2D’, ‘00’, ‘16’, ‘2A’, ‘02’, ‘D0’, ‘61’, ‘1B’, ‘8C’, ‘B8’, ‘D2’, ‘D3’, ‘07’, ‘D6’, ‘07’, ‘46’, ‘07’, ‘D6’, ‘02’, ‘27’, ‘00’, ‘85’, ‘00’, ‘86’, ‘08’, ‘03’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘FF’, ‘FF’, ‘FF’, ‘FF’, ‘00’, ‘A6’, ‘00’, ‘6A’, ‘20’, ‘69’, ‘00’, ‘00’, ‘01’, ‘AF’, ‘FF’, ‘F5’, ‘00’, ‘00’, ‘05’, ‘FB’, ‘00’, ‘00’, ‘00’, ‘0E’, ‘FF’, ‘8F’, ‘03’, ‘62’, ‘FF’, ‘F8’, ‘FF’, ‘FA’, ‘FB’, ‘12’, ‘FF’, ‘71’, ‘01’, ‘38’, ‘13’, ‘54’, ‘E6’, ‘C3’, ‘F3’, ‘95’, ‘FF’, ‘9C’, ‘FC’, ‘18’, ‘03’, ‘9D’, ‘04’, ‘4C’, ‘FF’, ‘E7’, ‘FB’, ‘82’, ‘00’, ‘4A’, ‘00’, ‘2B’, ‘02’, ‘3C’, ‘00’, ‘65’, ‘00’, ‘10’, ‘00’, ‘B4’, ‘08’, ‘00’, ‘27’, ‘A2’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘00’, ‘02’, ‘04’, ‘3F’, ‘DB’, ‘62’, ‘EF’, ‘00’, ‘05’, ‘8E’, ‘9C’, ‘D6’, ‘0F’, ‘87’, ‘BC’, ‘49’, ‘A8’]
record_number = 1
telemetry_identifier = {‘raw’: ‘8292’}
unix_time_millis = {‘raw’: 11520, ‘unit’: ‘ms’}
unix_time_secs = {‘raw’: 371851984, ‘unit’: ‘s’}
processing_time = {‘raw’: 24859, ‘unit’: ‘ms’}
solar_panel_x_axis_voltage = {‘raw’: 36024, ‘unit’: ‘mV’}
solar_panel_y_axis_voltage = {‘raw’: 53971, ‘unit’: ‘mV’}
solar_panel_z_axis_voltage = {‘raw’: 2006, ‘unit’: ‘mV’}
solar_panel_x_axis_current = {‘raw’: 1862, ‘unit’: ‘mA’}
solar_panel_y_axis_current = {‘raw’: 2006, ‘unit’: ‘mA’}
solar_panel_z_axis_current = {‘raw’: 551, ‘unit’: ‘mA’}
eps_bootcause = {‘raw’: 0}
eps_battery_mode = {‘raw’: 133}
MPPT_x_axis_temperature = {‘raw’: 134, ‘unit’: ‘C’}
MPPT_y_axis_temperature = {‘raw’: 2051, ‘unit’: ‘C’}
EPS_temperature = {‘raw’: 0, ‘unit’: ‘C’}
battery_pack_01_temperature = {‘raw’: 0, ‘unit’: ‘C’}
battery_pack_02_temperature = {‘raw’: 0, ‘unit’: ‘C’}
battery_pack_03_temperature = {‘raw’: 0, ‘unit’: ‘C’}
total_current_from_panels = {‘raw’: 65535, ‘unit’: ‘mA’}
total_current_absorbed = {‘raw’: 65535, ‘unit’: ‘mA’}
battery_voltage = {‘raw’: 166, ‘unit’: ‘mV’}
gps_current = {‘raw’: 0, ‘cal’: 0.0, ‘unit’: ‘mV (x0.15)’}
eps_boot_count = {‘raw’: 27168}
transceiver_PA_temperature = {‘raw’: 26880, ‘cal’: 2688.0, ‘unit’: ‘C (x10)’}
transceiver_TX_count = {‘raw’: 110591}
transceiver_RX_count = {‘raw’: 4110417925}
last_contact_rssi = {‘raw’: 64256, ‘unit’: ‘dBm’}
radio_boot_counter = {‘raw’: 0}
obc_temperature_01 = {‘raw’: 3839, ‘cal’: 383.90000000000003, ‘unit’: ‘C (x10)’}
obc_temperature_02 = {‘raw’: 36611, ‘cal’: 3661.1000000000004, ‘unit’: ‘C (x10)’}
gyroscope_x = {‘raw’: 25343, ‘cal’: 253.43, ‘unit’: ‘deg/s (x100)’}
gyroscope_y = {‘raw’: 63743, ‘cal’: 637.4300000000001, ‘unit’: ‘deg/s (x100)’}
gyroscope_z = {‘raw’: 64251, ‘cal’: 642.51, ‘unit’: ‘deg/s (x100)’}
magnetometer_x = {‘raw’: 4863, ‘unit’: ‘mG’}
magnetometer_y = {‘raw’: 28929, ‘unit’: ‘mG’}
magnetometer_z = {‘raw’: 14355, ‘unit’: ‘mG’}
solar_panel_+x_temperature = {‘raw’: 21734, ‘cal’: 217.34, ‘unit’: ‘C (x100)’}
solar_panel_+y_temperature = {‘raw’: 50163, ‘cal’: 501.63, ‘unit’: ‘C (x100)’}
solar_panel_-x_temperature = {‘raw’: 38399, ‘cal’: 383.99, ‘unit’: ‘C (x100)’}
solar_panel_-y_temperature = {‘raw’: 40188, ‘cal’: 401.88, ‘unit’: ‘C (x100)’}
solar_panel_+z_temperature = {‘raw’: 6147, ‘cal’: 61.47, ‘unit’: ‘C (x100)’}
solar_panel_-z_temperature = {‘raw’: 40196, ‘cal’: 401.96000000000004, ‘unit’: ‘C (x100)’}
coarse_sun_sensor_+x = {‘raw’: 19711, ‘unit’: ‘mV’}
coarse_sun_sensor_+y = {‘raw’: 59387, ‘unit’: ‘mV’}
coarse_sun_sensor_-x = {‘raw’: 33280, ‘unit’: ‘mV’}
coarse_sun_sensor_-y = {‘raw’: 18944, ‘unit’: ‘mV’}
coarse_sun_sensor_+z = {‘raw’: 11010, ‘unit’: ‘mV’}
coarse_sun_sensor_-z = {‘raw’: 15360, ‘unit’: ‘mV’}
led_status = {‘raw’: ‘65’}
gps_status_flag = {‘raw’: ‘00’}
gps_fix_time = {‘raw’: 268481544}
gps_latitude = {‘raw’: 2597376, ‘cal’: 2.5973759999999997, ‘unit’: ‘deg^6’}
gps_longitude = {‘raw’: 0, ‘cal’: 0.0, ‘unit’: ‘deg^6’}
gps_altitude = {‘raw’: 0, ‘unit’: ‘?’}
software_satus_flag = {‘raw’: ‘00’}
external_gyroscope_x = {‘raw’: 0, ‘cal’: 0.0, ‘unit’: ‘deg/s (x100)’}
external_gyroscope_y = {‘raw’: 0, ‘cal’: 0.0, ‘unit’: ‘deg/s (x100)’}
external_gyroscope_z = {‘raw’: 0, ‘cal’: 0.0, ‘unit’: ‘deg/s (x100)’}
external_magnetometer_x = {‘raw’: 516, ‘unit’: ‘mG’}
--------------------------------------------------------------------------------

5 Mi Piace

Lo stesso lavoro è in corso dalla community di SatNOGS:
https://dashboard.satnogs.org/d/rKSqs57nz/ledsat?orgId=1&refresh=30s&from=1629032558518&to=1629205358518&var-suid=99670

4 Mi Piace

Bello. Chissà come si fa a sottomettere i frames.

Bellissimo. :heart:

Ci sono numeri nella telemetria che ho visto fin qui che non hanno a mio parere un valore logico, a meno che non siano da calibrare in qualche modo o frutto di bit corrotti e incorreggibili a casa del segnale ricevuto con mezzi non ottimali…

Naturalmente non posso escludere che non vi siano errori di programmazione da parte mia.
In questa tabella metto la locazione, da byte a byte, dei vari dati di telemetria, che ho verificato.

Bytes Content Unit Byte from Byte to
2 Telemetry Identifier 0 1
2 Millisecond part of the unix time ms 2 3
4 On-board unix time s 4 7
2 Time taken to process the telemetry ms 8 9
2 Voltage of X axis solar panels mV 10 11
2 Voltage of Y axis solar panels mV 12 13
2 Voltage of Z axis solar panels mV 14 15
2 Current of X axis solar panels mA 16 17
2 Current of Y axis solar panels mA 18 19
2 Current of Z axis solar panels mA 20 21
1 EPS bootcause 22 22
1 EPS battery mode 23 23
2 Temperature of X axis MPPT °C 24 25
2 Temperature of Y axis MPPT °C 26 27
2 Temperature of EPS board °C 28 29
2 Temperature of battery pack #1 °C 30 31
2 Temperature of battery pack #2 °C 32 33
2 Temperature of battery pack #3 °C 34 35
2 Total current coming from solar panels mA 36 37
2 Total current absorbed by system mA 38 39
2 Battery voltage mV 40 41
1 GPS current (x0.15) mV 42 42
2 EPS boot count 43 44
2 Temperature of transceiver PA °C x10 45 46
4 Transceiver total TX count 47 50
4 Transceiver total RX count 51 54
2 Last radio-contact RSSI dBm 55 56
2 Radio bootcounter 57 58
2 OBC temperature #1 °C x10 59 60
2 OBC temperature #2 °C x10 61 62
2 Gyroscope X °/s x100 63 64
2 Gyroscope Y °/s x100 65 66
2 Gyroscope Z °/s x100 67 68
2 Magnetometer X mG 69 70
2 Magnetometer Y mG 71 72
2 Magnetometer Z mG 73 74
2 Temperature of +X solar panel °C x100 75 76
2 Temperature of +Y solar panel °C x100 77 78
2 Temperature of -X solar panel °C x100 79 80
2 Temperature of -Y solar panel °C x100 81 82
2 Temperature of +Z solar panel °C x100 83 84
2 Temperature of -Z solar panel °C x100 85 86
2 Coarse Sun sensor +X mV 87 88
2 Coarse Sun sensor +Y mV 89 90
2 Coarse Sun sensor +Z mV 91 92
2 Coarse Sun sensor -X mV 93 94
2 Coarse Sun sensor -Y mV 95 96
2 Coarse Sun sensor -Z mV 97 98
1 Status of the LEDs 99 99
1 GPS Status flag 100 100
4 GPS fix time 101 104
4 GPS Latitude ° x10^6 105 108
4 GPS Longitude ° x10^6 109 112
4 GPS Altitude 113 116
1 Software status flag 117 117
2 External Gyroscope X °/s x100 118 119
2 External Gyroscope Y °/s x100 120 121
2 External Gyroscope Z °/s x100 122 123
2 External Magnetometer X mG 124 125
2 External Magnetometer Y mG 126 127
2 External Magnetometer Z mG 128 129
6 Mi Piace

Ogni pacchetto include correzione di errore (codice Reed-Solomon) e check di errore (CRC), per cui il dato se decodificato dovrebbe essere pulito. In effetti durante i periodi di QSB (io lavoro in polarizzazione lineare, non circolare) ho perso diversi pacchetti, li sentivo ma l’S/N non era sufficiente per la decodifica.
Riky, Perseus, VAC e modem SW del russo fanno un lavoro eccellente.

2 Mi Piace

Marco, dai un’occhiata qui: https://network.satnogs.org/observations/?norad=99670

3 Mi Piace

Un messaggio è stato unito a un argomento esistente: Competizione ESA Education: essere i primi all’ascolto di LEDSAT

Entro la giornata dovrei pubblicare un update agli eseguibili nel primo post, per cui se li scaricate adesso sappiate che diversi valori sono senza senso.

A parte la descrizione del pacchetto dati, purtroppo il sito di LEDSAT non specifica quali byte siano da interpretare come interi (con o senza segno) o altri formati, o se vadano calibrati (cioè, ci sono x10 o x100 o x0.15 ma non mi è chiarissimo cosa voglia dire).
Spero che la documentazione sia un attimo chiarita…
Tu @Giuiba ne sai di più?
Vediamo se e quando arriveranno immagini :nerd_face:

Guardando cosa fanno dalle parti di satnoGS ho visto che loro interpretano alcuni parametri come interi con segno, altri senza, mentre la prima versione del sw che ho scritto traduce tutto brutalmente in interi senza segno :stuck_out_tongue:

Sto andando un po’ a tentoni insomma, quindi prendete quei programmini con molto granu salis…

4 Mi Piace

Sì, la community SatNOGS ha sollevato le stesse problematiche e i LEDSAT ne sono al corrente, la pagina verrà aggiornata (ma non so quando).

1 Mi Piace

Grazie all’aiuto di @Mike abbiamo trovato e risolto parte dei nostri problemi.
Ora i valori in telemetria… hanno senso :stuck_out_tongue:

Eseguibili aggiornati per windows 64 bit e linux amd64 nel primo post.

7 Mi Piace

Pubblicata ver. 0.4 con piccolo bugfix sul calcolo della data e ora di generazione del pacchetto dati

3 Mi Piace