venerdì 23 agosto 2024

Quectel LC29HDA

Cavalcando l'onda della banda 5 del GPS ho provato il Quectel LC29H DA (rover) e BS (base) che ha la possibilita' di RTK (esiste anche il rover DEA che costa un po' di piu' ed offre un campionamento a 10 Hz)

Piccola nota: per attivare l'uscita sulla UART si deve spostare il microswitch dal lato dove sono posti la porta USB ed i refori dalla porta seriale. L'alimentazione del modulo e' a 3.7 V


Il software di riferimento per questo dispositivo e' QGNSS della Quectel che ha incluso il proprio Ntrip Client. Al contrario di quanto indicato su altri siti la velocita' di default della porta e' 115200 

Come Ntrip server ho impiegato euref-ip.asi.it porta 2101 con la stazione IGMI00ITA


Si ottiene in pochi secondi RTK Fix 

Come si vede il posizionamento di prova e' sostanzialmente nelle specifiche ma si nota che i punti si distribuiscono su nuvole distinte 

La cosa curiosa con questo dispositivo e' che non funziona di default con altri software differenti da QGNSS. Il problema e' il software QGNSS di fatto non effettua nessun calcolo ma trasmette i dati dal server NTRIP verso LC29H che effettua i calcoli sul modulo e poi restituisce indietro una stringa NMEA con i dati gia' corretti

Io volevo trasmettere i dati dell'antenna via Lora verso un computer remoto e questa impostazione non e' applicabile. 

E' possibile modificare la configurazione in modo che LC29H trasmetta solo messaggi RTCM3 e non efffettui calcoli in modo poi da poter passare il calcolo ad RTKNAVI. Per fare cio' 

$PQTMRESTOREPAR*13 
$PQTMCFGRCVRMODE,W,2*29
$PQTMSAVEPAR*5A 
# reset
$PAIR432,1*22 # output RTCM3 MSM7 messages
$PAIR062,0,01*0F # Enable NMEA GGA message
$PQTMSAVEPAR*5A # save PQTM params to flash

Per la trasmissione Lora ho provato dei moduli E32 868T30D che sono compatibili con il voltaggio a 3.3 V in modo da essere alimentati direttamente da LC29H

Per programmarli ho utilizzato il modulo E15- USB-T2 spostando il jumper dell'alimentazione a 3.3 V e rimuovendo i jumper M0 ed M1 con il software RF Settings 





mercoledì 21 agosto 2024

U-Center e Window 11

Ho provato ad installare U-Center su Windows 11 ed sono partite una fila di lamentele su DLL non trovate 


La soluzione e' stato installare tutto il pacchetto con tutti le librerie Visual C++ in blocco da qui

martedì 20 agosto 2024

Oracle Instaclient

Per avere Instant Client Oracle (una versione alleggerita) su Linux si va a questo link e si scaricano i file .zip basic, sdk, tools, sqlplus e si scompattano con 

unzip insta*.zip -d /opt/oracle

si modifica il file bashrc per puntare la path ad instaclient

export PATH=/opt/oracle/instaclient_21_15:$PATH

si deve poi configurare il file tnsnames.ora che si trova qui

 /opt/oracle/instantclient_21_15/network/admin/tnsnames.ora 

con il formato di questo tipo

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

 XXXX.XXXX.TOSCANA.IT =
        (DESCRIPTION =
                (ADDRESS =
                        (PROTOCOL = TCP)
                        (HOST = xxxx.xxxxx.toscana.it)
                        (PORT = 1521)
                        )
                (CONNECT_DATA =
                        (SERVICE_NAME = xxxx.xxxx.toscana.it)
                        )
        )

 

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

a questo punto si puo' effettuare la connessione con 

sqlplus user/password@xxxx.xxxx.toscana.it

venerdì 9 agosto 2024

Compilare RTKLib Base5 QT su Linux

La libreria RTKLib che si scarica tramite apt e' obsoleta ed anche il github originale e' in abbandono. Attualmente e' piu' interessante il fork presente in https://github.com/rtklibexplorer/RTKLIB ma distribuisce solo versioni compilate per Windows

La ricetta per compilare su Linux e' la seguente

sudo apt install qt5base-dev
sudo apt-get install libqt5serialport5 
sudo apt-get install libqt5serialport5-dev

Per prima cosa si compila prima la libreria

cd src
mkdir build & cd build
qmake ../src.pro
make

si passa quindi a compilare le applicazione da consolle e qt

Queste si trovano in  app/consapp e in app/qtapp

Per le app da console si entra nel subfolder gcc e poi si digita

make

e' disponibile il make file per bcc ed nel caso di rnx2rtkp anche il makefile per gcc_mkl (le librerie Intel di calcolo matriciale. Istruzioni qui)

Attenzione: la compilazione genera un errore in rn2rtkp.c alla linea 76 perche' non e' terminata una stringa con il carattere doppio apice. Si risolve semplicemente editando 

Per le app Qt si deve cercare il subfolder gcc e lanciare make 

mkdir build
cd build
qmake ../rtklaunch_qt.pro (si seleziona il file .pro)
make

giovedì 8 agosto 2024

M8T e Ntrip

 Ho ripreso il vecchio Ublox M8T per provare il servizio NTrip di EUREF 

 Come client Ntrip ho usato RTKNav

Le impostazioni sono riportate nell'immagine sottostante. Ho impostato l'antenna per esporre i dati Raw UBX ed ho impostato la connessione di rete con EUREF via ASI (le credenziali sono gratuite e si ottengono in un paio di giorni). Attenzione ad impostare il formato RTCM a livello 3

Soluzioni per PPP Static
 

Considerando che si tratta di un GPS singola frequenza un posizionamento realtime xy di circca +/- 20 cm non e' per niente male

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)

}


RAG con Ollama Mistral e LangChain

Una altra prova usando questo repository https://github.com/CallumJMac/lessons Il folder di riferimento e'  lessons/1. RAG/examples/pixe...