martedì 28 novembre 2017

Maratona Firenze 2017

Il solito stupido giochino di ogni anno...quante volte sono finito su foto pubblicate da siti di giornali??
Quest'anno sono particolarmente riconoscibile per la pelata

In secondo piano




In ginocchio tenendo il nastro di partenza



Subito dopo la curva entrando in Piazza del Duomo

lunedì 20 novembre 2017

HAX emulator error per Android Studio su Mac High Sierra

Oggi ho ripreso dopo un po' di tempo il Mac per sviluppare su Android, in particolar modo dopo l'aggiornamento ad HIgh Sierra



La novita' e' che l'emulatore Android non ne voleva sapere di funzionare uscendo con Exit Code 0 dopo aver posto le rimostranze per non aver trovato l'accelerazione HAX

Dopo averne provate diverse la soluzione e' stata File->Invalidate Cache->Invalidate and Restart




giovedì 16 novembre 2017

Nexus 5x / RTKLib / Geo++ / DGPS

Stessa prova vista in questo post ma con un Nexus 5X.
L'applicazione Geo++ non e' quella presente sul market ma si tratta di una beta ricevuta dallo sviluppatore perche' Nexus 5x ha delle particolarita' (in realta' non e' molto chiaro se sia Nexus 5X oppure l'implementazione delle API perche' su Android Oreo stock la beta Geo++ non funziona mentre si ottengono risultati con Oreo beta)


Il punto topografico di riferimento e' sempre il solito come il post processing

Il punto calcolato risulta essere
43.833026632 11.307094997 201.0573

in precedenza i dati erano
dalla scheda del punto topografico
43.83304783 11.30706278 203.3

I dati post processati con RTKLib ed acquisiti con Nexus 9
43.833068271 11.307051667 184.74

da segnalare su questo argomento la seguente pubblicazione scientifica che riporta dei risultati decisamente interessanti

Precise GNSS Positioning Using Smart Devices
Eugenio Realini, Stefano Caldera Lisa Pertusini,Daniele Sampietro
Geomatics Research & Development s.r.l. (GReD), via Cavour 2, c/o ComoNExT, 22074 Lomazzo (Como), Italy

mercoledì 15 novembre 2017

Creare report PDF in Android

Ogni tanto (raramente) puo' essere necessario creare un report in una applicazione Android (anche se questa operazione e' piu' tipicamente indirizzata ad applicazione Desktop)

La soluzione piu' semplice e' appoggiarsi ad una libreria per la generazione di PDF come iTextPdf

per configurare le dipendenze si deve includere in build.gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'    })
    compile 'com.android.support:appcompat-v7:26.+'    compile 'com.android.support.constraint:constraint-layout:1.0.2'    compile 'com.android.support:design:26.+'
    //dipendenza PDF    compile 'com.itextpdf:itextg:5.5.9'
    testCompile 'junit:junit:4.12'}

Fatto cio' si puo' procedere come in seguito. L'unico aspetto di interesse e' che quando si lancia l'intent per la visualizzazione del Pdf, a causa della gestione dei permessi, si deve gestire l'errore  android.os.FileUriExposedException

---------------------------------------------------------------------------------------

package com.example.lucainnocenti.photonotation;

import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ReportActivity extends AppCompatActivity {

    private Button pulsante;
    private FileOutputStream output;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_report);

        pulsante = (Button) findViewById(R.id.buttonpdf);
        pulsante.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View view) {
                try {
                    try {
                        crea_pdf();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } catch (DocumentException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void crea_pdf() throws IOException, DocumentException {
        File pdfFolder = new File(Environment.getExternalStorageDirectory().getPath(), "Photonotation");
        if (!pdfFolder.exists()) {
            pdfFolder.mkdir();
            Log.i("Photonotation", "Pdf Directory created");
        }

        //Create time stamp        Date date = new Date() ;
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(date);

        String percorso = pdfFolder.getAbsolutePath() + "/" + timeStamp +".pdf";
        Log.i("Photonotation", percorso);

        File myFile = new File(percorso);

        output = new FileOutputStream(percorso);
        Document document = new Document(PageSize.A4);
        PdfWriter.getInstance(document, output);
        document.open();
        document.add(new Paragraph("Luca"));
        String path = "/storage/emulated/0/Photonotation/20171031_140238.jpg";
        Image image = Image.getInstance(path);
        document.add(image);

        document.close();

        // visualizza il pdf prodotto        
        // le prime righe servono ad evitare android.os.FileUriExposedException        
        if(Build.VERSION.SDK_INT>=24){
            try{
                Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
                m.invoke(null);
            }catch(Exception e){
                e.printStackTrace();
            }
        }


        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(myFile), "application/pdf");
        intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        startActivity(intent);


    }
}

Nexus 9 / RTKLIB/ Geo++ / DPGS

Dopo la prova del precedente post ho provato ad usare l'applicazione Geo++ su Nexus 9 con RTKLIB in postprocessing per vedere se era possibile ottenere una correzione DGPS



Il punto trigonometrico di riferimento e' sempre il solito visto qui . La novita' e' che l'antenna GPS della Provincia di Firenze che usavo come antenna base per la correzione DGPS non fornisce piu' dati probabilmente a seguito della dismissione della Provincia stessa. Un sostituto e' stato trovato nell'antenna base dell'IGM posta in via Baracca a Firenze i cui dati possono essere scaricati a questo link

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

e piu' in dettaglio qui (la sigla della stazione e' igmi. i dati sono ordinati per cartelle del giorno dell'anno progressivo e dell'ora di acquisizione. I dati del giorno 311 per esempio ora T avranno un nome file del tipo igmi311t.17d.Z)

ftp://igs.bkg.bund.de/EUREF/nrt/

I dati relativi dalla scheda del punto topografico indicano una posizione di riferimento
43.83304783 11.30706278 203.3
I dati post processati con RTKLib vengono indicate le seguenti coordinate
43.833068271 11.307051667 184.74

La cosa che mi disturba e' che RTKLib non fornisce l'errore di posizionamento

I dati post processati dalla ditta che fornisce Geo ++ forniscono un punto (nessun errore di posizionamento fornito)
43,833042 11,307012 171.7541

Gli stessi dati processati con Leica GeoOffice di Leica portano una posizione completamente differente, in particolare e' completamente sballato il dato di quota
11° 22' 52".68555 -43° 49' 59".11283 1023.8346

considerando che le differenze nella posizione si trovano nella quinta posizione decimale dopo la virgola non sembra proprio male (lasciando perdere la quota che pero' non e' di mio interesse)

mercoledì 8 novembre 2017

Precise Point Positioning con Nexus 9 ed Android 7.1.1

Con l'introduzione delle API di misura Raw Gnss avevo gia' provato qualche tempo fa la applicazione di test fornita da Google, ovvero GnssLogger, ma senza un programma per gestire il file di log l'esperimento non era andato molto in la'

Adesso ho trovato su questo link uno script in Python che converte il file di log in un formato Rinex che puo' essere dato in pasto ad RTKLib per il post processing dei dati 

Attenzione: lo script funziona su Python 3.x e non su Python 2.x

Per la prova ho usato un tablet Nexus 9 (senza supporto cellulare) che come riportato da questo link e'
uno dei pochi dispositivi certificati per funzionare con le API Raw Gnss (anzi e' uno dei pochi con la piena funzionalita')

Si usa quindi GnssLogger (vedi link per l'apk) per l'acquisizione dei dati, lo script android_to_rinex.py per la conversione in Rinex ed RTKPost in modalita' PPP per il post processing


Il risultato finale non e' niente male perche' l'errore si riduce a circa 1 m sui tre assi ed i dati riescono a convergere in meno di un minuto

GNSS Android 8

Tempo fa avevo provato l'applicazione demo delle nuovi API per GNSS di Android. Adesso e' disponibile una applicazione per verificare i dati salvati nel file dati (link). La applicazione Linux e' scaricabile da qui

https://github.com/google/gps-measurement-tools/releases/download/2.4.0.0/GnssAnalysisLinuxV2.4.0.0.zip

Per installare la applicazione si usa un web installer che permette di installare anche il runtime di Matlab senza la necessita' di avere una licenza

La applicazione e' installata di default in

/usr/local/Desktop/GnssAnalysisFiles/application

per lanciare l'applicazione si usa

./run_GnssAnalysisApp.sh ../../../MATLAB/MATLAB_Runtime/v901/

A questo punto si importa il file derivante da Android. In questo caso il file deriva da un Nexus 9 e quindi sono disponibili anche i dati GLONASS



 
Per usare Analyze and Plot si deve essere collegati ad Internet perche' devono essere scaricati in automatico i file delle effemeridi dei satelliti.

Al termine si puo' cliccare sull'icona del robottino verde per ottenere un report in formato HTML

Dalla lettura del file si vedono i test riusciti e quelli falliti. Per esempio


 

The GPS reference threshold is set to 38 dBHz. Well built phones, 
in open sky, have GPS satellites stronger than this threshold. 
GLONASS threshold is 2.5dB lower, since GLO signal is 2.5dB weaker, 
(see GPS and GLONASS ICDs).

For your log file the C/No results are:
GPS, mean of strongest 4 median C/No = 35.6 dBHz
Pass/fail reference threshold = 38.0 dBHz
Errors. Signals -2.4 dB compared to reference
FAIL BECAUSE OF WEAK SIGNALS
GLO, mean of strongest 4 median C/No = 36.0 dBHz
Pass/fail reference threshold = 35.5 dBHz
PASS








Come output si hanno anche i file .mat, .nmea e .derived