martedì 3 novembre 2020

Matplot++ e QtCreator

Vista la necessita' di plottare in uno scatterplot 3D qualche decina di migliaia di punti ho cercato una libreria adeguata e l'ho trovata in Matplot++



Per integrarla con QtCreator (ma funziona cosi' anche con Visual Studio su Windows) dopo aver creato un progetto CMake nella root del progetto si digita

git clone https://github.com/alandefreitas/matplotplusplus/

successivamente si modifica il file CMakeLists.txt aggiungendo le righe evidenziate

add_subdirectory(matplotplusplus)

add_executable(grafico
  main.cpp
)
target_link_libraries(grafico PUBLIC matplot Qt${QT_VERSION_MAJOR}::Core)
#target_link_libraries(grafico PUBLIC matplot)

per la visualizzazione e' necessario che sia installato gnuplot



lunedì 2 novembre 2020

Coreboot + Trisquel

 Per provare l'ebbrezza di un calcolatore libero sia dal punto di vista hardware che software da materiale proprietario mi sono comprato un Lenovo T400 con il Bios modificato e sostituito con Coreboot e con Trisquel come sistema operativo


pensavo che avrei avuto un sacco di limitazioni nell'uso normale ma devo ammettere che non ho limitazioni sostanziali nell'uso del calcolatore




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



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