lunedì 2 novembre 2020

Primi passi con Point Cloud Library

Con l'arrivo del sensore lidar sugli IPhone (rip Project Tango) forse e' il caso di ritirare fuori le librerie per trattare le nuvole di punti come PCL 

Per installare la liberia su Debian e' sufficiente

apt-get install libpcl-dev

che si porta dietro un po' di dipendenze come boost

I primi passi sono ovviamente quelli di inserire la libreria in un progetto. Per questo sono partito da QTCreator con le varie opzioni di Make

Compilazione con CMake

per la compilazione si devono aggiungere le righe in giallo al file CMakeLists.txt. Attenzione che in PCL le funzioni sono distribuite in vari moduli che devono essere specificati in REQUIRED COMPONENTS

cmake_minimum_required(VERSION 3.5)

project(nuvola LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(PCL 1.3 REQUIRED COMPONENTS common io features)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(nuvola main.cpp)

target_link_libraries(nuvola ${PCL_LIBRARIES})

Compilazione con QMake

Usando qmake, come prima, si devono modificare le righe in giallo.  Si deve anche specificare  c++14 

TEMPLATE = app
CONFIG += console c++14
CONFIG -= app_bundle
CONFIG -= qt
CONFIG += link_pkgconfig
PKGCONFIG += eigen3
INCLUDEPATH += /usr/include/pcl-1.11
LIBS += -L/usr/lib/x86_64-linux-gnu -lpcl_common -lpcl_io -lpcl_features -lpcl_search
QT += widgets

SOURCES += \
        main.cpp

Compilazione con Make

Per verificare quali sono gli switch di compilazione necessari per usare make si puo'usare

pkg-config --cflags --libs pcl_commons-1.7

anche in questo caso si deve ripetere l'operazione per ogni modulo utilizzato

Di seguito un semplice esempio di come leggere un file PCD, calcolare le normali e stampare i dati a schermo

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

#include <iostream>

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

#include <pcl/features/normal_3d.h>

using namespace std;

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

     if (pcl::io::loadPCDFile<pcl::PointXYZ> ("/home/luca/gabriele.pcd", *cloud) == -1) //* load the file
     {
       PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
       return (-1);
     }
     //std::cout << "Loaded " << cloud->width * cloud->height << " data points from test_pcd.pcd with the following fields: " << std::endl;
     /*for (size_t i = 0; i < cloud->points.size (); ++i)
       std::cout << "    " << cloud->points[i].x << " "    << cloud->points[i].y << " "    << cloud->points[i].z << std::endl;
    */
     // Create the normal estimation class, and pass the input dataset to it

     pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
     ne.setInputCloud (cloud);
    // Create an empty kdtree representation, and pass it to the normal estimation object.
       // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
       pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
       ne.setSearchMethod (tree);

       // Output datasets
       pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);

       // Use all neighbors in a sphere of radius 3cm
       ne.setRadiusSearch (0.03);

       // Compute the features
       ne.compute (*cloud_normals);

       //std::cout << endl << cloud_normals->size() << endl;


       // cloud_normals->size () should have the same size as the input cloud->size ()*

       int i = 0;
       for (pcl::Normal n : *cloud_normals) {
           //std::cerr << i << " n = " << n.normal_x << ", " << n.normal_y << ", " << n.normal_z << "\n";
           std::cout << n.normal_x << "," << n.normal_y << "," << n.normal_z << "\n";
           i++;
       }



    return 0;
}




sabato 24 ottobre 2020

Intel TV Sport 1004

 Il mio piccolo museo dell'informatico ha un nuovo ingresso. Un modello di Pong Intel TV Sport 1004 comprato per ben due euro ad un mercatino. Intel non e' la famosa ditta id processori ma un oscuro produttore tedesco 

L'alimentazione riporta un 9V AC (???). Non ho avuto il coraggio di inserire un trasformatore ... troppo strana una corrente alternata per un dispositivo di questo tipo...anche se il C64 aveva in effetti due alimentazioni di una in AC...ho inserito le batterie e....non funzionava. Ho lasciato distrattamente il pulsante su ON e lo ho appoggiato su un tavolo...dopo circa 10 minuti ha iniziato ad emettere il suono della pallina che rimbalza ...non e' completamente morto

Putroppo lo switch dell'angolo di rimbalzo e' rotto

Incredibilmente dentro al vano batterie ho trovato il cavo RF originale










venerdì 23 ottobre 2020

Hackathon Devs4Health

 Ecco il motivo di silenzio del blog, da Luglio sono stato impegnato nell'Hackathon Devs4Health di Codemotion. Rispetto al Hackathon di Tim questa volta la mia squadra non ha vinto ma abbiamo avuto in ogni caso una menzione speciale e la possibilita' di partecipare ai bootcamps

Per i piu' curiosi il progetto e' disponibile su https://www.pgpmedicalcard.it







mercoledì 14 ottobre 2020

Opposizione di Marte


 
Ripreso da un telescopio migliore del mio nello stesso giorno (https://bfcspace.com/foto_dei_lettori/opposizione-marte-2020-14/)



martedì 6 ottobre 2020

ISS SSTV Expedition 63

Ricevuta con una semplicissima radio Baofeng uv-5r da 25 euro con antenna standard

Il problema e' stato aspettare un passaggio abbastanza alto nel cielo (sopra i 25 gradi) e senza troppa copertura nuvolosa



e a questo giro c'e' anche il diploma



domenica 13 settembre 2020

Formula 1 Mugello - Tribuna Giogo

 Qualcuno dira' che la tribuna Giogo non esiste....in realta' dal monte Altuzzo (passo del Giogo) in corrispondenza con punti di osservazione tedeschi della seconda guerra mondiale c'e' una ottima visione del circuito..e' vero.. in linea d'aria siamo a 5.5 Km dal circuito ma basta un modesto telescopio terrestre da 70 mm che si ha una visione ottimale.....e non ero il solo a pensarlo perche' eravamo almeno in 5 con telescopi e binocoli



le immagini riprese con la camera non rendono la visione .. usando l'oculare si potevano vedere chiaramente le bandiere sventolare (e di bandiere rosse non ce le siamo fatte certo mancare)







Retrocomputing estremo - salvataggio dati

 Antefatto : correva l'anno 1990 e, dovendo fare l'esame di maturita' scientifica, mi ero scritto la tesina su un Commodore 64 (C1541 a prestito) stampata poi su modulo continuo perforato. Feci due copie in floppy e le lasciai in una valigetta. I file erano stati generati dall'editor Easy Script (che era in uso in piccoli uffici come word processor)

Oggi : salvare il fondamentale (ovviamente sto scherzando) lavoro su SD card per trasmetterlo ai posteri (peraltro la copia cartacea esiste ancora anche se non sono riuscita a ritrovarla)

Il mio computer originale non esiste piu' (lo prestai a meta' anni 90 e non lo ho piu' rivisto) e mi sono ricreato un set simile ( non avevo un televisore a colori) con l'aggiunta di un modulo SD2IEC (montato su device 9 mentre il C1541 e' su device 8)

Il Commodore non e' proprio in salute come si vede dal diagnostico ma per l'uso previsto va piu' che bene. Legge il floppy e mi basta

Per copiare i file da floppy a SD ho usato Dracopy  Per evitare di distruggere una copia unica il floppy e' stato prima protetto da copia mettendo un po' di nastro da elettricista sulla tacca di protezione disco.

Ho fatto qualche prova di Dracopy prima sull'emulatore VICE perche' il software non e' molto intuitiivo

Alla fine ho scoperto che che si devono selezionare i file con Space, si preme C per copy, con F3 si seleziona il dispositivo in cui devono essere salvati e si conferma


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