Usando praticamente mai Windows come ambiente di sviluppo ed ho scoperto a mie spese che il comando curl installato di default su Windows 10 non e' lequivalente di curl su Linux ma un alias di un comando di PowerShell con una sintassi differente
venerdì 10 marzo 2023
mercoledì 8 marzo 2023
Formaldeide e metano da Sentinel 5 con Google Earth Engine
Usare Google Earth Engine per Sentinel 5 e' comodo perche' i pixel sono stati ricalcolati in modo omogeneo (nei file netcdf originali i pixel hanno dimensioni differenti a secondo dell'orbita)
I valori di CH4 sono espressi in ppm ed il range di valore e' estremamente stretto (da 1860 a 1890 ppm nell'immagine ) con la dimensione del pixel di 1113 m. I dati sono disponibili sono per le aree di fondovalle
I dati di formaldeide sono espressi in mol/m2 ed il range di valori varia tra 0.00007 e 0.00014 con pixel di 1113 m.
var palette_r = palettes.colorbrewer.Accent[5];
var collection = ee.ImageCollection('COPERNICUS/S5P/NRTI/L3_HCHO')
.select('tropospheric_HCHO_column_number_density')
.filterDate('2019-01-01', '2019-12-31');
var median = collection.reduce(ee.Reducer.mean());
var band_viz = {
min: 0.00007,
max: 0.00014,
palette: ['black', 'blue', 'purple', 'cyan', 'green', 'yellow', 'red']
};
Map.addLayer(collection.mean(), band_viz, 'S5P HCHO');
Map.setCenter(11.295553516712024, 43.976202446636606,9);
Map.style().set('cursor', 'crosshair');
var header = ui.Label('HCHO', {fontWeight: 'bold', fontSize: '18px'});
var toolPanel = ui.Panel([header], 'flow', {width: '400px'});
Map.onClick(function(coords) {
// Create or update the location label (the second widget in the panel)
var location = 'lon: ' + coords.lon.toFixed(4) + ' ' +
'lat: ' + coords.lat.toFixed(4);
var click_point = ee.Geometry.Point(coords.lon, coords.lat);
var CH4Value = median.reduceRegion(ee.Reducer.first(), click_point, 90).evaluate(function(val){
console.log(val);
var CH4Text = 'CH4: ' + val;
toolPanel.widgets().set(2, ui.Label(CH4Text));
});
toolPanel.widgets().set(1, ui.Label(location));
// Add a red dot to the map where the user clicked.
Map.layers().set(1, ui.Map.Layer(click_point, {color: 'FF0000'}));
});
// Add the panel to the ui.root.
ui.root.add(toolPanel);
Posizione date le distanze da due punti conosciuti
Un problema che si ha con il posizionamento decawave e' quello di ottenere la posizione (coordinate) data la distanza da due punti conosciuti
Alla fine il problema si riduce ad ottenere gli angoli di un triangolo di cui sono conosciute le lunghezze di tutti i lati
diciamo che il lato A sia la distanza tra i due anchor mentre C e B sono le distanze del tag rispetto ai due anchor
Tutti i lati possono essere riscritti come
A = Ccos(alfa)+Bcos(beta)
B = Acos(beta)+Ccos(gamma)
C=Acos(alfa)+Bcos(gamma)
si tratta si un sistema di tre equazioni con 3 incognite e quindi risolvibile. Per semplice sostituzione si arriva alla fine che
cos(beta) = (A*A)+(B*B)-(C*C)/2AB
cos(alfa) = (A*A)+(C*C)-(B*B)/2AC
cos(gamma) = (B*B)+(C*C)-(A*A)/2BC
a questo punto abbiamo tutti gli angoli. Si puo' spostare un anchor sulle origine degli assi e ruotare gli assi in modo che il secondo anchor sia in coordinata (x2,0)
A questo punto le coordinate incognite del punto tra B e C sono
X = Bcos(alfa)
Y = SQRT(1 - cos(alfa)*cos(alfa))
martedì 7 marzo 2023
Makerfabs DW3000
Aggiornamento
Frugando meglio nei sorgenti della libreria ho visto che sono previste 33 configurazioni dell'antenna in base al tranfer rate, alla lunghezza dei pacchetti ed altro. Di default e' attivato il profilo 33 che non risulta essere adatto per le lunghe distanze
Ho quindi modificato il file dw3000_config_options.h della libreria alla riga 240 con
#define CONFIG_OPTION_16
che corrisponde alla impostazione
* Channel 9, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 10, Data Rate 850k, STS Length 64
*/
dwt_config_t config_options = {
9, /* Channel number. */
DWT_PLEN_1024, /* Preamble length. Used in TX only. */
DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */
10, /* TX preamble code. Used in TX only. */
10, /* RX preamble code. Used in RX only. */
3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 symbol, 2 for non-standard 16 symbol SFD and 3 for 4z 8 symbol SDF type */
DWT_BR_850K, /* Data rate. */
DWT_PHRMODE_STD, /* PHY header mode. */
DWT_PHRRATE_STD, /* PHY header rate. */
(1024 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
DWT_STS_MODE_1, /* Mode 1 STS enabled */
DWT_STS_LEN_64, /* STS length*/
DWT_PDOA_M0 /* PDOA mode off */
};
#endif
in pratica ho impostato il valore piu' basso di transfer rate (850Kbps con il pacchetto di preambolo della massima lunghezza ed abilitando STS. La modalita' STS (scrambled timestamp sequence) migliora la qualita' della stima della distanza impedendo interferenze
Da una serie di 1850 misure statiche la standard deviation e' risultata intorno ai 4 cm
==================================================================
Ho avuto modo di provare la scheda Makersfab Dw3000 basata su un Esp32 a cui e' collegata una antenna Decawave UWB Dw3000 (3110 per l'esattezza) che permette il calcolo della distanza tramite il calcolo del tempo di doppia percorrenza di un segnale tra due antenna (una chiamata initiator responsabile dell'invio dello scambio e ed un responser)...esiste una versione che usa la differenza di fase
Questo metodo di calcolo del tempo di volo permette di non necessitare la sincronizzazione degli orologi delle due schede
Note estremamente dolenti...rispetto alla versione Dw1000 sempre di Makerfabs al momento il supporto software e di documentazione e' al limite dell'inesistente. Nella libreria Arduino ci sono alcuni esempi poco commentati (per avere informazioni meglio riferirsi all'SDK ufficiale )
Ho fatto qualche prova con lo sketch ex_06a_ss_twr_initiator_sts_no_data ma la distanza stimata e' molto instabile con variazione di circa 10 cm (e fino a qui rientra nell'errore dichiarato del sensore) ma molto sensibile anche dalla presenza di oggetti nell'intorno. Non sono stato in grado di avere una retta di calibrazione
Un altro aspetto che non riesco a gestire e' la potenza del segnale. A questo link viene indicato che si possano registrare pacchetti fino a circa 20 m di distanza mentre con i miei moduli non riesco ad allontanarmi oltre i 5 m
Alla fine non sono riuscito a capire se l'insuccesso e' relativo ad un difetto delle mie schede o qualche programmazione non corretta (ma di fatto ho usato gli sketch di esempio)
venerdì 3 marzo 2023
Telit GE864-PY
Mi e' stato regalato una volta dismesso questo dispositivo nato per leggere una seriale ed inviare i dati via rete cellulare
Pensavo di poter recuperare qualche componente ma tutte le funzioni sono integrate nell'unico chip
Seagate ST-251
Il mio piccolo museo dell'informatica ha avuto una nuova acquisizione, un hard disk Seagate ST-251 del 1990
Si tratta di un HD da 42 Mb formattato che ha connettori MTM e non IDE. Non ho il controller adatto per cui non ho la piu' pallida idea se sia funzionante (ma guardando su Internet sembra che questi dispositivi fossero particolarmente delicati e pochi sono sopravvissuti funzionanti)
mercoledì 1 marzo 2023
PIP Python error: externally-managed-environment
Da qualche tempo sulla mia Debian testing non riesco ad installare le librerie Python tramite PIP ma sono tramite APT a causa dell'errore
error: externally-managed-environment
× This environment is externally managed╰─> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to install.
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...