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

Configurare traffico client su Tomato VPN

Questo post fa seguito al precedente dove sono indicate le istruzioni per configurare OpenVPN su Tomato


Con la configurazione standard i client si connettono alla VPN ma non si vedono reciprocamente.
Pingando i vari client direttamente sul router questi rispondono ma pingando un client verso l'altro questo non risponde
Per instradare il traffico tra i vari client si deve andare nelle impostazioni avanzate e settare Manage Client Specific Option-> Allow Client<->Client




Fotogrammetria da terra per geologia (2)

Dopo questo post ho cercato di rendere la procedura di estrazione dei piani automatizzata ed ho trovato dentro CloudCompare un plugin denominato RANSAC Shape Detection che fa esattamente cio' (il plugin e' presente solo dalla versione 2.6.1 e si attiva solo se e' selezionato un tema di nuvola di punti)

Il programma, basato su questo articolo, estrae tutte le feature possibili dall'immagine. Nell'albero a sinistra le feature di maggior peso (per esempio i piani maggiormente rappresentativi come quello di cava) si trovano in alto per scendere al maggiore dettaglio)

Piano di faglia

Piano di faglia e fronte di cava

Come si vede dalle immagini  sono stati correttamente selezionati il piano di cava e lo specchio di faglia e il piano di stratificazione

Stratificazione

mercoledì 4 marzo 2015

Stromboli 3D

Applicazione di quanto visto in questo post a dati ripresi dall'alto

Ho ripreso delle foto che mi sono state passate circa 7 anni fa da un amico riguardanti il vulcano Stromboli scattate da un elicottero con una panoramica sulla Sciara del Fuoco



Il modello di Google Earth con il modello digitale del terreno e una immagine ottica ad alta risoluzione


Le fotografie sono state elaborate con Agisoft Photoscan. E' molto evidente il gradino morfologico sulla sinistra della Sciara ed alcuni strutture delle strutture piu' piccole







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...