mercoledì 29 aprile 2015

Mappe offline con Phonegap e Leaflet.js

Mi e' stato chiesto di sviluppare una applicazione per Android/IOS/W8 che permetta di visualizzare mappe di escursionismo in modalita' completamente offline (non e' prevista la copertura internet via cellulare nel mezzo del bosco) e con un minimo di utilizzo del posizionamento GPS



Una delle richieste e che l'utente doveva avere subito disponibile tutta la cartografia dell'area di interesse (24Km x13Km) senza la necessita' di scaricare dati

Viste le limitazioni imposte e i sistemi da supportare mi sono orientato su una applicazione HTML5 su Phonegap ed usando la libreria Leaflet.JS .
Con Leaflet e' possibile mostrare mappe dinamiche (pan/zoom) derivanti dai progetti di cartografici open e vista la tematica ho scelto come sorgente dati 4UMaps, un servizio dedicato all'escursionismo e alla mountain bike con indicazione delle isoipse e di alcuni tracciati di sentieri

Le varie mattonelle della cartografia ai vari livelli di dettaglio (su 4UMaps il livello di maggiore dettaglio e' il 15) possono essere scaricati medianti il softare MOBAC (Mobile Atlas Creator), un software Java che date le coordinate dei vertici si occupa di scaricare tutti i dati legati all'area selezionata


Il primo problema che si e' posto e' che le mappe dell'area di interesse agli zoom 13-14-15 ha una dimensione di circa 90 Mb, decisamente troppi per gli utenti che si devono scaricare tutto il pacchetto (il limite proposto per l'applicazione completa e' massima di 50 Mb).

Mediante il software Pngyu e' pero' possibile effettuare una compressione dei PNG delle mappe di un fattore del 40-50% senza perdere sensibilmente in qualita'

Per ottenere il segnale del punto GPS e' possibile utilizzare un plugin per Leaflet (Leaflet.Control.GPS)

Per sovrapporre una traccia GPS alla mappa esistono vari plugin di leaflet ma sono nati per l'uso online ed usandoli all'interno di Phonegap viene generato un errore di javascript che per problemi di sicurezza non puo' accedere ai dati sul filesystem; per ovviare a questa limitazione ho trasformato il file GPX in un file testo creando poi un polilinea con l'array dei punti ...tracce con 5000 punti sono gestite senza troppi problemi o rallentamenti)

Al termine il file html di un progetto di sentiero e' cosi' composto (nella sottocartella Maps sono contenute le immagini della cartografia divise per livello di zoom)

--------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<title>Sentiero 2</title>
<meta charset="utf-8" />

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<link rel="stylesheet" href="leaflet.css" />
<link rel="stylesheet" href="leaflet-compass.css" />
<link rel="stylesheet" href="leaflet-gps.css" />
</head>
<body>
<div id="map" style="width: 500px; height: 500px"></div>

<script src="leaflet.js"></script>
<script src="leaflet-compass.js"></script>
<script src="leaflet-gps.js"></script>

<script>

var map = L.map('map').setView([44.1496, 10.7321], 12);

L.tileLayer('Maps/{z}/{x}/{y}.png', {
maxZoom: 15,
attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
'<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © <a href="http://4umaps.eu">4UMaps</a>',
id: 'examples.map-i875mjb7'
}).addTo(map);



var polygon = L.polyline([
   [44.136394501,10.721472740],
[44.136398315,10.721463203],
[44.136402130,10.721356392],
[44.136432648,10.721227646],
[44.136440277,10.721220016],
[44.136497498,10.721108437],
[44.136562347,10.721001625],
..................................................................................
..................................................................................
[44.136318207,10.721796036],
[44.136318207,10.721800804],
[44.136306763,10.721786499],
[44.136322021,10.721772194],
[44.136325836,10.721771240],

]).addTo(map);

//map.addControl( new L.Control.Compass() );
map.addControl( new L.Control.Gps({autoActive:false}) );



</script>
</body>

</html>
--------------------------------------------------------

martedì 28 aprile 2015

Windows Phone SDK su Virtualbox

Sto sviluppando una applicazione in Phonegap e volevo provare a fare il porting in Windows Phone....peccato che non ho una macchina fisica con installato Windows 8.
Per questo motivo ho provato ad installare il sistema di sviluppo su una macchina virtuale VirtualBox partendo da un disco di installazione Windows 8 Pro


I primi problemi non hanno tardato ad arrivare. Per installare il sistema non e' stato possibile usare l'installer online ma ho dovuto prendere l'immagine iso del DVD dell'SDK (circa 1.6 Gb) ed installarlo in questo modo
Una volta avuto l'SDK funzionante ho visto che il sistema di creazione dell'interfaccia utente non funzionava, non era possibile comporre i form delle pagine dell'applicazione....leggendo a giro ho visto che il problema era legato ad un conflitto tra l'installazione di Silverlight di W8 e quello dell'SDK. E' stato necessario rimuovere l'SDK e Silverlight e ripartire da capo con l'installer

Alla fine sono riuscito ad avere l'IDE completa ed ho trovato l'ultima sorpresa. Nei dispositivi non era presente l'opzione dell'emulatore del Windows Phone


Lanciando a  mano il software dell'emulatore, dall'esterno dell'ambiente di sviluppo, e' risultato un po' piu' chiaro il motivo.....l'emulatore di Windows Phone gira come macchina virtuale direttamente dentro a Windows ma Virtualbox, essendo lui stesso un ambiente di virtualizzazione, non permette un ambiente virtuale dentro un ambiente virtuale.

Nessuna soluzione. O mi compro un telefono Windows o cerco un computer fisico con Windows 8 installato dove far girare l'emulatore

Schermare beacon

Lavorando con diversi beacon e' piuttosto fastidioso quando interferiscono tra di loro all'interno dell'ufficio



Un sistema banale e' quello di avvolgere i trasmettitori nella carta argentata per uso alimentare (piu' di una volta, un solo giro non e' garanzia di schermatura), altrimenti possono essere messi dentro un forno a microonde

OpenVPN Server e Client su Westermo

Dopo aver aggiornato il firmware al Westermo Lynx DSS L205-S1 (per me al firmware v4.15.3) e' possibile creare un server OpenVPN

Prima di tutto pero' e' necessario impostare la data e l'ora sul dispositivo

Questo e' importante perche' i certificati di autenticazione self-signed hanno tempo di default di scadenza di 10 anni. Il Lynx, se non ha l'ora impostata, parte dal 1 gennaio 1970 e cio' comporta il fatto che tutti i certificati risultano scaduti (...nel futuro)
(in caso di non aver settata l'ora corretta sul server verra' generato il criptico messaggio di errore
OpenVPN - TLS incoming plaintext read error)

In seguito devono essere generati i certificati mediante la normale procedura mediante easy-rsa (le istruzioni possono essere seguite mediante la guida qui linkata)

Se tutto e' andato bene ci troveremo con diversi file relativi ai certificati per il server e per il client

dato che stiamo guardando il lato server si deve andare nel menu Maintenance/Certificates e si effettua l'upload dei file ca.crt (come CA Certificate), ca.key (come Private Key), Server.key (come Private Key) ed infine Server.crt (come Certificate)


fatto cio' ci si sposta in Configuration/VPN&Tunnel/SSL per terminare la configurazione di OpenVPN

Senza mutare nessuna configurazione si scorre verso il basso e si popolano i campi Local Certificate con il valore Server e CA Certificate come ca (cliccando sull'icona del folder si ottiene un aiuto)

Si avvia il server VPN con la spunta in alto (Enabled)
Per permettere che i client VPN si vedano reciprocamente e' utile spuntare Client-to-Client

Per verificare che tutto funzioni si puo' andare su Maintenance/ViewLog

Come VPN Client ho usato un Westermo MRD-310. Non ho avuto necessita' di aggiornare il firmware perche' il client OpenVPN era gia' incluso in quello installato
Per amministrare questo dispositivo ci si puo' collegare a 192.168.2.200 con credenziali admin/westermo

Come nel caso precedente si deve prima settare l'ora in System/Administration



Si popola quindi il certificato OpenVPN del client in VPN/Certificates. L'opzione migliore e' avere il certificato direttamente in formato PK12


Si va poi in VPN/SSL per settare i parametri di configurazione. Sostanzialmente e' sufficiente mettere l'IP del server VPN (oscurato nell'immagine sottostante) e selezionare il certificato prima inserito

Si abilita la VPN (flaggando in alto) e si va in Status/System Log per verificare che il collegamento sia avvenuto (tale verifica si fa anche sui log del server)




giovedì 9 aprile 2015

Android come tavoletta grafica

A seguito del precedente post ho visto con un po' di sorpresa che il tablet che mi e' stato prestato e' un Panasonic FZ-A1 che monta un digitalizzatore Wacom (per essere piu' precisi un Penabled, basato su tecnologia EMR e quindi in grado di avere la posizione del mouse anche se il pennino non poggia sullo schermo link)




Mi e' venuta cosi' l'idea di poterlo utilizzare, nonostante lo schermo rotto, come tavoletta grafica per disegnare....ovviamente qualcuno ci aveva gia' pensato e la soluzione e' stata GfxTablet 

GfxTablet e' costuita da una coppia di applicazioni, una client da montare sul tablet Android ed una server da montare su una macchina Linux. Il client cattura la posizione dello stilo sul tablet ed il livello di pressione e lo manda al server sul PC che converte i dati. La trasmissione avviene su protocollo UDP in porta 40118

L'applicazione Android e' stata ricompilata direttamente  partendo dai sorgenti cosi' come la parte server (su una macchina Ubuntu 14.10). In nessuno dei due casi ci sono stati particolari problemi di compilazione

A questo punto si lancia l'applicazione sui due dispositivi configurando sul client l'ip della macchina server e se tutto e' andato a buon fine si vedra' il cursore di XWindow muoversi come la penna sulla tavoletta.
(per verificare si digiti il comando xinput list e dovra' comparire un dispositivo Network Tablet)

Questo sistema puo' essere anche usato per disegnare con Gimp configurando opportunamente il device di input dal menu Modifica/Preferenze/Dispositivi di ingresso

Di seguito uno screencast per vedere piu' in dettaglio la fluidita' del sistema
Sul terminale in background c'e' l'applicazione networktablet che riceve di dati mentre in primo piano Gimp comandato dal tablet Android


L'aspetto utile e' che questo sistema funziona wireless.

Prendere il controllo di un tablet Android con schermo rotto

Mi e' stato prestato (per vedere se lo recuperavo in qualche modo) un tablet Android con lo schermo all'80% distrutto. Il digitalizzatore e tutto il resto funzionano correttamente



Cercare di interagire con il tablet in queste condizioni e' a dir poco proibitivo ma usando Droid at Screen si puo' replicare su computer via cavo Usb il display di Android
Ci sono un po' di limitazioni
1) il sistema deve essere settato in Debug Mode. Fortunatamente nel mio caso era gia' cosi' altrimenti si puo' via Adb forzare via recovery

Adb shell 
echo "persist.service.adb.enable=1" >>/system/build.prop 
echo "persist.service.debuggable=1" >>/system/build.prop 
echo "persist.sys.usb.config=mass_storage,adb" >>/system/build.prop" 
reboot

(sorgente


2) non c'e' un puntatore per cui si deve cliccare piu' o meno a caso sull'icona del tablet una volta presa la mira guardando l'immagine sul desktop

In questo modo si possono effettuare operazioni base (io per esempio sono riuscito ad agganciarlo al WiFi)

venerdì 3 aprile 2015

Cron fork crash

Un amico mi ha contattato perche' la sua macchina di acquisizione dati (Ubuntu 14.04 su una macchina DELL certificata Linux) nella notte ha crashato con reboot e perdita di dati
La macchina e' esposta con indirizzo pubblico su Internet ma non ha servizio Web (solo SSH ed altri sistemi di controllo remoto)

I sintomi dal syslog sono una serie di errori
-----------------------------------------------------
Mar 10 06:38:01 apollo CRON[2745]: (apollo) CMD (/home/apollo/xxxxxxxxx)
Mar 10 06:38:01 apollo CRON[28701]: (apollo) MAIL (mailed 1 byte of output; but got status 0x00ff, #012)
Mar 10 06:34:01 apollo CRON[16435]: (apollo) CMD (/home/apollo/xxxxxx)
Mar 10 06:39:01 apollo CRON[18558]: (CRON) error (can't fork)
Mar 10 06:39:01 apollo CRON[16435]: (CRON) error (can't fork)
-----------------------------------------------------

con l'ultimo messaggio prima di fare reboot
-----------------------------------------------------
Mar 10 08:49:27 apollo xinetd[27808]: service telnet: too many consecutive fork failures
Mar 10 09:22:16 apollo xinetd[27808]: telnet: fork failed: Cannot allocate memory (errno = 12)
Mar 10 09:22:36 apollo xinetd[27808]: message repeated 4 times: [ telnet: fork failed: Cannot allocate memory (errno = 12)]
Mar 10 09:22:36 apollo xinetd[27808]: service telnet: too many consecutive fork failures
-----------------------------------------------------

mi viene detto che e' stato installato il servizio telnet perche' la macchina non era piu' raggiungibile via SSH (insieme a telnet erano stati installati ShellInABox, Vino e NoMachine)
Nei log erano presenti connessioni da tutto il mondo su telnet

-----------------------------------------------------
Mar 10 05:32:40 apollo in.telnetd[28701]: connect from xx.xxx.x.xxx (xx.xxxx.x.xxx)
-----------------------------------------------------

il primo consiglio e' stato quello di spengere tutti i servizi non necessari, in particolare telnet (al giorno d'oggi e' sostanzialemente obsoleta)

Il mattino dopo la macchina presentava un normale traffico di rete solo sulla rete interna ma nella notte era andata di nuovo in crash con un ultimo messaggio
-----------------------------------------------------
Mar 11 03:34:01 apollo cron[1163]: (CRON) error (can't fork)
-----------------------------------------------------
di nuovo un crash su un fork

a questo punto e' partita la ricerca sul colpevole. La macchina lavorava al 5% della CPU con la Swap libera quindi in condizioni sostanzialmente ottimali ed eseguiva uno script una volta al minuto che elabora dei dati acquisiti e invia i risultati ad un'altra macchina. Lo script era costituito da diverse fasi la somma dei tempi di ciascun passo era nettamente inferiore ad un minuto, non era quindi possibile la sovrapposizione di piu' lavori in cron che potessero generare una fork bomb

Guardando meglio e' emerso pero' che l'ultimo passo copiava i dati sulla macchina remota mediante un comando rsync un solo file (peraltro sempre dello stesso nome) ed e' stato visto che la directory di arrivo era costituita da una moltitudine di file. Il numero dei file nel server di arrivo rendevano rsync molto lenta e cio' creava il sovrapporsi dei cron ogni minuto per arrivare a saturare le risorse acccumulandosi lavoro con il tempo

Sostituito il comando rsync con scp la macchina ha ripreso a lavorare senza interruzioni



HTML Dom Parser in PHP

In questo post viene descritto come estrarre i dati da una pagina HTML. Cio' mi e' stato richiesto perche' una ditta offre un servizio di pubblicazione dati (peraltro forniti con licenza Common Creative) in formato CSV solo a seguito di autenticazione mediante un Captcha impedendo di fatto il download automatico

I medesimi dati sono pero' pubblicati anche all'interno di una tabella di una pagina HTML piuttosto complessa. Per "catturare" i dati si puo' analizzare il Document Object Method HTML (DOM) mediante la libreria Simple HTML Dom (http://simplehtmldom.sourceforge.net/) che indicizza i tag e permette di creare per esempio degli array php a partire da tag table

una volta importata la pagina html (anche da un link web oltre che file) nell'esempio sottostante e' stata selezionata la seconda tabella presente nel codice (linea evidenziata in giallo). Il contenuto della tabella e' salvato nell'array rowData

--------------------------------------------------------
<?php
require('simple_html_dom.php');
$html = file_get_html('http://xxxxxxx');

$table = $html->find('table', 2);
$rowData = array();

foreach($table->find('tr') as $row) {
    $flight = array();
    foreach($row->find('td') as $cell) {
        $flight[] = $cell->plaintext;
    }
    $rowData[] = $flight;
}
--------------------------------------------------------

La libreria funziona anche su pagine html non perfettamente formattate (per esempio con tag aperti e non chiusi)

giovedì 2 aprile 2015

Ubuntu 14.10 su Lenovo X201

Avendo fretta di mettere in servizio un Lenovo X201 ho installato su questa macchina Ubuntu al posto della mia solita Debian sperando di non aver problemi..vana speranza.

Al riavvio della macchina non funzionava il touchpad mentre era possibile muovere il mouse mediante il trackpad (il piccolo joystick rosso al centro della tastiera tipico delle macchine IBM/Lenovo)




la soluzione e' stata inserire i seguenti comandi
modprobe -r psmouse 
modprobe psmouse proto=imps

la soluzione definitiva e' quella di creare un file /etc/modprobe.d/psmouse.conf con all'interno
options psmouse proto=imps
un altro problema veramente fastidioso e' che la tastiera, nonostante in fase di installazione fosse stata indicata la lingua italiana, era rimasta settata in inglese/americano. So scrivere su una tastiera muta americana ma e' veramente difficile ricordarsi la posizione di tutti i caratteri speciali (tipo apice inverso)


Con un po' di settaggi sono riuscito a settare in italiano GNOME ma nel momento in cui aprivo una shell di terminale la tastiera ritornava in inglese. Questo problema si e' risolto da solo a seguito di un aggiornamento automatico ma mi ha perseguitato per febbraio e marzo 

Google Maps vs Openlayers

Ho praticamente sempre usato Google Maps per fornire informazioni geografiche via Web ma ultimamente mi e' stato richiesto che


  1. Fosse possibile avere un evento mouseover quando il cursore passa su marker in modo da avere le informazioni senza necessariamente cliccare
  2. Usare gif animate come icone dei marker
  3. L'aggiornamento dei dati via KML doveva essere in tempo reale
Ho quindi dovuto affrontare Openlayers come piattaforma alternativa


Di seguito un medesimo file kml con due vestizioni differenti in Openlayers e GMaps
Openlayers
Google Maps
Un po' di indicazioni di confronto
  • GoogleMaps non permette di fornire dati realtime quando si usano i KML. Di fatto i layer Kml vengono gestiti dai server di Google ed hanno un tempo di cache variabile anche superiore ai 15 minuti; con Openlayers invece la pubblicazione e' completamente gestita in proprio senza nessun ritardo
  • GoogleMaps non ha un evento mouseover quando si usano i kml. In Openlayers la funzione puo' essere programmata
  • GoogleMaps ha una comodo InfoWindow mente fornire informazioni contestuali con Openlayers e' piu' complicato e ci si appoggia a JQuery
  • Openlayers permette marker con gif animate mentre le animazioni su GMaps viene effettuata mediante trucchi e non in modo diretto
  • Openlayer non ha una base cartografica fissa, vengono usate varie sorgenti dati, e non esiste un layer di foto da satellite con dettaglio comparabile con quello di GMaps
  • Scrivere applicazioni per GMaps e' piu' semplice per gli esempi e la compattezza dei comandi. La corrispondente applicazione di Openlayer risulta essere un po' piu' complessa


Openlayers basato su http://openlayers.org/en/v3.4.0/examples/kml-earthquakes.html





giovedì 26 marzo 2015

Kinect v1 vs Kinect v2

Un po' di considerazioni sulla differenza tra Kinect 1 e Kinect2



Le maggiori differenze sono a livello dell'immagine RGB, passata da 640x480 a 1920x1080, ed IR, molto migliorata perche' e' presente in K2 un illuminatore infrarosso che rende la scena leggibile anche nel buio completo.

Per quanto riguarda il sensore di profondita' in K2 la matrice e' passata da 320x240 a 514x424 ma a causa dell'aumento dell'angolo di vista la densita' di punti per grado angolare e' solo passata da 5x5 pixel/grado a 7x7 pixel grado. Rimangono i problemi di acquisire la profondita' su oggetti molto scuri o di materiali particolari per cui la scena di profondita' puo' presentare dei buchi

Per prova ho ripreso in profondita' questi due oggetti, in particolare ero interessato a vedere se Kinect 2 riesce a vedere meglio i pulsanti del telecomando



Questa e' la visione di profondita' di K1 


mentre questa e' la visione di profondita' di K2

Non ci sono sensibili miglioramenti a parte il fatto che K2 produce una mappa piu' smussata perche' registra anche i decimi di millimetro


Giocattoli per la geomatica - Urbino 20 Marzo 2015

Il 20 Marzo 2015 sono stato ospite presso la Facolta' di Scienze e Tecnologie dell'Universita' di Urbino a presentare parte del materiale presente su questo blog, in particolare quello ad indirizzo geologico




La presentazione puo' essere scaricata a questo link http://goo.gl/Euyi0Z

Yubico Security Key su Ubuntu


In preda ad una smania di sicurezza ho attivato l'autenticazione a due passi su Google e mi sono comprato anche una chiavetta compatibile con il protocollo FIDO


In pratica nella chiave e' contenuta una firma digitale non modificabile che viene letta da Chrome per accedere ai servizi di Google senza la necessita' di un codice via telefono
La chiave era vendita come perfettamente trasparente su tutti i sistemi operativi dato che si presenta come una periferica USB di tastiera senza nessun driver da installare

L'indirizzo per registrare la chiave e' il seguente
https://security.google.com/settings/security/securitykey/add?pli=1

Su Windows XP e MacOsX nessun problema. Chrome ha visto la chiave al primo tentativo senza nessuna operazione aggiuntiva oltre all'inserimento nella porta

Su Ubuntu le cose sono state differenti. Per problemi di sicurezza interni a Linux la periferica USB non viene letta in automatico dal sistema operativo. Si deve creare il file 70-u2f.rules
------------------------------------------------------------
# this udev file should be used with udev 188 and newer
ACTION!="add|change", GOTO="u2f_end"

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0113|0114|0115|0116|0120|0402|0403|0406|0407|0410", TAG+="uaccess"

LABEL="u2f_end"
------------------------------------------------------------
ed inserirlo /etc/udev/rules.d/. Al successivo riavvio la chiavetta funziona correttamente

mercoledì 25 marzo 2015

Westermo Lynx DSS L205-S1


Mi e' stato da configurare il dispositivo Westermo Lybx DSS L205-S1. Francamente non conoscevo i prodotti Westermo ma ho potuto vedere che sono prodotti di tipo industriale di tipo rugged

Il dispositivo si monta su sbarra DIN (quella dei quadri elettrici), si caratterizza per una doppia alimentazione ridondante da 24 V CC/290 mA (l'alimentatore non e' fornito) ed ha un peso non indifferente
Non e' indifferente nemmeno il prezzo che si aggira attorno ai 1400 euro per un dispositivo che di fatto e' un piccolo routerino con le stesse funzione del gia' provato WRT54G



L'indirizzo di rete di fabbrica e' 192.168.2.200 e non ha il DHCP attivo per cui si deve mettere il portatile sulla stessa rete con IP in manuale. L'interfaccia Web ha come credenziali admin/westermo ed e' anche attivo un servizio SSH con le stesse password

La prima cosa che ho dovuto fare e' stato l'aggiornamento del firmware perche' quello di fabbrica non prevedeva OpenVPN. Adesso gli aggiornamenti del firmware vengono distribuiti in formato pkg mentre per il vecchio sistema operativo e' necessario effettuare l'upload del file .img.
Scaricato quindi il file pkg si scompatta con 7zip e si trova il file img corrispondente in

\WeOS-4.15.3\upgrade\mxc\Lynx

L'aggiornamento si effettua tranquillamente dall'interfaccia Web

GoPro

Recentemente mi e' stata prestata una GoPro Hero 3+, un giocattolino da oltre 300 euro.
La volevo usare per riprendere una presentazione 


Una volta tornato a casa ho scaricato i dati ed ho avuto la sopresa che l'audio della presentazione era del tutto inascoltabile (nel filmato era presente un forte rumore di fondo che rendeva impossibile sentire le parole)

I problemi possono essere stati due:
1) la camera era appoggiata sopra il proiettore
2) la camera e' stata usata nella sua custodia impermeabile (in modo da poterla aggianciare alla basetta e tenerla fissa)

ovviamente una volta a casa ad una nuova prova il filmato e' risultato perfettamente udibile :<<


Compilare libfreenect2 su Ubuntu e Mac

Mi e' stata prestato Kinect One, la versione aggiornata del Kinect originale per XBox 360


Le prime impressioni.
E' necessario utilizzare un calcolatore con USB3. Le specifiche di Microsoft non possono essere aggirate neanche su sistemi operativi non Windows. In Linux lanciando protonect in alcuni casi viene individuata la periferica ma poi non c'e' trasmissione dati

La libreria libfreenect2 NON funziona con il vecchio kinect per il quale bisogna ancora usare libfreenect 1

Il supporto software e' ancora abbastanza primitivo. La libreria di riferimento e' Libfreenect2 e ci sono dettagliate istruzioni sulla compilazione su Mac, Linux....peccato che nel mio caso su Ubuntu abbiano fallito con un segmentation fault

Il problema deriva dal fatto che libfreenect2 e' nata per essere impiegata su calcolatori con scheda video NVidia mentre il mio portatile Ubuntu ha una scheda Intel. Per poter compilare e far funzionare il software dimostrativo protonect si deve modificare il sorgente come indicato a questo link
https://github.com/OpenKinect/libfreenect2/issues/31

aggiungendo questo include in testa

#include <libfreenect2/packet_pipeline.h>

e cambiando la riga 61 in

libfreenect2::Freenect2Device *dev = freenect2.openDefaultDevice(new libfreenect2::CpuPacketPipeline());

in questo modo il programma non crasha piu'

Se si esegue il programma su un computer Ubuntu privo di USB3 questi saranno i messaggi

root@luca-ThinkPad-X201:/home/luca/libfreenect2/examples/protonect/bin# ./Protonect
[Freenect2Impl] enumerating devices...
[Freenect2Impl] 7 usb devices connected
[Freenect2Impl] found valid Kinect v2 @2:5 with serial 105188533647
[Freenect2Impl] found 1 devices
[Freenect2DeviceImpl] opening...
[UsbControl::claimInterfaces(IrInterfaceId)] failed! libusb error -6: LIBUSB_ERROR_BUSY
[Freenect2DeviceImpl] closing...
[Freenect2DeviceImpl] deallocating usb transfer pools...
[Freenect2DeviceImpl] closing usb device...
[Freenect2DeviceImpl] closed
[Freenect2DeviceImpl] failed to open Kinect v2 @2:5!
no device connected or failure opening the default one!

Su Mac la compilazione non e' banale. La catena di compilazione (installata via MacBrew) presente a questo link non e' completa...di fatto mancano i pacchetti di autoconf e cosi' non e' presente il comando configure (fra parentesi per usare MacBrew si deve lanciare prima il comando sudo chown root /usr/local/bin/brew per permettere la compilazione da root)
I comandi di compilazione devono essere eseguiti alla lettera lanciando gli script esattamente dalla posizione con cui sono descritti nelle istruzioni.

Seguite queste indicazioni si puo' compilare libfreenect2 su Mac
Avendo un MacBook Pro 2013 con I5 e scheda grafica Intel ho dovuto provvedere a modificare protonect cosi' come nel caso di Ubuntu
Ho modificato leggermente il programma protonect per ottenere i soli dati di profondita' del sensore sia in formato xml da OpenCV che come file testo
-------------------------------------------------------
* This file is part of the OpenKinect Project. http://www.openkinect.org
 *
 * Copyright (c) 2011 individual OpenKinect contributors. See the CONTRIB file
 * for details.
 *
 * This code is licensed to you under the terms of the Apache License, version
 * 2.0, or, at your option, the terms of the GNU General Public License,
 * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses,
 * or the following URLs:
 * http://www.apache.org/licenses/LICENSE-2.0
 * http://www.gnu.org/licenses/gpl-2.0.txt
 *
 * If you redistribute this file in source form, modified or unmodified, you
 * may:
 *   1) Leave this header intact and distribute it under the same terms,
 *      accompanying it with the APACHE20 and GPL20 files, or
 *   2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or
 *   3) Delete the GPL v2 clause and accompany it with the APACHE20 file
 * In all cases you must keep the copyright notice intact and include a copy
 * of the CONTRIB file.
 *
 * Binary distributions must follow the binary distribution requirements of
 * either License.
 */


#include <iostream>
#include <signal.h>

#include <opencv2/opencv.hpp>

#include <libfreenect2/libfreenect2.hpp>
#include <libfreenect2/frame_listener_impl.h>
#include <libfreenect2/threading.h>
#include <libfreenect2/packet_pipeline.h>

bool protonect_shutdown = false;

void sigint_handler(int s)
{
  protonect_shutdown = true;
}

int main(int argc, char *argv[])
{
  std::string program_path(argv[0]);
  size_t executable_name_idx = program_path.rfind("Protonect");


  std::string binpath = "/";

  if(executable_name_idx != std::string::npos)
  {
    binpath = program_path.substr(0, executable_name_idx);
  }


  libfreenect2::Freenect2 freenect2;
  //libfreenect2::Freenect2Device *dev = freenect2.openDefaultDevice();
  libfreenect2::Freenect2Device *dev = freenect2.openDefaultDevice(new libfreenect2::CpuPacketPipeline());


  if(dev == 0)
  {
    std::cout << "no device connected or failure opening the default one!" << std::endl;
    return -1;
  }

  signal(SIGINT,sigint_handler);
  protonect_shutdown = false;

  libfreenect2::SyncMultiFrameListener listener(libfreenect2::Frame::Color | libfreenect2::Frame::Ir | libfreenect2::Frame::Depth);
  libfreenect2::FrameMap frames;

  dev->setColorFrameListener(&listener);
  dev->setIrAndDepthFrameListener(&listener);
  dev->start();

  std::cout << "device serial: " << dev->getSerialNumber() << std::endl;
  std::cout << "device firmware: " << dev->getFirmwareVersion() << std::endl;

  while(!protonect_shutdown)
  {
    listener.waitForNewFrame(frames);
    //libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color];
    //libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir];
    libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth];

    //cv::imshow("rgb", cv::Mat(rgb->height, rgb->width, CV_8UC3, rgb->data));
    //cv::imshow("ir", cv::Mat(ir->height, ir->width, CV_32FC1, ir->data) / 20000.0f);
    cv::imshow("depth", cv::Mat(depth->height, depth->width, CV_32FC1, depth->data) / 4500.0f);
    //cv::imwrite("luca.png",cv::Mat(depth->height, depth->width, CV_32FC1, depth->data)/4500.0f);
    std::cout << cv::Mat(depth->height, depth->width, CV_32FC1, depth->data);
    cv::FileStorage fs("trilobite.xml", cv::FileStorage::WRITE);
    fs << "immagine" << cv::Mat(depth->height, depth->width, CV_32FC1, depth->data);
    fs.release();
    return 0;



    int key = cv::waitKey(1);
    protonect_shutdown = protonect_shutdown || (key > 0 && ((key & 0xFF) == 27)); // shutdown on escape

    listener.release(frames);
    //libfreenect2::this_thread::sleep_for(libfreenect2::chrono::milliseconds(100));
  }

  // TODO: restarting ir stream doesn't work!
  // TODO: bad things will happen, if frame listeners are freed before dev->stop() :(
  dev->stop();
  dev->close();

  return 0;

}-------------------------------------------------------

il file xml e' in questo formato
-------------------------------------------------------
<?xml version="1.0"?>
<opencv_storage>
<immagine type_id="opencv-matrix">
  <rows>424</rows>
  <cols>512</cols>
  <dt>f</dt>
  <data>
    0. 0. 0. 0. 0. 2.49869482e+03 0. 0. 0. 1.85178479e+03 0. 0.
    1.78918164e+03 1.88499329e+03 0. 0. 0. 1.77245947e+03 1.99891040e+03
    1.83380408e+03 0. 1.91916858e+03 1.89536816e+03 0. 0. 0.
    2.07646899e+03 0. 2.00091846e+03 2.04850122e+03 0. 0. 2.00802515e+03
    0. 2.12383228e+03 0. 2.04420789e+03 0. 0. 2.04419519e+03
    2.03690503e+03 2.00967407e+03 0. 0. 2.00150708e+03 2.10069604e+03 0.
    0. 0. 2.11520288e+03 0. 2.08436304e+03 0. 2.07646094e+03 0.

    2.13713623e+03 0. 2.12
-------------------------------------------------------
mentre i dati raw sono
-------------------------------------------------------
0, 0, 0, 0, 0, 2498.6948, 0, 0, 0, 1851.7848, 0, 0, 1789.1816, 1884.9933, 0, 0, 0, 1772.4595, 1998.9104, 1833.8041, 0, 1919.1686, 1895.3682, 0, 0, 0, 2076.469, 0, 2000.9185, 2048.5012, 0, 0, 2008.0251, 0, 2123.8323, 0, 2044.2079, 0, 0, 2044.1952, 2036.905, 2009.6741, 0, 0, 2001.5071, 2100.696, 0, 0, 0, 2115.2029, 0, 2084.363, 0, 2076.4609, 0, 2137.1362, 0, 2126.874, 2140.6592, 2108.6714, 0, 0, 2102.1692, 2100.3867, 0, 0, 2109.4075, 2118.7947, 2124.1169, 0, 2096.3901, 2067.7419, 2058.8411, 2099.4333, 2113.417, 2081.3757, 0, 2112.1855, 2143.5496, 2110.3533, 2108.1643, 2127.9106, 0, 0, 2065.8389, 0, 2135.0957, 2136.1062, 2200.4043, 0, 2113.2451, 2115.2937, 2113.6121, 2103.0654, 2104.3423, 2123.4355, 2176.7842, 0, 2059.0129, 2106.6523, 2110.292, 2082.958, 2129.3064, 2094.9377, 2106.3201, 2133.8752, 0, 0, 2118.3491, 0, 2091.9097, 2147.2163, 2119.6216, 2101.3369, 2106.2881, 2150.4028, 2120.2986, 2116.1897, 2144.3218, 0, 2099.1787, 2145.4131, 2101.3423, 2113.9082, 2132.8118, 2120.2107, 0, 2081.64
-------------------------------------------------------
come si vede Kinect 2 riporta i dati di profondita' in millimetri e a differenza di Kinect1 riesce a vedere anche i decimali dei millimetri (secondo me 4 cifre decimali sono troppe, basterebbe avere la precisione significativa al decimo di  millimetro per avere un milglioramento

martedì 24 marzo 2015

Strane cose su Blogger

Il mio blog non vincera' mai nessun premio per il maggior numero di accessi e francamente non me ne preoccupo ma guardando i dati degli accessi (vedi grafico sottostante) mi sono incuriosito nel vedere cosi' tante connessione in un solo giorno, ovvero circa 5 volte il normale



guardando le pagine piu' lette si vede che la maggior parte del traffico viene da un sito russo. 
La sorpresa e' che il sito, una volta tradotto ....non parlo russo, non parla di tecnologia o di computer ma vende finestre. Ho difficolta' a capire cosa possa essere successo



lunedì 23 marzo 2015

Eclissi 20 Marzo 2015 da Urbino


Ho provato a fotografare l'eclissi solare del 20 Marzo 2015 con il cellulare ed un paio di filtri per saldatore



Mi aspettavo qualcosa di piu' spettacolare ...almeno la giornata era priva di nuvole e calda

(immagini corrette in gamma e contrasto per mettere in evidenzia il disco solare)


Urbino ore 10:27 e 10:34


Urbino ore 11:24


martedì 17 marzo 2015

CloudCompare e Kinect

Dopo un anno e qualcosa a cercare di installare tutti i pacchetti per usare Kinect su Linux ed oggi ho scoperto che installando CloudCompare tramite ppa su Ubuntu 14.04 viene inserito anche un comodo plugin per pilotare Kinect e per ottenere direttamente la nuvola dei punti gia' registrata con l'immagine RGB


saperlo prima era qualche mal di testa di meno...

Preparazione eclissi solare del 20 marzo

In preparazione dell'eclissi del 20 marzo 2015 sto cercando di organizzarmi per fare vedere l'evento al bambino



Non trovando gli occhiali in mylar (per la precedente eclissi, nel 1999, li avevo comprati e funzionano molto bene) mi sono comprato un paio di occhiali da saldatore classificati come CE-EN 166F/167/168 nella speranza che schermasssero abbastanza gli occhi



Purtroppo non funzionano. La soluzione pero' e' stata abbastanza semplice, e' stato sufficiente smontare le lenti (sono fissate con un blocco a vite facilmente smontabile) e sovrapporle per ottenere il risultato cercato (vedi prima foto).
Il passo successivo e' stato quello di cercare di ottenere una foto. Con le macchine fotografiche digitali tascabili e' quasi impossibile perche' l'autofocus sbaglia completamente la messa a fuoco e (almeno sulla mia) non e' possibile disabilitare tale funzione.
E' invece possibile usare la fotocamera del cellulare tenendo i filtri ad una di centimetri di distanza dall'obbiettivo per avere una foto accettabile

E adesso c'e' solo da sperare nel bel tempo.

QGIS2ThreeJs

QGis2ThreeJS e' un comodo plugin di QGis per creare dei modelli digitali dal terreno che possono essere visualizzati in modo interattivo su Web mediante la libreria ThreeJS

Per la prova ho preso i dati DEM ripresi da Aster (http://earthexplorer.usgs.gov/)


Non avendo delle immagini georiferite da spalmare sul DEM ho ripreso una Geotiff del rilievo a falsi colori da questo indirizzo http://geodati.fmach.it/gfoss_geodata/SRTM-Italy/

Una volta caricati i dati come raster su QGis si apre il plugin QGis2ThreeJS  scegliendo il tema del DEM ed il tema dell'immagine


deve essere selezionata anche l'esagerazione verticale (a tentativi ho trovato il valore di 0.02)


Una volta scelto il nome del file del progetto html si clicca Run e si apre in automatico il browser e vengono caricati i dati generati dal plugin

giovedì 12 marzo 2015

Time Machine su Linux

Mi e' capitato di dover trasferire un backup Time Machine da una macchina Mac ad un disco di una macchina Linux piu' che altro per usare ShotWell al posto di foto ... e sono nati i problemi

Su Ubuntu collegando il disco esterno formattato da Mac, questo viene correttamente ed automaticamente montato (almeno su Ubuntu) e compare nella directory /media. Il problema e' che l'organizzazione dei file non e' immediatamente chiara


le directory principali sono
/Backups.backupdb
/.HFS+ Private Directory Data

dentro /Backups.backupdb si trovano directory con il nome coincidente con la data nella quale sono stati fatti i vari backup, esiste anche una directory Latest che indica dove e' contenuto l'ultimo backup

Se si entra in queste directory si trova la struttura dell'albero come normale su un sistema unix
Per le fotografie il path sara' simile a questo
cd /media/luca/Backup1T/Backups.backupdb/MacBook\ Pro\ di\ Luca/Latest/Macintosh\ HD/Users/lucainnocenti/

qui pero' non si trovano pero' i file. Facendo un lista dei file si osserva che (ls -la)

-r--r--r-- 2067021 root 2075999     0 gen  3 17:06 Music
-r--r--r-- 2067033 root 2076001     0 gen  3 17:06 Pictures
-r--r--r-- 1513259 root 2075617     0 gen  3 17:06 .pip
-r--r--r-- 1332692 root 2076002     0 gen  3 17:06 Public

non esiste una directory Pictures.
Per trovare i file il trucco e' prendere nota del numero subito prima di root (in questo caso 2067033 che per essere precisi e' un inode) ed andare nella directory

/media/luca/Backup1T/.HFS+ Private Directory Data/dir_2067033

qui si trovano dei file di immagini e delle sottodirectory. Per copiare i file si puo' fare direttamente una copia (cp) mentre le directory sono di nuovo degli inode-r--r--r-- 1069123 root 2031303       0 gen  3 17:06 2000

-r--r--r-- 1069205 root 2031304       0 gen  3 17:06 2001
-r--r--r-- 1069248 root 2031305       0 gen  3 17:06 2002
-r--r--r-- 1069326 root 2031306       0 gen  3 17:06 2003
-r--r--r-- 1069891 root 2031307       0 gen  3 17:06 2004

per ottenere i file delle foto dell'anno 2001 dovremo cambiare directory annotando l'inode 1069205
e copiare con il comando

cp -R /media/luca/Backup1T/.HFS+ Private Directory Data/dir_1069205/* /home/luca/copia/

poco lineare ma funziona

LLama3 Anita

A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...