Samuele Facenda
Una piccolo (per quello che si potrebbe dire) documento con quello che io (Samuele Facenda) ho imparato e ho da dire sulla robotica all'ITT Buonarroti. Espone un paio di aspetti e soprattutto include link utili per capire come fare alcune cose, che vanno dal riconoscimento dei caratteri alla mappatura del labirinto o all'allineamento del robot.
Non sono un elettronico né un automatico, ma un informatico. Non farò riferimento al funzionamento dei sensori o dei motori, parlerò solo dell'aspetto informatico (inteso come codice e gesitone).
Il robot ha motissimi componenti diversi, essi devono essere coordinati nelle loro azioni. Ci sono i sensori e i motori, collegati con il robò. Il modo più semplice per interfacciarsi con i componenti è usando una scheda arduino, ci sono un sacco di librerie comode e codici boilerplate in internet.
Arduino è praticamente c++, cambia però la struttura del progetto, che viene molto semplificata.
La struttura deve essere così composta:
directory root (si chiama come lo sketch principale):
- sketch principale (file.ino)
- codice aggiuntivo.h
- codice aggiuntivo.cpp
- codice aggiuntivo2.h
- codice aggiuntivo2.cpp
In c++ si deve definire in un file le funzioni e le classi e queste vanno implementate in un altro file, rispettivamente i file .h (header) e .cpp. Arduino in automatico riconosce questa divisione e include le funzioni, classi e costanti così definite nello sketch principale (file .ino con funzioni setup e loop)
Per comunicare via seriale (un canale con input e output divisi e comodo da usare) con altri dispositivi da arduino si può usare la classe Serial che con i metodi println ad esempio invia una stringa con il carattere di a capo alla fine sulla porta principale, quella usb (quindi il computer di solito).
Questa è comoda per il debug, mentre per le comunicazioni con altri dispositivi si possono usare le porte seriali ausiliari. Queste sono coppie di pin, segnati come RX e TX (transmit e recive), la prima è utilizzabile come quella principale con la classe Serial1 (e.g. Serial1.println). Dall'altro capo ci deve essere collegato un dispositivo (arduino, raspberry o altra cosa che sia) che comunica in seriale.
Se questi pin sono occupati o si necessità un setup diverso, qualunque pin può essere usato come rx/tx, con la libreria arduino Software Serial. Al link si trovano le informazioni necessarie
I raspberry pi sono single board computer economici (:no_mouth:) con dei pin gpio (pinout). Qui ci sono delle informazioni sul loro utilizzo con python (se non si è pratici con python è comodo impararlo, è semplice, qui un corso base).
Sul raspberry va installato linux (architettura ARM), raspbian è fatto apposta, comunque qui c'è la guida introduttiva ufficiale. Io mi sono sempre connesso con ssh o vnc, quando usi raspberry pi image per creare la schedina col sistema operativo puoi assegnargli una wifi a cui connettersi e un hostname per riconoscerlo.
Per comunicare in seriale con qualunque altro dispositivo con qualunque porta (le usb o i pin rx tx del raspberry) pyserial è perfetta, basta cercare qualche esempio per capire come funziona.
Sul raspberry soprattutto è importante coordinare tutti i moduli perchè siano coesi (e.g. lettura sensori, esplorazione, movimenti). Con python semplice o qualunque altro linguaggio si possono usare in thread (libreria threading ufficiale), in python con le classi Thread, Lock (un mutex), Semaphore e Event(un flag booleano sincronizzato).
Robot OS è un framework molto comodo per gestire tutti i processo e componenti di un pc con linux (raspberry), ti permette di definirli come nodi indipendenti e di lasciarlo ad occuparsi della loro gestione e comunicazione. Qui c'è la documentazione dell'LTS al 2023, comsiglio di leggerla prima di cominciare ad usarlo, soprattutto i tutorial da beginner.
Il riconosciemento è molto complicato, consiglio principalmente di usare opencv per tutto ciò che ci sta intorno (cattura immagini, filtri alle immagini...). Va molto bene anche per il riconosciemento vero e proprio. Qui ci sono un po' di corsi e tutorial per imparare a fare object detection e OCR (optical character recognition). Tutto questo è visione artificiale.
Usare delle reti neurali può essere una buona idea per catalogare le immagini, la cosa complicata è catturare tante immagini e catalogarle a mano per trainale i modelli.
Per cominciare e capire un po' di cosa si tratta: Questi video sono i migliori esistenti per capire il tema, già solo con il primo si ha una visione più chiara. Questo invece è un po' più avanzato sul riconoscimento delle immagini con reti neurali, sempre di 3blue1brown (i suoi video sono fatti benissimo anche di altri temi, il suo canale youtube è molto famoso).
Per la realizzazione vera e propria ci sono due framework molto famosi:
- Pytorch è di facebook ed è molto diffusa come libreria. Qui c'è un tutorial veloce per le basi e il codice boilerplate. Comunque per fare questo tipo di sviluppo è molto comodo usare Jupyter notebook invece di semplici script python, sono supportati in vscode e anche in Dataspell, un ide a pagamento (non se hai il github student developer pack) molto avanzato. Con il github student developer pack hai anche github copilot, che è comodissimo.
- Keras, che è un frontend molto comodo per tensorflow (di google) e altre librerie per il deep learning.
Altre librerie molto comode sono sklearn per machine learning è utilità varie, numpy e pandas per data analysis e utilizzo veloce di matrici e array in python.
Comunque in questa repo ci sono i codice per l'anno 2022-2023. Li ho scritti io, per contattarmi la mia mail è questa: [email protected].
Qui servono le cose che impari alle olimpiadi di informatica, quindi strutture dai e algoritmi. In generale, per salvare la mappa si può usare una matrice gigante (non ridimensionabile) o un grafo.
Algoritmi, strutture dati astratte o concrete comode:
- Algoritmo di dijkstra
- BFS
- DFS
- Linked list
- Python deque - linked list
- C++ deque - linked list
- Python set
- C++ set
Per allineare il robot c'è una tecnica comoda, avendo più sensori per lato. Vai un po' avanti e indietro, finché la media delle distanza dei sensori di sinistra non è uguale a quella di destra. Poi Ti allinei girando su te stesso facendo in modo che tutti i sensori laterali abbiano gli stessi valori.
Scrivete codice pulito, che si capisca, senza duplicati. Con nomi parlanti, non importa se vengono lunghi. Questo è un buonissimo libro per capire come fare, del più famoso clean coder. Documentate tutto, anche in modo generale, ma che ci sia qualcosa, il minimo è lasciare commenti nei codici complicati per far capire l'intento.
Samuele Facenda, Trento 30/05/2023