lunedì 22 agosto 2022

Evento Stromboli 12 agosto su ERA5

 Il 12 agosto 2022 e' avvenuto un inteso evento meteo a Stromboli ..volevo vedere se era possibile ricavare i dati di precipitazione anche dal servizio ERA5 di Copernicus per confrontarli con la verita' a terra data dal pluviometro INGV

per scaricare i dati ho utilizzato il seguente script Python (dati del solo 12 agosto per il solo parametro Total Precipitation)

//////////////////////////////////

import cdsapi

c = cdsapi.Client()

c.retrieve(
'reanalysis-era5-single-levels',
{
'product_type': 'reanalysis',
'variable': 'total_precipitation',
'year': '2022',
'month': '08',
'day': '12',
'time': [
'00:00', '01:00', '02:00',
'03:00', '04:00', '05:00',
'06:00', '07:00', '08:00',
'09:00', '10:00', '11:00',
'12:00', '13:00', '14:00',
'15:00', '16:00', '17:00',
'18:00', '19:00', '20:00',
'21:00', '22:00', '23:00',
],
'area': [
39, 15.25, 38.75,
15.5,
],
'format': 'netcdf',
},
'12.nc')

//////////////////////////////////

i dati sono stati acquisiti in formato NetCDF4 perche' il formato GRIB non sembra compatibile con Wgrib2 (forse si tratta di grib1)..per leggere i dati ho prima usato Qgis per verificare di avere centrato la finestra geografica di ricerca



e poi ho utilizzato il seguente script Python per estrarre i dati (non ho trovato niente di gia' pronto per una conversione da NetCDF4 a testo)

import netCDF4

precip_nc_file = '12.nc'
nc = netCDF4.Dataset(precip_nc_file, mode='r')

nc.variables.keys()

lat = nc.variables['latitude'][:]
lon = nc.variables['longitude'][:]
time_var = nc.variables['time']
dtime = netCDF4.num2date(time_var[:],time_var.units)
precip = nc.variables['tp'][:]

print("lat "+str(len(lat)))
print("lon "+str(len(lon)))
print("prec "+str(len(precip)))
print("time "+str(len(dtime)))

# coordinate Stromboli 38.79184084355282, 15.2152918018263


for s in range(len(dtime)):
for l in range(len(lat)):
for g in range(len(lon)):
print(dtime[s], end=''),
print(";", end='')
print(lat[l], end=''),
print(";", end='')
print(lon[g], end=''),
print(";", end='')
# il primo indice e' quello dell'ora
# il secondo indice e' la latitudine
# il terzo indice e' la longitudine
print(precip[s][l][g], end='\n\r')

questo e' il grafico generato con i dati di ERA5
questo per confronto sono i dati dal pluviometro di Stromboli gestito da INGV


(la scala dei tempi e' differente ed anche l'ora risulta differente a causa dei differenti fusi)

In conclusione il dato da satellite sottostima l'evento ma la forma generale del grafico e' raffrontabile



Debian e Ideapad 310 MIIX310

Mi sono comprato il tablet/convertibile Lenovo Ideapad 310 MIIX non perche' ne avessi bisogno ma per il costo estremamente ridotto (50 euro) e .... mi sono messo nei guai

Con Windows 10 la macchina e' completamente inutilizzabile ma me lo aspettavo....cio' che non aspettavo era di dover lottare con i driver per Linux

Una sintesi

con Ubuntu la scheda di rete Realtek8723BS funziona, non funziona audio e webcam (la webcam e' un modello molto particolare non USB ne' PCI ..e' una OV2680..comoda su Arduino per niente su PC per mancanza di supporto)




con Manjaro in versione live funziona praticamente tutto (tranne webcam)...una volta installato e' sparita la scheda di rete

Debian nemmeno a parlarne...il supporto alla Realtek 8723BS esisteva nel kernel fino a qualche anno fa ma e' stato rimosso. Ho provato ad installare Devuan per avere i driver gia' installati ...funziona l'audio ma niente wifi e webcam

alla fine pero' Debian e' molto rapida su una macchina dalle risorse cosi' limitate e mi sono adattato con una scheda Wifi USB

Un aspetto fastidioso e' che essendo un tablet il sistema operativo parte in modalita' portrait, per ruotare lo schermo e il touchscreen si possono utilizzare i comani

xrandr -o right   
xinput set-prop 'FTSC1000:00 2808:1015' 'Coordinate Transformation Matrix' 0 1 0 -1 0 1 0 0 1

 

 

 sdfsfd

sabato 13 agosto 2022

Distanza Realsense

Misura la distanza al centro dell'immagine

Per rendere la misura piu' stabile e' stato utilizzato un ring buffer


## License: Apache 2.0. See LICENSE file in root directory.
## Copyright(c) 2015-2017 Intel Corporation. All Rights Reserved.

###############################################
## Open CV and Numpy integration ##
###############################################

import pyrealsense2 as rs
import numpy as np
from numpy_ringbuffer import RingBuffer
import cv2


RingBufferSize = 50
r = RingBuffer(capacity=RingBufferSize, dtype=np.float16)

# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()

# Get device product line for setting a supporting resolution
pipeline_wrapper = rs.pipeline_wrapper(pipeline)
pipeline_profile = config.resolve(pipeline_wrapper)
device = pipeline_profile.get_device()
device_product_line = str(device.get_info(rs.camera_info.product_line))

found_rgb = False
for s in device.sensors:
if s.get_info(rs.camera_info.name) == 'RGB Camera':
found_rgb = True
break
if not found_rgb:
print("The demo requires Depth camera with Color sensor")
exit(0)

config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

if device_product_line == 'L500':
config.enable_stream(rs.stream.color, 960, 540, rs.format.bgr8, 30)
else:
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

# Start streaming
pipeline.start(config)

try:
while True:

# Wait for a coherent pair of frames: depth and color
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
color_frame = frames.get_color_frame()
if not depth_frame or not color_frame:
continue

# Convert images to numpy arrays
depth_image = np.asanyarray(depth_frame.get_data())
color_image = np.asanyarray(color_frame.get_data())
#print(depth_image[320,240])
r.append(depth_image[320,240])
print(np.mean(r))

# Apply colormap on depth image (image must be converted to 8-bit per pixel first)
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

depth_colormap_dim = depth_colormap.shape
color_colormap_dim = color_image.shape

# If depth and color resolutions are different, resize color image to match depth image for display
if depth_colormap_dim != color_colormap_dim:
resized_color_image = cv2.resize(color_image, dsize=(depth_colormap_dim[1], depth_colormap_dim[0]), interpolation=cv2.INTER_AREA)
images = np.hstack((resized_color_image, depth_colormap))
else:
images = np.hstack((color_image, depth_colormap))

# Show images
cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
startpoint=(310,240)
endpoint=(330,240)
color=(255,0,0)
thickness=3
images = cv2.line(images,startpoint,endpoint,color,thickness)
startpoint=(320,230)
endpoint=(320,250)


images = cv2.line(images,startpoint,endpoint,color,thickness)
cv2.imshow('RealSense', images)
cv2.waitKey(1)

finally:

# Stop streaming
pipeline.stop()

mercoledì 3 agosto 2022

Archivi di dati meteo

 Il sito https://cds.climate.copernicus.eu/cdsapp#!/search?type=dataset permette di scaricare in modo gratuito dati storici a carattere ambientale come il dataset ERA5 (meteo dati dal 1959 all'attuale)


I dati si possono scaricare dall'interfaccia web ma si possono anche utilizzare le API Python

Per fare cio' ci si deve iscrivere al sito per ricevere la API KEY (da ricavare dal proprio user profile) e la si deve inserire nel file HOME/.cdsapirc 

url: https://cds.climate.copernicus.eu/api/v2
key: 123456:123445-abcd-efgh-12345
a questo punto si puo' installare la libreria

per creare il programma si puo' andare sulla pagina web del dataset, selezionare i dati che si intendono scaricare e poi selezionare in fondo alla pagina il pulsante Show API Request. Basta copiare ed incollare nel file programma

=============================================================

import cdsapi
c = cdsapi.Client()
c.retrieve(
    'reanalysis-era5-single-levels',
    {
        'product_type': 'reanalysis',
        'format': 'grib',
        'year': '2022',
        'month': '07',
        'day': '01',
        'time': [
            '00:00', '01:00', '02:00',
            '03:00', '04:00', '05:00',
            '06:00', '07:00', '08:00',
            '09:00', '10:00', '11:00',
            '12:00', '13:00', '14:00',
            '15:00', '16:00', '17:00',
            '18:00', '19:00', '20:00',
            '21:00', '22:00', '23:00',
        ],
        'variable': '2m_temperature',
    },
    'download.grib')

mercoledì 27 luglio 2022

GRIB Arpege MeteoFrance

Un'altra fonte di download di previsioni meteo specifico per l'area Europa e' il servizio Arpege con Grib files che si possono scarica da 

https://donneespubliques.meteofrance.fr/?fond=produit&id_produit=130&id_rubrique=51

Le previsioni sono orarie fino a 114 ore con una risoluzione di 0.1 gradi

dal sito non e' possibile selezionare la finestra geografica dei dati. Per effettuare una selezione sul file GRIB si puo' usare il parametro -lon ...il problema e' che questo switch non e' compatibile con lo switch -cvs per cui per fare l'estrazione si deve usare il piping

di seguito uno script che scarica in automatico i file disponibili, estra il valore temperatura per la coordinata selezionata e crea un file csv 

====================================================================

#!/bin/bash
rm *.grib > /dev/null 2>&1
rm *.csv > /dev/null 2>&1

today=`date +%Y-%m-%d`
today2=`date +%Y%m%d`

lon="11.8"
lat="46.4"
 
wget -O 00_12.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=00H12H&referencetime=${today}T00:00:00Z&format=grib2" 
wget -O 13_24.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=13H24H&referencetime=${today}T00:00:00Z&format=grib2" 
wget -O 25_36.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=25H36H&referencetime=${today}T00:00:00Z&format=grib2" 
wget -O 37_48.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=37H48H&referencetime=${today}T00:00:00Z&format=grib2" 
wget -O 49_60.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=49H60H&referencetime=${today}T00:00:00Z&format=grib2" 
wget -O 61_72.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=61H72H&referencetime=${today}T00:00:00Z&format=grib2" 
wget -O 73_84.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=73H84H&referencetime=${today}T00:00:00Z&format=grib2" 
wget -O 85_96.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=85H96H&referencetime=${today}T00:00:00Z&format=grib2" 
wget -O 97_102.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=97H102H&referencetime=${today}T00:00:00Z&format=grib2" 
#wget -O 103_114.grib2 "http://dcpc-nwp.meteo.fr/services/PS_GetCache_DCPCPreviNum?token=__5yLVTdr-sGeHoPitnFc7TZ6MhBcJxuSsoZp6y0leVHU__&model=ARPEGE&grid=0.1&package=SP1&time=103H114H&referencetime=${today}T00:00:00Z&format=grib2" 
.
/wgrib2 -for 102:114 -s -lon ${lon} ${lat} 00_12.grib2 > dati.csv
./wgrib2 -for 102:114 -s -lon ${lon} ${lat} 13_24.grib2 >> dati.csv
./wgrib2 -for 102:114 -s -lon ${lon} ${lat} 25_36.grib2 >> dati.csv
./wgrib2 -for 102:114 -s -lon ${lon} ${lat} 37_48.grib2 >> dati.csv
./wgrib2 -for 102:114 -s -lon ${lon} ${lat} 49_60.grib2 >> dati.csv
./wgrib2 -for 102:114 -s -lon ${lon} ${lat} 61_72.grib2 >> dati.csv
./wgrib2 -for 102:114 -s -lon ${lon} ${lat} 73_84.grib2 >> dati.csv
./wgrib2 -for 102:114 -s -lon ${lon} ${lat} 85_96.grib2 >> dati.csv
./wgrib2 -for 102:114 -s -lon ${lon} ${lat} 97_102.grib2 >> dati.csv
#./wgrib2 -for 102:114 -s -lon ${lon} ${lat} 103_114.grib2 >> dati.csv

cut -d, -f1 --complement dati.csv > dati2.csv
cut -d, -f1 --complement dati2.csv > temp.csv
sed -i -e 's/val=//g' temp.csv


lunedì 25 luglio 2022

GFS via NOMAD

 Se non si ha necessita' di scaricare tutto il dataset di GFS si puo' effettuare una query di selezione utilizzando la URL sottostante

https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?dir=%2Fgfs.20220724%2F00%2Fatmos

dopo si puo' scegliere il campo desiderato. Verra' scaricato un file GRIB 

il tracciato record completo e' https://www.nco.ncep.noaa.gov/pmb/products/gfs/gfs.t00z.pgrb2.0p25.f000.shtml


Il download puo' essere automatizzato fornendo i parametri sulla URL (in questo caso si richiede il parametro TMP 2 m above ground nella finestra latitudine 41-46, longitudine 10-12 per la previsione F000 del giorno 24/07/2022

https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file=gfs.t00z.pgrb2.0p25.f000&lev_2_m_above_ground=on&var_TMP=on&subregion=&leftlon=10&rightlon=12&toplat=46&bottomlat=41&dir=%2Fgfs.20220724%2F00%2Fatmos

Attenzione che EarthEngine di Google esprime i valori in C mentre da questa fonte i dati sono in K

se interessa la precipitazione totale si puo' usare il parametro PRATE (Precipitation is the total liquid content of rain, snow, sleet (ice pellets), and freezing rain which falls out of the atmosphere in a given time period. Precipitation rate is the rate at which precipitation is falling at a given momen) espresso in kg/m2/sec (1Kg/m2 corrisponde ad 1l/m2 quindi 1mm/m2, per avere i dati orari in mm/ora basta moltiplicare per 3600). Anche in questo caso vi sono differenze tra come espressi i dati (Kg/m2/s contro Kg/m2)

https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file=gfs.t00z.pgrb2.0p25.anl&all_lev=on&var_PRATE=on&leftlon=7.75&rightlon=8&toplat=45&bottomlat=44.5&dir=%2Fgfs.20220724%2F00%2Fatmos

venerdì 22 luglio 2022

EarthEngine con Python

Una delle limitazione di Earth Engine Editor e' quello di salvare i dati solo su cloud. Tale limitazione puo' essere aggirata mediante Geemap  che permette di scarica i dati come array numpy o come geotiff

Prima di poter procedere con Geemap si deve configurare l'autenticazione con EarthEngine mediante 

pip install earthengine-api --upgrade


=====================================================

import ee
import geemap
import numpy as np
import os

ee.Authenticate()
ee.Initialize()
img = ee.Image('NOAA/GFS0P25/2022072100F002').select(['temperature_2m_above_ground'])
aoi = ee.Geometry.Polygon([[[11.0, 43.0], [11.0, 43.25], [11.25, 43.25], [11.25, 43.0]]], None, False)
# converte una immagine in un array numpy
rgb_img = geemap.ee_to_numpy(img, region=aoi)
print(rgb_img.shape)
print(rgb_img)

# scarica una image collection in una serie di Geotiff
aoi = ee.Geometry.Point(11.0, 43.0)
region = aoi.buffer(1000)
collection = (
    ee.ImageCollection('NOAA/GFS0P25')
    .filterBounds(aoi)
    .filterDate("2022-07-21")
    .select('temperature_2m_above_ground')
)
out_dir='/home/luca/'
geemap.ee_export_image_collection(collection, out_dir=out_dir, region=region)
=====================================================

per scaricare una intera immagine si puo' utilizzare la libreria Geedim (attenzione le versioni precedenti alla 1.3 hanno problemi per il download di grandi dimensioni)

un esempio puo' essere il seguente per ricercare le immagini disponibili

geedim search -c NOAA/GFS0P25  -s 2022-07-21 -e 2022-07-22 --bbox 43.0 11.0 44.0 12.0

il bbox indica l'angolo in basso/sinistra alto/destra WGS84

per scaricare l'immagine si puo' usare la sintassi sottostante

geedim download --id NOAA/GFS0P25/2022072118F000 --crs EPSG:4326 --bbox 43.0 11.0 44.0 12.0 --scale 1000 -o

-o : overwrite il file se esiste
il geotiffi contiene 7 bande (1: temperature 2 m above ground, 2: umidita' specifica, 3: umidita' relativa, 4,5 : vento, 6: acqua precipitabile in atmosfera, 7: maschera)

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...