venerdì 10 febbraio 2012
Applet Wireless Netowork su Gnome
nel caso si cancellasse erroneamente l'applet che gestisce le connessioni Wi-Fi nella barra di Gnome, questa puo' essere ripristinata cliccando destro sulla barra/Aggiungi al Pannello/Area di Notifica
mercoledì 8 febbraio 2012
Bussola Geologica - Geological Compass
Un utilizzo dei sensori del telefono Android per creare una bussola da rilevamento geologico
Al contrario del normale metodo per orientare la bussola con questo programma basta appoggiare il telefono sulla superficie piana da misurare e si ha direttamente la misura di strike/dip
-------------------------------------------------------------------------------------------
import android, time,math
droid = android.Android()
droid.startSensingTimed(1,1000)
time.sleep(2)
while True:
azimuth = droid.sensorsReadOrientation().result[0]
pitch = droid.sensorsReadOrientation().result[1]
roll = droid.sensorsReadOrientation().result[2]
pimezzi = math.pi/2
cosalfa = math.cos(roll-pimezzi)
cosbeta = math.cos(pitch-pimezzi)
dir_maxpendenza = math.degrees(math.atan(cosalfa/cosbeta))
if (pitch < 0):
dir_maxpendenza = dir_maxpendenza + 180
if ((pitch > 0) and (roll < 0)):
dir_maxpendenza = dir_maxpendenza + 360
dir_maxpendenza = (math.degrees(azimuth)+dir_maxpendenza)% 360
print "Strike : " + str(dir_maxpendenza)
ang_maxpendenza = 90-math.degrees(math.acos(math.sqrt((cosalfa*cosalfa)+(cosbeta*cosbeta))))
print "Dip: "+ str(ang_maxpendenza)
droid.stopSensing()
-------------------------------------------------------------------------------------------
da http://portal.tugraz.at/portal/page/portal/i_2720/Projects/diggc |
-------------------------------------------------------------------------------------------
import android, time,math
droid = android.Android()
droid.startSensingTimed(1,1000)
time.sleep(2)
while True:
azimuth = droid.sensorsReadOrientation().result[0]
pitch = droid.sensorsReadOrientation().result[1]
roll = droid.sensorsReadOrientation().result[2]
pimezzi = math.pi/2
cosalfa = math.cos(roll-pimezzi)
cosbeta = math.cos(pitch-pimezzi)
dir_maxpendenza = math.degrees(math.atan(cosalfa/cosbeta))
if (pitch < 0):
dir_maxpendenza = dir_maxpendenza + 180
if ((pitch > 0) and (roll < 0)):
dir_maxpendenza = dir_maxpendenza + 360
dir_maxpendenza = (math.degrees(azimuth)+dir_maxpendenza)% 360
print "Strike : " + str(dir_maxpendenza)
ang_maxpendenza = 90-math.degrees(math.acos(math.sqrt((cosalfa*cosalfa)+(cosbeta*cosbeta))))
print "Dip: "+ str(ang_maxpendenza)
droid.stopSensing()
-------------------------------------------------------------------------------------------
martedì 7 febbraio 2012
Git e GitHub
ho spostato il progetto su Git Hub e riporto di seguito un breve tutorial
prima di registrarsi su GitHub e' necessario configurare la propria Linux Box creando le proprie chiavi ssh con il comando
ssh-keygen -t rsa -C "your_email@youremail.com"
formulando la passphrase
successivo passo importante e' quello di definire l'utente che usa Git
git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@youremail.com"
la mail deve essere la stessa con cui e' stata firmata la chiave RSA
successivamete dall'interfaccia del sito si deve creare un repository
per iniziare ad usare il repository ci si deve poi porre nella root del progetto sul disco locale e scrivere
git init
questo comando crea una directory nascosta in cui vengono inseriti i file di configurazione di Git
Dopo di cio' per popolare il server remoto si deve
git add .
git commit -m 'commento al commit'
git remote add origin git@github.com:username/nome_repository.git
git push origin master
prima di registrarsi su GitHub e' necessario configurare la propria Linux Box creando le proprie chiavi ssh con il comando
ssh-keygen -t rsa -C "your_email@youremail.com"
formulando la passphrase
successivamente ci si registra su GitHub e nel menu "Account Settings” > Click “SSH Public Keys” > Click “Add another public key” si deve inserire il contenuto del file rsa.pub contenuto nella directory .ssh della propria home.
Si puo' testare il corretto inserimento digitando ssh -T git@github.comsuccessivo passo importante e' quello di definire l'utente che usa Git
git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@youremail.com"
la mail deve essere la stessa con cui e' stata firmata la chiave RSA
successivamete dall'interfaccia del sito si deve creare un repository
per iniziare ad usare il repository ci si deve poi porre nella root del progetto sul disco locale e scrivere
git init
questo comando crea una directory nascosta in cui vengono inseriti i file di configurazione di Git
Dopo di cio' per popolare il server remoto si deve
git add .
git commit -m 'commento al commit'
git remote add origin git@github.com:username/nome_repository.git
git push origin master
per effettuare gli aggiornamenti si puo' procedere,ponendosi nella directory di radice del progetto sottoposto a Git con
git diff per vedere le differenze con il progetto precedente
git commit -m "stringa" per preparare l'aggiornamento del progetto su GitHub. Fino ad ora comunque non sono state fatte modifiche al sistema di GitHub e tutto rimane in locale. Nella stringa si puo' riassumere in modo stringato le modifiche effettuate
git push -u origin master effettua l'invio e la sincronizzazione con il database remoto
Attenzione: se si sono aggiunti dei file rispetto al commit precedente si deve in modo esplicito digitare il comando
git add nomefile per includere il file nel progetto Git
per aggiungere invece in un colpo solo tutti i file che sono stati creati nel progetto si digita invece
git add . (attenzione al punto finale..e' importante)
con git status si ha un elenco della situazione della sincronia del progetto
se si vuole invece copiare un progetto da git e creare una copia locale (clone) si puo' digitare
git clone git@github.com:c1p81/GpsTest.git
git diff per vedere le differenze con il progetto precedente
git commit -m "stringa" per preparare l'aggiornamento del progetto su GitHub. Fino ad ora comunque non sono state fatte modifiche al sistema di GitHub e tutto rimane in locale. Nella stringa si puo' riassumere in modo stringato le modifiche effettuate
git push -u origin master effettua l'invio e la sincronizzazione con il database remoto
Attenzione: se si sono aggiunti dei file rispetto al commit precedente si deve in modo esplicito digitare il comando
git add nomefile per includere il file nel progetto Git
per aggiungere invece in un colpo solo tutti i file che sono stati creati nel progetto si digita invece
git add . (attenzione al punto finale..e' importante)
con git status si ha un elenco della situazione della sincronia del progetto
se si vuole invece copiare un progetto da git e creare una copia locale (clone) si puo' digitare
git clone git@github.com:c1p81/GpsTest.git
domenica 5 febbraio 2012
DGPS su GitHub
il codice del progetto per il GPS Differenziale e' stato pubblicato su GitHub
al link https://github.com/c1p81/GpsTest
per scaricare il codice si puo' utilizzare il link git@github.com:c1p81/GpsTest.git
al link https://github.com/c1p81/GpsTest
per scaricare il codice si puo' utilizzare il link git@github.com:c1p81/GpsTest.git
Move app su SDCard
Per poter spostare, una volta installata, una applicazione sulla SD e' aggiungere nel file Manifest la scritta installLocation="auto"
-------------------------------------------------------------------------------------------------------------
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.gpstest"
android:versionCode="1"
android:versionName="1.0" android:installLocation="auto">
-------------------------------------------------------------------------------------------------------------
altrimenti in modo automatico da dentro Eclipse si puo' usare il menu
-------------------------------------------------------------------------------------------------------------
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.gpstest"
android:versionCode="1"
android:versionName="1.0" android:installLocation="auto">
-------------------------------------------------------------------------------------------------------------
altrimenti in modo automatico da dentro Eclipse si puo' usare il menu
giovedì 2 febbraio 2012
Magnetometro come misuratore di distanza
Ho provato ad usare il magnetometro contenuto nel telefono come sensore di distanza. Il sistema prevede l'impiego di una calamita, del telefono Android e dello script riportato di seguito
-----------------------------------------------------------------------------------------
import android, time
droid = android.Android()
droid.startSensingTimed(1, 250)
time.sleep(1)
f = open('/sdcard/magnete00.txt','w')
while True:
s5 = droid.sensorsReadMagnetometer().result
f.write(str(s5[0])+";"+str(s5[1])+";"+str(s5[2])+"\n")
print str(s5[0])+" "+str(s5[1])+" "+str(s5[2])
droid.stopSensing()
-----------------------------------------------------------------------------------------
Il sistema puo' avere impieghi piu' disparati dal realizzare un sistema di allarme (mettendo il magnete su uno stipite di una porta ed il sensore dall'altra) a misuratori di distanza a corto raggio.
La prova e' stata effettuando allontanando il magnete dal telefono e registrando il valore medio ad ogni distanza
Come si puo' vedere dal grafico sottostante
il comportamento del sensore e' ottimale nonostante lo scarso campionamento del convertitore ADC con un errore pari a circa qualche punto percentuale. Con questo sistema e' quindi possibile sicuramente misurare spostamenti dell'ordine di 2mm ma credo sia possibile scendere anche a sensibilita' pari ad 1mm di spostamento
Da notare che le unita' di misura del magnetometro non sembrano essere unita' fisiche. A seguito di una calibrazione con la app Stato GPS i valori sono passati da circa 30 unita' a 15 unita'
-----------------------------------------------------------------------------------------
import android, time
droid = android.Android()
droid.startSensingTimed(1, 250)
time.sleep(1)
f = open('/sdcard/magnete00.txt','w')
while True:
s5 = droid.sensorsReadMagnetometer().result
f.write(str(s5[0])+";"+str(s5[1])+";"+str(s5[2])+"\n")
print str(s5[0])+" "+str(s5[1])+" "+str(s5[2])
droid.stopSensing()
-----------------------------------------------------------------------------------------
Il sistema puo' avere impieghi piu' disparati dal realizzare un sistema di allarme (mettendo il magnete su uno stipite di una porta ed il sensore dall'altra) a misuratori di distanza a corto raggio.
La prova e' stata effettuando allontanando il magnete dal telefono e registrando il valore medio ad ogni distanza
Come si puo' vedere dal grafico sottostante
Misure magnetometro Distanza-Intensita' |
Da notare che le unita' di misura del magnetometro non sembrano essere unita' fisiche. A seguito di una calibrazione con la app Stato GPS i valori sono passati da circa 30 unita' a 15 unita'
DGPS Test 2
Il metodo del GPS Differenziale prevede una correzione basato sul cacolo delle effemeridi dei satelliti e degli errori degli orologi atomici. L'idea sarebbe quella di effettuare un sistema DGPS usando due GPS di due telefoni senza la pretesa di scendere alla precisione del centimetro ma quanto meno di migliore l'errore di posizionamento di un singolo telefono.
Se i due telefoni sono ragionevolmente vicini (nel raggio di qualche chilometro l'uno dall'altro) e condividono la stessa elettronica saranno ragionevolmente affetti dagli stessi errori sistematici che si possono annullare mantenendone uno fisso
Per il secondo test di GPS differenziale mi sono dotato di due telefoni identici (due Huawei 8150 Ideos Vodafone) con montato il medesimo programma utilizzato per il primo test. I due telefoni sono stati posti uno vicino all'altro (pochi centimetri) fissato il punto in modo simultaneo e messi in registrazione in simultanea
Lo script del test 1 e' stato leggermente modificato in modo da scrivere anche il tempo e data ripresi dall'orologio del telefono ed tempo ripreso dal satellite GPS (loc.getTime())
In particolare e' interessante il secondo valore (espresso in millisecondi a partire dalla data del 1 gennaio 1970 00:00:00) perche' puo' essere utilizzato come sincronizzatore tra le due serie di misure. Questa funzione e' quella impiegata dalla app GPS Time (Market Android). Per passare dallo Unix time in millisecondi al formato data/ora in formato leggibile da un umano si puo' usare in Openoffice Calc la formula
A1/86400000+DATA(1970;1;1) e poi formattando la cella come data/ora (supponendo che il dato da convertire sia nella cella A1)
--------------------------------------------------------------------------------------------------------
package com.test.gpstest;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.widget.Toast;
public class GpsTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* Use the LocationManager class to obtain GPS locations */
LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
LocationListener mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
}
public class MyLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location loc)
{
loc.getLatitude();
loc.getLongitude();
loc.getAccuracy();
String Text = "My current location is: " + "Latitud = " + loc.getLatitude() +"Longitud = " + loc.getLongitude()+" Accuracy = " + loc.getAccuracy();
Toast.makeText( getApplicationContext(),Text,Toast.LENGTH_SHORT).show();
// scrive i dati sul file
try {
File root = Environment.getExternalStorageDirectory();
if (root.canWrite()){
File gpxfile = new File(root, "dati_gps.txt");
FileWriter gpxwriter = new FileWriter(gpxfile,true);
BufferedWriter out = new BufferedWriter(gpxwriter);
//String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
out.write(currentTimeString+";"+loc.getTime()+";"+loc.getLatitude()+";"+loc.getLongitude()+";"+loc.getAccuracy()+"\n");
out.close();
}
} catch (IOException e) {
}
}
@Override
public void onProviderDisabled(String provider)
{
Toast.makeText( getApplicationContext(),"Gps Disabled",Toast.LENGTH_SHORT ).show();
}
@Override
public void onProviderEnabled(String provider)
{
Toast.makeText( getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}/* End of Class MyLocationListener */
}
--------------------------------------------------------------------------------------------------------
Come si osserva nei primi istanti l'errore di posizionamento e' alto ma decresce rapidamente fino a 2 metri dichiarati. La distanza relativa tra i due punti e' stata calcolata usando il valore medio di latitudine e longitudine (eliminando i primi punti con HDOP troppo elevata) ed e' risultata di circa 1.2 m
Calcolando la differenza di ogni latitudine e longitudine rispetto al valore medio per i due GPS si osserva una certa correlazione sulla longitudine ma non sulla latitudine
Effettuando una correzione utilizzando i delta di differenza tra i due GPS non si hanno significativi miglioramenti della distanza reciproca tra i sensori
Se i due telefoni sono ragionevolmente vicini (nel raggio di qualche chilometro l'uno dall'altro) e condividono la stessa elettronica saranno ragionevolmente affetti dagli stessi errori sistematici che si possono annullare mantenendone uno fisso
Per il secondo test di GPS differenziale mi sono dotato di due telefoni identici (due Huawei 8150 Ideos Vodafone) con montato il medesimo programma utilizzato per il primo test. I due telefoni sono stati posti uno vicino all'altro (pochi centimetri) fissato il punto in modo simultaneo e messi in registrazione in simultanea
Lo script del test 1 e' stato leggermente modificato in modo da scrivere anche il tempo e data ripresi dall'orologio del telefono ed tempo ripreso dal satellite GPS (loc.getTime())
In particolare e' interessante il secondo valore (espresso in millisecondi a partire dalla data del 1 gennaio 1970 00:00:00) perche' puo' essere utilizzato come sincronizzatore tra le due serie di misure. Questa funzione e' quella impiegata dalla app GPS Time (Market Android). Per passare dallo Unix time in millisecondi al formato data/ora in formato leggibile da un umano si puo' usare in Openoffice Calc la formula
A1/86400000+DATA(1970;1;1) e poi formattando la cella come data/ora (supponendo che il dato da convertire sia nella cella A1)
--------------------------------------------------------------------------------------------------------
package com.test.gpstest;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.widget.Toast;
public class GpsTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* Use the LocationManager class to obtain GPS locations */
LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
LocationListener mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
}
public class MyLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location loc)
{
loc.getLatitude();
loc.getLongitude();
loc.getAccuracy();
String Text = "My current location is: " + "Latitud = " + loc.getLatitude() +"Longitud = " + loc.getLongitude()+" Accuracy = " + loc.getAccuracy();
Toast.makeText( getApplicationContext(),Text,Toast.LENGTH_SHORT).show();
// scrive i dati sul file
try {
File root = Environment.getExternalStorageDirectory();
if (root.canWrite()){
File gpxfile = new File(root, "dati_gps.txt");
FileWriter gpxwriter = new FileWriter(gpxfile,true);
BufferedWriter out = new BufferedWriter(gpxwriter);
//String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
out.write(currentTimeString+";"+loc.getTime()+";"+loc.getLatitude()+";"+loc.getLongitude()+";"+loc.getAccuracy()+"\n");
out.close();
}
} catch (IOException e) {
}
}
@Override
public void onProviderDisabled(String provider)
{
Toast.makeText( getApplicationContext(),"Gps Disabled",Toast.LENGTH_SHORT ).show();
}
@Override
public void onProviderEnabled(String provider)
{
Toast.makeText( getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}/* End of Class MyLocationListener */
}
--------------------------------------------------------------------------------------------------------
Dati non elaborati |
Calcolando la differenza di ogni latitudine e longitudine rispetto al valore medio per i due GPS si osserva una certa correlazione sulla longitudine ma non sulla latitudine
Differenze di longitudine rispetto alla media |
Differenze di latitudine rispetto alla media |
Distanza tra sensori con valori corretti sulla base del valore medio |
Usando un altro approccio ovvero correlando a coppie le varie posizioni GPS allo stesso tempo si osserva una correlazione decisamente piu' stringente
Utilizzando le correlazioni precedenti per correggere i valori delle posizioni GPS le nuove tracce GPS sono le seguenti. Si osserva chiaramente il miglioramento e la sostanziale coincidenza dei dati misurati
Dati corretti da retta di calibrazione |
Calcolo della distanza corretta |
La distanza tra i due GPS e' calcolata con il metodo correlatao in circa 4 cm che e' sostanzialmente la reale distanza presente tra i due sensori al momento delle acquisizioni
Questa prova si e' rivelata sostanzialmente un successo che ha comunque necessita' di conferme
Questa prova si e' rivelata sostanzialmente un successo che ha comunque necessita' di conferme
Iscriviti a:
Post (Atom)
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...