Tra le infinite soluzione di simulazione in ambiente Simulink vi è chiaramente la possibilità di analizzare diversi sistemi di volo. In particolare, in questo articolo tratto una mia esperienza su un box avionico composto di due schede, un Arduino Due e un Raspberry Pi, che insieme a diversi circuiti realizzati ad hoc permette di gestire e pilotare da remoto un UAV. Inoltre, tramite Simulink è sviluppato anche un autopilota che consente all’aeromobile di svolgere il tutto il autonomia

Microcontrollori

Un microcontrollore è un dispositivo digitale nato in alternativa al microprocessore per ampliarne le possibilità in sistemi embedded. Il dispositivo presenta diversi componenti, oltre al processore e alla memoria si aggiungono diverse periferiche come hardware per la comunicazione UART, I2C e SPI e diversi pin GPIO. Questi ultimi si utilizzano anche per la gestione dei sensori esterni.

microcontroller

Affinché sia possibile utilizzare il microcontrollore è necessario caricare un firmware, ovvero software contenente tutte le applicazioni necessarie. In particolare, in questo contesto, sono utilizzati un Arduino DUE e un Raspberry Pi 3. In realtà, il Raspberry è molto più che un microprocessore, è piuttosto un computer a singola board ma in questo caso viene utilizzando in modo più simile all’utilizzo di un microcontrollore.

Questi dispositivi interagiscono con gli attuatori per il controllo di volo e con diversi sensori. In particolare, sono presenti:

  • Tubo di Pitot
  • Accelerometro
  • Giroscopio
  • Sensore di temperatura
  • GPS
  • Altimetro barometrico

Simulink è un software di simulazione e progettazione model-based sviluppato dalla Mathworks. È largamente utilizzando in ingegneria e nell’industria per progettare e simulare diversi sistemi prima di trasferirli all’hardware. Il sistema permette di modellare il sistema partendo dal concetto e dalla sequenza di blocchi in un ambiente multi-dominio per poterlo simulare e infine generare il codice che soddisfa il modello.

Tra le varie funzionalità di Simulink esiste la possibilità di affrontare diverse sfide nella programmazione dei mircocontrolli. In particolare, è possibile seguire due flussi di lavoro diversi:

  • Lettura e scrittura dei dati dai sensori
  • Sviluppo di algoritmi che verranno eseguiti autonomamente sul dispositivo
With Simulink support package for Arduino, you develop the algorithm in Simulink and deploy to the Arduino using automatic code generation. Processing is then done on the Arduino.
Credits: MATLAB

All’interno del box avionico i diversi devices sono integrati sulla base di un modello sviluppato in ambiente Simulink. In particolare, l’autopilota è sviluppato interamente dal Flight Team in ambiente Simulink e si basa sull’implementazione di loop di controllo che, avendo acquisito lo stato dell’assetto dell’UAV, generano i comandi da esercitare sulle superfici aereodinamiche. A questo si aggiunge la possibilità di controllare il volo dalla stazione di terra assegnando dei waypoint o dei parametri di volo, quali velocità, rotta e quota.

SASA Flight Team

A supporto di queste informazioni si aggiunge un’esperienza molto interessante che ho svolto grazie al Sapienza Flight Team. Mi hanno invitato al loro laboratorio per partecipare all’ottimizzazione del computer di volo. All’interno del box avionico si trovano un Arduino DUE e un Raspberry Pi 3 che comunicano tra loro analizzando i dati, filtrandoli e controllando la dinamica di volo.

Il team è gestito su iniziativa studentesca nel dipartimento di Ingegneria Aerospaziale dell’Università degli Studi di Roma La Sapienza. Hanno partecipato a diverse competizioni importanti raggiungendo ottime posizioni. L’obiettivo del progetto è proprio quello di mettere in pratica le conoscenze acquisite in ambito accademico trasferendole su un progetto pratico. Questo porta ad affrontare diverse problematiche più simile a quelle chi si affrontano nel mondo industriale portando ad una maggiore preparazione e consapevolezza. Attualmente il team ha l’obiettivo di portare a termine la costruzione di un UAV, ovvero un aereo a pilotaggio remoto in grado di compiere autonomamente delle missioni specifiche.

Filtro di Kalman

I dati dei sensori sono letti da Arduino e memorizzati per la telemetria. Inoltre, per poter sfruttare correttamente l’autopilota si effettua una forte pulizia e un filtraggio tale da garantire una visione corretta sullo stato del velivolo. Questo si realizza mediante un filtro di Kalman. Tale stimatore è sviluppato in ambiente Simulink in un lavoro di tesi ed è implementato su Raspberry Pi 3.

Il filtro di Kalman è un filtro ricorsivo molto efficiente che permette di valutare lo stato di un sistema dinamico a partire da una serie di misure soggette a rumore. Tra le sorgenti di rumore troviamo il rumore di quantizzazione, la presenza di rumore a bassa frequenza nella componenti elettroniche e le deviazioni dei singoli sensori.

Lo stimatore di Kalman permette di riportare un certo guadagno all’interno del sistema realizzando una retroazione sul modello per migliorare la stima dello stato servendosi proprio dell’errore. In particolare, sotto opportune condizioni, l’algoritmo di Kalman è quello che rende ottimo questo guadagno.

Nel corso della prima giornata di test a cui ho partecipato è stato necessario risalire alla sorgente di alcuni problemi di comunicazione tra i microcontrollori. A seguito di alcuni problemi hardware siamo ripartiti dalla comunicazione seriale tra Arduino e Raspberry. In particolare, un esempio di modello di comunicazione molto semplice da implementare su Arduino potrebbe essere il seguente:

simulink

Il messaggio più semplice da inviare è una costante e in questo modo è stato possible svolgere alcuni test cercando la codifica migliore per inviare i dati all’interno del sistema di filtraggio. Successivamente abbiamo proceduto incrementando sempre più la complessità dell’algoritmo passando ad incrementare la costante ogni giro del loop fino ad arrivare a simulare i dati della sensoristica.

I primi test sono stati svolti interfacciandosi direttamente con i due dispositivi. È stato creata una chat seriale tra il monitor seriale di Arduino e il Raspberry Pi sfruttando, su quest’ultimo, minicom.

minicom --device /dev/ttyS0 --baudrate 115200

Ed implementando su Arduino una semplice chat seriale:

String mex = "";
String mex1 = "";
int number = 10;
void setup() {
  Serial1.begin(115200);
  Serial.begin(115200);
}
void loop() {
  // Serial1.print(number)
  if (Serial.available()) {
    mex = Serial.readString();
    Serial1.println(mex);
  }
  if (Serial1.available()) {
    mex1 = Serial1.readString();
    Serial.println(mex1);
  }
delay(10);
}

All’inizio sono stati testati semplici messaggi testo in codifica ASCII per passare poi ad utilizzare il comando write ottimizzando la sequenza di dati per l’intero modello sviluppato in Simulink.