CAPITOLO 2: Il codice di simulazione
ABS
2.1 L’AMBIENTE MATLAB/SIMULINK
Il Matlab è un codice di calcolo molto usato nella pratica ingegneristica ed in ambito universitario a fini di ricerca. Caratteristica principale è la sua versatilità ed è a tutti gli effetti un linguaggio di programmazione con una interfaccia utente molto semplice. La parte interattiva è formata da due “finestre”: La finestra di “Command”, attraverso la quale facciamo eseguire al Matlab i comandi da tastiera, e la finestra di “Editor”.
Le operazioni eseguibili da Command sono relativamente poche, e la vera forza del Matlab sta nel semplice linguaggio di programmazione, tramite il quale, con l’”Editor” è possibile scrivere i veri e propri programmi per gli scopi più diversi: Calcolo, progettazione e, appunto, simulazione.
Il Matlab è corredato anche da una serie di toolbox che agevolano alcuni tipi di programmazione.
Il Simulink è uno di questi, ed è essenzialmente un modulo di programmazione attraverso il quale si sostituiscono i listati (i testi scritti in linguaggio Matlab) dei programmi con dei diagrammi a blocchi. In pratica i modelli matematici vengono realizzati in blocchi che possono scambiare i dati tra loro mediante comunicazioni rappresentate da semplice linee. Dentro questi blocchi, o celle, stanno operazioni già impostate o vi si richiamano funzioni Matlab scritte oppure altri diagrammi a blocchi Simulink.
2.2 IL CODICE DI SIMULAZIONE ABS
Il codice di simulazione ABS, fu sviluppato dal DIA per un lavoro di cooperazione con il progetto europeo SAMBA (Smart Attuator and Modulator Bracking Application, dicembre ’97) avente come obbiettivo il miglioramento delle prestazioni dei sistemi di controllo della frenata degli aerei.
Il codice è stato implementato in ambiente Matlab/Simulink ed è composto da due sistemi principali:
uno per la simulazione della dinamica dell’aereo e uno per l’iniziale determinazione dell’equilibrio a terra.
In Fig. 2.1 si può osservare il modello che simula la dinamica dell’aereo.
I blocchi colorati posti in alto costituiscono la semplice interfaccia utente, e permettono di caricare i dati di ingresso, far partire la fase di inizializzazione, far partire la simulazione e accedere a tutti i grafici degli input e degli output.
Il modello dinamico è composto da otto sottosistemi: pilota, aereo, ruote, carrelli di atterraggio, pedaliera, controllori di frenata, servovalvole e freni.
A loro volta ogni sottosistema è diviso in altri fino ad arrivare al livello più basso rappresentato da funzioni Matlab di tipo M-function o S-function.
Fig. 2.2 Sistema di inizializzazione
Prima di far partire la simulazione occorre calcolare i valori iniziali di tutte le variabili. Si è supposto di porre l’aereo in una condizione di equilibrio rappresentata dal Taxiig simmetrico ad una certa velocità costante. Questa configurazione è completamente definita da: l’altezza del centro di gravità dell’aereo, l’angolo di pitch, la deformazione degli ammortizzatori, la deformazione e la velocità angolare dei pneumatici.
Di solito occorrerebbe un metodo iterativo abbastanza complicato per una tale inizializzazione. Invece, per il codice ABS è stato sviluppato un metodo molto semplice e veloce, basato sul modello Simulink mostrato dalla Fig. 2.2. Il metodo è basato sull’ipotesi l’altezza del baricentro, e l’angolo di pitch (θ) siano quantità note, insieme alla velocità di taxiing (VCG). Questo porta a grandi semplificazioni. Infatti, conoscendo VCG e
θ, è immediatamente possibile calcolare le forze aerodinamiche, i momenti aerodinamici e quindi le forze di equilibrio a terra. note queste ultime si possono ottenere i valori delle deformazioni degli ammortizzatori e dei pneumatici.
2.3 MODELLO MATEMATICO IMPLEMENTATO IN ABS
2.3.1 Equazioni della dinamica del velivolo
Il modello di simulazione della dinamica del velivolo si basa sull’ipotesi che il velivolo si comporti come un corpo rigido. Sotto tale ipotesi la dinamica del velivolo è completamente descritta dalle due equazioni cardinali di seguito riportate, scritte in un sistema di riferimento solidale all’aereo e in forma vettoriale:
m d dt . V m.(Ω V) FeFeFe (2.1) d dt H Ω H MMM (2.2) Dove: m = massa dell’aereo. V = velocità del baricentro. Ω = velocità angolare.
Fe = risultante delle forze esterne.
H = momento della quantità di moto rispetto al baricentro. M = momento delle forze esterne.
2.3.2 Azioni aerodinamiche
In Fig. 2.3 si mostrano i sistemi di riferimento.
Fig. 2.3 sistemi di riferimento
Xi e Zi sono gli assi della terna inerziale.
Le forze esterne sono divise in forze gravitazionali, forze aerodinamiche, forze propulsive, forze trasmesse dai carrelli.
Le forze aerodinamiche, di portanza (Lift) e di resistenza (Drag) possono essere scritte tramite formule che usano coefficienti adimensionali:
L 1 2. Sρ. CL . .V2 ρρ (2.3) D 1 2. Sρ. CD . .V2 ρρ (2.4) Dove: ρ = densità dell’aria S = superficie alare
CL = Coefficiente di portanza adimensionalizzato CD = Coefficiente di resistenza adimensionalizzato Ed essendo:
CL CLα α. CLδe δe. CLq q.CLqCLq CD CD0 k CLkk. 2
con CLi = derivate parziali di CL rispetto a:
α = incidenza
δe = angolo di equilibratore
q = velocità angolare di beccheggio.
Allo stesso modo i momenti aerodinamici sono:
M 1 2. Sρ. c. Cm. V 2 . ρρ (2.5) Dove:
c = corda media aerodinamica dell’ala
Cm = coefficiente di momento (beccheggio) adimensionalizzato Essendo
Cm Cm0 Cmα α. Cmαp αp. Cmq q. Cmδe δeCmδeCmδe.
Con Cm0 = coefficiente di momento a incidenza nulla, Cmi = derivate parziali di Cm
rispetto a: α = incidenza
αp = derivata rispetto al tempo dell’incidenza δe = angolo di equilibratore
q = velocità angolare di beccheggio.
Il modello delle forze aerodinamiche sul piano laterodirezionale non è riportato in quanto non interessa nell’ambito del presente lavoro.
2.3.3 Azioni propulsive
La spinta del motore si considera costante e parallela all’asse Xb
F T maxδtT maxT max. (2.6)
Con Tmax = spinta massima del motore e δt = percentuale di manetta
M H thr T maxH thrH thr. .δt (2.7)
Con Hthr = distanza lungo l’asse z corpo del motore dal baricentro.
2.3.4 Azioni dei carrelli
Il modello di carrello sviluppato per le simulazioni è a due gradi di libertà (Fig. 2.4). La geometria adottata non ricalca un’architettura specifica al fine di semplificare al massimo il modello matematico senza però lederne la generalità.
Con riferimento alla Fig. 2.4 la forza trasmessa dai carrelli diretta lungo l’asse x può essere scritta come:
F lgx K lgx dx. C lgx dxpC lgxC lgx. (2.8)
In cui Klgx è la rigidezza flessionale e Clgx lo smorzamento flessionale della gamba del
carrello (in generale funzioni non lineari della deformazione e della velocità di deformazione, nel nostro caso costanti), mentre dx e dxp sono rispettivamente lo spostamento lungo x del mozzo della ruota (estremo libero della “trave” carrello) e la derivata rispetto al tempo di questo.
F lgz K lgz dz. C lgz dxpC lgzC lgz. 2 (2.9)
Dove Klgz è costante elastica dell’ammortizzatore (funzione non lineare della deformazione
dz) e Clgz è il coefficiente di smorzamento dell’ammortizzatore (funzione non lineare della
deformazione dz e con valori diversi a seconda che l’ammortizzatore sia in allungamento o in accorciamento ).
Fig. 2.4 Schema gradi di libertà carrello
2.3.5 Dinamica dei pneumatici
Si considera solo il modello longitudinale; Facendo riferimento alla successiva Fig. 2.5:
F hz K w dr. C w drpC wC w. (2.10)
Dove Kw è la rigidezza del pneumatico ed è una funzione non lineare dello schiacciamento
dr e Cw è lo smorzamento (in generale funzione non lineare di deformazione e velocità di
deformazione drp).
Si definisce lo slittamento come:
S x V hx ω w R w . V hx ω w ω w ω w 2.11 ( ) S
con Vhx = velocità lungo x del mozzo della ruota, ωw = velocità angolare del pneumatico,
Rw = raggio della ruota.
In questo modo la forza frenante è data da:
F b F hz µ. S x S x . F hz
F hz (2.12)
con µ = coefficiente di attrito, funzione non lineare dello slittamento (e in generale anche della forza verticale Fhz e della velocità del mozzo Vhx.
Il momento resistente al rotolamento è dato da:
M r F hz X rollF hzF hz. (2.13)
Dove Xroll, come da figura, è la distanza lungo x tra il centro della ruota e il punto di
2.4 INTERVENTI FATTI SU ABS
2.4.1 Cenni introduttivi
In §2.1 è stato descritto lo schema Simulink di ABS, costituito da un diagramma a blocchi (cfr. Fig. 2.1); all’interno di ogni blocco può trovarsi o un sottosistema a blocchi, o una funzione predefinita (una sommatoria, un integratore, un comando per immettere un dato nel workspace, un selettore…..), oppure un comando che richiama un programma. Nel codice ABS questi “programmi” sono scritti in linguaggio Matlab e sono: S-functions se preposti alla risoluzione di sistemi dinamici, oppure M-function se le relazioni tra le variabili in ingresso e in uscita sono algebriche.
Uno degli scopi di questo lavoro è quello di verificare l’efficacia e l’efficienza di un'altra forma di programmazione per le functions:
Precedenti attività di tesi avevano dimostrato che è possibile diminuire molto i tempi di calcolo usando, al posto delle M-function e S-function Matlab, delle s-function scritte in C++ (cfr. [3]). Si è, quindi, modificato il codice sostituendo alle functions scritte in linguaggio Matlab, functions analoghe scritte in C++.
2.4.2 Struttura delle functions
- S-functions: all’interno di una S-function Matlab troviamo più parti di codice, relative alla fase di inizializzazione, alla risoluzione del sistema dinamico, al calcolo delle uscite (Fig. 2.6). Nella fase di inizializzazione vengono definiti i valori iniziali delle variabili di stato; segue la procedura che, ad ogni passo di integrazione, calcola i valori delle variabili di stato e delle loro derivate, e le uscite. La struttura delle S-function in C++ è simile a quella delle S-function Matlab.
- M-function: le M-functions sono routines prive di dinamiche temporali. In C++ è possibile realizzare M-function solo come S-function “mascherate”, nelle quali, cioè, non viene sviluppata la parte relativa alla risoluzione dei sistemi dinamici. In Fig. 2.7 se ne mostra una schematizzazione.
Fig. 2.7 Schema del funzionamentodi una M-function
2.4.3 Lavoro svolto
Il lavoro svolto per creare un codice in grado di operare con functions scritte in linguaggio C++ è riassumibile nelle seguenti fasi:
1) Scrittura delle functions di ABS in linguaggio C++.
2) Compilazione dei files.c con Matlab per creare files.dll utilizzabili da Simulink.
3) Sostituzione, nello Schema Simulink, dei blocchi originali M-function e S-function con nuovi blocchi S-function, contenenti le informazioni necessarie per richiamare correttamente le nuove functions in C++.
2.4.3.1 Scrittura delle functions in C++
Per quanto riguarda la scrittura delle nuove functions in C++, bisogna dire che non si è trattato di una semplice traduzione da quelle originali in Matlab: infatti, se da un lato lo schema del funzionamento delle M-function e S-function Matlab è identico a quello delle loro controparti in C++, vanno sottolineate alcune differenze nella struttura sintattica e nella grammatica:
- Nel testo di una function Matlab, sia S-function che M-function, la parte dedicata alle espressioni matematiche è preceduta da una in cui si esplicitano i nomi delle variabili globali e delle variabili in ingresso. In particolare, i parametri globali sono quei parametri, costanti durante la simulazione, presenti nel “Workspace”, che sono utilizzati nella successiva sezione dedicata ai calcoli matematici. Essi sono elencati senza nessun ordine logico sotto la voce “Global” e, se sono vettori o matrici, vengono indicati semplicemente con il nome del vettore o della matrice. Gli input invece sono elencati secondo l’ordine in cui, nello schema Simulink, sono immessi nel blocco della
function e, in questo caso, vettori e matrici sono scissi nei loro componenti. Anche in
C++ è presente una parte introduttiva in cui vengono esplicitati sia gli input che i
parametri globali. Questa parte introduttiva però è molto più estesa e comprende uno schema fisso in cui vanno inserite varie informazioni; tra queste, il numero degli input e il numero dei parametri globali. Ogni parametro, così come ogni input, deve essere uno scalare, quindi è necessario, in questo caso, esplicitare ogni singolo componente di vettori o matrici. Nelle functions in C++ l’ordine degli input rimane quello originale, mentre l’ordine in cui sono definiti i parametri globali assume un’importanza che in
sono elencati nell’apposita finestra dello schema Simulink (Fig. 2.13). Gli outputs sono trattati in entrambi i linguaggi nello stesso modo: Viene creato un vettore di output le cui componenti sono disposte secondo l’ordine in cui escono dal blocco della function nello schema Simulink.
- Per quanto riguarda la parte di scrittura delle espressioni matematiche, tra tante piccole differenze grammaticali tra i due linguaggi di programmazione, vale la pena evidenziarne una, in particolare, che ha comportato un grosso carico di lavoro in più rispetto alla semplice traduzione: e’ stato impossibile (con le limitate conoscenze a disposizione) far eseguire automaticamente le operazioni tra matrici, anche le più semplici. Ogni operazione tra matrici o vettori (inversione di matrici, determinante, prodotto tra matrici…) è stata eseguita facendo i calcoli a mano, e scrivendo le espressioni delle componenti, della matrice o del vettore, risultato dell’operazione. Questa operazione è stata particolarmente lunga e fonte della maggior parte degli errori che si sono verificati durante il lavoro.
2.4.3.2 Compilazione dei Files.c
Una volta scritte le functions in linguaggio C++ è stato necessario compilarle usando il comando “mex” di Matlab, per ottenere files in formato .dll, utilizzabili dal simulatore Simulink al posto delle functions Matlab.
2.4.3.3 Aggiornamento del diagramma Simulink con nuovi blocchi S-function
Tutte le functions scritte in C++, sia quelle derivate da S-functions, che quelle derivate da M-function, sono utlizzate in Simulink come S-function. Si distinguono quindi due diverse procedure per modificare lo schema Simulink, a seconda che la function originale fosse una M-function o una S-function.
- Function originale Æ M-function: il blocco Simulink M-function si presenta come in
Fig. 2.9. In Fig 2.10 si mostra la finestra di dialogo che appare cliccando sull’icona del
blocco.
Fig. 2.9 Blocco M-function
Fig. 2.10 Finestra di dialogo di una M-function
Questo blocco va sostituito con un blocco S-function in cui occorre inserire nell’apposita finestra il nome del nuovo file formato “dll” e l’elenco di tutti i parametri globali. Come già specificato in §2.4.3.1 il loro ordine deve essere lo stesso con cui sono scritti nel testo
della function. Nelle seguenti figure Fig. 2.11, Fig. 2.12, Fig. 2.13 viene mostrato come bisogna modificare il sottosistema per poter utilizzare il file.dll.
Fig. 2.11 Sottosistema modificato
Fig. 2.12 Blocco S-function
- Function originale Æ S-function: Se la function originale è una S-function occorre solamente aprire la finestra di dialogo del blocco, eventualmente modificare il nome del file qualora risultasse diverso, e inserire l’elenco dei parametri sotto l’apposita voce.
Fig. 2.14 Sottosistema con S-functions
Fig. 2.16 Finestra di dialogo della S-function Acdyn21.dll
Si noti come, nel caso della S-function Matlab (Fig. 2.15), non sono specificati i parametri globali sotto l’apposita voce, in quanto essi sono letti automaticamente dal Workspace, mentre, nel caso della S-function in C++ (Fig. 2.16), è stato necessario inserirli. Si osservi, inoltre, come i parametri I e Iinv, che sono vettori, sono stati inseriti dividendoli nelle loro componenti.
2.4.4 Modifiche al modello matematico
Per rendere più semplice la costruzione del modello ADAMS, si è deciso di modificare alcune routines di ABS, in maniera, però, non sostanziale:
Nelle funzioni DZ34 è stata tolta la dipendenza dal parametro deformazione massima del pneumatico; in pratica si è evitato di simulare la battuta al massimo schiacciamento possibile del pneumatico.
Va detto che questa funzione può essere implementata in ADAMS, attraverso l’uso di una forza di contatto, peraltro già impostata, che però ha il difetto di rallentare molto la simulazione. Si è deciso di togliere questa funzione perché le simulazioni riguardano una fase successiva al touch-down e si ritiene quindi che non si giunga mai allo schiacciamento massimo dei pneumatici per l’effetto della sola frenata.
Inoltre, è stata tolta nella funzione che calcola le forze aerodinamiche, la dipendenza di queste dalla derivata dell’angolo di incidenza, per poter utilizzare una specifica formulazione preimpostata su ADAMS per semplificare la costruzione del modello.