giovedì 8 agosto 2024

RTKLib e GPS L1/L5 Pixel 6

Aggiornamento

Questo e' il migliore risultato dopo alcune prove





Visto il servizio EUREF che distribuisce dati GNSS sia in formato Rinex che NTRIP (RTCM 3) ho voluto provare ad usare la app Geo++ RINEX su un Google Pixel 6 per vedere come funziona la banda L5 in accoppiata  alla classica L1

I dati della stazione di base che ho preso a rifeirmento derivano dalla stazione

https://epncb.oma.be/_networkdata/siteinfo4onestation.php?station=IGMI00ITA

che si trova a Firenze. 

     City or Town             : Firenze
     State or Province        : TOSCANA
     Country or Region        : ITA
     Tectonic Plate           : EURASIAN
     Approximate Position (ITRF)
       X coordinate (m)       : 4523251.085
       Y coordinate (m)       : 896760.233
       Z coordinate (m)       : 4391796.488
       Latitude (N is +)      : +434744.34
       Longitude (E is +)     : +0111249.69
       Elevation (m,ellips.)  : 95.1
in Rtkpost Options/Positions si devono le coordinate ECEF della stazione riprese dalla tabella soprastante
 

i file delle osservazioni della stazione base dell'IGM vengono forniti in formato CRX e RNX 
Per utilizzare il formato CRX in RTKLIB si puo' usare il tool CRX2RNX (https://terras.gsi.go.jp/ja/crx2rnx.html) che dal file CRX porta ad un file OBS. Per quanto riguarda il file RNX basta rinominarlo (dentro c'e' il NAV in formato Rinex)
 
 Queste sono le impostazioni delle Options di RTKLib (per un corretto funzionamento ho dovuto usare i files di RTKLIB Demo5 http://rtkexplorer.com/downloads/rtklib-code/ , Le librerie RTKLib che si scaricano in APT da Debian sono obsolete e non riconoscono i nuovi formati dati ed i nuovi sensori

questo il riultato di una acquisizione speditiva

Ho provato a seguire le istruzioni https://rtklibexplorer.wordpress.com/2021/02/27/another-look-at-l1-l5-cellphone-ppk-with-rtklib/ dove l'autore scende a circa +/-10 cm di precisione m


Io non sono sceso sotto al metro

Proiezione isometrica Esercizio GoNum Golang

 Per esercizio ho provato ad implementare la proiezione isometrica in GO partendo dalle istruzioni su Wikipedia


i calcoli matriciali sono i seguenti (in questo caso e' gia' impostata una rotazione di alfa di circa 35 gradi e beta di 45 gradi





package main
import (
"fmt"
"math"
"gonum.org/v1/gonum/mat"
)
func format(matrix mat.Matrix) {
formatted := mat.Formatted(matrix, mat.Prefix(""), mat.Squeeze())
fmt.Println(formatted)
}


func isometrica(x,y,z float64) (float64,float64) {
xs := mat.NewDense(3, 3, []float64{math.Sqrt(3), 0, -math.Sqrt(3),
1, 2, 1,
math.Sqrt(2),  -math.Sqrt(2),  math.Sqrt(2)})
//format(xs)
w := mat.NewDense(3, 3,nil)
w.Scale(1/math.Sqrt(6),xs)
coordinate := mat.NewVecDense(3, []float64{x,y,z}) // e' gia' un vettore colonna
c := mat.NewVecDense(3,  make([]float64, 3))
c.MulVec(w,coordinate)
pr := mat.NewDense(3, 3, []float64{1,0,0,0,1,0,0,0,1})
d := mat.NewVecDense(3,  make([]float64, 3))
d.MulVec(pr,c)
return d.AtVec(1),d.AtVec(2)
}
func main() {
xi,yi := isometrica(0.0,0.0,0.0)
fmt.Printf("data: %f,%f\n", xi,yi)
xi,yi = isometrica(1.0,0.0,0.0)
fmt.Printf("data: %f,%f\n", xi,yi)
xi,yi = isometrica(0.0,1.0,0.0)
fmt.Printf("data: %f,%f\n", xi,yi)
xi,yi = isometrica(1.0,1.0,0.0)
fmt.Printf("data: %f,%f\n", xi,yi)
xi,yi = isometrica(0.0,0.0,2.0)
fmt.Printf("data: %f,%f\n", xi,yi)
xi,yi = isometrica(1.0,0.0,2.0)
fmt.Printf("data: %f,%f\n", xi,yi)
xi,yi = isometrica(0.0,1.0,2.0)
fmt.Printf("data: %f,%f\n", xi,yi)
xi,yi = isometrica(1.0,1.0,2.0)
fmt.Printf("data: %f,%f\n", xi,yi)

}


venerdì 26 luglio 2024

ODMNode

 Un metodo per automatizzare ODM e' quello di utilizzare NodeODM

 


 In estrema sintesi si mette in esecuzione su un server il docker con la seguente sintassi

 

 docker run -p 3000:3000 opendronemap/nodeodm

 In seguito da un client si puo' usare il seguente script Python per effettuare l'upload automatico di tutte le immagini in un folder e per impostare i parametri di lavoro. Al termine del task sul server i dati saranno reinviati in automatico al client

 

import os
import sys
sys.path.append('..')
from pprint import pprint

from pyodm import Node, exceptions

node = Node("192.168.1.125", 3000)

files = []
for dirname, dirnames, filenames in os.walk('./images/'):
for subdirname in dirnames:
files.append(os.path.join(dirname, subdirname))
for filename in filenames:
files.append(os.path.join(dirname, filename))

pprint(files)
try:
# Start a task
print("Uploading images...")
task = node.create_task(files,{'dsm': True, 'orthophoto-resolution': 4})
print(task.info())


try:
# This will block until the task is finished
# or will raise an exception
task.wait_for_completion()

print("Task completed, downloading results...")

# Retrieve results
task.download_assets("./results")

print("Assets saved in ./results (%s)" % os.listdir("./results"))

# Restart task and this time compute dtm
task.restart({'dtm': True})
task.wait_for_completion()

print("Task completed, downloading results...")

task.download_assets("./results_with_dtm")

print("Assets saved in ./results_with_dtm (%s)" % os.listdir("./results_with_dtm"))
except exceptions.TaskFailedError as e:
print("\n".join(task.output()))

except exceptions.NodeConnectionError as e:
print("Cannot connect: %s" % e)
except exceptions.NodeResponseError as e:
print("Error: %s" % e)


 

sabato 20 luglio 2024

giovedì 27 giugno 2024

Led e sensori AS7265x

 Illuminando lo spectralon con tutti i led accesi di AS7265 la risposta in radianza e' la seguente. Come si vede il massimo di illuminazione e' intorno ai 400 nm e deriva da contributo del led UV e del led White

Il picco a 870 nm deriva dal centro di emissione del led IR

Non riesco a giustificare il picco a circa 600 nm

 


 Spettro di emissione dei led da datasheet
White Led (Visibile)

IR Led

UV Led

questo e' il grafico di risposta spettrale dei 18 canali dei sensori



 

 

Aruco Tag e filtri Kalman

Usando gli Aruco tag in ambiente esterno con illuminazione solare a diverse ore e in diversi periodi dell'anno ho trovato un errore nell...