\documentclass[11pt,letterpaper]{article}

% Use custom template style
\usepackage{MY_template}
\usepackage{cancel}
\usepackage{todonotes}
\usepackage{caption}
\usepackage{enumitem}
\usepackage{footmisc}
\usepackage[toc,page]{appendix}
\usepackage{wrapfig}
\usepackage{pdfpages}
\usepackage[italian]{babel}
\usepackage{tikz}
\usepackage{float}
\usepackage{cite}
\usetikzlibrary{arrows.meta,positioning,calc,fit, shapes.symbols}
\tikzset{
  block/.style = {draw, thick, minimum width=18mm, minimum height=10mm, align=center},
  sum/.style   = {circle, draw, thick, inner sep=1pt, minimum size=5mm},
  line/.style  = {thick, -{Stealth[length=2.2mm]}}
}



\setcounter{secnumdepth}{4}
\setcounter{tocdepth}{4}

% User inputs: change as needed for each assignment
\newcommand{\workingDate}{\textsc{\today}}
\newcommand{\userName}{Scazzi Antonio}
\newcommand{\institution}{Politecnico di Torino}
\newcommand{\theTitle}{MASTER DEGREE THESIS}

\setlength{\parskip}{0.5ex}
\begin{document}

% Set up the title page
\begin{titlepage}

    \begin{figure}[t]
        \centering
        \begin{minipage}{0.5\linewidth}
            \centering
            \includegraphics[width=0.85\linewidth]{Figures/polito-logo.png}
        \end{minipage}%
        \begin{minipage}{0.5\linewidth}
            \centering
            \includegraphics[width=.85\linewidth]{Figures/02 - Logo.jpg}
        \end{minipage} 
    \end{figure}
    \begin{center}
        \LARGE
        \textbf{MASTER DEGREE IN AEROSPACE ENGINEERING}
        \Large     
        \textbf{ACCADEMIC YEAR 2024-2025}
        \vspace{3.00cm}   
    \end{center}      
   
    \begin{center}
        \huge
        \textbf{MANNED - UNMANNED TEAMING\\ controllore di volo per UAV in formazione col velivolo principale. } 
    \end{center}      
    \vfill
    \begin{minipage}{0.34\linewidth}
        CANDIDATO:\\
        RELATRICE ACCADEMICA:\\
        RELATORE AZIENDALE:\\
\end{minipage}%
    \begin{minipage}{0.65\linewidth}
        Antonio Scazzi\\
        Prof.ssa Elisa Capello, Politecnico di Torino\\
        Mario Nigra, Sipal s.p.a\\
\end{minipage} 

      
  

\end{titlepage}

\newpage

\begin{center}
    \LARGE
    \textbf{Dichiarazioni}
    \end{center}
    \normalsize

Questa tesi magistrale \'{e} stata realizzata grazie a una collaborazione tra il Politecnico di Torino e SIPAL S.p.a ed \'{e} il 
proseguimento e l'evoluzione di una tesi precedentemente svolta sullo stesso simulatore. 
L'Autore dichiara che questa tesi rappresenta un lavoro originale, svolto dopo l'iscrizione al corso di Laurea Magistrale 
in Ingegneria Aerospaziale presso il Politecnico di Torino. Questo lavoro non \'{e} stato precedentemente incluso in una tesi 
o dissertazione presentata presso questa o qualsiasi altra istituzione per il conseguimento di un titolo di studio, diploma 
o altra qualifica.
Il software e la documentazione legati al codice presente in questo documento sono soggetti alla licenza MIT.\\
\pagenumbering{gobble}

\newpage

\begin{center}
\LARGE
\textbf{Abstract}
\end{center}
\normalsize
Gli UAV (Veicoli Aerei Senza Pilota) assumono un ruolo sempre pi\'{u} centrale in ambito militare e civile grazie alla loro capacit\'{a} 
di ridurre i rischi per gli operatori umani in ambienti ostili. Tuttavia, al di fuori di ambienti controllati, i loro impeghi 
operativi sono ancora limitati. La maggior parte degli UAV attuali \'{e} controllata in remoto o in modalit\'{a} semi-autonoma, con scarso livello di 
adattamento a situazioni impreviste inoltre l'integrazione in spazi aerei condivisi rimane complessa per motivi di sicurezza e regolamentazione. 
Le nuove tecnologie puntano a migliorare l'autonomia mediante sistemi avanzati di intelligenza artificiale, algoritmi di navigazione 
evoluti e l'introduzione del concetto di Manned-Unmanned Teaming (MUM-T), ovvero la capacit\'{a} di velivoli senza pilota di supportare quelli con equipaggio 
durante una missione.\\
Questa tesi, frutto della collaborazione tra il Politecnico di Torino e Sipal S.p.a e sviluppata durante uno stage presso l'azienda, 
si inserisce in questo contesto.
Utilizzando l'hardware del laboratorio di Sipal e il software Prepar3d, \'{e} stato progettato un autopilota per velivoli ad ala fissa 
che include le fasi di decollo, immissione in crociera e volo in formazione, con l'obiettivo di simulare uno scenario MUM-T.  
Poich\'{e} sono stati utilizzati due elaboratori connessi sulla stessa rete locale, si \'{e} deciso di adottare un'architettura di tipo 
leader-follower. Sono stati quindi implementati due algoritmi, uno per ciascuna macchina, che gestiscono l'automazione dei task, 
all'interno dei quali diversi autopiloti, utilizzando controllori PID (Proporzionali integrali derivativi), e LEAD-LAG (filtri d'anticipo o 
ritardo) portano a termine la missione.\\ Sono state quindi effettuate diverse simulazioni in condizioni standard e perturbate al fine 
di produrre dei grafici che descrivono l'andamento temporale delle grandezze di interesse.\\
Il sistema pu\'{o} essere adattato al tipo di aeromobile selezionato e alle esigenze della missione tramite la regolazione di 
specifici parametri di input.

\newpage

\tableofcontents

\newpage

\listoffigures

\newpage

\pagenumbering{arabic}
\section{Introduzione}
La presente Tesi di Laurea Magistrale in Ingegneria Aerospaziale \'{e} frutto della collaborazione tra il Politecnico di 
Torino e Sipal S.p.A.; a partire da febbraio 2025, l'autore ha avuto l'opportunit\'{a} di svolgere uno stage di sei mesi 
presso il laboratorio HMI di Sipal a Torino, durante il quale \'{e} stata realizzata gran parte del lavoro successivamente descritto. 
Il progetto si colloca nel contesto del \textit{Manned-Unmanned Teaming} (MUM-T), una modalit\'{a} avanzata di gestione 
della missione che prevede la cooperazione tra sistemi con equipaggio umano e sistemi autonomi di diversa natura, 
aerei, terrestri, marittimi, subacquei e spaziali, con l'obiettivo di migliorare la \textit{situational awareness}, 
l'efficacia operativa e la sicurezza in scenari ad alto rischio, riducendo al contempo il numero di risorse umane
 necessarie. In tale quadro, il controllo in formazione di veicoli senza pilota assume un ruolo centrale, poich\'{e} il
  volo coordinato consente non solo di accrescere l'efficacia della missione, ma anche di ottenere benefici in termini 
  di efficienza di personale e di sicurezza di quest'ultimo. I livelli di autonomia degli UAV possono variare dal pieno controllo remoto 
 all'autonomia totale, rendendo cruciale lo studio delle modalit\'{a} attraverso cui velivoli autonomi , 
  eventualmente accompagnati da aeromobili con equipaggio , possano cooperare in formazione per il successo della missione.
\begin{figure}[ht] % r = right
  \centering
  \includegraphics[width=0.6\linewidth]{Figures/FormationFlight.png}
  \caption{Formation Flight}
  \label{fig:FormationFlight}
\end{figure}

   Storicamente, il volo in formazione nasce nei primi decenni dell'aviazione militare, con i primi esperimenti della 
   Prima Guerra Mondiale volti a migliorare la copertura visiva e la protezione reciproca, mentre durante la Seconda 
   Guerra Mondiale divenne una componente strategica fondamentale, con schemi tattici specifici impiegati per aumentare
    l'efficacia dei bombardamenti e ridurre la vulnerabilit\'{a} agli attacchi nemici. Nel periodo della Guerra Fredda, 
    lo sviluppo tecnologico e delle comunicazioni port\'{o} a tattiche pi\'{u} sofisticate, mentre in ambito civile il volo 
    in formazione rimase rilevante per manifestazioni aeree, missioni di ricerca e applicazioni sperimentali. 
    Con l'avvento dell'era dell'informazione e delle \textit{Netcentric Operations}, il concetto si \'{e} esteso ai droni, 
    oggi capaci di operare autonomamente in ricognizione, sorveglianza, monitoraggio ambientale e missioni civili quali 
    mappatura, agricoltura di precisione e gestione delle emergenze. In parallelo, la tecnologia MUM-T ha conosciuto 
    un'evoluzione significativa: sebbene le prime sperimentazioni risalgano al periodo tra le due guerre, 
    la definizione ufficiale fu introdotta solo nel 2013 dall'U.S. Army Aviation Center, che la descrisse come 
    l'impiego congiunto e sincronizzato di soldati, sistemi con e senza equipaggio, robotica e sensori per accrescere 
    la letalit\'{a}, la sopravvivenza e la situational awareness. L'obiettivo principale era quello di ridurre 
    l'esposizione al rischio per gli operatori, delegando ai veicoli senza pilota le missioni pi\'{u} pericolose, 
    come la ricognizione in aree ostili. Un esempio emblematico \'{e} rappresentato dall'elicottero AH-64E, capace 
    non solo di ricevere dati dai droni, ma anche di controllarne i sensori e la navigazione, integrando cos\'{i} le 
    informazioni nel processo decisionale. I consistenti investimenti militari hanno favorito lo sviluppo rapido 
    della tecnologia, oggi adottata anche in ambito civile: si pensi alla collaborazione avviata nel 2022 dal Regno 
    Unito tra HM Coastguard e Bristow Helicopters per l'implementazione di servizi MUM-T a supporto delle operazioni 
    di ricerca e soccorso marittimo. Parallelamente, anche i modelli di controllo degli UAV hanno seguito un percorso 
    evolutivo scandito dal progresso tecnologico: negli anni '60,'80 erano predominanti i controllori PID, semplici ma 
    efficaci per la stabilit\'{a} del volo; negli anni '90, grazie all'aumento della capacit\'{a} di calcolo, si diffusero 
    approcci ottimi come il LQR e strumenti di stima avanzata come il Filtro di Kalman e la sua versione estesa EKF; 
    nei primi anni 2000, il focus si spost\'{o} sulla robustezza, con l'adozione di controlli $H_\infty$, adattivi e a 
    \textit{sliding mode}. L'avvento dell'intelligenza artificiale negli anni 2010 segn\'{o} una svolta, con l'applicazione 
    di reti neurali, logica fuzzy e \textit{reinforcement learning}, capaci di apprendere modelli di controllo 
    complessi direttamente dall'interazione con l'ambiente. Oggi, il panorama \'{e} dominato da tecniche predittive come 
    l'MPC (\textit{Model Predictive Control}) e da strategie cooperative multi-UAV, che si ispirano alla 
    \textit{swarm intelligence} per coordinare sciami di droni in maniera distribuita e adattiva. Inoltre, approcci 
    ibridi che combinano metodi classici e intelligenza artificiale stanno aprendo la strada a missioni autonome 
    sempre pi\'{u} complesse, collaborative e critiche.

    Gli obiettivi di questa tesi quindi si collocano nel medesimo contesto contesto di Manned-Unmanned Teaming (MUM-T) 
    e mirano a dimostrare la possibilit\'{a} di integrare in maniera efficace velivoli con e senza pilota in uno scenario 
    cooperativo. In particolare, il lavoro si propone di sviluppare e validare un sistema di controllo per UAV ad ala 
    fissa, capace di interagire con un velivolo leader pilotato in modo stabile e affidabile. La progettazione 
    dell'autopilota si \'{e} concentrata sulla definizione di algoritmi di controllo per le principali fasi operative, 
    includendo decollo, salita, volo livellato e mantenimento della formazione, attraverso l'impiego di controllori 
    PID e compensatori di tipo lead-lag, opportunamente calibrati per garantire sia rapidit\'{a} di risposta che 
    robustezza alle perturbazioni esterne.

Parallelamente la tesi ha perseguito l'obiettivo di garantire 
la scalabilit\'{a} della piattaforma, prevedendo la possibilit\'{a} di estendere il numero di velivoli simulati e di integrare 
in futuro sensori e moduli software aggiuntivi senza richiedere modifiche invasive all'hardware esistente.

Infine, si \'{e} posta importanza nella validazione sperimentale del sistema, mediante la raccolta e 
l'elaborazione dei dati di simulazione, con lo scopo di quantificare in maniera 
oggettiva le prestazioni dei controllori in termini di tempi di risposta, errori a regime e capacit\'{a} di 
mantenere la separazione nella formazione. L'elaborato intende quindi non soltanto proporre una soluzione 
tecnica innovativa per il controllo cooperativo di UAV, ma anche fornire un framework sperimentale solido e 
replicabile, utile come base di partenza per studi futuri e per l'evoluzione verso applicazioni operative reali. \cite{luo2024uavpath,bai2018uavformation}
    \newpage

\section{Ambiente della simulazione}

Un ambiente di simulazione pu\'{o} essere definito come una rappresentazione virtuale del mondo reale o di un suo
 sottoinsieme, concepita per riprodurre fenomeni fisici, dinamiche operative o condizioni ambientali in maniera 
 controllata e ripetibile. Esso costituisce uno strumento fondamentale per l'analisi, l'addestramento e la 
 sperimentazione, in quanto consente di osservare e valutare il comportamento di sistemi complessi senza la 
 necessit\'{a} di operare direttamente nel contesto reale, riducendo costi, rischi e vincoli logistici. Un ambiente 
 simulato integra tipicamente pi\'{u} componenti tra loro interconnessi: la descrizione dello scenario, che comprende 
 la modellazione del terreno, delle infrastrutture e degli elementi contestuali; la riproduzione delle condizioni 
 meteorologiche e ambientali, in grado di variare su diverse scale temporali e spaziali; e la presenza di entit\'{a} 
 interattive, come veicoli, macchine o attori virtuali, dotati di caratteristiche dinamiche e comportamentali 
 specifiche. Tali ambienti possono essere impiegati per finalit\'{a} differenti, dal supporto all,'addestramento del 
 personale alla validazione di algoritmi di controllo o strategie decisionali, fino alla sperimentazione di scenari 
 operativi complessi che coinvolgono pi\'{u} domini e attori. Un aspetto cruciale \'{e} la possibilit\'{a} di riprodurre 
 condizioni iniziali definite con precisione, garantendo la ripetibilit\'{a} degli esperimenti e quindi la validit\'{a} 
 del confronto tra differenti soluzioni o approcci. Inoltre, la natura modulare e scalabile di tali sistemi consente 
 l'estensione progressiva delle funzionalit\'{a}, ad esempio introducendo nuovi modelli, regole comportamentali o vincoli 
 ambientali, in modo da aumentare il grado di realismo o adattare il simulatore a specifiche esigenze applicative. 
 Nelle sezioni successive verranno descritti i componenti sia fisici che software utilizzati per questo progetto.

\subsection{Hardware}
\subsubsection{Postazione Principale}
La postazione principale del sistema di simulazione \'{e} stata progettata e realizzata con particolare attenzione alla 
scelta e all'integrazione dei componenti hardware, in modo da garantire un ambiente di lavoro stabile, scalabile e il 
pi\'{u} realistico possibile. Questa servir\'{a} per simulare il cockpit del velivolo leader pilotato.

Al centro dell'allestimento vi \'{e} un computer aziendale gi\'{a} disponibile, equipaggiato con un processore Intel Core i7 
di settima generazione e due schede grafiche Nvidia T1000. La decisione di utilizzare due GPU 
\'{e} stata determinata principalmente da due esigenze: garantire un adeguato livello di prestazioni, 
distribuendo il carico di calcolo grafico, e offrire la scalabilit\'{a} necessaria per integrare in futuro ulteriori schermi 
senza dover intervenire con aggiornamenti hardware invasivi.  

La prima GPU \'{e} dedicata al collegamento con il proiettore, che rappresenta l'elemento visivo centrale della 
simulazione, mentre la seconda gestisce tre monitor, utilizzati per fornire angoli di visione aggiuntivi e per 
ospitare interfacce di controllo. Questa configurazione consente di mantenere un ambiente immersivo e, allo stesso tempo, 
funzionale per la gestione del sistema.  

Nonostante la complessit\`{a} della configurazione, la postazione garantisce comunque una resa fluida con una media di 
24fps, valore sufficiente per assicurare un'esperienza di simulazione stabile e realistica.

Per quanto riguarda la proiezione, \'{e} stato selezionato un videoproiettore Epson EH-LS650B a tiro ultracorto scelto
a causa di vincoli logistici e da requisiti di qualit\'{a}: nel laboratorio non era possibile 
installare un proiettore a soffitto e il posizionamento frontale permetteva di evitare la formazione di ombre 
sulla zona di seduta. Grazie alla tecnologia a tiro ultracorto, \'{e} stato possibile ottenere uno schermo di grandi 
dimensioni in uno spazio ridotto, ottimizzando cos\'{i} l'utilizzo dell'ambiente. A ci\'{o} si aggiungono l'elevata 
luminosit\'{a} e la fedelt\'{a} cromatica del dispositivo, aspetti fondamentali per riprodurre scenari realistici e 
coinvolgenti.

Accanto al proiettore, la postazione integra diversi schermi dedicati a funzioni specifiche. Un monitor 
touchscreen da 24 pollici (DELL P2424HT) \'{e} utilizzato per riprodurre il display multifunzionale del velivolo, 
fornendo dati essenziali sul volo e sullo stato dei sistemi. A questo si affianca un monitor touchscreen da 
14 pollici (Verbatim PMT-14), che visualizza il GPS, migliorando la navigazione e la consapevolezza situazionale 
durante la simulazione.

Per completare la postazione sono stati acquistati controlli dedicati e una seduta specifica. I comandi, 
dotati di numerosi pulsanti configurabili, consentono un'interazione diretta e dettagliata con l'ambiente 
virtuale, simulando in maniera fedele i comandi presenti in un cockpit reale. La seduta scelta \'{e} il modello Next 
Level Racing Flight Simulator - Boeing Military Edition, completamente regolabile e predisposta per l'aggiunta di 
accessori. La sedia permette di adattare la 
configurazione a diversi scenari.

I controlli principali sono costituiti dal sistema HOTAS Warthog e dai pedali TPR Rudder, entrambi prodotti da 
Thrustmaster. Il joystick e la 
doppia manetta del Warthog utilizzano sensori magnetici a effetto Hall, in grado di 
garantire precisione elevatissima e assenza di usura meccanica. Il joystick interamente in metallo offre un feedback
 realistico con una resistenza calibrata dei pulsanti, mentre la throttle, dotata di sistema 
 a doppia leva, include meccanismi di idle e afterburner con blocchi meccanici a scatto che riproducono fedelmente quelli 
 presenti in cabina. L'insieme fornisce oltre trenta comandi programmabili tra pulsanti, interruttori e hat switch, 
 permettendo di gestire in maniera completa le principali funzioni di pilotaggio e di missione

A complemento, i pedali TPR Rudder sfruttano il sistema a pendolo T.Pendular che consente un'escursione fluida e 
progressiva, con angoli regolabili fra 35° e 75°. Ciascun pedale integra 
freni differenziali indipendenti, utili per manovre di rullaggio e controllo fine in fase di atterraggio. Il 
dispositivo \'{e} completamente configurabile tramite software oltre a poter essere integrato con gli altri prodotti Thrustmaster grazie al pacchetto T.A.R.G.E.T., 
cos\'{i} da gestire l'intero sistema come un unico dispositivo

L'adozione congiunta di HOTAS Warthog e TPR Rudder, montati sulla struttura Boeing Military Edition, permette quindi 
di ricreare una postazione immersiva e al tempo stesso stabile, in grado di restituire sensazioni estremamente vicine 
al volo reale, sia per quanto riguarda il comfort, sia per la fedelt\'{a} nell'interazione con i comandi. \cite{hotas2010}

\subsubsection{Postazione Secondaria}

La postazione secondaria del sistema di simulazione \'{e} stata concepita con un approccio pi\'{u} leggero e compatto, 
pensato per garantire comunque la possibilit\'{a} di svolgere attivit\'{a} e test in parallelo a quella 
principale. Essa \'{e} basata su un laptop Alienware ad alte prestazioni, collegato a un monitor esterno di grandi 
dimensioni che funge da display principale, cos\'{i} da assicurare un'ampia superficie visiva per la simulazione. 
Accanto al notebook \'{e} presente un secondo schermo portatile toucg, che pu\'{o} essere utilizzato per visualizzare pannelli 
di controllo aggiuntivi o interfacce software di supporto. Questa configurazione, pur meno immersiva rispetto 
alla postazione leader, consente comunque una gestione ordinata e funzionale delle informazioni necessarie al 
volo virtuale.

Dal punto di vista dei controlli, la postazione \'{e} equipaggiata con una periferica Thrustmaster T.16000M FCS, 
un dispositivo dotato di numerosi pulsanti programmabili e di un hat switch multidirezionale che permette di riprodurre 
i principali comandi di volo in maniera intuitiva e immediata. questo controllo per\'{o} non verr\'{a} utilizzato in quanto 
la postazione secondaria \'{e} relegata alla simulazione del drone follower che non necessita di controlli.

Complessivamente, la postazione secondaria si presenta come una soluzione scalabile e facilmente adattabile, 
utile sia come sistema di supporto al cockpit principale, sia come piattaforma autonoma per esercitazioni 
di natura specifica. Pur rinunciando a seduta dedicata e pedali professionali, mantiene un livello di fedelt\'{a} 
adeguato e rappresenta un complemento strategico all'ecosistema di simulazione, consentendo di simulare pi\'{u} elementi 
all'interno dello stesso scenario di addestramento senza richiedere le stesse risorse logistiche della postazione leader.


\subsection{Software}

\subsubsection{Simulatore}

Prepar3D, sviluppato da Lockheed Martin, \'{e} una piattaforma di simulazione professionale progettata per l'addestramento 
e la formazione in ambito aeronautico, terrestre e marittimo. Il suo scopo \'{e} fornire un ambiente immersivo per preparare operatori, piloti e personale specializzato a 
gestire scenari complessi, sia in condizioni normali che di emergenza. 
Nonostante la somiglianza con i simulatori 
di volo di tipo consumer, Prepar3D non \'{e} un videogioco, ma uno strumento certificato e sviluppato per finalit\'{a} 
professionali, accademiche e militari.
\begin{figure}[ht] % r = right
  \centering
  \includegraphics[width=0.3\linewidth]{Figures/P3D_v6_Pro.png}
  \caption{Logo P3D}
  \label{fig:P3Dlogo}
\end{figure}
Dal punto di vista tecnico, Prepar3D eredita le basi da Microsoft ESP, ma \'{e} stato completamente evoluto negli anni 
per rispondere a esigenze moderne di prestazioni e fedelt\'{a} visiva. A partire dalla versione 4, il passaggio al modello 
a 64 bit ha permesso di superare i limiti di memoria dei sistemi precedenti, consentendo scenari pi\'{u} estesi e modelli 
di maggiore complessit\'{a}. Con la versione 5, il motore grafico \'{e} stato aggiornato a DirectX 12, introducendo atmosfere 
volumetriche, riflessioni fisicamente corrette e un modello idrico pi\'{u} realistico. L'attuale versione 6 ha 
ulteriormente perfezionato il rendering, migliorando l'illuminazione globale, le condizioni atmosferiche e introducendo 
tecniche moderne come DLSS/DLAA, FSR2 e Screen Space Reflections, con un significativo guadagno in termini di qualit\'{a} 
e performance.

Dal punto di vista funzionale, Prepar3D mette a disposizione strumenti avanzati per la creazione e la gestione degli 
scenari. SimDirector \'{e} l'editor integrato che consente di progettare missioni e addestramenti interattivi, definendo 
condizioni iniziali, logiche di evento e comportamenti dinamici. Per l'ambito pi\'{u} strettamente professionale 
(quella utilizzata in questo progetto), chiamata Professional Plus, \'{e} disponibile anche SimOperator, un Instructor Operator Station che 
permette di controllare in tempo reale l'andamento di una simulazione, intervenendo su parametri ambientali o 
introducendo eventi critici per testare la capacit\'{a} di reazione dell'operatore.

La piattaforma \'{e} aperta all'integrazione grazie a un ricco SDK. Le API SimConnect consentono a sviluppatori esterni 
di accedere a dati e funzioni del simulatore, mentre il PDK (Prepar3D Development Kit) permette un'integrazione a 
basso livello per applicazioni che richiedono massima efficienza. In questo modo, Prepar3D non \'{e} solo un simulatore 
pronto all'uso, ma anche un framework espandibile che pu\'{o} adattarsi a contesti addestrativi molto diversi

Dal punto di vista dei contenuti, Prepar3D include una rappresentazione completa del globo terrestre basata sul 
sistema WGS-84, con oltre 24.000 aeroporti, traffico terrestre, marittimo e aereo generato dall'intelligenza 
artificiale, e scenari arricchiti da vegetazione e infrastrutture 3D. Le capacit\'{a} immersive sono estese anche al 
supporto per la realt\'{a} virtuale e mista, con compatibilit\'{a} verso i principali visori professionali. Nelle versioni 
utilizzate, il software consente inoltre la simulazione di sensori specifici come NVG (Night Vision Goggles), 
camere a infrarossi e radar, aprendo l'utilizzo anche a contesti militari e di difesa.

Un aspetto cruciale riguarda il modello di licenza. Prepar3D \'{e} distribuito in versioni differenziate: Personal, 
rivolta a un uso domestico e scolastico di base; Professional, destinata ad aziende e centri di formazione; e 
Professional Plus, che aggiunge le capacit\'{a} di simulazione avanzata, inclusi armamenti, interoperabilit\'{a} con protocolli 
di simulazione distribuita come DIS e CIGI, e il gi\'{a} citato SimOperator. \cite{prepar3d2024sdk}

\subsubsection{SDK}
L'SDK di Prepar3D \'{e} il tassello che trasforma la piattaforma di Lockheed Martin da semplice simulatore a ecosistema 
estendibile: consente di modellare veicoli e sensori, generare scenari e traffico, integrare pannelli e strumenti, 
automatizzare logiche via script e collegare applicazioni esterne o plug-in nativi al motore di simulazione. 
La documentazione ufficiale organizza l'SDK in kit funzionali e ne indica il percorso di installazione predefinito su Windows, 
all'interno di Program Files. In questa architettura l'assunto chiave \'{e} che Prepar3D sia 
data-driven: nuove risorse, modelli e scenari possono essere aggiunti senza un limite imposto dal motore, 
purch\'{e} conformi ai formati supportati. 

La parte Modeling \'{e}, per molti sviluppatori, il cuore operativo: ogni aereo, mezzo terrestre o marittimo, edificio 
o infrastruttura nasce da un modello 3D in un formato specifico del simulatore, tipicamente creato con 3ds Max e 
corredato da animazioni, materiali PBR, effetti e illuminazione. Per gli effetti particellari 
l'SDK fornisce un tool dedicato e un formato testuale.


I Simulation Objects definiscono struttura e comportamento dei veicoli e degli altri oggetti simulati nel mondo. 
La configurazione \'{e} file-based e separa in modo ordinato gli aspetti estetici quali modelli, texture e suoni, 
da quelli funzionali: sistemi: motori, carburante, avionica, carrelli, aerodinamica, camere e effetti. 
Per gli aeromobili, i file AIR e le tabelle di coefficienti determinano la dinamica di volo, mentre le cfg orchestrano 
varianti e dotazioni; la stessa logica, semplificata, si applica ad altri oggetti simulabili. Questo approccio rende 
riproducibile il tuning dei sistemi e favorisce la 
manutenzione nel ciclo di vita del contenuto. 


Sul fronte World, l'SDK espone gli strumenti per plasmare l'ambiente: lo stack BGL per scenari e aeroporti, 
il Terrain SDK composto da Resample per l'ortofoto/elevazioni, TmfViewer per l'ispezione dei livelli di dettaglio e 
Shp2Vec per convertire forme 
vettoriali in dati nativi, l'Autogen per generare edificato e vegetazione e i tool per il traffico AI aereo 
e marittimo. \'{E} un set coerente che copre il ciclo completo: dalla sorgente 
 alla priorit\'{a} e fusione in runtime mediante i file di configurazione. 

La strumentazione di bordo e l'interfaccia utente sono affrontate nella sezione Panels and UI: pannelli in finestra o 
in cabina possono essere definiti via XML o Scaleform, orchestrati dal panel.cfg e duplicati con sincronizzazione di 
stato. A completare il comparto "percepito" c'\'{e} l'estensione Cameras, che ammette configurazioni articolate e 
post-process custom (HLSL) applicabili alla render chain con accesso a colore e profondit\'{a}: meccanismo pensato tanto 
per sensori simulati (NVG/IR, pod di puntamento) quanto per la resa grafica.

La produzione di scenari didattici \'{e} delegata a SimDirector, l'editor integrato che copre l'intero flusso: 
dall'editing della scena alle modalit\'{a} "Virtual Instructor" 
per registrare interazioni in cockpit, fino a Flight Instructor per catturare manovre e valutarle con criteri 
oggettivi. La modalit\'{a} Preview offre strumenti di debug e profiling in tempo reale, mentre la possibilt\'{a} di creare delle cofigurazioni dello 
scenario nelle parti di briefing, multiplayer e realismo consente di confezionare esperienze strutturate, singole o multi-ruolo. 
Per chi sviluppa contenuti formativi, SimDirector riduce drasticamente i tempi tra ideazione, verifica e distribuzione.  

Per l'interazione dall'esterno il riferimento \'{e} l'API SimConnect. Il modello \'{e} client-server: il simulatore pubblica 
servizi e uno o pi\'{u} client (anche remoti) si collegano per leggere SimVars, ricevere eventi o trasmetterne di nuovi, 
manipolare AI e strutture, fino a controllare camere e meteo. La documentazione v6 raccomanda di privilegiare progetti 
out-of-process (eseguibili) per robustezza e facilit\'{a} di debug, lasciando ai wrapper .NET la strada breve per GUI e 
strumenti. \'{e} la via maestra per telemetria, pannellistica esterna, IOS personalizzate e automazioni di scenario. 

\subsubsection{Wrapper}
Nel panorama delle piattaforme di simulazione di volo, una delle componenti chiave per garantire estensibilit\'{a} e 
integrazione con sistemi esterni \'{e} SimConnect. Si tratta dell'API ufficiale sviluppata inizialmente da Microsoft e 
oggi mantenuta sia nell'ambito di Microsoft Flight Simulator che in quello di Prepar3D di Lockheed Martin. Il suo 
scopo \'{e} fornire un'interfaccia standard attraverso la quale applicazioni esterne, o moduli caricati all'interno del 
simulatore, possono interagire con il motore di simulazione, accedendo a dati in tempo reale o inviando comandi ed 
eventi. In altre parole, SimConnect rappresenta il "ponte" che consente di trasformare un simulatore da applicazione 
isolata a piattaforma aperta e integrabile.

Dal punto di vista architetturale, SimConnect adotta un modello di tipo client-server. Il simulatore stesso si 
comporta come server, mentre uno o pi\'{u} programmi esterni assumono il ruolo di client. Questa separazione consente 
non solo di eseguire applicazioni sulla stessa macchina del simulatore, ma anche di distribuire il carico su pi\'{u} 
computer collegati in rete. La connessione viene stabilita attraverso un'API dedicata, con la possibilit\'{a} di 
utilizzare canali locali oppure protocolli TCP/IP su IPv4 o IPv6. La configurazione avviene mediante due file: 
SimConnect.xml lato server, che definisce gli endpoint disponibili, e SimConnect.cfg lato client, dove vengono 
specificati parametri come indirizzo, porta e protocollo. Questa flessibilit\'{a} permette di realizzare scenari che 
spaziano dall'applicazione singola, come un pannello strumenti virtuale, fino a laboratori complessi con pi\'{u} 
postazioni e istruttori collegati.

La comunicazione \'{e} interamente event-driven. Una volta stabilita la connessione, l'applicazione client pu\'{o} 
sottoscrivere variabili di simulazione oppure mappare eventi e trasmetterli al simulatore. 
Le variabili disponibili coprono l'intero spettro del modello simulativo: dall'altitudine e velocit\'{a} del velivolo, 
allo stato dei sistemi di bordo, fino a parametri ambientali come vento, temperatura o visibilit\'{a}. \'{e} possibile decidere 
con quale frequenza ricevere i dati: ogni fotogramma di simulazione, ogni secondo, oppure soltanto quando il valore 
cambia, opzione molto utile per ridurre il traffico e ottimizzare le prestazioni. Allo stesso modo, gli eventi 
permettono di pilotare funzioni interne al simulatore, come l'attivazione del pilota automatico, il settaggio delle 
luci di bordo o l'inserimento di anomalie.

Oltre alla gestione di variabili e comandi, SimConnect offre meccanismi per interagire con il mondo simulato. 
Attraverso specifiche chiamate \'{e} possibile creare e controllare oggetti AI, come aeromobili o veicoli, oppure 
interrogare i database delle strutture aeroportuali e radionavigazionali. Sono disponibili anche aree di memoria 
condivisa chiamate Client Data, utili per lo scambio di informazioni tra pi\'{u} applicazioni collegate allo stesso 
simulatore, senza dover implementare ulteriori canali di comunicazione. Tutti questi strumenti concorrono a 
trasformare il simulatore in un hub interoperabile, adatto sia ad applicazioni civili che militari.


\newpage
\section{Fondamenti matematici}

\subsection{Sistemi di riferimento}
\subsubsection{WGS 84}

Il \emph{World Geodetic System 1984} (WGS 84) rappresenta oggi il sistema di riferimento geodetico di uso globale 
ed \'{e} quello adottato dal sistema GPS. Si tratta di un modello matematico e fisico 
che descrive la forma della Terra, la sua posizione nello spazio e il modo in cui \'{e} possibile esprimere le coordinate 
di qualsiasi punto della superficie terrestre in maniera coerente.

Il sistema \'{e} costruito attorno a un ellissoide di riferimento, cio\'{e} una superficie matematica che approssima la 
forma reale della Terra, la quale non \'{e} perfettamente sferica ma leggermente schiacciata ai poli. L'ellissoide WGS 84 
\'{e} definito da un semi-asse maggiore di 6.378.137 metri e da un appiattimento pari a 1/298,257223563. Questi valori, 
frutto di osservazioni geodetiche a scala globale, permettono di ottenere una rappresentazione uniforme del pianeta, 
che costituisce la base per calcolare latitudine, longitudine e quota ellissoidica di un punto.

\begin{figure}[ht] % r = right
  \centering
  \includegraphics[width=0.5\linewidth]{Figures/WGS.png}
  \caption{Grafico WGS84}
  \label{fig:WGS}
\end{figure}

Un aspetto fondamentale del WGS 84 \'{e} il suo datum geodetico, ovvero il modo in cui l'ellissoide \'{e} posizionato e 
orientato rispetto alla Terra reale. A differenza di molti datumi locali, questo \'{e} di tipo geocentrico: l'origine 
del sistema coincide con il centro di massa terrestre, includendo oceani e atmosfera. L'asse Z \'{e} orientato lungo 
l'asse medio di rotazione terrestre, l'asse X passa per il meridiano di Greenwich all'equatore e l'asse Y completa 
la terna destrorsa. In questo modo, il sistema \'{e} direttamente collegato alla dinamica fisica del pianeta ed \'{e} 
coerente con i sistemi di riferimento internazionali utilizzati in geodesia.

Un altro elemento che rende il WGS 84 uno standard di riferimento \'{e} la sua realizzazione pratica. 
Il sistema non \'{e} statico, perch\'{e} la Terra \'{e} soggetta a movimenti tettonici e variazioni dinamiche: 
per questo motivo, nel tempo sono state prodotte diverse versioni aggiornate, dette "realizzazioni", 
che mantengono l'allineamento con i frame di riferimento internazionali (ITRF). Dal punto di vista operativo, 
ci\'{o} significa che le coordinate fornite dai ricevitori GPS sono gi\'{a} espresse in WGS 84, con una precisione che, 
a seconda delle tecniche di posizionamento, pu\'{o} andare dal livello del metro fino al centimetro. \cite{stevens2016aircraft}
\newpage
\subsubsection{ECEF}
Il sistema di coordinate ECEF (Earth-Centered, Earth-Fixed) \'{e} strettamente legato al WGS 84 e rappresenta il modo 
pi\'{u} naturale per descrivere posizioni sulla Terra in tre dimensioni. Si tratta di un sistema cartesiano 
tridimensionale con origine nel centro di massa terrestre, lo stesso utilizzato dal WGS 84 per definire il proprio 
datum.

\begin{figure}[ht] % r = right
  \centering
  \vspace{-0.2cm}
  \includegraphics[width=0.5\linewidth]{Figures/ECEFNED.png}
  \caption{ECEF e NED}
  \label{fig:ECEFNED}
\end{figure}

L'asse Z \'{e} orientato verso il polo nord geografico, coincidente con l'asse medio di rotazione terrestre. 
L'asse X giace sul piano equatoriale e passa per l'intersezione tra l'equatore e il meridiano di Greenwich. 
L'asse Y, infine, completa il sistema seguendo la regola della mano destra, e anch'esso si trova sul piano 
equatoriale, ortogonale rispetto all'asse X.

La caratteristica principale del sistema ECEF \'{e} che esso viene definito come \emph{Earth-Fixed}, cio\'{e} ruota solidalmente con la 
Terra. Questo significa che le coordinate (X,Y,Z) di un punto fissato sulla superficie terrestre rimangono costanti 
nel tempo, almeno in assenza di movimenti tettonici o deformazioni locali. Ci\'{o} lo rende particolarmente utile per 
descrivere  qualsiasi punto che debba mantenere stabilit\'{a} rispetto alla 
crosta terrestre.

Le coordinate in ECEF sono espresse in metri e permettono un'immediata conversione con le coordinate 
geodetiche $(\varphi,\, \lambda,\, h)$, ossia latitudine, longitudine e quota ellissoidica. Questa trasformazione \'{e} alla 
base del funzionamento dei ricevitori GPS: i satelliti trasmettono dati che vengono elaborati direttamente 
in ECEF e solo in seguito convertiti in latitudine e longitudine per essere comprensibili agli utenti. \cite{stevens2016aircraft}

\subsubsection{NED}

Il sistema di riferimento NED \'{e} un sistema cartesiano locale comunemente utilizzato in aeronautica 
e navigazione per descrivere i movimenti e le posizioni di un veicolo rispetto alla superficie terrestre. A differenza 
del sistema ECEF, che \'{e} globale e centrato nel centro della Terra, NED \'{e} legato al punto in cui si trova il veicolo e 
fornisce una rappresentazione intuitiva dei movimenti in prossimit\'{a} della superficie.

Il suo origine \'{e} tipicamente posto nel punto in cui si trova il velivolo o il veicolo di riferimento. L'asse X \'{e} 
orientato verso il Nord geografico, l'asse Y \'{e} orientato verso Est, mentre l'asse Z punta verso il basso, ossia 
nella direzione del centro della Terra. Questa scelta di convenzione, con l'asse Z orientato verso il basso, \'{e} 
molto diffusa in aviazione perch\'{e} semplifica il calcolo delle quote e la rappresentazione della gravit\'{a}, che 
risulta avere valori positivi lungo tale direzione.

Il sistema NED \'{e} particolarmente utile nelle applicazioni operative poich\'{e} fornisce una rappresentazione 
direttamente interpretabile dai piloti e dagli strumenti di bordo: spostarsi lungo l'asse X significa andare 
verso nord, lungo l'asse Y verso est e lungo l'asse Z significa scendere in altitudine. In questo modo, i 
sensori di navigazione come accelerometri, magnetometri e GPS possono tradurre le misure in coordinate facilmente 
gestibili per il controllo e la navigazione.

Dal punto di vista matematico, il sistema NED si ottiene tramite una trasformazione dal sistema ECEF. Dati 
latitudine e longitudine del punto di riferimento, \'{e} possibile costruire la matrice di rototraslazione che porta 
dal frame globale (ECEF) al frame locale (NED). Questa operazione permette di collegare dati geodetici assoluti 
con informazioni locali utilizzabili per la navigazione e il controllo di un veicolo.

In sintesi, NED \'{e} un sistema locale, intuitivo e funzionale, che permette di descrivere i movimenti in 
prossimit\'{a} della superficie terrestre con un'immediatezza che i sistemi globali come ECEF non offrono. \cite{stevens2016aircraft}

\subsubsection{BODY}

Il sistema di riferimento BODY \'{e} un sistema cartesiano solidale con il veicolo stesso, spesso utilizzato in 
aeronautica e robotica per descrivere le grandezze cinematiche e dinamiche direttamente dal punto di vista del mezzo. 
A differenza del sistema NED, che rimane fisso rispetto alla Terra, il sistema BODY si muove e ruota insieme al 
velivolo.

L'origine del sistema \'{e} generalmente posto nel centro di gravit\'{a} del veicolo. L'asse X \'{e} orientato lungo la 
direzione longitudinale del velivolo, cio\'{e} verso il muso; l'asse Y \'{e} orientato lateralmente, verso l'ala destra; 
infine, l'asse Z punta verso il basso, in direzione del ventre del velivolo. Questa convenzione \'{e} standard in ambito 
aeronautico e garantisce coerenza nelle formulazioni delle equazioni del moto.

L'utilizzo del sistema BODY \'{e} fondamentale per la dinamica del volo e per il controllo. Le forze aerodinamiche 
(portanza, resistenza, forza laterale) e i momenti (rollio, beccheggio, imbardata) vengono infatti descritti e 
calcolati in questo sistema, poich\'{e} agiscono direttamente sul corpo dell'aeromobile. Allo stesso modo, i sensori 
montati a bordo - come giroscopi e accelerometri - misurano grandezze fisiche espresse nel sistema BODY, che devono 
poi essere convertite in sistemi di riferimento pi\'{u} adatti alla navigazione (come NED o ECEF).

Dal punto di vista matematico, la trasformazione tra BODY e NED si ottiene tramite le angoli di Eulero (rollio, 
beccheggio, imbardata) o, in alternativa, tramite rappresentazioni pi\'{u} robuste come i quaternioni. Questi strumenti 
consentono di passare da un sistema solidale con il veicolo a uno solidale con la Terra, integrando cos\'{i} le misure 
di bordo con le esigenze della navigazione globale.

In definitiva, il sistema BODY rappresenta la prospettiva "interna" del veicolo, essenziale per la descrizione 
delle dinamiche di volo e per l'elaborazione dei segnali provenienti dai sensori. \'{e} in stretta relazione con NED 
ed ECEF, poich\'{e} consente di tradurre i dati locali acquisiti dal veicolo in coordinate interpretabili su scala 
geografica e operativa.\cite{stevens2016aircraft}

\newpage
\subsection{Modello aeromeccanico}
Prepar3D v6 \'{e} un simulatore parametrico che adotta un modello a sei gradi di libert\'{a} per un corpo rigido, in cui le forze e i momenti aerodinamici 
e propulsivi vengono determinati sulla base di coefficienti tabellari e scalari. Tali coefficienti sono definiti 
principalmente in due archivi: il file \texttt{.AIR}, che raccoglie le tabelle e le derivate aerodinamiche, e il file
 \texttt{aircraft.cfg}, che contiene informazioni su geometria, masse e inerzie, parametri di propulsione e scalari di 
 taratura entrambi disponibili nell'SDK. L'insieme di questi dati consente al motore fisico di integrare le equazioni di Eulero-Newton in forma 
 classica, attraverso interpolazioni lineari e correzioni in funzione del numero di Mach. \cite{prepar3d2024sdk}

\begin{figure}[ht] % r = right
  \centering
  \vspace{-0.2cm}
  \includegraphics[width=0.4\linewidth]{Figures/Riferimenti.png}
  \caption{SR in uso.}
  \label{fig:REF}
\end{figure}
Il sistema di riferimento utilizzato  \'{e} quello riferito agli assi ortogonali mancini: l'asse longitudinale $+X$ punta in avanti, 
l'asse laterale $+Y$ verso destra e l'asse verticale $+Z$ verso l'alto. Le rotazioni seguono la convenzione: 
beccheggio positivo con il muso verso il basso, rollio positivo con l'ala sinistra abbassata e imbardata positiva 
verso destra. Questi segni valgono per tutte le derivate e i momenti aerodinamici.

Il modello aerodinamico si basa su due insiemi di dati. 

Da un lato, il file \texttt{.AIR} contiene i coefficienti 
aerodinamici di base, organizzati in tabelle per portanza, resistenza, momento di beccheggio, forze laterali, 
momenti di rollio e imbardata. Sono inoltre presenti curve di portanza e di momento in funzione dell'angolo d'attacco, 
cos\'{i} come tabelle correttive dipendenti dal numero di Mach. 

Dall'altro lato, il file \texttt{aircraft.cfg} definisce 
geometria, masse, inerzie e parametri di propulsione, oltre a scalari che permettono di modificare i coefficienti 
tabellari, facilitando il processo di taratura.

Tutte le tabelle sono interpolate linearmente e, se l'input eccede l'intervallo, i valori vengono mantenuti costanti agli 
estremi (\emph{clamping}). \\
Le Mach tables utilizzano una discretizzazione fissa da Mach 0 a Mach 3.2 con passo 0.2, 
ed ogni voce viene normalizzata.

Il nucleo del modello \'{e} costituito dalle equazioni di Newton Eulero per un corpo rigido a sei gradi di libert\'{a}, 
espresse nel sistema corpo:
\begin{equation}
m \, \dot{\mathbf{V}}_b + \boldsymbol{\omega}_b \times (m \, \mathbf{V}_b) = \mathbf{F}_b,
\end{equation}
\begin{equation}
I \, \dot{\boldsymbol{\omega}}_b + \boldsymbol{\omega}_b \times (I \, \boldsymbol{\omega}_b) = \mathbf{M}_b,
\end{equation}
dove $m$ \'{e} la massa, $\mathbf{V}_b$ la velocit\'{a} traslazionale nel sistema corpo, 
$\boldsymbol{\omega}_b = [p \; q \; r]^T$ la velocit\'{a} angolare e $I$ il tensore d'inerzia. Le forze totali 
$\mathbf{F}_b$ comprendono contributi aerodinamici, propulsivi, gravitazionali e da contatto, mentre i momenti 
$\mathbf{M}_b$ includono sia quelli aerodinamici sia quelli derivanti dai bracci di spinta dei motori.


I coefficienti aerodinamici sono ricavati dal file \texttt{.AIR} e successivamente corretti tramite scalari del \\ 
\texttt{aircraft.cfg}. In forma generale:
\begin{equation}
C_X(\alpha, \beta, \delta, M) =
C_{X,\text{base}}(\cdot) +
\Delta C_X^{Mach}(M),
\end{equation}
dove $C_{X,\text{base}}$ proviene dalle tabelle AIR, $\Delta C_X^{Mach}(M)$ dalle Mach tables e infine il risultato 
\'{e} moltiplicato dagli scalari presenti in \texttt{[flight\_tuning]}.

Le forze aerodinamiche principali sono:
\begin{equation}
L = q S C_L, \qquad D = q S C_D, \qquad Y = q S C_Y,
\end{equation}
mentre i momenti, calcolati rispetto agli assi corpo, sono:
\begin{equation}
M_x = q S b C_l, \qquad
M_y = q S \bar{c} C_m, \qquad
M_z = q S b C_n.
\end{equation}
Qui $q = \tfrac{1}{2}\rho V^2$ \'{e} la pressione dinamica, $S$ la superficie alare, $b$ l'apertura alare e $\bar{c}$ 
la corda media aerodinamica. Le derivate dinamiche ($C_{m_q}$, $C_{l_p}$, $C_{n_r}$) e quelle di controllo 
($C_{m_{\delta_e}}$, $C_{l_{\delta_a}}$, $C_{n_{\delta_r}}$) sono scalabili tramite parametri di 
\texttt{[flight\_tuning]}.


Gli assi di riferimento per centro di gravit\'{a} e momenti d'inerzia sono definiti nella sezione \\
\texttt{[weight\_and\_balance]}. In mancanza di valori sperimentali, il simulatore propone una stima 
degli MOI basata su geometria e peso a vuoto:
\begin{equation}
MOI_{pitch} \approx W_{vuoto}\frac{L^2}{810}, \quad
MOI_{roll} \approx W_{vuoto}\frac{b^2}{1870}, \quad
MOI_{yaw} \approx W_{vuoto}\frac{\big(\tfrac{1}{2}(L+b)\big)^2}{770},
\end{equation}
dove $L$ \'{e} la lunghezza, $b$ l'apertura e $W_{vuoto}$ il peso a vuoto del velivolo.


Per i motori a turbina, i parametri sono definiti nelle sezioni:\\ \texttt{[generalenginedata]}, 
\texttt{[turbineenginedata]}. 

Oltre alla spinta statica e alla geometria di installazione, viene introdotto 
il consumo specifico di carburante (TSFC).

Il modello assume:
\begin{equation}
\dot{m}_{fuel} = TSFC \cdot T,
\end{equation}
dove $\dot{m}_{fuel}$ \'{e} il consumo in lb/h e $T$ la spinta in lb. \'{e} possibile specificare valori separati di 
TSFC per l'afterburner, cos\'{i} come abilitare reverse thrust o angoli di montaggio della spinta che introducono 
momenti aggiuntivi.



\subsection{Meccanismi di controllo}

\subsubsection{PID}
Tra i diversi algoritmi di controllo sviluppati e applicati in ambito industriale, il controllore PID con la sua azione
 Proporzionale, Integrale e Derivativa rappresenta senza dubbio il pi\'{u} diffuso e utilizzato. Il suo largo impiego deriva 
dal perfetto compromesso tra semplicit\'{a} di implementazione, robustezza e capacit\'{a} di adattarsi a una grande 
variet\'{a} di processi, dai sistemi meccanici a quelli termici, fino ai processi chimici e biologici. \cite{qiu2010robustformation,zhang2012kalmanpid}

Il principio di funzionamento del PID \'{e} piuttosto intuitivo. L'algoritmo riceve in ingresso un segnale di 
errore, cio\'{e} la differenza tra il valore desiderato di una variabile ovvero il riferimento e il valore effettivamente 
misurato dal sistema. Questo errore, indicato convenzionalmente con e(t), viene elaborato dal controllore secondo 
tre modalit\'{a} di azione: proporzionale, integrale e derivativa. Il risultato di questa elaborazione \'{e} il segnale 
di controllo u(t), che viene inviato ad un potenziale attuatore per guidare il sistema verso il comportamento desiderato. \cite{testolin2010pid}

\begin{equation}
u(t) = K_P \, e(t) + K_I \int_0^t e(t)\, d\tau + K_D \frac{de(t)}{dt}
\end{equation}

L'azione proporzionale \'{e} la pi\'{u} immediata: il controllore produce un'uscita proporzionale all'errore istantaneo. 
Se l'errore \'{e} grande, anche la correzione sar\'{a} grande; se l'errore \'{e} piccolo, la correzione sar\'{a} pi\'{u} contenuta. 
L'effetto pratico \'{e} quello di ridurre rapidamente lo scostamento dal riferimento. Tuttavia, un guadagno proporzionale 
eccessivo pu\'{o} portare ad oscillazioni e persino instabilit\'{a}.

L'azione integrale guarda non solo all'errore istantaneo, ma anche alla sua storia. Integra infatti l'errore nel 
tempo, accumulandolo: in questo modo \'{e} in grado di correggere gli errori a regime, cio\'{e} gli scostamenti persistenti 
che il solo termine proporzionale non riesce ad annullare. Grazie a questo contributo, il sistema pu\'{o} raggiungere 
con precisione il valore di riferimento. D'altra parte, un'azione integrale troppo aggressiva pu\'{o} rendere la risposta 
lenta e oscillante.

L'azione derivativa, invece, ha il compito di anticipare il comportamento del sistema. Essa agisce in base alla 
velocit\'{a} di variazione dell'errore: se l'errore sta crescendo rapidamente, la derivata produce una correzione 
preventiva, come una sorta di "freno predittivo". Questo riduce oscillazioni e sovraelongazioni, migliorando la 
stabilit\'{a}. Tuttavia, il termine derivativo \'{e} molto sensibile al rumore di misura e deve essere utilizzato con cautela.

La combinazione di questi tre effetti - proporzionale, integrale e derivativo - d\'{a} origine al PID completo, un 
controllore versatile che riesce a garantire rapidit\'{a}, precisione e stabilit\'{a} allo stesso tempo.

Il controllore PID nasce in forma continua, ma per poter essere implementato 
in un calcolatore deve essere riscritto in maniera \textit{discreta}, cio\'{e} definita 
a intervalli di tempo scanditi dal periodo di campionamento $T_s$. 
In questo modo, l'algoritmo pu\'{o} essere eseguito passo dopo passo, elaborando 
i segnali misurati e producendo in uscita il comando da applicare al sistema.  

L'idea di fondo resta la stessa: il controllore elabora l'\textit{errore} 
tra il riferimento e l'uscita del sistema, indicato con $e[k]$ al passo $k$, 
e lo trasforma in un segnale di controllo $u[k]$ attraverso le tre azioni: proporzionale, integrale e derivativa.  

La componente proporzionale calcola un contributo direttamente proporzionale 
all'errore istantaneo:

\begin{equation}
u_P[k] = K_P \, e[k]
\end{equation}
La parte integrale tiene conto della \textit{storia dell'errore}. 
In forma digitale, l'integrale viene sostituito da una somma che accumula 
gli errori campione dopo campione. Questo si traduce nella ricorrenza:

\begin{equation}
u_I[k] = u_I[k-1] + K_I T_s \, e[k]
\end{equation}
Se l'errore persiste nel tempo, l'azione integrale cresce progressivamente, 
garantendo l'eliminazione dell'errore a regime.  


La parte derivativa agisce prevedendo l'andamento dell'errore, reagendo 
alla sua variazione nel tempo. In forma discreta, questa operazione 
corrisponde a una \textit{differenza finita}:

\begin{equation}
u_D[k] = K_D \, \frac{e[k] - e[k-1]}{T_s}
\end{equation}
In questo modo il controllore riesce ad anticipare la dinamica del sistema, 
riducendo oscillazioni e migliorando la stabilit\'{a}. 
Nelle applicazioni pratiche, questa formula viene spesso arricchita con un piccolo filtro, 
in modo da attenuare l'effetto del rumore di misura.  


Mettendo insieme i tre contributi, si ottiene l'espressione diretta 
del controllore in forma discreta:

\begin{equation}
u[k] = K_P e[k] + K_I T_s \sum_{i=0}^k e[i] + K_D \frac{e[k] - e[k-1]}{T_s}
\end{equation}

Questa \'{e} detta \textit{forma posizionale}, perch\'{e} fornisce direttamente 
il valore assoluto dell'uscita del controllore al passo $k$.  

In alternativa, si pu\'{o} scrivere il PID in forma \textit{incrementale}, 
concentrandosi non sul valore assoluto di $u[k]$, ma sulla variazione 
rispetto al passo precedente. In questo caso si calcola:

\begin{equation}
\Delta u[k] = K_P \big(e[k] - e[k-1]\big) + K_I T_s \, e[k] 
+ \frac{K_D}{T_s} \big(e[k] - 2 e[k-1] + e[k-2]\big)
\end{equation}

e quindi:

\begin{equation}
u[k] = u[k-1] + \Delta u[k]
\end{equation}

Questa formulazione ha il vantaggio di essere pi\'{u} robusta dal punto di vista numerico 
e di ridurre il rischio di accumulo di errori di calcolo. \cite{stevens2016aircraft}


\paragraph{Antiwindup}
Uno dei problemi pi\'{u} comuni nell'uso del controllore PID riguarda il cosiddetto 
\textit{integral windup}. Questo fenomeno si verifica quando l'attuatore del sistema 
raggiunge i propri limiti di saturazione: in tali condizioni, l'uscita del controllore 
non pu\'{o} pi\'{u} crescere o decrescere oltre un certo valore, mentre il termine integrale 
continua ad accumulare errore. Il risultato \'{e} che l'integratore mantiene un valore elevato 
anche quando l'errore tende a ridursi 
o cambia segno. La conseguenza pratica \'{e} una risposta lenta, caratterizzata da 
sovraelongazioni marcate e instabilit\'{a} temporanee.  

Per ovviare a questo problema, sono state sviluppate diverse strategie di 
\textit{anti-windup}, che mirano a limitare o correggere il comportamento 
dell'integratore in presenza di saturazioni. 

La tecnica pi\'{u} semplice consiste nel \textbf{clamping} che implica il bloccaggio  dell'integratore. Quando 
il segnale di controllo si trova in saturazione se l'errore mantiene lo stesso segno 
che quindi lo farebbe crescere ulteriormente, l'azione integrale cessa. In pratica, l'azione viene sospesa 
in condizioni critiche e riattivata non appena l'uscita torna entro i limiti consentiti.  
Questa strategia \'{e} di immediata implementazione, ma pu\'{o} introdurre discontinuit\'{a} 
evidenti nel passaggio tra le due modalit\'{a} operative.  \cite{bemporad2007antiwindup}

Una delle tecniche pi\'{u} diffuse  \'{e} la 
\textbf{back-calculation} che consiste in una retroazione di anti-windup. 
In questo caso si introduce un termine correttivo proporzionale alla differenza 
tra l'uscita calcolata dal controllore $u$ e quella effettivamente applicata 
dopo la saturazione $u_{sat}$. 
Il modello matematico dell'integratore viene quindi modificato come segue:  

\begin{equation}
\dot{x}_I = K_I e(t) + K_{aw}\,(u_{sat} - u)
\end{equation}

dove $K_{aw}$ \'{e} un guadagno di retroazione specifico per l'anti-windup.  
Questa soluzione consente di "scaricare" gradualmente l'integratore, riducendo 
gli effetti del windup in modo continuo e controllato. 
L'unico svantaggio \'{e} la necessit\'{a} di introdurre un parametro aggiuntivo ($K_{aw}$), 
che deve essere scelto e tarato con attenzione.  

Un'altra strategia consiste nel \textbf{forcing} ovver forzare lo stato dell'integratore affinch\'{e} 
segua il valore dell'uscita effettivamente disponibile dopo la saturazione. 
In questo caso, il termine integrale non viene lasciato libero di crescere, 
ma viene riposizionato in modo da rispettare il vincolo imposto:  

\begin{equation}
x_I(t) = u_{sat} - (u_P + u_D)
\end{equation}

Questa tecnica \'{e} particolarmente efficace, poich\'{e} impedisce che l'integratore 
accumuli valori irrealistici, mantenendolo coerente con le condizioni operative del sistema.  

Una soluzione ancora pi\'{u} immediata \'{e} quella di \textbf{imporre limiti minimi e massimi} 
ai valori che l'integratore pu\'{o} assumere. 
In questo modo, si impedisce a priori che il termine integrale possa crescere oltre 
soglie prestabilite. Tuttavia, se i limiti sono troppo stringenti, esiste il rischio 
che l'integrale perda parte della sua efficacia nell'eliminare l'errore a regime.  

Una variante del clamping prevede l'introduzione di una \textbf{zona morta}, 
all'interno della quale l'integratore \'{e} attivo, mentre al di fuori di essa viene bloccato. 
In questo modo si evita che errori troppo grandi (che porterebbero rapidamente in saturazione) 
alimentino l'integrale, pur mantenendo la capacit\'{a} di correzione quando il sistema 
si trova in prossimit\'{a} del regime desiderato. 


\subsubsection{Lead-Lag}
Nel campo dell'ingegneria dei controlli, i filtri \textit{lead-lag} rivestono un ruolo fondamentale 
per la modellazione e la regolazione dei sistemi dinamici. Essi rappresentano una famiglia di reti lineari tempo-invarianti 
che, in funzione della configurazione dei parametri, possono modificare la risposta in frequenza di un segnale amplificando 
o attenuando determinate componenti.  \cite{haugen2008filter}

Questi filtri sono strettamente collegati ai pi\'{u} noti filtri \textit{passa-basso} e \textit{passa-alto}.  La loro combinazione permette di modellare comportamenti 
intermedi e di ottenere la cosiddetta funzione di trasferimento lead-lag, che unisce entrambe le azioni.  

Un filtro \textbf{lag} introduce un ritardo di fase: attenua le componenti ad alta frequenza, lasciando pressoch\'{e} inalterate 
quelle a bassa frequenza. \'{e} quindi simile a un filtro passa-basso del primo ordine.  

Un filtro \textbf{lead}, al contrario, anticipa la risposta, introducendo un guadagno di fase positivo alle frequenze medio-alte. 
Ci\'{o} equivale, dal punto di vista funzionale, a un filtro passa-alto del primo ordine, con una pendenza limitata.  

Il filtro \textbf{lead-lag} combina entrambi i comportamenti: consente di spostare la fase e modellare il guadagno 
di un sistema in funzione della frequenza, rendendolo uno strumento essenziale sia per la compensazione di dinamiche indesiderate 
sia per il miglioramento della stabilit\'{a} e delle prestazioni dei controllori.  

Nel dominio di Laplace, la funzione di trasferimento di un filtro lead-lag si pu\'{o} scrivere come:

\begin{equation}
H(s) = K \cdot \frac{T_{\text{lead}} s + 1}{T_{\text{lag}} s + 1}
\end{equation}

dove:
\begin{itemize}
    \item $K$ \'{e} il guadagno statico,
    \item $T_{\text{lead}}$ \'{e} la costante di tempo associata alla parte anticipatrice (lead),
    \item $T_{\text{lag}}$ \'{e} la costante di tempo associata alla parte ritardatrice (lag).
\end{itemize}

Se $T_{\text{lead}} = 0$, si ottiene:

\begin{equation}
H_{\text{lag}}(s) = \frac{1}{T_{\text{lag}} s + 1}
\end{equation}

che corrisponde a un filtro passa-basso del primo ordine.  

Se invece $T_{\text{lag}} \to 0$, si ottiene:

\begin{equation}
H_{\text{lead}}(s) = T_{\text{lead}} s + 1
\end{equation}

che rappresenta un filtro con caratteristiche di passa-alto.  


Quando il filtro deve essere implementato in un calcolatore, occorre passare dalla forma continua a quella discreta. 
La discretizzazione pu\'{o} avvenire tramite diversi metodi: tra i pi\'{u} comuni troviamo l'approssimazione di 
\textbf{Eulero all'indietro} (Backward Euler) o la trasformata bilineare (Tustin).  

Dato il sistema continuo:  

\begin{equation}
H(s) = \frac{1}{T_f s + 1}
\end{equation}

si ottiene la ricorrenza discreta:  

\begin{equation}
y[k] = (1-a)\,y[k-1] + a\,u[k]
\end{equation}

con  

\begin{equation}
a = \frac{T_s}{T_f + T_s}
\end{equation}

dove $T_s$ \'{e} il tempo di campionamento.  

Invece applicando la sostituzione di Tustin al filtro lead lag nella sua interezza
\begin{equation}
s \approx \frac{2}{T_s}\frac{z-1}{z+1}
\end{equation}
si ottiene:  

\begin{equation}
H(z) = K \cdot \frac{ \big( \tfrac{2 T_{\text{lead}}}{T_s} + 1 \big) z + \big(1 - \tfrac{2 T_{\text{lead}}}{T_s}\big)}{\big( \tfrac{2 T_{\text{lag}}}{T_s} + 1 \big) z + \big(1 - \tfrac{2 T_{\text{lag}}}{T_s}\big)}
\end{equation}

Questa forma consente di implementare direttamente il filtro in digitale, utilizzando ricorrenze del tipo:  

\begin{equation}
y[k] = b_0 u[k] + b_1 u[k-1] - a_1 y[k-1]
\end{equation}

con coefficienti $a_1, b_0, b_1$ derivati dai parametri del filtro.  \cite{stevens2016aircraft}

\subsection{Approccio Leader-Follower}

Uno dei modelli pi\'{u} classici e intuitivi per il volo in formazione \'{e} quello detto \textbf{Leader--Follower}. 
In questo approccio, il comportamento dell'intera formazione \'{e} determinato principalmente dalla traiettoria di 
uno o pi\'{u} \textbf{leader}, mentre i droni rimanenti, detti \textbf{follower}, regolano la propria dinamica in 
funzione della posizione e del moto del leader.

\begin{figure}[ht] % r = right
  \centering
  \vspace{-0.2cm}
  \includegraphics[width=0.4\linewidth]{Figures/LEADER-FOLLOW.png}
  \caption{Approccio Leader follower - piano  XY.}
  \label{fig:LF}
\end{figure}

Matematicamente, se indichiamo con \(x_L(t) \in \mathbb{R}^3\) la posizione del leader in funzione del tempo, la 
traiettoria desiderata di un follower \(i\) \'{e} data da:
\begin{equation}
x_i^{des}(t) = x_L(t) + \Delta_i
\end{equation}
dove \(\Delta_i \in \mathbb{R}^3\) \'{e} il vettore che definisce la posizione relativa desiderata rispetto al leader. 
In altre parole, il follower non segue una traiettoria assoluta, ma mantiene un ``offset'' fisso dal leader, che pu\'{o} 
rappresentare una distanza di sicurezza, una disposizione a griglia o una formazione geometrica specifica.

Per ottenere questa traiettoria, il controllore del follower calcola l'errore di inseguimento:
\begin{equation}
e_i(t) = x_i^{des}(t) - x_i(t)
\end{equation}
dove \(x_i(t)\) \'{e} la posizione reale del follower. L'obiettivo del controllore \'{e} minimizzare l'errore \(e_i(t)\) 
mediante leggi di controllo che agiscono sulle velocit\'{a} o accelerazioni.

Il modello Leader-Follower trova applicazione diretta nei tre piani fondamentali dello spazio tridimensionale:


    \textbf{Piano Orizzontale (XY):}  
    In questo piano il leader definisce la rotta laterale. Supponiamo che il leader percorra una traiettoria 
    parametrica
    \begin{equation}
    x_L(t) = 
    \begin{bmatrix} 
    x_L(t) \\ y_L(t) 
    \end{bmatrix}.
    \end{equation}
    Allora, per un follower disposto lateralmente, la posizione desiderata \'{e}:
    \begin{equation}
    \begin{bmatrix} 
    x_i^{des}(t) \\ y_i^{des}(t) 
    \end{bmatrix}
    =
    \begin{bmatrix} 
    x_L(t) \\ y_L(t) 
    \end{bmatrix}
    +
    \begin{bmatrix} 
    \Delta_{i,x} \\ \Delta_{i,y} 
    \end{bmatrix}.
    \end{equation}
    Questo consente di creare formazioni a linea, a griglia o a matrice, mantenendo la stessa distanza orizzontale 
    tra droni anche durante curve o cambi di direzione.

    \textbf{Piano Verticale (XZ):}  
    Qui si regola l'altitudine. Se il leader varia la propria quota secondo \(z_L(t)\), ogni follower mantiene un 
    dislivello costante:
    \begin{equation}
    z_i^{des}(t) = z_L(t) + \Delta_{i,z}.
    \end{equation}
    Questo permette di organizzare formazioni multilivello, ad esempio con UAV a diverse altezze per effettuare 
    misure stratificate o ottimizzare la copertura sensoriale.

    \textbf{Piano Longitudinale (YZ):}  
    In direzione del moto, i follower devono mantenere una distanza longitudinale costante per evitare collisioni. 
    Se il leader accelera o decelera, la legge di controllo del follower include una compensazione sulla velocit\'{a}.


Il modello Leader--Follower ha il vantaggio di essere concettualmente semplice e facilmente implementabile. Ogni 
follower deve solo stimare la posizione e velocit\'{a} del leader o, in versioni pi\'{u} complesse, del drone che lo 
precede nella catena. Questo riduce notevolmente la complessit\'{a} computazionale e di comunicazione rispetto a metodi 
pi\'{u} sofisticati come la formazione virtuale.

Tuttavia, l'approccio soffre di due limiti fondamentali. Se il leader fallisce o perde il controllo, 
l'intera formazione viene compromessa.Nei sistemi a catena lunga, piccoli errori di inseguimento possono 
amplificarsi man mano che ci si allontana dal leader, causando instabilit\'{a} nella parte finale della formazione.


Per mitigare questi problemi, in letteratura sono stati sviluppati modelli con pi\'{u} leader o con architetture 
ibride come Leader-Follower combinato con controllo distribuito che migliorano robustezza e resilienza.
\newpage
\section{Autopilota di formazione}
\subsection{Velivolo}
Per lo sviluppo di questo progetto \'{e} stato utilizzato sia come velivolo mothership che come drone gregario l'F-35 
Lightning II. Si tratta di un caccia multiruolo di quinta generazione progettato per integrare in un unico sistema 
caratteristiche di furtivit\'{a}, superiorit\'{a} aerea, capacit\'{a} d'attacco e funzioni di supporto elettronico. 
A differenza 
dei velivoli delle generazioni precedenti, che erano concepiti essenzialmente come mezzi di combattimento con 
funzioni ben definite, l'F-35 \'{e} stato ideato come un vero e proprio nodo informativo capace di raccogliere, 
elaborare e redistribuire dati in tempo reale, rendendolo un attore centrale nelle moderne operazioni multi-dominio.

\begin{figure}[ht] % r = right
  \centering
  \vspace{-0.2cm}
  \includegraphics[width=\linewidth]{Figures/F353view.png}
  \caption{F35 -Disegno 3 viste.}
  \label{fig:F35}
\end{figure}

Dal punto di vista tecnologico, l'F-35 incorpora numerose innovazioni che lo rendono unico. La sua architettura 
stealth, ottenuta grazie a materiali radar-assorbenti e a una progettazione delle superfici aerodinamiche volta a 
ridurre la sezione radar equivalente, gli consente di operare in spazi aerei altamente difesi. Ma ci\'{o} che davvero 
lo distingue \'{e} l'insieme dei suoi sistemi di sensori e la capacit\'{a} di fusione dei dati. Il radar AESA a scansione 
elettronica, i sensori a infrarossi distribuiti (DAS), il sistema elettro-ottico EOTS e i sistemi di guerra 
elettronica producono enormi quantit\'{a} di informazioni che vengono elaborate da algoritmi avanzati per fornire al 
pilota una rappresentazione sintetica, unificata e coerente dello scenario operativo. Questo processo, noto come 
\textit{sensor fusion}, riduce notevolmente il carico cognitivo del pilota e aumenta la situational awareness.

Oltre a ci\'{o}, l'F-35 dispone di avanzati datalink come il MADL (Multifunction Advanced Datalink), che permettono di 
condividere in tempo reale le informazioni raccolte con altre piattaforme aeree, navali e terrestri, anche in 
condizioni ostili e con bassa probabilit\'{a} di intercettazione. Questa capacit\'{a} lo trasforma non soltanto in un aereo 
da combattimento, ma in un vero e proprio coordinatore di missione, capace di guidare altri assetti meno sofisticati 
e di integrarsi in reti operative distribuite. Un elemento fondamentale \'{e} anche l'architettura software del velivolo, 
pensata per essere modulare e aggiornabile. A differenza dei velivoli tradizionali, che richiedevano modifiche 
hardware per introdurre nuove funzioni, l'F-35 pu\'{o} ricevere aggiornamenti digitali periodici che gli permettono di 
incorporare rapidamente algoritmi sempre pi\'{u} sofisticati. Questo lo rende una piattaforma adatta a sperimentare ed 
evolvere progressivamente verso capacit\'{a} autonome.

La possibilit\'{a} di sviluppare autonomia a bordo di un sistema come l'F-35 trova giustificazione in diverse 
caratteristiche intrinseche. In primo luogo, la fusione sensoriale costituisce gi\'{a} la base per qualsiasi forma 
di intelligenza artificiale: un sistema autonomo deve infatti poter contare su una percezione affidabile e completa 
dell'ambiente circostante. L'F-35, grazie all'integrazione di sensori eterogenei e all'elaborazione in tempo reale, 
\'{e} gi\'{a} in grado di fornire una visione globale e coerente del campo di battaglia, riducendo una delle principali 
difficolt\'{a} nello sviluppo dell'autonomia.

In secondo luogo, la sua potenza di calcolo e l'architettura avionica avanzata permettono di sostenere carichi 
computazionali elevati. Algoritmi di apprendimento automatico, modelli predittivi per il comportamento dei nemici 
e logiche decisionali distribuite possono essere integrati senza necessit\'{a} di riprogettazioni radicali. Ci\'{o} significa 
che l'autonomia pu\'{o} essere sviluppata in modo incrementale, partendo da funzioni di supporto decisionale fino ad 
arrivare a capacit\'{a} di missione completamente automatizzate.

Un altro elemento chiave \'{e} la riduzione del carico cognitivo del pilota. Gi\'{a} oggi, l'F-35 si pone come interfaccia 
avanzata uomo-macchina, alleggerendo il pilota da compiti di basso livello e permettendogli di concentrarsi su 
decisioni tattiche di alto livello. L'autonomia potrebbe spingersi oltre, arrivando a sostituire il pilota in 
missioni particolarmente rischiose o a supportarlo con suggerimenti decisionali calcolati in millisecondi, tempi 
impossibili da raggiungere per la mente umana in scenari di combattimento complessi.

Le capacit\'{a} di rete dell'F-35, inoltre, rendono naturale la sua evoluzione verso il ruolo di coordinatore di 
sistemi autonomi. Esso potrebbe agire come piattaforma madre (\textit{mothership}) in grado di controllare sciami 
di droni collaborativi, delegando a essi compiti specifici come la ricognizione, la guerra elettronica o l'attacco 
a bersagli multipli, mantenendo per s\'{e} la supervisione strategica. In un contesto multi-dominio, l'autonomia 
permetterebbe all'F-35 non solo di condurre missioni aeree, ma di integrarsi direttamente con assetti navali e 
terrestri, diventando un nodo intelligente di un'unica rete bellica distribuita.

Dal punto di vista della sicurezza e dell'affidabilit\'{a}, il velivolo possiede gi\'{a} sistemi ridondanti e protocolli 
di gestione dei guasti che possono fungere da garanzia per l'introduzione dell'autonomia. Modalit\'{a} di fallback e 
supervisione remota potrebbero essere implementate senza dover modificare radicalmente la struttura del sistema. 
Questo riduce uno degli ostacoli principali all'adozione dell'autonomia in aviazione militare: la necessit\'{a} di 
assicurare affidabilit\'{a} e prevedibilit\'{a} in ogni scenario operativo.

In termini operativi, rendere l'F-35 autonomo significherebbe ottenere diversi vantaggi. Missioni ad altissimo 
rischio, come la penetrazione in spazi aerei pesantemente difesi, potrebbero essere svolte senza rischiare la 
vita dei piloti. Le operazioni potrebbero durare pi\'{u} a lungo, senza i limiti fisiologici dell'uomo. Sciami di 
droni potrebbero essere gestiti direttamente dal velivolo, moltiplicandone l'efficacia e la capacit\'{a} di proiezione. 
La superiorit\'{a} informativa, infine, sarebbe amplificata, poich\'{e} un sistema autonomo pu\'{o} analizzare e reagire 
pi\'{u} velocemente di un operatore umano a scenari mutevoli.

\subsection{Struttura del codice}
Il progetto consiste in un addon sviluppato per il simulatore Prepar3D, che utilizza l'interfaccia \emph{SimConnect} 
per pilotare automaticamente un velivolo designato come \emph{C2 Plane} e un gregario a controllo automatico chiamato 
\emph{Drone}. L'obiettivo principale del codice \'{e} la 
gestione autonoma delle fasi di missione, dall'inizializzazione dei velivoli a terra fino alla crociera, tramite una serie di 
autopiloti implementati manualmente. Parallelamente, l'addon fornisce funzionalit\'{a} di logging e test automatici dei 
regolatori, con lo scopo di valutare le prestazioni dei controlli e permettere successiva analisi.  


\begin{figure}[ht]
\centering
\begin{tikzpicture}
  [
  node distance=10mm and 10mm,
  block/.style={draw, rounded corners=2pt, thick, align=center, minimum width=10mm, minimum height=10mm},
  bus/.style={draw, rounded corners=2pt, thick, align=center, minimum width=10mm, minimum height=10mm, fill=black!3},
  bi/.style={Latex-Latex, very thick},   % <--- frecce bidirezionali
  grp/.style={draw, rounded corners=3pt, inner sep=5pt, label={[anchor=north west, xshift=2mm, yshift=-1mm]\bfseries}},
]
% ===================== C2 SIDE (top) =====================
% hub
\node[block] (c2main) {\texttt{C2main.cpp}\\ Loop principale};

% satelliti attorno al main
\node[block, above=of c2main]              (c2cmd)  {\texttt{Globalvar.h}\\ Variabili Globali};
\node[block, left=of  c2main]              (c2disp) {\texttt{dispatch.h}\\ Dispatch di eventi};
\node[block, right=of c2main]              (c2io)   {\texttt{readwrite.h}\\ IO \& Config};
\node[block, below=of c2main, xshift=-22mm](c2auto) {\texttt{autopilots.h}\\ Autopiloti};
\node[block, below=of c2main, xshift=+22mm](c2misc) {\texttt{miscellaneous.h}\\ Funzioni Varie};

% riquadro C2
\node[grp, fit=(c2main) (c2cmd) (c2disp) (c2io) (c2auto) (c2misc), label=above:{C2 Add-on}] (gC2) {};

% collegamenti bidirezionali verso il main
\draw[bi] (c2main) -- (c2cmd);
\draw[bi] (c2main) -- (c2disp);
\draw[bi] (c2main) -- (c2io);
\draw[bi] (c2main) -- (c2auto);
\draw[bi] (c2main) -- (c2misc);
\draw[bi] (c2auto) -- (c2misc);

% ===================== COMM BUS =====================
\node[bus, below=28mm of c2main] (lan) {\texttt{comunicationmodule.h}\\ Transponder link};

% collegamenti bidirezionali ai main
\draw[bi] (c2main) -- (lan);

% ===================== DRONE SIDE (bottom) =====================
% hub
\node[block, below=28mm of lan] (dmain) {\texttt{DRONEmain.cpp}\\ Loop principale};

% satelliti attorno al main
\node[block, left=of  dmain]              (ddisp) {\texttt{dispatch.h}\\ Dispatch di eventi};
\node[block, above=of ddisp]              (dcmd)  {\texttt{Globalvar.h}\\ Variabili Globali};
\node[block, right=of dmain]              (dio)   {\texttt{readwrite.h}\\ IO \& Config};
\node[block, below=of dmain, xshift=-22mm](dauto) {\texttt{autopilots.h}\\ Autopiloti di formazione};
\node[block, below=of dmain, xshift=+22mm](dmisc) {\texttt{miscellaneous.h}\\ Funzioni Varie};

% riquadro DRONE
\node[grp, fit=(dmain) (dcmd) (ddisp) (dio) (dauto) (dmisc), label=below:{DRONE Add-on}] (gDR) {};

% collegamenti bidirezionali verso il main
\draw[bi] (dmain) -- (dcmd);
\draw[bi] (dmain) -- (ddisp);
\draw[bi] (dmain) -- (dio);
\draw[bi] (dmain) -- (dauto);
\draw[bi] (dmain) -- (dmisc);
\draw[bi] (dauto) -- (dmisc);

% bus <-> drone main
\draw[bi] (lan) -- (dmain);

\end{tikzpicture}
\caption{Schema a blocchi del codice}
\end{figure}

Il codice \'{e} stato progettato in maniera modulare, organizzato in una serie di file \texttt{.h} inclusi da un unico 
\texttt{main.cpp} per velivolo, che funge da cuore esecutivo del sistema. Tale struttura rende l'architettura facilmente 
estendibile, ma introduce anche un livello di complessit\'{a} dovuto all'utilizzo di numerose variabili globali.

La struttura del progetto \'{e} composta da diversi moduli, ciascuno con un ruolo specifico. Le \emph{variabili globali}, 
le strutture dati e i flag di stato sono racchiusi nel file \texttt{globalvar.h}. In esso troviamo, ad esempio, 
la definizione di \emph{ObjectDataStruct}, che contiene lo stato dinamico e aerodinamico del velivolo, insieme a 
due istanze specifiche denominate \texttt{UserPlane} e \texttt{OtherPlane}. Questi oggetti fungono da interfaccia 
tra simulatore e addon, veicolando posizione, assetto, velocit\'{a} e deflessioni dei comandi di ciascun velivolo.

Il file \texttt{dispatchfun.h} \'{e} invece deputato alla gestione degli eventi di SimConnect. All'interno di questo 
modulo \'{e} implementata la funzione di callback \texttt{MyDispatchProc}, che riceve ed elabora i pacchetti informativi 
provenienti dal simulatore, aggiornando lo stato interno dell'addon. Contestualmente, la stessa funzione si occupa 
di definire i canali di input-output: associa i tasti della tastiera agli eventi SimConnect, mappa gli eventi di 
controllo e organizza il flusso informativo dal simulatore al programma.

Un ruolo cruciale \'{e} ricoperto dal file \texttt{autopilots.h}, in cui risiedono gli omonimi autopiloti. Questi sono 
implementati come sistemi Lead-Lag, PID e ibridi, dotati di meccanismi di anti-windup, con saturazioni esplicite per evitare 
comandi irrealizzabili. I regolatori sono organizzati gerarchicamente: quelli esterni, come il controllo di quota 
e di rotta, forniscono set-point ai regolatori interni, responsabili invece di variabili dinamicamente pi\'{u} rapide, 
quali pitch e bank. La separazione di banda garantisce stabilit\'{a} e semplicit\'{a} di taratura.

Per quanto riguarda le funzioni di servizio, il file \texttt{miscellaneous.h} raccoglie utility di vario tipo: 
il riconoscimento dello stato \emph{on-ground}, la gestione automatica del carrello e soprattutto le funzioni di 
trasformazione tra sistemi di coordinate. In particolare, il passaggio da coordinate geodetiche a frame ECEF 
(Earth-Centered, Earth-Fixed) e poi a frame locali NED (North-East-Down) e body \'{e} essenziale per calcolare 
separazioni relative tra velivoli.

La gestione dell'I/O, distinta dal resto del codice, \'{e} centralizzata nel file \texttt{readwrite.h}. Questo 
modulo si occupa di leggere i file di configurazione (\texttt{inputs/configs.txt}), di inizializzare i file di 
output per il logging e di chiedere all'utente, tramite prompt a console, se abilitare funzionalit\'{a} come test o 
registrazione dati. I file di output generati riportano, per ciascun passo temporale, l'intero stato del velivolo.

Infine, \texttt{comunicationmodule.h} fornisce un canale di comunicazione rudimentale con il drone gregario 
attraverso l'uso del transponder code. Sono definiti tre comandi simbolici: \emph{TakeOff}, 
\emph{Reach C2} e \emph{Formation}, che corrispondono rispettivamente ai valori 1, 2 e 3 del transponder.

\subsection{Gestione della missione}
Il cuore logico della missione \'{e} una macchina a stati governata dal flag \texttt{flag\_decollo}. Inizialmente, 
quando il velivolo \'{e} a terra, viene memorizzato l'heading iniziale. Se la velocit\'{a} supera un certo valore soglia, 
l'addon assume che il velivolo sia gi\'{a} in fase di rullaggio e salta alcune fasi iniziali.

La sequenza di missione procede in maniera deterministica. Nella prima fase, il velivolo viene spinto al 90\% di 
potenza, i freni vengono rilasciati e viene inviato un comando di decollo al drone che a 
questo punto effettua la stessa manovra. Successivamente, in fase di 
rullaggio, il timone viene comandato per allineare l'heading, mentre gli elevatori mantengono l'aereo a 
terra fino a che la velocit\'{a} di stacco non viene raggiunta. Nella fase di salita, il controllo passa a un 
regolatore di pitch che forza l'assetto a valori negativi per ottenere una salita stabilizzata, mentre gli 
alettoni mantengono l'allineamento di rotta. Una volta raggiunta circa un terzo della quota di crociera, l'aereo 
entra nella fase di immissione. Qui i regolatori di quota e rotta stabilizzano il velivolo ai valori desiderati. 
Se la quota resta stabile entro un margine di $\pm 10$ piedi per almeno cinque secondi, il sistema dichiara il 
raggiungimento del C2 in crociera e invia un nuovo comando di stato al drone per il raggiungimento.
 Infine, in crociera, l'autothrottle mantiene una velocit\'{a} 
costante di 850 ft/s, mentre gli altri regolatori tengono invariati assetto e direzione.

Parallelamente, il carrello viene retratto automaticamente al superamento di una velocit\'{a} prestabilita, senza 
richiedere input manuali. Questa sequenza logica, seppur semplice, consente al velivolo di compiere un profilo di 
volo standardizzato e ripetibile.

\begin{figure}[ht]
  \centering
  \begin{minipage}{0.45\textwidth}
  \includegraphics[width=\linewidth]{Figures/LeaderMission.png}
  \caption{Fasi di missione del leader.}
  \label{fig:LeaderM}
  \end{minipage}\hfill
  \begin{minipage}{0.55\textwidth}
  \centering
  \includegraphics[width=\linewidth]{Figures/LeaderM.png}
  \caption{Fasi di missione del follower.}
    \end{minipage}
    \label{fig:FollowerM}

\end{figure}


\subsection{Trasformazioni di coordinate }
Il calcolo delle separazioni tra velivoli \'{e} basato su una pipeline di trasformazioni coordinate che garantisce
consistenza geometrica rispetto alla superficie ellissoidale terrestre. A partire dalle posizioni geodetiche
(latitudine $\phi$, longitudine $\lambda$, quota $h$), si effettua la conversione in coordinate ECEF
mediante i parametri WGS--84. L'eccentricit\'{a} dell'ellissoide e il raggio di curvatura nel primo verticale
$N(\phi)$ sono definiti come:
\begin{align}
e^2 &= 1-\frac{b^2}{a^2}, \qquad
N(\phi)=\frac{a}{\sqrt{1-e^2\sin^2\phi}}, \\[3pt]
\mathbf r_\mathrm{ecef}(\phi,\lambda,h) &=
\begin{bmatrix}
(N(\phi)+h)\cos\phi\cos\lambda\\
(N(\phi)+h)\cos\phi\sin\lambda\\
\big(N(\phi)(1-e^2)+h\big)\sin\phi
\end{bmatrix},
\end{align}
dove $a$ e $b$ sono rispettivamente semiasse maggiore e minore. La differenza tra i vettori ECEF del drone e del
velivolo di riferimento fornisce il vettore relativo $\Delta\mathbf r_\mathrm{ecef}$:
\begin{align}
\Delta\mathbf r_\mathrm{ecef} &= \mathbf r_\mathrm{ecef}(\phi,\lambda,h)-
\mathbf r_\mathrm{ecef}(\phi_0,\lambda_0,h_0).
\end{align}
Tale differenza viene riportata nel frame locale NED del velivolo di riferimento attraverso la matrice di
rototrasformazione:
\begin{align}
C^{n}_{e}(\phi_0,\lambda_0) &=
\begin{bmatrix}
-\sin\phi_0\cos\lambda_0 & -\sin\phi_0\sin\lambda_0 & \phantom{-}\cos\phi_0\\
-\sin\lambda_0           & \phantom{-}\cos\lambda_0 & 0\\
-\cos\phi_0\cos\lambda_0 & -\cos\phi_0\sin\lambda_0 & -\sin\phi_0
\end{bmatrix}, \\[3pt]
\mathbf r_n &= C^{n}_{e}(\phi_0,\lambda_0)\,\Delta\mathbf r_\mathrm{ecef}.
\end{align}
Per rappresentare le separazioni nel frame di corpo del leader, utile al calcolo di distanze frontali, laterali e
verticali, il vettore NED viene ulteriormente trasformato mediante le rotazioni di assetto
(heading $\psi$, pitch $\theta$, roll $\varphi$). Le matrici elementari sono:
\begin{align}
R_z(\alpha) &=
\begin{bmatrix}
\cos\alpha & -\sin\alpha & 0\\
\sin\alpha & \phantom{-}\cos\alpha & 0\\
0 & 0 & 1
\end{bmatrix},\quad
R_y(\beta) =
\begin{bmatrix}
\cos\beta & 0 & \sin\beta\\
0 & 1 & 0\\
-\sin\beta & 0 & \cos\beta
\end{bmatrix},\quad
R_x(\gamma) =
\begin{bmatrix}
1 & 0 & 0\\
0 & \cos\gamma & -\sin\gamma\\
0 & \sin\gamma & \phantom{-}\cos\gamma
\end{bmatrix}.
\end{align}
Nel codice implementato la trasformazione segue l'ordine \emph{heading, pitch, roll} con segno negativo
sull'heading, risultando:
\begin{align}
\mathbf r_b &= R_x(\varphi)\,R_y(\theta)\,R_z(-\psi)\,\mathbf r_n,
\end{align}
mentre in casi particolari \'{e} disponibile anche la sola rotazione di heading:
\begin{align}
\mathbf r_{n,\psi} &= R_z(-\psi)\,\mathbf r_n.
\end{align}
Questa catena di trasformazioni, coerente con le funzioni \texttt{EcefToBody} ed \texttt{EcefToNEDPhi}
implementate nel codice, consente di esprimere le separazioni nel sistema di corpo del leader, mantenendo
la correttezza geometrica e tenendo conto della curvatura terrestre. Tale soluzione, pur con approssimazioni
intrinseche, risulta adeguata agli scenari simulativi previsti.
\newpage
\subsection{Acquisizione dati}
Oltre al profilo missione standard, il codice prevede una modalit\'{a} di test dei regolatori. L'utente pu\'{o} 
scegliere di eseguire prove specifiche, come il controllo del pitch o della velocit\'{a}. In tali casi, vengono 
generati set-point tempo-varianti, che costringono i regolatori a reagire a variazioni brusche. Questo permette 
di analizzare la dinamica di risposta e valutare l'efficacia dei guadagni.
\begin{figure}[ht]
  \includegraphics[width=\linewidth]{Figures/Immagine10.png}
  \caption{Schermata principale addon}
  \label{fig:SchermataPrinc}
\end{figure}

La funzionalit\'{a} di logging affianca l'esecuzione dei test e delle missioni. Vengono creati file di testo 
distinti per il C2 e per il drone, con intestazioni descrittive e campi che riportano lo stato completo a ogni 
campione temporale. I file vengono nominati in maniera univoca attraverso un timestamp, cos\'{i} da evitare 
sovrascritture e facilitare l'archiviazione.


Un aspetto centrale del progetto \'{e} la modalit\'{a} con cui l'addon interagisce con il simulatore Prepar3D per 
acquisire i dati necessari al funzionamento degli autopiloti e della logica di missione. L'interfaccia scelta 
\'{e} SimConnect, che rappresenta il canale ufficiale di comunicazione tra applicazioni esterne e l'ambiente 
simulativo. Attraverso SimConnect, l'addon dichiara esplicitamente quali grandezze desidera ricevere, 
stabilendo cos\'{i} una sorta di contratto con il simulatore. Questo processo inizia nella fase di inizializzazione, 
quando la funzione di callback \texttt{MyDispatchProc}, contenuta nel file \texttt{dispatchfun.h}, definisce 
le variabili da monitorare. In questa fase vengono registrate le cosiddette \emph{data definitions}, cio\'{e} gli 
insiemi di parametri che il simulatore dovr\'{a} fornire ad ogni aggiornamento.

Il ciclo operativo dell'acquisizione prevede tre momenti fondamentali. In primo luogo, il programma richiede 
i dati sul velivolo controllato dall'utente, il cosiddetto \emph{C2 Plane}, attraverso la funzione 
\texttt{SimConnect\_RequestDataOnSimObject}. In parallelo, la stessa funzione viene invocata per ottenere le 
informazioni relative ad altri aeromobili presenti nello scenario, come ad esempio un drone o il traffico 
circostante. Successivamente, i dati viaggiano dal simulatore al programma in maniera asincrona e giungono 
alla funzione di callback precedentemente registrata. Qui vengono interpretati e ricondotti alla struttura 
\texttt{ObjectDataStruct}, che costituisce il contenitore principale dei dati aeronautici all'interno dell'addon. 
Le due istanze \texttt{UserPlane} e \texttt{OtherPlane} vengono cos\'{i} aggiornate a ogni ciclo con i valori pi\'{u} 
recenti. Infine, il flusso acquisitivo si completa con la frequenza di campionamento stabilita: il programma 
inserisce una pausa di 50 millisecondi all'interno del ciclo principale, ottenendo un ritmo di acquisizione e 
aggiornamento di circa 20 Hertz. Questo valore rappresenta un compromesso efficace tra prontezza di risposta e 
carico computazionale.

L'insieme delle variabili acquisite \'{e} molto ampio e permette di ricostruire uno stato quasi completo del 
velivolo. I dati pi\'{u} immediatamente intuitivi sono quelli relativi alla cinematica e alla posizione: latitudine, 
longitudine e altitudine forniscono il riferimento geografico, mentre gli angoli di assetto, espressi 
come pitch, bank e heading, descrivono l'orientamento. A ci\'{o} si aggiungono le velocit\'{a}, sia come modulo 
rispetto al suolo, sia nelle componenti lungo gli assi del velivolo. Non mancano le accelerazioni lineari e i 
ratei angolari, elementi indispensabili per una descrizione dinamica pi\'{u} raffinata.

Un altro gruppo di variabili riguarda i comandi e le superfici mobili. L'addon riceve dal simulatore la 
posizione della manetta, la deflessione di timone, alettoni ed elevatori, oltre allo stato di flap, carrello e 
freno di parcheggio. Queste informazioni permettono non solo di monitorare lo stato effettivo dei comandi, 
ma anche di chiudere i loop di controllo quando i regolatori inviano i loro segnali correttivi.

Sono inoltre acquisiti dati aerodinamici e ambientali, come i coefficienti di portanza, resistenza e momento, 
le forze aerodinamiche nel sistema di riferimento del velivolo e le condizioni del vento (velocit\'{a} e direzione). 
Tali variabili forniscono un quadro completo delle interazioni tra velivolo e ambiente, utile sia per la 
valutazione delle prestazioni sia per la robustezza dei controllori. Infine, il simulatore comunica anche 
variabili di stato globale, tra cui un flag che indica se il velivolo si trova a terra, il codice transponder 
utilizzato come canale di comunicazione e il tempo di simulazione, che rappresenta il riferimento temporale 
per il calcolo delle derivate e per l'esecuzione dei test.

\subsection{Controllori}
Nel progetto sono implementat una serie di autopiloti, ciascuno progettato per controllare una specifica variabile 
del volo. Tutti i regolatori utilizzano strutture Lead-Lag, PID o ibride, arricchite da meccanismi di anti-windup e
 saturazione per tenere conto dei limiti fisici dei comandi. Nei paragrafi seguenti vengono descritti i diversi 
 autopiloti con le relative leggi matematiche.

\newpage
\subsubsection{Pitch Hold}

Il controllore di \emph{Pitch Hold} presente in Figure~\ref{fig:pitchhold} ha l'obiettivo di stabilizzare l'assetto longitudinale del velivolo agendo 
sull'equilibratore. L'implementazione segue uno schema a due stadi di tipo \emph{lead--lag}, composta da un blocco lead 
che processando l'errore fornisce un pitch rate di riferimento e da un
blocco lag che filtra il segnale, evitando oscillazioni troppo rapide.  Il primo stadio (lead) trasforma l'errore di pitch in un rateo 
di beccheggio desiderato, rendendo la risposta pronta ai cambiamenti rapidi; il secondo stadio (lag) filtra il 
segnale di controllo per smussare le componenti ad alta frequenza ed evitare comandi troppo bruschi. L'uscita 
viene infine saturata entro i limiti fisici accettati dal simulatore.

Il punto di partenza \'{e} il calcolo dell'errore di pitch come differenza tra riferimento e misura:
\begin{equation}
e_\theta(t) = \theta_{\text{cmd}}(t) - \theta(t),
\end{equation}
dove $\theta_{\text{cmd}}(t)$ \'{e} il pitch desiderato e $\theta(t)$ il pitch misurato.

Lo stadio \emph{lead} costruisce un \emph{rateo di pitch} comandato combinando l'errore e la sua derivata numerica:
\begin{equation}
\dot{\theta}_{\text{cmd}}(t) = K_{\ell}\!\left(
e_\theta(t) + \tau_d \,\frac{e_\theta(t)-e_\theta(t-\Delta t)}{\Delta t}
\right),
\end{equation}
con $K_{\ell}=9000$ e $\tau_d=0.3$. Il termine derivativo anticipa la dinamica e incrementa la prontezza del 
controllore, mentre $\Delta t$ \'{e} il passo di campionamento stimato dalla simulazione.

Il rateo di pitch desiderato viene confrontato con il rateo effettivamente misurato (variabile $q(t)$). Nel 
codice questa misura \'{e} scalata da un guadagno di retroazione $K_q$:
\begin{equation}
e_q(t) = \dot{\theta}_{\text{cmd}}(t) - K_q\, q(t),
\qquad K_q = 4500.
\end{equation}

Il segnale $e_q(t)$ attraversa quindi un filtro \emph{lag} del primo ordine, implementato come media esponenziale 
dipendente da $\Delta t$:
\begin{equation}
u(t) = \alpha \, e_q(t) + \bigl(1-\alpha\bigr)\, u(t-\Delta t),
\qquad
\alpha = \frac{\Delta t}{\Delta t + 0.8},
\end{equation}
dove $u(t)$ rappresenta il comando grezzo agli elevatori. La scelta di $\alpha$ rende il filtro adattivo 
rispetto al passo temporale effettivo del simulatore, favorendo una risposta regolare anche in presenza di 
jitter temporale.

Infine, il comando viene limitato ai valori massimi consentiti dall'interfaccia di SimConnect.

\begin{figure}[H]
  \centering
  \rotatebox{90}{
  \begin{tikzpicture}[node distance=16mm]

% Nodes
\node (tetacom) {$\theta_{\mathrm{com}}$};

\node[sum, right=5mm of tetacom] (sum1) {};
\node[block, right=12mm of sum1] (lead) {LEAD};
\node[sum, right=12mm of lead] (sum2) {};
\node[block, right=12mm of sum2] (lag) {LAG};
\node[block, right=12mm of lag] (sat) {SAT};
\node[block, right=12mm of sat, minimum width=22mm] (plant) {PREPAR3D};

% Outputs from plant
\node[right=10mm of plant.north east, anchor=west] (bout) {$\theta$};
\node[right=10mm of plant.south east, anchor=west] (pout) {$p$};

% Ka block under plant
\node[block, below=10mm of sat] (ka) {$K_p$};


% Draw connections (forward path)
\draw[line] (tetacom) -- (sum1);
\draw[line] (sum1) -- node[above, pos=0.5] {\small $err_1$} (lead);
\draw[line] (lead) -- (sum2) node[above, pos=0.4]{\small $p_{\mathrm{com}}$};
\draw[line] (sum2) -- node[above, pos=0.45] {\small $err_2$} (lag);
\draw[line] (lag) -- node[above, pos=0.5] {\small $\delta_{e\mathrm{COM}}$} (sat);
\draw[line] (sat) -- node[above, pos=0.5] {\small $\delta_e$} (plant);

% Plant outputs to labels
\draw[line] ($(plant.north east)+(0,-2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+2.5mm)$) -- ++(10mm,0) node[right] {};

% Upper feedback: V -> sum1 negative input
\draw[line] (plant.north east) ++(5mm,-2.5mm) |- ($(sum1.north)+(0,15mm)$) -| (sum1.north);
\node at ($(sum1.north)+(-2.5mm,4.5mm)$) {\small $\theta$};

% Lower feedback: a -> ka -> sum2 negative input
\draw[line] (plant.south east) ++(5mm,2.5mm) |- (ka.east);
\draw[line] (ka.west) -| ($(sum2.south)+(0,-15mm)$) -- (sum2.south);
\node at ($(sum2.south)+(-2.5mm,-4.5mm)$) {\small $q$};


% Small output labels next to plant
\node[above right=-2pt and -2pt of plant.north east, anchor=west] {};
\node[below right=-2pt and -2pt of plant.south east, anchor=west] {};

% Input annotations to the sums (plus/minus)
\node at ($(sum1.center)+(-3mm,-3mm)$) {\small $+$};
\node at ($(sum1.center)+(-3mm,3mm)$) {\small $-$};
\node at ($(sum2.center)+(-3mm,3mm)$) {\small $+$};
\node at ($(sum2.center)+(-3mm,-3mm)$) {\small $-$};



\end{tikzpicture}
  }
  \caption{Schema a blocchi del pitch hold}
  \label{fig:pitchhold}
\end{figure}
\newpage

\subsubsection{Bank Hold}


Il \emph{Bank Hold} presente in Figure~\ref{fig:bankhold}ha il compito di stabilizzare l'angolo di rollio del velivolo, generando un comando 
sugli alettoni che permetta di seguire l'angolo desiderato. L'implementazione utilizza una struttura a due 
stadi, composta da un blocco \emph{lead} che processando l'errore fornisce un roll rate di riferimento e da un blocco \emph{lag} 
che filtra il segnale, evitando oscillazioni troppo rapide. L'uscita finale viene infine saturata ai limiti 
fisici consentiti dal simulatore.

Il punto di partenza \'{e} il calcolo dell'errore:
\begin{equation}
e_\phi(t) = \phi_{\text{cmd}}(t) - \phi(t)
\end{equation}
dove $\phi_{\text{cmd}}(t)$ rappresenta l'angolo desiderato e $\phi(t)$ quello misurato. 

Questo errore viene utilizzato per calcolare un \emph{roll rate} comandato attraverso un controllore di tipo lead, 
che combina l'errore con la sua derivata:
\begin{equation}
\dot{\phi}_{\text{cmd}}(t) = K_{\ell}\left( e_\phi(t) + \tau_d \frac{e_\phi(t)-e_\phi(t-\Delta t)}{\Delta t}\right)
\end{equation}
dove $K_{\ell}=400$ \'{e} il guadagno principale del blocco, $\tau_d=0.64$ \'{e} la costante di anticipo 
e $\Delta t$ rappresenta l'intervallo temporale tra due campioni consecutivi. Questa forma di compensazione 
anticipatrice rende il controllore pi\'{u} reattivo ai cambiamenti rapidi dell'angolo di rollio.

Il valore ottenuto viene confrontato con il roll rate effettivamente misurato, ponderato da un fattore di 
scala:
\begin{equation}
e_{\dot{\phi}}(t) = \dot{\phi}_{\text{cmd}}(t) - K_r \, \dot{\phi}(t)
\end{equation}
dove $\dot{\phi}(t)$ \'{e} il roll rate reale e $K_r=200$ \'{e} un guadagno di retroazione.

Il segnale $e_{\dot{\phi}}(t)$ passa quindi attraverso un filtro di tipo lag, che smussa le variazioni veloci e 
riduce il rumore:
\begin{equation}
u(t) = \alpha \, e_{\dot{\phi}}(t) + (1-\alpha)\, u(t-\Delta t)
\end{equation}
con
\begin{equation}
\alpha = \frac{\Delta t}{\Delta t + 0.7}
\end{equation}
dove $u(t)$ \'{e} il comando agli alettoni e $u(t-\Delta t)$ \'{e} il valore del comando al passo temporale 
precedente. L'uso di $\alpha$ rende il filtro dipendente dalla frequenza di campionamento e quindi adattivo 
rispetto al passo temporale effettivo della simulazione.

Infine, il comando agli alettoni \'{e} limitato attraverso una saturazione, cos\'{i} da rientrare nell'
intervallo gestibile dal simulatore.

Dove \(\theta\) \'{e} l'angolo di pitch, \(\theta_\text{ref}\) il riferimento, \(q_\text{cmd}\) il rateo di pitch desiderato, \(f(\cdot)\) un filtro passa-basso, \(u_\theta\) il comando agli elevatori.
\begin{figure}[H]
  \centering
  \rotatebox{90}{
  \begin{tikzpicture}[node distance=16mm]

% Nodes
\node (phicom) {$\phi_{\mathrm{com}}$};

\node[sum, right=5mm of phicom] (sum1) {};
\node[block, right=12mm of sum1] (lead) {LEAD};
\node[sum, right=12mm of lead] (sum2) {};
\node[block, right=12mm of sum2] (lag) {LAG};
\node[block, right=12mm of lag] (sat) {SAT};
\node[block, right=12mm of sat, minimum width=22mm] (plant) {PREPAR3D};

% Outputs from plant
\node[right=10mm of plant.north east, anchor=west] (bout) {$\phi$};
\node[right=10mm of plant.south east, anchor=west] (pout) {$p$};

% Ka block under plant
\node[block, below=10mm of sat] (ka) {$K_p$};


% Draw connections (forward path)
\draw[line] (phicom) -- (sum1);
\draw[line] (sum1) -- node[above, pos=0.5] {\small $err_1$} (lead);
\draw[line] (lead) -- (sum2) node[above, pos=0.4]{\small $p_{\mathrm{com}}$};
\draw[line] (sum2) -- node[above, pos=0.45] {\small $err_2$} (lag);
\draw[line] (lag) -- node[above, pos=0.5] {\small $\delta_{a\mathrm{COM}}$} (sat);
\draw[line] (sat) -- node[above, pos=0.5] {\small $\delta_p$} (plant);

% Plant outputs to labels
\draw[line] ($(plant.north east)+(0,-2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+2.5mm)$) -- ++(10mm,0) node[right] {};

% Upper feedback: V -> sum1 negative input
\draw[line] (plant.north east) ++(5mm,-2.5mm) |- ($(sum1.north)+(0,15mm)$) -| (sum1.north);
\node at ($(sum1.north)+(-2.5mm,4.5mm)$) {\small $\phi$};

% Lower feedback: a -> ka -> sum2 negative input
\draw[line] (plant.south east) ++(5mm,2.5mm) |- (ka.east);
\draw[line] (ka.west) -| ($(sum2.south)+(0,-15mm)$) -- (sum2.south);
\node at ($(sum2.south)+(-2.5mm,-4.5mm)$) {\small $a$};


% Small output labels next to plant
\node[above right=-2pt and -2pt of plant.north east, anchor=west] {};
\node[below right=-2pt and -2pt of plant.south east, anchor=west] {};

% Input annotations to the sums (plus/minus)
\node at ($(sum1.center)+(-3mm,-3mm)$) {\small $+$};
\node at ($(sum1.center)+(-3mm,3mm)$) {\small $-$};
\node at ($(sum2.center)+(-3mm,3mm)$) {\small $+$};
\node at ($(sum2.center)+(-3mm,-3mm)$) {\small $-$};

\end{tikzpicture}
  }
  \caption{Schema a blocchi del bank hold}
  \label{fig:bankhold}
\end{figure}

\newpage

\subsubsection{Autothrottle}

L'\emph{Autothrottle} presente in Figure~\ref{fig:autothrottle} ha lo scopo di regolare la posizione della manetta per inseguire una velocit\'{a} 
desiderata. L'implementazione segue lo schema a due stadi \emph{lead-lag} gi\'{a} impiegato per i canali di assetto, 
con una particolarit\'{a}: il blocco \emph{lag} risulta, nei parametri correnti, degenere in un semplice passaggio 
diretto (di fatto senza filtraggio), come si vedr\'{a} pi\'{u} avanti.

Il segnale di ingresso \'{e} l'errore di velocit\'{a}
\begin{equation}
e_V(t) = V_{\text{cmd}}(t) - V(t),
\end{equation}
dove $V_{\text{cmd}}(t)$ \'{e} la velocit\'{a} desiderata e $V(t)$ la velocit\'{a} misurata. Questo errore viene trasformato, 
nello stadio \emph{lead}, in un comando di manetta che combina una parte proporzionale e una parte 
derivativa numerica dell'errore:
\begin{equation}
u_{\text{cmd}}(t) \;=\; K_{\ell}\!\left(
e_V(t) + \tau_d \,\frac{e_V(t) - e_V(t-\Delta t)}{\Delta t}
\right),
\qquad K_{\ell}=3000,\quad \tau_d=0.27,
\end{equation}
con $\Delta t$ il passo temporale calcolato dalla simulazione. Il termine proporzionale assicura che la manetta 
cresca all'aumentare dell'errore di velocit\'{a}, mentre il termine derivativo anticipa i cambi rapidi dell'errore, 
rendendo il controllore pi\'{u} pronto.

Per attenuare eventuali sovraelongazioni dovute alla dinamica propulsiva e all'inerzia del velivolo, il comando $u_{\text{cmd}}(t)$ viene 
corretto tramite un confronto con l'accelerazione longitudinale $a(t)$ misurata dal simulatore:
\begin{equation}
e_u(t) \;=\; u_{\text{cmd}}(t) \;-\; K_a\, a(t),
\qquad K_a = 1500.
\end{equation}
In questo modo, se l'aereo sta gi\'{a} accelerando (accelerazione positiva), il termine $K_a a(t)$ riduce il comando 
di manetta, e viceversa se sta decelerando: si tratta di una retroazione che smorza l'azione del controllore 
tenendo conto dell'inerzia e della spinta gi\'{a} in sviluppo.

Il segnale $e_u(t)$ \'{e} quindi inviato a uno stadio \emph{lag} del primo ordine, implementato come media 
esponenziale:
\begin{equation}
u(t) \;=\; \alpha \, e_u(t) \;+\; \bigl(1-\alpha\bigr)\, u(t-\Delta t),
\qquad
\alpha \;=\; \frac{\Delta t}{\Delta t + 0}.
\end{equation}
Con i parametri attuali si ha $\alpha = 1$ (per ogni $\Delta t>0$), quindi
\begin{equation}
u(t) \equiv e_u(t),
\end{equation}
ossia il filtro lag \'{e} degenere e non applica alcuna smussatura temporale. In termini pratici, l'uscita del blocco 
\emph{lag} coincide con l'ingresso, rendendo il controllore pi\'{u} reattivo ma anche pi\'{u} esposto a eventuale 
rumore del segnale.

Infine, il comando di manetta \'{e} vincolato entro i limiti operativi desiderati
\begin{figure}[H]
  \centering
  \rotatebox{90}{
  \begin{tikzpicture}[node distance=16mm]

% Nodes
\node (Vcom) {$V_{\mathrm{com}}$};

\node[sum, right=5mm of Vcom] (sum1) {};
\node[block, right=12mm of sum1] (lead) {LEAD};
\node[sum, right=12mm of lead] (sum2) {};
\node[block, right=12mm of sum2] (lag) {LAG};
\node[block, right=12mm of lag] (sat) {SAT};
\node[block, right=12mm of sat, minimum width=22mm] (plant) {PREPAR3D};

% Outputs from plant
\node[right=10mm of plant.north east, anchor=west] (Vout) {$V$};
\node[right=10mm of plant.south east, anchor=west] (aout) {$a$};

% Ka block under plant
\node[block, below=10mm of sat] (ka) {$K_a$};


% Draw connections (forward path)
\draw[line] (Vcom) -- (sum1);
\draw[line] (sum1) -- node[above, pos=0.5] {\small $err_1$} (lead);
\draw[line] (lead) -- (sum2) node[above, pos=0.4]{\small $a_{\mathrm{com}}$};
\draw[line] (sum2) -- node[above, pos=0.45] {\small $err_2$} (lag);
\draw[line] (lag) -- node[above, pos=0.5] {\small $\delta_{t\!\mathrm{COM}}$} (sat);
\draw[line] (sat) -- node[above, pos=0.5] {\small $\delta_t$} (plant);

% Plant outputs to labels
\draw[line] ($(plant.north east)+(0,-2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+2.5mm)$) -- ++(10mm,0) node[right] {};

% Upper feedback: V -> sum1 negative input
\draw[line] (plant.north east) ++(5mm,-2.5mm) |- ($(sum1.north)+(0,15mm)$) -| (sum1.north);
\node at ($(sum1.north)+(-2.5mm,4.5mm)$) {\small $V$};

% Lower feedback: a -> Ka -> sum2 negative input
\draw[line] (plant.south east) ++(5mm,2.5mm) |- (ka.east);
\draw[line] (ka.west) -| ($(sum2.south)+(0,-15mm)$) -- (sum2.south);
\node at ($(sum2.south)+(-2.5mm,-4.5mm)$) {\small $a$};


% Small output labels next to plant
\node[above right=-2pt and -2pt of plant.north east, anchor=west] {};
\node[below right=-2pt and -2pt of plant.south east, anchor=west] {};

% Input annotations to the sums (plus/minus)
\node at ($(sum1.center)+(-3mm,-3mm)$) {\small $+$};
\node at ($(sum1.center)+(-3mm,3mm)$) {\small $-$};
\node at ($(sum2.center)+(-3mm,3mm)$) {\small $+$};
\node at ($(sum2.center)+(-3mm,-3mm)$) {\small $-$};

\end{tikzpicture}
  }
  \caption{Schema a blocchi dell'autothrottle}
  \label{fig:autothrottle}
\end{figure}

\newpage
\subsubsection{Altitude Hold}


L'\emph{Altitude Hold} presente in Figure~\ref{fig:altitudehold} \'{e} organizzato gerarchicamente in due anelli: un \emph{anello esterno} che, a partire dall'errore di quota, 
calcola un \emph{pitch di riferimento} e un \emph{anello interno} che realizza tale riferimento comandando il timone. 
Questa architettura separa le dinamiche lente (quota) da quelle rapide (pitch), migliorando la robustezza complessiva.

Si definisce anzitutto l'errore di quota come
\begin{equation}
e_h(t) \;=\; h(t) - h_{\text{cmd}}(t),
\end{equation}
dove $h(t)$ \'{e} la quota misurata e $h_{\text{cmd}}(t)$ la quota desiderata. L'implementazione adotta una protezione 
all'inizializzazione: se l'intervallo di campionamento $\Delta t$ risulta troppo grande (ad es.\ al primo passo), 
i termini derivativo e integrale vengono azzerati per evitare transitori numerici.

La derivata dell'errore \'{e} calcolata come differenza in avanti
\begin{equation}
\dot e_h(t) \;=\; \frac{e_h(t) - e_h(t-\Delta t)}{\Delta t},
\end{equation}
mentre l'integrale sfrutta la regola del trapezio e include un termine di \emph{anti-windup} basato sulla saturazione del pitch:
\begin{equation}
I_h(t) \;=\; I_h(t-\Delta t)
\;+\; \frac{e_h(t) + e_h(t-\Delta t)}{2}\,\Delta t
\;-\; K_{aw}\,\bigl(\theta_{\text{cmd}}(t-\Delta t) - \theta_{\text{sat}}(t-\Delta t)\bigr),
\end{equation}
dove $K_{aw}>0$ \'{e} il guadagno di back-calculation (nel codice $K_{aw}=1$) e il termine tra parentesi rappresenta 
l'errore di saturazione del pitch (vedi oltre). In pratica, quando il pitch comandato viene limitato, si scarica l'integratore 
per prevenire accumulo eccessivo.

Il pitch desiderato \'{e} quindi fornito da un PID su $e_h$:
\begin{equation}
\theta_{\text{cmd}}(t)
\;=\; K_p^h\, e_h(t) \;+\; K_i^h\, I_h(t) \;+\; K_d^h\, \dot e_h(t),
\qquad
K_p^h = 0.08,\; K_i^h = 0.01,\; K_d^h = 0.09.
\end{equation}

Per rispettare i limiti operativi si applica una saturazione simmetrica.

L'anello interno fa inseguire al velivolo il riferimento $\theta_{\text{sat}}(t)$, agendo sugll'equilibratore. 
Si definisce
\begin{equation}
e_\theta(t) \;=\; \theta_{\text{sat}}(t) - \theta(t),
\end{equation}
dove $\theta(t)$ \'{e} il pitch misurato. 

Un blocco \emph{lead} genera un rateo di pitch comandato combinando errore e sua 
derivata numerica:
\begin{equation}
\dot{\theta}_{\text{cmd}}(t) \;=\; K_{\ell}\!\left(
e_\theta(t) + \tau_d\,\frac{e_\theta(t)-e_\theta(t-\Delta t)}{\Delta t}
\right),
\qquad K_{\ell}=9000,\ \ \tau_d=0.3.
\end{equation}
Questo rateo desiderato \'{e} poi confrontato con il rateo reale $q(t)$ (pitch rate), pesato da un guadagno $K_q$:
\begin{equation}
e_q(t) \;=\; \dot{\theta}_{\text{cmd}}(t) - K_q\, q(t),
\qquad K_q = 4500.
\end{equation}
Il segnale $e_q(t)$ attraversa un filtro \emph{lag} del primo ordine con coefficiente dipendente dal 
passo temporale:
\begin{equation}
u(t) \;=\; \alpha\, e_q(t) + (1-\alpha)\,u(t-\Delta t),
\qquad
\alpha \;=\; \frac{\Delta t}{\Delta t + 0.8},
\end{equation}
dove $u(t)$ \'{e} il comando agli elevatori prima della limitazione. Infine si impone la saturazione compatibile con SimConnect.



La catena complessiva realizza:
\begin{equation}
h_{\text{cmd}} \xrightarrow{\ e_h\ ,\ \text{PID+AW}\ } \theta_{\text{sat}}
\;\;\xrightarrow{\ \text{Lead}\ } \dot{\theta}_{\text{cmd}}
\;\;\xrightarrow{\ -K_q q\ } e_q
\;\;\xrightarrow{\ \text{Lag}\ } u
\;\;\xrightarrow{\ \text{sat}\ } \text{elevator.}
\end{equation}
L'anello esterno garantisce il tracciamento della quota limitando il pitch entro valori ammissibili; l'anello interno assicura 
inseguimento rapido e ben smorzato del pitch di riferimento. L'anti-windup evita che l'integratore di quota accumuli errore 
quando il pitch \'{e} saturato, scongiurando sovraelongazioni al rientro.

\begin{figure}[H]
    \centering
    \vspace{-1.0cm}
    \rotatebox{90}{
    \begin{tikzpicture}[node distance=16mm]

        % Nodes

    \node(hcom) {$h_{\mathrm{com}}$};   
\node[sum, right=5mm of hcom, minimum width=10mm] (sum3) {};
\node[block, right=10mm of sum3, minimum width=10mm] (PID) {PID};
\node[block, right=10mm of PID, minimum width=10mm] (tetasat) {SAT};
\node[sum, right=10mm of tetasat, minimum width=10mm] (sum1) {};
\node[block, right=10mm of sum1, minimum width=10mm] (lead) {LEAD};
\node[sum, right=10mm of lead, minimum width=10mm] (sum2) {};
\node[block, right=10mm of sum2, minimum width=10mm] (lag) {LAG};
\node[block, right=10mm of lag, minimum width=10mm] (sat) {SAT};
\node[block, right=10mm of sat, minimum width=10mm] (plant) {PREPAR3D};

% Outputs from plant
\node[right=5mm of plant.north east, anchor=west] (bout) {$\theta$};
\node[right=5mm of plant.south east, anchor=west] (pout) {$q$};
\node[right=11mm of plant.south east, anchor=west] (hout) {$h$};

% Ka block under plant
\node[block, below=10mm of sat, minimum width=10mm] (ka) {$K_q$};
\node[block, below=30mm of PID, minimum width=10mm] (Kw) {$K_w$};
\node[sum, below=10mm of tetasat, minimum width=10mm] (sum4) {};


% Draw connections (forward path)
\draw[line] (hcom) -- (sum3) {};
\draw[line] (sum3) -- node[above, pos=0.5] {\small $\theta_{\mathrm{sat}}$} (PID);
\draw[line] (PID) -- node[above, pos=0.5] {\small $\theta_{\mathrm{COM}}$} (tetasat);
\draw[line] ($(PID.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (tetasat) -- node[above, pos=0.5] {\small $\theta_{\mathrm{sat}}$} (sum1);
\draw[line] ($(tetasat.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (sum1) -- node[above, pos=0.5] {\small $err_1$} (lead);
\draw[line] (sum4) |- node[above, pos=0.5, xshift=6mm] {\small $err_{bk}$} (Kw);
\draw[line] (Kw) -- node[above, pos=0.5, xshift=-12mm] {\small $antiwindup$} (PID);
\draw[line] (lead) -- (sum2) node[above, pos=0.4]{\small $q_{\mathrm{com}}$};
\draw[line] (sum2) -- node[above, pos=0.45] {\small $err_2$} (lag);
\draw[line] (lag) -- node[above, pos=0.5] {\small $\delta_{e\mathrm{COM}}$} (sat);
\draw[line] (sat) -- node[above, pos=0.5] {\small $\delta_e$} (plant);

% Plant outputs to labels
\draw[line] ($(plant.north east)+(0,-2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+5.0mm)$) -- ++(20mm,0) node[right] {};

% Upper feedback: V -> sum1 negative input
\draw[line] (plant.north east) ++(15mm,-5mm) |- ($(sum3.north)+(0,30mm)$) -| (sum3.north);
\node at ($(sum3.north)+(5mm,4.5mm)$) {\small $h$};

\draw[line] (plant.north east) ++(5mm,-2.5mm) |- ($(sum1.north)+(0,15mm)$) -| (sum1.north);
\node at ($(sum1.north)+(-2.5mm,4.5mm)$) {\small $\theta$};

% Lower feedback: a -> ka -> sum2 negative input
\draw[line] (plant.south east) ++(5mm,2.5mm) |- (ka.east);
\draw[line] (ka.west) -| ($(sum2.south)+(0,-15mm)$) -- (sum2.south);
\node at ($(sum2.south)+(-2.5mm,-4.5mm)$) {\small $q$};


% Small output labels next to plant
\node[above right=-2pt and -2pt of plant.north east, anchor=west] {};
\node[below right=-2pt and -2pt of plant.south east, anchor=west] {};

% Input annotations to the sums (plus/minus)
\node at ($(sum1.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum1.center)+(0mm,3mm)$) {\small $-$};
\node at ($(sum2.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum2.center)+(0mm,-3mm)$) {\small $-$};
\node at ($(sum4.center)+(3mm,0mm)$) {\small $+$};
\node at ($(sum4.center)+(-3mm,0mm)$) {\small $-$};
\node at ($(sum3.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum3.center)+(0mm,3mm)$) {\small $-$};



\end{tikzpicture}
  }
  \caption{Schema a blocchi dell'altidude hold}
  \label{fig:altitudehold}
\end{figure}

\subsubsection{Heading Hold}

L'\emph{Heading Hold} presente in Figure~\ref{fig:headinghold} mantiene la prua del velivolo al valore desiderato generando, in un anello esterno, un angolo di rollio di 
riferimento e, in un anello interno, il comando agli alettoni che realizza tale banca. L'architettura \'{e} dunque gerarchica: 
heading (lento) $\rightarrow$ bank (pi\'{u} rapido).


Poich\'{e} l'heading \'{e} un angolo definito modulo $360^\circ$, l'errore va calcolato come l'angolo \emph{minimo} che porta dalla prua 
attuale a quella desiderata. Indichiamo con $\psi_{\text{cmd}}(t)$ la prua richiesta e con $\psi(t)$ la prua misurata. 
L'errore avvolto \'{e}
\begin{equation}
e_\psi(t) \;=\; \operatorname{wrap}_{(-180^\circ,\,180^\circ]}\!\big(\psi_{\text{cmd}}(t)-\psi(t)\big),
\end{equation}
cio\'{e} $e_\psi\in(-180^\circ,180^\circ]$. Nel codice questo avviene con diramazioni che sommano o sottraggono $360^\circ$ quando 
la differenza supera $180^\circ$.


Si applica una protezione all'inizializzazione: se il passo temporale $\Delta t$ risulta grande (ad es.\ al primo ciclo), i 
termini derivativo e integrale sono azzerati per evitare problemi numerici. In regime normale si calcolano:
\begin{equation}
\dot e_\psi(t) \;=\; \frac{e_\psi(t)-e_\psi(t-\Delta t)}{\Delta t},
\end{equation}
\begin{equation}
I_\psi(t) \;=\; I_\psi(t-\Delta t) \;+\; \frac{e_\psi(t)+e_\psi(t-\Delta t)}{2}\,\Delta t \;-\; K_{aw}\,\bigl(\phi_{\text{cmd}}
(t-\Delta t)-\phi_{\text{sat}}(t-\Delta t)\bigr),
\end{equation}
dove il termine di \emph{anti-windup} (back-calculation) scarica l'integratore quando l'angolo comandato viene saturato; nel 
codice $K_{aw}=0.001$.

L'angolo di rollio di riferimento \'{e} dato da una legge PID, qui ridotta a puro $P$:
\begin{equation}
\phi_{\text{cmd}}(t) \;=\; K_p^\psi\, e_\psi(t) \;+\; K_i^\psi\, I_\psi(t) \;+\; K_d^\psi\, \dot e_\psi(t),
\qquad
K_p^\psi = 10,\quad K_i^\psi = 0,\quad K_d^\psi = 0.
\end{equation}
Si impone poi una saturazione simmetrica in funzione del limite operativo $\phi_{\max}$ 

L'anello interno fa seguire al velivolo l'angolo di rollio di riferimento $\phi_{\text{sat}}(t)$ agendo sugli alettoni. Si definisce
\begin{equation}
e_\phi(t) \;=\; \phi_{\text{sat}}(t) - \phi(t),
\end{equation}
dove $\phi(t)$ \'{e} l'angolo. Un blocco \emph{lead} genera un roll rate desiderato combinando errore e sua derivata numerica:
\begin{equation}
\dot{\phi}_{\text{cmd}}(t) \;=\; K_{\ell}\!\left(
e_\phi(t) + \tau_d \,\frac{e_\phi(t)-e_\phi(t-\Delta t)}{\Delta t}
\right),
\qquad K_{\ell} = 400,\quad \tau_d = 0.6.
\end{equation}
Il roll rate desiderato \'{e} confrontato con il roll rate reale $p(t)$, pesato da $K_r$:
\begin{equation}
e_p(t) \;=\; \dot{\phi}_{\text{cmd}}(t) - K_r\, p(t),
\qquad K_r = 200.
\end{equation}
Il segnale $e_p(t)$ attraversa quindi un filtro \emph{lag} del primo ordine (media esponenziale) con coefficiente dipendente 
da $\Delta t$:
\begin{equation}
u(t) \;=\; \alpha\, e_p(t) + \bigl(1-\alpha\bigr)\, u(t-\Delta t),
\qquad
\alpha \;=\; \frac{\Delta t}{\Delta t + 0.7},
\end{equation}
dove $u(t)$ \'{e} il comando agli alettoni prima della limitazione. Infine si applica la saturazione ammessa da SimConnect:
\begin{equation}
u(t) \in [-16383,\; 16383].
\end{equation}

\begin{equation}
\psi_{\text{cmd}} \xrightarrow{\ e_\psi\ } \phi_{\text{cmd}} \xrightarrow{\ \text{sat}\ } \phi_{\text{sat}}
\;\;\xrightarrow{\ \text{Lead}\ } \dot{\phi}_{\text{cmd}}
\;\;\xrightarrow{\ -K_r p\ } e_p
\;\;\xrightarrow{\ \text{Lag}\ } u
\;\;\xrightarrow{\ \text{sat}\ } \text{aileron.}
\end{equation}
L'uso dell'errore bidirezzionale assicura la via pi\'{u} corta e correzioni su di essa; l'anello esterno trasforma l'errore di prua in un riferimento 
di angolo di rollio limitato limitato; l'anello interno \emph{lead-lag} garantisce inseguimento rapido e smorzato del riferimento, mentre la 
saturazione finale rende il comando compatibile con i limiti fisici.

\begin{figure}[H]
    \centering
    \vspace{-1.0cm}
    \rotatebox{90}{
    \begin{tikzpicture}[node distance=16mm]

        % Nodes

    \node(hcom) {$\psi_{\mathrm{com}}$};   
\node[sum, right=5mm of hcom, minimum width=10mm] (sum3) {};
\node[block, right=10mm of sum3, minimum width=10mm] (PID) {PID};
\node[block, right=10mm of PID, minimum width=10mm] (phisat) {SAT};
\node[sum, right=10mm of tetasat, minimum width=10mm] (sum1) {};
\node[block, right=10mm of sum1, minimum width=10mm] (lead) {LEAD};
\node[sum, right=10mm of lead, minimum width=10mm] (sum2) {};
\node[block, right=10mm of sum2, minimum width=10mm] (lag) {LAG};
\node[block, right=10mm of lag, minimum width=10mm] (sat) {SAT};
\node[block, right=10mm of sat, minimum width=10mm] (plant) {PREPAR3D};

% Outputs from plant
\node[right=5mm of plant.north east, anchor=west] (bout) {$\phi$};
\node[right=5mm of plant.south east, anchor=west] (pout) {$p$};
\node[right=11mm of plant.south east, anchor=west] (hout) {$\psi$};

% Ka block under plant
\node[block, below=10mm of sat, minimum width=10mm] (ka) {$K_p$};
\node[block, below=30mm of PID, minimum width=10mm] (Kw) {$K_w$};
\node[sum, below=10mm of tetasat, minimum width=10mm] (sum4) {};


% Draw connections (forward path)
\draw[line] (hcom) -- (sum3) {};
\draw[line] (sum3) -- node[above, pos=0.5] {\small $\phi_{\mathrm{sat}}$} (PID);
\draw[line] (PID) -- node[above, pos=0.5] {\small $\phi_{\mathrm{COM}}$} (tetasat);
\draw[line] ($(PID.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (tetasat) -- node[above, pos=0.5] {\small $\phi_{\mathrm{sat}}$} (sum1);
\draw[line] ($(tetasat.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (sum1) -- node[above, pos=0.5] {\small $err_1$} (lead);
\draw[line] (sum4) |- node[above, pos=0.5, xshift=6mm] {\small $err_{bk}$} (Kw);
\draw[line] (Kw) -- node[above, pos=0.5, xshift=-12mm] {\small $antiwindup$} (PID);
\draw[line] (lead) -- (sum2) node[above, pos=0.4]{\small $p_{\mathrm{com}}$};
\draw[line] (sum2) -- node[above, pos=0.45] {\small $err_2$} (lag);
\draw[line] (lag) -- node[above, pos=0.5] {\small $\delta_{a\mathrm{COM}}$} (sat);
\draw[line] (sat) -- node[above, pos=0.5] {\small $\delta_a$} (plant);

% Plant outputs to labels
\draw[line] ($(plant.north east)+(0,-2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+5.0mm)$) -- ++(20mm,0) node[right] {};

% Upper feedback: V -> sum1 negative input
\draw[line] (plant.north east) ++(15mm,-5mm) |- ($(sum3.north)+(0,30mm)$) -| (sum3.north);
\node at ($(sum3.north)+(5mm,4.5mm)$) {\small $\psi$};

\draw[line] (plant.north east) ++(5mm,-2.5mm) |- ($(sum1.north)+(0,15mm)$) -| (sum1.north);
\node at ($(sum1.north)+(-2.5mm,4.5mm)$) {\small $\phi$};

% Lower feedback: a -> ka -> sum2 negative input
\draw[line] (plant.south east) ++(5mm,2.5mm) |- (ka.east);
\draw[line] (ka.west) -| ($(sum2.south)+(0,-15mm)$) -- (sum2.south);
\node at ($(sum2.south)+(-2.5mm,-4.5mm)$) {\small $p$};


% Small output labels next to plant
\node[above right=-2pt and -2pt of plant.north east, anchor=west] {};
\node[below right=-2pt and -2pt of plant.south east, anchor=west] {};

% Input annotations to the sums (plus/minus)
\node at ($(sum1.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum1.center)+(0mm,3mm)$) {\small $-$};
\node at ($(sum2.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum2.center)+(0mm,-3mm)$) {\small $-$};
\node at ($(sum4.center)+(3mm,0mm)$) {\small $+$};
\node at ($(sum4.center)+(-3mm,0mm)$) {\small $-$};
\node at ($(sum3.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum3.center)+(0mm,3mm)$) {\small $-$};



\end{tikzpicture}
  }
  \caption{Schema a blocchi dell'heading hold}
  \label{fig:headinghold}
\end{figure}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\subsubsection{Vertical Separation}

L'autopilota di \emph{Vertical Separation} presente in Figure~\ref{fig:verticalsep} mantiene una distanza verticale desiderata rispetto a un 
riferimento (ad esempio il velivolo leader), utilizzando come ingresso la separazione misurata nel sistema di riferimento locale NED 
(North-East-Down). In NED la coordinata $D$ (indice 2 del vettore) \'{e} positiva verso il basso ci\'{o} implica, per 
convenzione, che una separazione verticale positiva corrisoponde ad un drone pi\'{u} in basso. L'architettura di 
controllo \'{e} gerarchica: un \emph{anello esterno} (PID su separazione verticale) fornisce un \emph{pitch di riferimento} 
saturato, seguito da un \emph{anello interno} (pitch hold) che realizza tale riferimento comandando gli equilibratori 
tramite una catena \emph{lead-lag}.


Sia $NED = [N, E, D]^\top$ il vettore di separazione nel frame NED e sia $s_{\text{des}}$ la separazione verticale 
desiderata.
 L'errore in \emph{piedi} \'{e} costruito come
\begin{equation}
e_h(t) \;=\; -\bigl(D(t) - s_{\text{des}}\bigr)\cdot \kappa,
\qquad \kappa = 3.28084 \ \text{(ft/m)}.
\end{equation}
Il segno ``$-$'' tiene conto dell'asse $D$ positivo verso il basso: se il riferimento \'{e} pi\'{u} in basso ($D$ maggiore), 
il controllo comanda un pitch coerente con la risalita/discesa necessaria secondo la convenzione di segno adottata.

Per robustezza numerica si introduce una protezione: se il passo $\Delta t$ risulta grande (ad es.\ all'inizializzazione), 
i termini derivativo e integrativo vengono azzerati. In regime normale si hanno:
\begin{equation}
\dot e_h(t) \;=\; \frac{e_h(t)-e_h(t-\Delta t)}{\Delta t},
\end{equation}
\begin{equation}
I_h(t) \;=\; I_h(t-\Delta t) \;+\; \frac{e_h(t)+e_h(t-\Delta t)}{2}\,\Delta t \;-\; K_{aw}\,\bigl(\theta_{\text{cmd}}
(t-\Delta t)-\theta_{\text{sat}}(t-\Delta t)\bigr),
\end{equation}
dove il termine di \emph{anti-windup} (back-calculation) sottrae dall'integratore l'errore di saturazione del pitch, 
evitando accumulo quando il comando \'{e} limitato. Nel codice $K_{aw}=1$.

Il pitch desiderato \'{e} quindi dato da un PID su $e_h$:
\begin{equation}
\theta_{\text{cmd}}(t) \;=\; K_p^h\, e_h(t) \;+\; K_i^h\, I_h(t) \;+\; K_d^h\, \dot e_h(t),
\qquad
K_p^h = 0.08,\;\; K_i^h = 0.01,\;\; K_d^h = 0.09.
\end{equation}
Si applica quindi una saturazione simmetrica per rispettare il limite operativo $\theta_{\max}$ passato alla funzione:
\begin{equation}
\theta_{\text{sat}}(t) \;=\;
\begin{cases}
\;\;\;\;\;\;\; \theta_{\max}, & \text{se } \theta_{\text{cmd}}(t)>\theta_{\max}\ \text{e}\ \theta_{\text{cmd}}(t)>0,
\\\;\;\;\;\;\;\;-\theta_{\max}, & \text{se } \theta_{\text{cmd}}(t)<-\theta_{\max}\ \text{e}\ \theta_{\text{cmd}}(t)<0,\\
\;\;\;\;\;\;\; \theta_{\text{cmd}}(t), & \text{altrimenti.}
\end{cases}
\end{equation}


L'anello interno fa inseguire al velivolo il riferimento $\theta_{\text{sat}}(t)$ agendo sugli elevatori. 

Definiamo l'errore 
di pitch
\begin{equation}
e_\theta(t) \;=\; \theta_{\text{sat}}(t) - \theta(t),
\end{equation}
dove $\theta(t)$ \'{e} il pitch misurato. Un blocco \emph{lead} genera un rateo di pitch desiderato combinando errore e derivata 
numerica:
\begin{equation}
\dot{\theta}_{\text{cmd}}(t) \;=\; K_{\ell}\!\left(
e_\theta(t) + \tau_d\,\frac{e_\theta(t)-e_\theta(t-\Delta t)}{\Delta t}
\right),
\qquad K_{\ell}=9000,\ \ \tau_d=0.2.
\end{equation}
Questo rateo desiderato \'{e} confrontato con il rateo reale $q(t)$ (pitch rate), pesato da $K_q$:
\begin{equation}
e_q(t) \;=\; \dot{\theta}_{\text{cmd}}(t) - K_q\, q(t),
\qquad K_q = 4500.
\end{equation}
Il segnale $e_q(t)$ \'{e} poi filtrato con un \emph{lag} (media esponenziale) a coefficiente dipendente da $\Delta t$:
\begin{equation}
u(t) \;=\; \alpha\, e_q(t) + (1-\alpha)\,u(t-\Delta t),
\qquad
\alpha \;=\; \frac{\Delta t}{\Delta t + 0.8},
\end{equation}
dove $u(t)$ rappresenta il comando grezzo agli elevatori. L'uscita \'{e} infine limitata secondo i vincoli di SimConnect:
\begin{equation}
u(t) \in [-16383,\; 16383].
\end{equation}


\begin{equation}
(N,E,D),\ s_{\text{des}}
\ \longrightarrow\ e_h \xrightarrow{\ \text{PID+AW}\ } \theta_{\text{sat}}
\ \xrightarrow{\ \text{Lead}\ } \dot{\theta}_{\text{cmd}}
\ \xrightarrow{\ -K_q q\ } e_q
\ \xrightarrow{\ \text{Lag}\ } u
\ \xrightarrow{\ \text{sat}\ } \text{elevator.}
\end{equation}
La conversione metrica $\kappa$ assicura coerenza delle unit\'{a}, l'anti-windup impedisce l'accumulo dell'integratore quando il 
pitch \'{e} saturato, e la catena \emph{lead--lag} garantisce un inseguimento del riferimento rapido ma smorzato.

\begin{figure}[H]
    \centering
    \vspace{-1.0cm}
    \rotatebox{90}{
    \begin{tikzpicture}[node distance=16mm]

        % Nodes
    
    \node(hcom) {$s_{\mathrm{des}}$};   
\node[sum, right=5mm of hcom, minimum width=10mm] (sum3) {};
\node[block, right=10mm of sum3, minimum width=10mm] (PID) {PID};
\node[block, right=10mm of PID, minimum width=10mm] (phisat) {SAT};
\node[sum, right=10mm of tetasat, minimum width=10mm] (sum1) {};
\node[block, right=10mm of sum1, minimum width=10mm] (lead) {LEAD};
\node[sum, right=10mm of lead, minimum width=10mm] (sum2) {};
\node[block, right=10mm of sum2, minimum width=10mm] (lag) {LAG};
\node[block, right=10mm of lag, minimum width=10mm] (sat) {SAT};
\node[block, right=10mm of sat, minimum width=10mm] (plant) {PREPAR3D};

% Outputs from plant
\node[right=5mm of plant.north east, anchor=west] (bout) {$\theta$};
\node[right=5mm of plant.south east, anchor=west] (pout) {$q$};
\node[right=11mm of plant.south east, anchor=west] (hout) {$D$};

% Ka block under plant
\node[block, below=10mm of sat, minimum width=10mm] (ka) {$K_q$};
\node[block, below=30mm of PID, minimum width=10mm] (Kw) {$K_w$};
\node[sum, below=10mm of tetasat, minimum width=10mm] (sum4) {};


% Draw connections (forward path)
\draw[line] (hcom) -- (sum3) {};
\draw[line] (sum3) -- node[above, pos=0.5] {\small $s_{\mathrm{sat}}$} (PID);
\draw[line] (PID) -- node[above, pos=0.5] {\small $\theta_{\mathrm{COM}}$} (tetasat);
\draw[line] ($(PID.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (tetasat) -- node[above, pos=0.5] {\small $\theta_{\mathrm{sat}}$} (sum1);
\draw[line] ($(tetasat.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (sum1) -- node[above, pos=0.5] {\small $err_1$} (lead);
\draw[line] (sum4) |- node[above, pos=0.5, xshift=6mm] {\small $err_{bk}$} (Kw);
\draw[line] (Kw) -- node[above, pos=0.5, xshift=-12mm] {\small $antiwindup$} (PID);
\draw[line] (lead) -- (sum2) node[above, pos=0.4]{\small $q_{\mathrm{com}}$};
\draw[line] (sum2) -- node[above, pos=0.45] {\small $err_2$} (lag);
\draw[line] (lag) -- node[above, pos=0.5] {\small $\delta_{e\mathrm{COM}}$} (sat);
\draw[line] (sat) -- node[above, pos=0.5] {\small $\delta_e$} (plant);

% Plant outputs to labels
\draw[line] ($(plant.north east)+(0,-2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+5.0mm)$) -- ++(20mm,0) node[right] {};

% Upper feedback: V -> sum1 negative input
\draw[line] (plant.north east) ++(15mm,-5mm) |- ($(sum3.north)+(0,30mm)$) -| (sum3.north);
\node at ($(sum3.north)+(5mm,4.5mm)$) {\small $D$};

\draw[line] (plant.north east) ++(5mm,-2.5mm) |- ($(sum1.north)+(0,15mm)$) -| (sum1.north);
\node at ($(sum1.north)+(-2.5mm,4.5mm)$) {\small $\theta$};

% Lower feedback: a -> ka -> sum2 negative input
\draw[line] (plant.south east) ++(5mm,2.5mm) |- (ka.east);
\draw[line] (ka.west) -| ($(sum2.south)+(0,-15mm)$) -- (sum2.south);
\node at ($(sum2.south)+(-2.5mm,-4.5mm)$) {\small $q$};


% Small output labels next to plant
\node[above right=-2pt and -2pt of plant.north east, anchor=west] {};
\node[below right=-2pt and -2pt of plant.south east, anchor=west] {};

% Input annotations to the sums (plus/minus)
\node at ($(sum1.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum1.center)+(0mm,3mm)$) {\small $-$};
\node at ($(sum2.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum2.center)+(0mm,-3mm)$) {\small $-$};
\node at ($(sum4.center)+(3mm,0mm)$) {\small $+$};
\node at ($(sum4.center)+(-3mm,0mm)$) {\small $-$};
\node at ($(sum3.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum3.center)+(0mm,3mm)$) {\small $-$};

\end{tikzpicture}
  }
  \caption{Schema a blocchi Vertical Separation Autopilot}
  \label{fig:verticalsep}

\end{figure}





%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\subsubsection{Lateral Separation}


L'autopilota di \emph{Lateral Separation} presente in Figure~\ref{fig:lateralsep} mantiene una distanza prefissata lungo l'asse Est del frame NED (North-East-Down). 
Indichiamo con
\begin{equation}
\text{NED}(t) = \begin{bmatrix} N(t) \\ E(t) \\ D(t) \end{bmatrix}
\end{equation}
il vettore di separazione relativo (leader $\rightarrow$ ownship) e con $s_{\text{lat}}$ la separazione laterale desiderata 
lungo l'asse Est. L'architettura del controllore \'{e} gerarchica: un \emph{anello esterno} trasforma l'errore laterale in una 
\emph{banca di riferimento}, poi un \emph{anello interno} di \emph{bank hold} realizza tale riferimento comandando gli alettoni 
attraverso una catena \emph{lead--lag}.

L'errore laterale \'{e} definito (coerentemente al codice) come
\begin{equation}
e_y(t) \;=\; -\bigl(s_{\text{lat}} - E(t)\bigr) \;=\; E(t) - s_{\text{lat}}.
\end{equation}
Questa convenzione di segno \'{e} scelta per allinearsi alle direzioni positive interne; il \emph{segno} del guadagno 
proporzionale (e degli altri termini) determina la direzione della correzione.

Per robustezza numerica si applica una protezione all'inizializzazione: se il passo di campionamento $\Delta t$ risulta grande 
(ad es.\ al primo ciclo), i termini derivativo e integrale sono azzerati. In regime normale, si calcolano:
\begin{equation}
\dot e_y(t) \;=\; \frac{e_y(t)-e_y(t-\Delta t)}{\Delta t},
\end{equation}
\begin{equation}
I_y(t) \;=\; I_y(t-\Delta t) \;+\; \frac{e_y(t)+e_y(t-\Delta t)}{2}\,\Delta t \;-\; K_{aw}\,\bigl(\phi_{\text{cmd}}(t-\Delta t)
-\phi_{\text{sat}}(t-\Delta t)\bigr),
\end{equation}
dove il termine di \emph{anti-windup} realizza una back-calculation sull'integratore quando la banca comandata viene 
saturata; nel codice $K_{aw}=0.001$.

La banca di riferimento \'{e} quindi una legge PID (qui con guadagni esplicitati):
\begin{equation}
\phi_{\text{cmd}}(t) \;=\; K_p^y\, e_y(t) \;+\; K_i^y\, I_y(t) \;+\; K_d^y\, \dot e_y(t),
\qquad
K_p^y = 1,\;\; K_i^y = 0.001,\;\; K_d^y = 3.6.
\end{equation}
Per rispettare i limiti operativi si impone la saturazione:
\begin{equation}
\phi_{\text{sat}}(t) \;=\;
\begin{cases}
\;\;\;\;\;\;\; \phi_{\max}, & \text{se } \phi_{\text{cmd}}(t)>\phi_{\max}\ \text{e}\ \phi_{\text{cmd}}(t)>0,\\
\;\;\;\;\;\;\;
-\phi_{\max}, & \text{se } \phi_{\text{cmd}}(t)<-\phi_{\max}\ \text{e}\ \phi_{\text{cmd}}(t)<0,\\
\;\;\;\;\;\;\; \phi_{\text{cmd}}(t), & \text{altrimenti.}
\end{cases}
\end{equation}


L'anello interno fa seguire al velivolo la banca di riferimento $\phi_{\text{sat}}(t)$ agendo sugli alettoni. Si definisce 
l'errore di banca
\begin{equation}
e_\phi(t) \;=\; \phi_{\text{sat}}(t) - \phi(t),
\end{equation}
dove $\phi(t)$ \'{e} la banca misurata. Un blocco \emph{lead} genera un roll rate desiderato combinando errore e derivata numerica:
\begin{equation}
\dot{\phi}_{\text{cmd}}(t) \;=\; K_{\ell}\!\left(
e_\phi(t) + \tau_d \,\frac{e_\phi(t)-e_\phi(t-\Delta t)}{\Delta t}
\right),
\qquad K_{\ell}=400,\ \ \tau_d=0.6.
\end{equation}
Il roll rate desiderato \'{e} confrontato con il roll rate reale $p(t)$, pesato da $K_r$:
\begin{equation}
e_p(t) \;=\; \dot{\phi}_{\text{cmd}}(t) - K_r\, p(t),
\qquad K_r = 200.
\end{equation}
Il segnale $e_p(t)$ attraversa quindi un filtro \emph{lag} del primo ordine (media esponenziale) con coefficiente 
dipendente da $\Delta t$:
\begin{equation}
u(t) \;=\; \alpha\, e_p(t) + \bigl(1-\alpha\bigr)\, u(t-\Delta t),
\qquad
\alpha \;=\; \frac{\Delta t}{\Delta t + 0.7},
\end{equation}
dove $u(t)$ \'{e} il comando agli alettoni prima della limitazione. Infine si impone la saturazione compatibile con SimConnect:
\begin{equation}
u(t) \in [-16383,\; 16383].
\end{equation}


\begin{equation}
E,\ s_{\text{lat}}
\ \longrightarrow\ e_y \xrightarrow{\ \text{PID+AW}\ } \phi_{\text{sat}}
\ \xrightarrow{\ \text{Lead}\ } \dot{\phi}_{\text{cmd}}
\ \xrightarrow{\ -K_r p\ } e_p
\ \xrightarrow{\ \text{Lag}\ } u
\ \xrightarrow{\ \text{sat}\ } \text{aileron.}
\end{equation}
L'anello esterno mappa l'errore laterale in un riferimento di banca limitato; l'anello interno \emph{lead-lag} assicura 
inseguimento rapido e smorzato del riferimento. L'anti-windup previene l'accumulo dell'integratore quando la banca \'{e} satura.

\begin{figure}[H]
    \centering
    \vspace{-1.0cm}
    \rotatebox{90}{
    \begin{tikzpicture}[node distance=16mm]

        % Nodes
    
    \node(hcom) {$s_{\mathrm{lat}}$};   
\node[sum, right=5mm of hcom, minimum width=10mm] (sum3) {};
\node[block, right=10mm of sum3, minimum width=10mm] (PID) {PID};
\node[block, right=10mm of PID, minimum width=10mm] (phisat) {SAT};
\node[sum, right=10mm of tetasat, minimum width=10mm] (sum1) {};
\node[block, right=10mm of sum1, minimum width=10mm] (lead) {LEAD};
\node[sum, right=10mm of lead, minimum width=10mm] (sum2) {};
\node[block, right=10mm of sum2, minimum width=10mm] (lag) {LAG};
\node[block, right=10mm of lag, minimum width=10mm] (sat) {SAT};
\node[block, right=10mm of sat, minimum width=10mm] (plant) {PREPAR3D};

% Outputs from plant
\node[right=5mm of plant.north east, anchor=west] (bout) {$\theta$};
\node[right=5mm of plant.south east, anchor=west] (pout) {$p$};
\node[right=11mm of plant.south east, anchor=west] (hout) {$E$};

% Ka block under plant
\node[block, below=10mm of sat, minimum width=10mm] (ka) {$K_p$};
\node[block, below=30mm of PID, minimum width=10mm] (Kw) {$K_w$};
\node[sum, below=10mm of tetasat, minimum width=10mm] (sum4) {};


% Draw connections (forward path)
\draw[line] (hcom) -- (sum3) {};
\draw[line] (sum3) -- node[above, pos=0.5] {\small $s_{\mathrm{sat}}$} (PID);
\draw[line] (PID) -- node[above, pos=0.5] {\small $\phi_{\mathrm{COM}}$} (tetasat);
\draw[line] ($(PID.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (tetasat) -- node[above, pos=0.5] {\small $\phi_{\mathrm{sat}}$} (sum1);
\draw[line] ($(tetasat.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (sum1) -- node[above, pos=0.5] {\small $err_1$} (lead);
\draw[line] (sum4) |- node[above, pos=0.5, xshift=6mm] {\small $err_{bk}$} (Kw);
\draw[line] (Kw) -- node[above, pos=0.5, xshift=-12mm] {\small $antiwindup$} (PID);
\draw[line] (lead) -- (sum2) node[above, pos=0.4]{\small $p_{\mathrm{com}}$};
\draw[line] (sum2) -- node[above, pos=0.45] {\small $err_2$} (lag);
\draw[line] (lag) -- node[above, pos=0.5] {\small $\delta_{a\mathrm{COM}}$} (sat);
\draw[line] (sat) -- node[above, pos=0.5] {\small $\delta_a$} (plant);

% Plant outputs to labels
\draw[line] ($(plant.north east)+(0,-2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+5.0mm)$) -- ++(20mm,0) node[right] {};

% Upper feedback: V -> sum1 negative input
\draw[line] (plant.north east) ++(15mm,-5mm) |- ($(sum3.north)+(0,30mm)$) -| (sum3.north);
\node at ($(sum3.north)+(5mm,4.5mm)$) {\small $E$};

\draw[line] (plant.north east) ++(5mm,-2.5mm) |- ($(sum1.north)+(0,15mm)$) -| (sum1.north);
\node at ($(sum1.north)+(-2.5mm,4.5mm)$) {\small $\phi$};

% Lower feedback: a -> ka -> sum2 negative input
\draw[line] (plant.south east) ++(5mm,2.5mm) |- (ka.east);
\draw[line] (ka.west) -| ($(sum2.south)+(0,-15mm)$) -- (sum2.south);
\node at ($(sum2.south)+(-2.5mm,-4.5mm)$) {\small $p$};


% Small output labels next to plant
\node[above right=-2pt and -2pt of plant.north east, anchor=west] {};
\node[below right=-2pt and -2pt of plant.south east, anchor=west] {};

% Input annotations to the sums (plus/minus)
\node at ($(sum1.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum1.center)+(0mm,3mm)$) {\small $-$};
\node at ($(sum2.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum2.center)+(0mm,-3mm)$) {\small $-$};
\node at ($(sum4.center)+(3mm,0mm)$) {\small $+$};
\node at ($(sum4.center)+(-3mm,0mm)$) {\small $-$};
\node at ($(sum3.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum3.center)+(0mm,3mm)$) {\small $-$};

\end{tikzpicture}
  }
  \caption{Schema a blocchi del lateral separation autopilot}
  \label{fig:lateralsep}

\end{figure}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\subsubsection{Forward Separation}


Il controllore di \emph{Forward Separation} presente in Figure~\ref{fig:verticalsep} mantiene una distanza prefissata lungo l'asse Nord del frame NED (North--East--Down),
 cio\'{e} lungo la direzione "avanti/indietro" rispetto al riferimento. Indichiamo con
\begin{equation}
\text{NED}(t) =
\begin{bmatrix}
N(t)\\ E(t)\\ D(t)
\end{bmatrix}
\end{equation}
il vettore di separazione relativo (leader $\rightarrow$ ownship) e con $s_{\text{fwd}}$ la separazione longitudinale 
desiderata sull'asse $N$. L'architettura \'{e} gerarchica: un \emph{anello esterno} converte l'errore di separazione in 
una \emph{velocit\'{a} di riferimento} $V_{\text{cmd}}$, mentre un \emph{anello interno} di \emph{autothrottle} realizza 
tale velocit\'{a} agendo sulla manetta.


Coerentemente al codice, l'errore longitudinale \'{e}
\begin{equation}
e_x(t) \;=\; s_{\text{fwd}} - N(t).
\end{equation}
Per robustezza numerica si applica una protezione all'inizializzazione: se il passo temporale $\Delta t$ \'{e} 
grande (ad es.\ al primo ciclo), i termini derivativo e integrale sono azzerati. In regime normale si calcolano:
\begin{equation}
\dot e_x(t) \;=\; \frac{e_x(t)-e_x(t-\Delta t)}{\Delta t},
\end{equation}
\begin{equation}
I_x(t) \;=\; I_x(t-\Delta t) \;+\; \frac{e_x(t)+e_x(t-\Delta t)}{2}\,\Delta t
\;-\; K_{aw}\,\bigl(V_{\text{cmd}}(t-\Delta t) - V_{\text{sat}}(t-\Delta t)\bigr),
\end{equation}
dove il termine di \emph{anti-windup} (back-calculation) scarica l'integratore quando la velocit\'{a} comandata viene saturata; 
nel codice $K_{aw}=0.5$.

La velocit\'{a} di riferimento \'{e} quindi una legge PID su $e_x$:
\begin{equation}
V_{\text{cmd}}(t) \;=\; K_p^x\, e_x(t) \;+\; K_i^x\, I_x(t) \;+\; K_d^x\, \dot e_x(t),
\qquad
K_p^x = 1,\;\; K_i^x = 0.03,\;\; K_d^x = 2.
\end{equation}
Per rispettare i vincoli operativi si impone la saturazione:
\begin{equation}
V_{\text{sat}}(t) \;=\;
\begin{cases}
1060, & \text{se } V_{\text{cmd}}(t) > 1060,\\
600, & \text{se } V_{\text{cmd}}(t) < 600,\\
V_{\text{cmd}}(t), & \text{altrimenti.}
\end{cases}
\end{equation}
Il valore $V_{\text{sat}}$ diventa il riferimento per l'anello interno.


Definiamo l'errore di velocit\'{a} come
\begin{equation}
e_V(t) \;=\; V_{\text{sat}}(t) - V(t),
\end{equation}
dove $V(t)$ \'{e} la velocit\'{a} misurata. Lo stadio \emph{lead} dell'autothrottle costruisce un comando "grezzo" di 
manetta combinando $e_V$ e la sua derivata numerica:
\begin{equation}
u_{\text{cmd}}(t) \;=\; K_{\ell}\!\left(
e_V(t) + \tau_d \,\frac{e_V(t)-e_V(t-\Delta t)}{\Delta t}
\right),
\qquad
K_{\ell} = 3000,\quad \tau_d = 0.27.
\end{equation}
Per smorzare l'azione in funzione della dinamica propulsiva, $u_{\text{cmd}}$ \'{e} corretto con una retroazione 
sull'accelerazione longitudinale $a(t)$:
\begin{equation}
e_u(t) \;=\; u_{\text{cmd}}(t) - K_a\, a(t),
\qquad K_a = 1500.
\end{equation}
Lo stadio \emph{lag} \'{e} implementato come media esponenziale
\begin{equation}
u(t) \;=\; \alpha \, e_u(t) + \bigl(1-\alpha\bigr)\, u(t-\Delta t),
\qquad
\alpha \;=\; \frac{\Delta t}{\Delta t + 0},
\end{equation}
che, con i parametri correnti, d\'{a} $\alpha=1$ (per ogni $\Delta t>0$), quindi $u(t)\equiv e_u(t)$: il lag \'{e} degenere e non introduce filtraggio. Infine si impone la saturazione della manetta:
\begin{equation}
u(t) \in \bigl[\,0.3\cdot 16383,\; 0.9\cdot 16383\,\bigr].
\end{equation}


\begin{equation}
N,\ s_{\text{fwd}}
\ \longrightarrow\ e_x \xrightarrow{\ \text{PID+AW}\ } V_{\text{sat}}
\ \xrightarrow{\ \text{Lead}\ } u_{\text{cmd}}
\ \xrightarrow{\ -K_a a\ } e_u
\ \xrightarrow{\ \text{Lag (}\alpha=1\text{)}\ } u
\ \xrightarrow{\ \text{sat}\ } \text{throttle.}
\end{equation}
L'anello esterno regola la distanza lungo l'asse Nord traducendola in una velocit\'{a} ammissibile; l'anello interno \emph{lead--(lag)} regola la manetta per inseguire la velocit\'{a}, smorzando l'azione in base all'accelerazione gi\'{a} presente. La scelta $\alpha=1$ rende l'autothrottle molto reattivo; qualora si desiderasse maggiore smussatura, basterebbe adottare una costante positiva al denominatore (es.\ $\alpha=\frac{\Delta t}{\Delta t+\tau_{\text{lag}}}$ con $\tau_{\text{lag}}>0$).

\begin{figure}[H]
    \centering
    \vspace{-1.0cm}
    \rotatebox{90}{
    \begin{tikzpicture}[node distance=16mm]

        % Nodes
    
    \node(hcom) {$s_{\mathrm{fwd}}$};   
\node[sum, right=5mm of hcom, minimum width=10mm] (sum3) {};
\node[block, right=10mm of sum3, minimum width=10mm] (PID) {PID};
\node[block, right=10mm of PID, minimum width=10mm] (phisat) {SAT};
\node[sum, right=10mm of tetasat, minimum width=10mm] (sum1) {};
\node[block, right=10mm of sum1, minimum width=10mm] (lead) {LEAD};
\node[sum, right=10mm of lead, minimum width=10mm] (sum2) {};
\node[block, right=10mm of sum2, minimum width=10mm] (lag) {LAG};
\node[block, right=10mm of lag, minimum width=10mm] (sat) {SAT};
\node[block, right=10mm of sat, minimum width=10mm] (plant) {PREPAR3D};

% Outputs from plant
\node[right=5mm of plant.north east, anchor=west] (bout) {$V$};
\node[right=5mm of plant.south east, anchor=west] (pout) {$a$};
\node[right=11mm of plant.south east, anchor=west] (hout) {$N$};

% Ka block under plant
\node[block, below=10mm of sat, minimum width=10mm] (ka) {$K_a$};
\node[block, below=30mm of PID, minimum width=10mm] (Kw) {$K_w$};
\node[sum, below=10mm of tetasat, minimum width=10mm] (sum4) {};


% Draw connections (forward path)
\draw[line] (hcom) -- (sum3) {};
\draw[line] (sum3) -- node[above, pos=0.5] {\small $s_{\mathrm{sat}}$} (PID);
\draw[line] (PID) -- node[above, pos=0.5] {\small $V_{\mathrm{COM}}$} (tetasat);
\draw[line] ($(PID.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (tetasat) -- node[above, pos=0.5] {\small $V_{\mathrm{sat}}$} (sum1);
\draw[line] ($(tetasat.south east)+(+5mm,+5mm)$) |- node[above, pos=0.5] {} (sum4);
\draw[line] (sum1) -- node[above, pos=0.5] {\small $err_1$} (lead);
\draw[line] (sum4) |- node[above, pos=0.5, xshift=6mm] {\small $err_{bk}$} (Kw);
\draw[line] (Kw) -- node[above, pos=0.5, xshift=-12mm] {\small $antiwindup$} (PID);
\draw[line] (lead) -- (sum2) node[above, pos=0.4]{\small $a_{\mathrm{com}}$};
\draw[line] (sum2) -- node[above, pos=0.45] {\small $err_2$} (lag);
\draw[line] (lag) -- node[above, pos=0.5] {\small $\delta_{t_\mathrm{COM}}$} (sat);
\draw[line] (sat) -- node[above, pos=0.5] {\small $\delta_t$} (plant);

% Plant outputs to labels
\draw[line] ($(plant.north east)+(0,-2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+2.5mm)$) -- ++(10mm,0) node[right] {};
\draw[line] ($(plant.south east)+(0,+5.0mm)$) -- ++(20mm,0) node[right] {};

% Upper feedback: V -> sum1 negative input
\draw[line] (plant.north east) ++(15mm,-5mm) |- ($(sum3.north)+(0,30mm)$) -| (sum3.north);
\node at ($(sum3.north)+(5mm,4.5mm)$) {\small $N$};

\draw[line] (plant.north east) ++(5mm,-2.5mm) |- ($(sum1.north)+(0,15mm)$) -| (sum1.north);
\node at ($(sum1.north)+(-2.5mm,4.5mm)$) {\small $V$};

% Lower feedback: a -> ka -> sum2 negative input
\draw[line] (plant.south east) ++(5mm,2.5mm) |- (ka.east);
\draw[line] (ka.west) -| ($(sum2.south)+(0,-15mm)$) -- (sum2.south);
\node at ($(sum2.south)+(-2.5mm,-4.5mm)$) {\small $a$};


% Small output labels next to plant
\node[above right=-2pt and -2pt of plant.north east, anchor=west] {};
\node[below right=-2pt and -2pt of plant.south east, anchor=west] {};

% Input annotations to the sums (plus/minus)
\node at ($(sum1.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum1.center)+(0mm,3mm)$) {\small $-$};
\node at ($(sum2.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum2.center)+(0mm,-3mm)$) {\small $-$};
\node at ($(sum4.center)+(3mm,0mm)$) {\small $+$};
\node at ($(sum4.center)+(-3mm,0mm)$) {\small $-$};
\node at ($(sum3.center)+(-3mm,0mm)$) {\small $+$};
\node at ($(sum3.center)+(0mm,3mm)$) {\small $-$};

\end{tikzpicture}
  }
  \caption{Schema a blocchi del forward separation autopilot}
  \label{fig:forwardsep}

\end{figure}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Simulazioni}


Le simulazioni sono state condotte utilizzando l'ambiente \textit{Prepar3D v6} precedentemete descritto e impiegando come piattaforma di volo il velivolo 
\textit{Lockheed Martin F-35A Lightning II}. L'obiettivo delle simulatizoni \'{e} quello di analizzare e confrontare il comportamento dinamico del 
velivolo in due condizioni distinte: una condizione non perturbata, priva cio\'{e} di vento e turbolenze, e una condizione perturbata, 
caratterizzata dalla presenza di vento trasversale, raffiche, turbolenza e wind shear a bassa quota in modo da testare la robustezza 
dei controlli progettati. 

In entrambi i casi si \'{e} scelto di mantenere costanti alcuni parametri generali al fine di garantire coerenza e comparabilit\'{a} 
tra gli scenari. Le operazioni si sono svolte presso l'aeroporto Ronald Reagan Washington National (KDCA), utilizzando la pista 
1 come punto di partenza. L'orario simulato \'{e} stato fissato alle ore 12:00 locali in un contesto stagionale estivo. 
La modalit\'{a} di simulazione selezionata \'{e} stata quella multiplayer, con due istanze connesse in rete locale. Il velivolo 
host, denominato \textit{C2 Plane}, ha avuto il compito di gestire la sessione, mentre il velivolo client, denominato 
\textit{DRONE}, ha partecipato in parallelo riproducendo le medesime condizioni. 

Entrambi i velivoli hanno utilizzato la stessa configurazione iniziale e lo stesso modello aerodinamico di F-35A. Il 
collegamento multiplayer \'{e} stato configurato con un'elevata frequenza di aggiornamento pari a 0.05 secondi, riducendo 
cos\'{i} eventuali disallineamenti temporali o spaziali. 

\subsubsection{Condizioni non perturbate}

Nel primo scenario si \'{e} optato per una configurazione priva di disturbi meteorologici. Il cielo \'{e} stato impostato sereno, 
con vento calmo e totale assenza di turbolenze e shear. Questa condizione ha permesso di osservare il comportamento del 
velivolo in una situazione di riferimento nominale. 

Durante il rullaggio e il decollo l'F-35A ha mostrato un'ottima stabilit\'{a} dinamica. L'allineamento con l'asse pista \'{e} stato 
mantenuto senza richiedere correzioni significative e la fase di virata si \'{e} svolta in maniera fluida e lineare. La salita 
iniziale \'{e} stata caratterizzata da un assetto costante e da risposte ai comandi dell autopilota precise e prevedibili. L'assenza 
di disturbi ha consentito di effettuare un volo pulito e regolare, che pu\'{o} essere considerato come la baseline per il confronto 
con le condizioni perturbate. 

Dal punto di vista della simulazione in rete, entrambi i velivoli, host e client, hanno mostrato una perfetta sincronizzazione. 
Le posizioni, i movimenti e l'evoluzione temporale delle manovre coincidevano, confermando la validit\'{a} del collegamento 
multiplayer e la robustezza della piattaforma utilizzata. 

In conclusione, lo scenario non perturbato ha permesso di verificare la stabilit\'{a} intrinseca del modello aerodinamico del 
simulatore e degli autopiloti e di disporre di un caso di riferimento utile per analizzare successivamente le differenze introdotte dalle 
perturbazioni atmosferiche. 

\subsubsection{Condizioni perturbate}

Nel secondo scenario sono state introdotte condizioni atmosferiche avverse con l'obiettivo di valutare la risposta del 
velivolo e la robustezza degli autopiloti. Il vento prevalente proveniva da ovest, con direzione 270 gradi, 
ed era caratterizzato da raffiche variabili tra zero e trenta nodi. \'{e} stata inoltre attivata una turbolenza di intensit\'{a} 
moderata e un wind shear a bassa quota, localizzato a circa cinquecento piedi dal suolo. 

Fin dalla fase di rullaggio si \'{e} osservata una chiara influenza del vento trasversale. L'F-35A tendeva a deviare 
lateralmente rispetto all'asse pista, richiedendo continue correzioni al timone per mantenere l'allineamento. Durante 
la viarta e la salita iniziale le raffiche improvvise hanno generato oscillazioni sia in rollio sia in beccheggio, 
complicando la stabilit\'{a} dell'assetto. La turbolenza ha reso pi\'{u} difficoltoso il mantenimento di una traiettoria regolare, 
imponendo agli autopiloti di effettuare micro-correzioni costanti per contrastare le perturbazioni. 

L'ingresso nella zona di wind shear ha rappresentato la fase pi\'{u} critica della simulazione. La velocit\'{a} indicata ha 
subito variazioni repentine, riproducendo il rischio di una perdita momentanea di portanza. Questa condizione \'{e} notoriamente 
pericolosa nelle operazioni reali, soprattutto nelle fasi di decollo e atterraggio, e la simulazione ne ha mostrato con 
efficacia la complessit\'{a} gestionale. 

Sul piano del multiplayer, anche in presenza di perturbazioni, entrambi i velivoli hanno condiviso le stesse condizioni 
atmosferiche. Le variazioni dovute a vento, turbolenza e shear sono state percepite in maniera coerente da host e client, 
dimostrando la consistenza del modello meteorologico distribuito. 

In sintesi, lo scenario perturbato ha evidenziato la maggiore complessit\'{a} operativa del volo in condizioni atmosferiche 
avverse. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\section{Risultati}

In questa sezione vengono discussi i risultati ottenuti dai diversi controllori  
implementati per il velivolo principale e gregario nella configurazione \textit{leader follower}.
Ogni autopilota \'{e} stato valutato mediante simulazioni dedicate e i risultati sono riportati 
sotto forma di grafici temporali e spaziali. 
La descrizione include un'analisi qualitativa del comportamento dinamico 
e una quantificazione numerica delle principali metriche prestazionali: 
tempo di salita ($t_r$), tempo di assestamento ($t_s$), sovraelongazione percentuale 
($\%OS$), errore a regime ($e_\infty$) e valori massimi dei comandi/attuatori.

\subsubsection{Caso non perturbato}
\begin{figure}[ht]
  \centering
  \includegraphics[width=\linewidth]{Figures/R1Ptich.png}
  \caption{Pitch Hold.}
  \label{fig:PitchN}
\end{figure}
Il controllore \textit{Pitch Hold} (Figure~\ref{fig:PitchN}) ha il compito di stabilizzare l'assetto longitudinale, 
agendo sull'equilibratore. 
La struttura \textit{lead--lag} consente di convertire l'errore di pitch in un rateo desiderato, 
anticipando i cambiamenti rapidi (componente lead) e filtrando le alte frequenze (componente lag). 
Il grafico mostra un inseguimento rapido e stabile, con transitori puliti e assenza di oscillazioni persistenti. 

\textbf{Risultati numerici:} $t_r \approx 2.5$--$3.0$ s, 
$t_s \approx 4$--$5$ s, $\%OS \approx 5$--$8\%$, 
$e_\infty < 0.5^\circ$, deflessione massima $\delta_e \approx 20^\circ$, 
accelerazione massima $a_x \approx 5$--$6$ g. 

\newpage
\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/R2bank.png}
  \caption{Bank Hold.}
  \label{fig:BankN}
\end{figure}
Il controllore \textit{Bank Hold} (Figure~\ref{fig:BankN}) regola l'angolo di rollio tramite gli alettoni, anch'esso con struttura 
\textit{lead--lag}. La risposta mostra un inseguimento regolare, con piccoli picchi nel comando di rollio 
dovuti all'azione derivativa, ma senza instabilit\'{a}. 

\textbf{Risultati numerici:} $t_r \approx 2$ s, 
$t_s \approx 3$--$4$ s, $\%OS \approx 3$--$5\%$, 
$e_\infty < 0.3^\circ$, deflessione massima $\delta_a \approx 2$--$3^\circ$. 

\newpage
\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/R3throttle.png}
  \caption{Autothrottle.}
  \label{fig:AutothrN}
\end{figure}

Il controllore \textit{Autothrottle} (Figure~\ref{fig:AutothrN}) regola la velocit\'{a} longitudinale agendo sulla manetta. 
La dinamica evidenzia tempi pi\'{u} lunghi rispetto ai canali d'assetto, riflettendo l'inerzia propulsiva. 
Il feedback sull'accelerazione longitudinale riduce i comandi quando il velivolo \'{e} gi\'{a} in accelerazione o decelerazione, 
migliorando la stabilit\'{a} complessiva. 

\textbf{Risultati numerici:} per uno step 800$\to$900 ft/s, 
$t_r \approx 8$--$10$ s, $t_s \approx 12$--$15$ s, 
$\%OS \approx 0$--$2\%$, $e_\infty < 2$ ft/s; 
variazione throttle 40--90\%, stabilizzazione al 55\%. 
In decelerazione, $t_s \approx 25$--$30$ s. 

\newpage
\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/R5altitude.png}
  \caption{Altitude Hold.}
  \label{fig:AltitudeN}
\end{figure}

L'autopilota \textit{Altitude Hold} (Figure~\ref{fig:AltitudeN}) \'{e} organizzato in due anelli: 
PID esterno per la quota e controllore interno di pitch. 
L'errore iniziale di quota viene compensato rapidamente, con picchi contenuti sugli elevatori. 
La struttura a cascata assicura robustezza anche in presenza di perturbazioni. 

\textbf{Risultati numerici:} per uno step 6000$\to$6800 ft, 
$t_r \approx 8$--$10$ s, $t_s \approx 12$--$14$ s, 
$\%OS \approx 3$--$5\%$, $e_\infty < 20$ ft, 
pitch massimo $|\theta| \approx 15^\circ$, 
$\delta_e \approx 20^\circ$, $a_x \approx 4$--$5$ g. 

\newpage
\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/R4heading.png}
  \caption{Heading Hold.}
  \label{fig:HeadingN}
\end{figure}

Il controllore \textit{Heading Hold} (Figure~\ref{fig:HeadingN}) adotta una struttura gerarchica: 
l'errore di prua viene convertito in un bank di riferimento dall'anello esterno, 
poi realizzato dall'anello interno di rollio. 
I grafici mostrano un inseguimento stabile della rotta con overshoot moderati 
e saturazioni ben gestite. 

\textbf{Risultati numerici:} $t_s \approx 6$--$8$ s, 
$\%OS \approx 5$--$7\%$, $e_\infty < 0.5^\circ$, 
bank massimo $|\phi| \approx 35^\circ$, $\delta_a \approx 6$--$7^\circ$. 

\newpage
\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/r6north.png}
  \caption{Forward separation autopilot.}
  \label{fig:ForwardN}
\end{figure}

Il controllore di \textit{Forward Separation} (Figure~\ref{fig:ForwardN}) mantiene la distanza longitudinale dal leader. 
Le traiettorie bidimensionali e tridimensionali mostrano che il follower segue con precisione 
anche durante manovre complesse. 
Le discrepanze massime si verificano nelle variazioni rapide di rotta, ma vengono recuperate in pochi secondi. 

\textbf{Risultati numerici:} errore RMS lungo rotta $\approx 20$--$40$ m, 
errore massimo in manovra $\approx 80$--$120$ m, 
errore altimetrico $\approx 30$--$50$ m, 
tempo di riallineamento dopo manovra leader $\approx 6$--$9$ s. 

\newpage
\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/r7east.png}
  \caption{Lateral separation autopilot.}
  \label{fig:LateralN}
\end{figure}

Il controllore di \textit{Lateral Separation} (Figure~\ref{fig:LateralN}) mantiene la distanza desiderata lungo l'asse Est rispetto al leader. 
La distanza viene seguita con precisione, con oscillazioni moderate nei transitori e angoli di rollio consistenti. 
L'anti-windup previene accumuli durante le saturazioni. 

\textbf{Risultati numerici:} $t_s \approx 8$--$10$ s, 
$\%OS \approx 8$--$12\%$, $e_\infty < 2$ m, 
bank massimo $|\phi| \approx 30$--$35^\circ$, $\delta_a \approx 2$--$3^\circ$. 

\newpage
\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/r8down.png}
  \caption{Vertical separation autopilot.}
  \label{fig:VerticalN}
\end{figure}

Il controllore di \textit{Vertical Separation} (Figure~\ref{fig:VerticalN}) regola la distanza verticale dal leader con struttura simile 
all'Altitude Hold. La risposta evidenzia prontezza e correzioni aggressive ma stabili. 

\textbf{Risultati numerici:} $t_s \approx 9$--$11$ s, 
$\%OS \approx 10$--$12\%$, $e_\infty < 3$ m, 
pitch massimo $|\theta| \approx 18^\circ$, 
$\delta_e \approx 16$--$18^\circ$, $a_x \approx 5$--$6$ g. 

\newpage

La Tabella~\ref{tab:metrics} riassume i principali valori numerici per ciascun autopilota. 
\begin{table}[ht]
\centering
\rotatebox{90}{
\begin{tabular}{lccccc}
\hline
\textbf{Autopilota} & $t_r$ [s] & $t_s$ [s] & $\%OS$ & $e_\infty$ & Comando/Attuatore \\ \hline
Pitch Hold         & 2.5--3.0 & 4--5  & 5--8\%  & $<0.5^\circ$ & $\delta_e \approx 20^\circ$ \\
Bank Hold          & $\sim$2  & 3--4  & 3--5\%  & $<0.3^\circ$ & $\delta_a \approx 3^\circ$ \\
Autothrottle       & 8--10    & 12--15 / 25--30 & $\sim$0--2\% & $<2$ ft/s & Throttle 40--90\% \\
Heading Hold       & --       & 6--8  & 5--7\%  & $<0.5^\circ$ & $\phi \approx 35^\circ$ \\
Altitude Hold      & 8--10    & 12--14 & 3--5\% & $<20$ ft     & $\delta_e \approx 20^\circ$ \\
Lateral Sep.       & --       & 8--10 & 8--12\% & $<2$ m       & $\phi \approx 35^\circ$ \\
Vertical Sep.      & --       & 9--11 & 10--12\%& $<3$ m       & $\theta \approx 18^\circ$ \\
Forward Sep.       & --       & 6--9  & --      & 20--40 m RMS & err. max 80--120 m \\
\hline
\end{tabular}
}
\caption{Metriche prestazionali degli autopiloti in simulazione.}
\label{tab:metrics}
\end{table}

\newpage
\begin{figure}[ht]
  \centering
  \begin{minipage}{0.5\textwidth}
    \centering
    \includegraphics[width=\linewidth]{Figures/r9.png}
    \caption{Mission Trajectory - 3D}
    \label{fig:traj3dN}
    
  \end{minipage}\hfill
   \begin{minipage}{0.5\textwidth}
    \centering
    \includegraphics[width=\linewidth]{Figures/R10.png}
    \caption{Mission Trajectory - Top}
    \label{fig:trajN}
  \end{minipage}
  
\end{figure}

La traiettoria complessiva di missione, mostrata nelle Figure~\ref{fig:traj3dN} e~\ref{fig:trajN}, evidenzia 
come il follower riesca a replicare con buona fedelt\'{a} il profilo del leader. 
Nella vista tridimensionale si osservano discrepanze limitate ai soli transitori, con rapidi riallineamenti che 
confermano la stabilit\'{a} del sistema. 
La vista dall'alto mette in luce un errore longitudinale contenuto entro margini accettabili, a riprova dell'efficacia 
dei controllori di separazione nell'assicurare coesione durante l'intera missione.


\newpage

\begin{figure}[ht]
  \centering
  \begin{minipage}{0.5\textwidth}
  \includegraphics[width=\linewidth]{Figures/R11.png}
  \caption{Manovra di decollo e avvicinamento.}
  \label{fig:takeoff3d}
  \end{minipage}\hfill
  \begin{minipage}{0.5\textwidth}
  \centering
  \includegraphics[width=\linewidth]{Figures/R12.png}
  \caption{NED decollo e avvicinamento.}
  \label{fig:takeoffned}
    \end{minipage}

\end{figure}

Nella fase di decollo e avvicinamento (Figure~\ref{fig:takeoff3d} e~\ref{fig:takeoffned}), il follower riproduce 
correttamente la sequenza di salita del leader. 
Nei grafici NED si nota un transitorio iniziale pi\'{u} marcato lungo l'asse verticale, legato alla fase critica di 
transizione dal rullaggio al volo, ma il sistema converge rapidamente al riferimento. 
Le traiettorie Nord ed Est risultano invece ben sovrapposte, a conferma di un inseguimento stabile in orizzontale.

\newpage

\begin{figure}[ht]
  \centering
  \begin{minipage}{0.5\textwidth}
  \includegraphics[width=\linewidth]{Figures/R13.png}
  \caption{Manovra di richiamata.}
  \label{fig:pullup3d}
  \end{minipage}\hfill
  \begin{minipage}{0.5\textwidth}
  \centering
  \includegraphics[width=\linewidth]{Figures/R14.png}
  \caption{NED richiamata.}
  \label{fig:pullupned}
    \end{minipage}

\end{figure}

Durante la manovra di richiamata (Figure~\ref{fig:pullup3d} e~\ref{fig:pullupned}), caratterizzata da un rapido 
cambiamento di quota, il follower dimostra prontezza di risposta. 
Nei grafici NED l'errore pi\'{u} evidente si manifesta sul canale Nord, dove si osserva uno scostamento temporaneo, 
seguito da un rapido riallineamento. 
I canali Est e Down presentano deviazioni trascurabili, indicando una buona robustezza dei controllori anche in 
condizioni dinamiche pi\'{u} sollecitanti.

\newpage

\begin{figure}[ht]
  \centering
  \begin{minipage}{0.5\textwidth}
  \includegraphics[width=\linewidth]{Figures/R15.png}
  \caption{Manovra di virata.}
  \label{fig:turn3d}
  \end{minipage}\hfill
  \begin{minipage}{0.5\textwidth}
  \centering
  \includegraphics[width=\linewidth]{Figures/R16.png}
  \caption{NED virata.}
  \label{fig:turnned}
    \end{minipage}

\end{figure}

La virata orizzontale (Figure~\ref{fig:turn3d} e~\ref{fig:turnned}) conferma la capacit\'{a} del follower di mantenere la 
posizione relativa durante variazioni di rotta. 
Il grafico tridimensionale mostra una traiettoria ben aderente a quella del leader, mentre i grafici NED evidenziano 
un errore iniziale sull'asse Est di pochi metri, recuperato senza oscillazioni persistenti. 
L'azione coordinata tra heading e bank hold garantisce la stabilizzazione sulla nuova direzione in tempi ridotti.

\newpage

\begin{figure}[ht]
  \centering
  \begin{minipage}{0.5\textwidth}
  \includegraphics[width=\linewidth]{Figures/R17.png}
  \caption{Manovra di virata ascendente.}
  \label{fig:climbturn3d}
  \end{minipage}\hfill
  \begin{minipage}{0.5\textwidth}
  \centering
  \includegraphics[width=\linewidth]{Figures/R18.png}
  \caption{NED virata ascendente.}
  \label{fig:climbturnned}
    \end{minipage}

\end{figure}

La virata ascendente (Figure~\ref{fig:climbturn3d} e~\ref{fig:climbturnned}), che combina simultaneamente variazioni di 
direzione e quota, rappresenta una manovra pi\'{u} complessa. 
In questo scenario il follower presenta un overshoot verticale pi\'{u} evidente nella fase iniziale, che viene tuttavia 
compensato in maniera efficace, riportando l'assetto entro i valori desiderati. 
Gli errori lungo gli assi Nord ed Est rimangono contenuti e non compromettono la stabilit\'{a} della formazione. 
Tale risultato dimostra la robustezza del sistema anche in condizioni tridimensionali critiche.


\newpage

\begin{figure}[ht]
  \centering
  \begin{minipage}{0.5\textwidth}
  \includegraphics[width=\linewidth]{Figures/R19.png}
  \caption{Comandi manuali.}
  \label{fig:manual3d}
  \end{minipage}\hfill
  \begin{minipage}{0.5\textwidth}
  \centering
  \includegraphics[width=\linewidth]{Figures/R20.png}
  \caption{NED comandi manuali.}
  \label{fig:manualned}
    \end{minipage}

\end{figure}

I comandi manuali (Figure~\ref{fig:manual3d} e~\ref{fig:manualned}) costituiscono una prova di stress per l'architettura 
di controllo. 
In questo caso, le traiettorie risultano meno regolari a causa della natura non ottimizzata degli input. 
Nei grafici NED emergono oscillazioni pi\'{u} significative nei tre canali, con deviazioni ripetute dai riferimenti. 
Nonostante ci\'{o}, il sistema \'{e} in grado di mantenere la stabilit\'{a} complessiva, impedendo divergenze eccessive e preservando 
la sicurezza della formazione. 
Questo esperimento evidenzia la resilienza dell'architettura anche in presenza di condizioni di pilotaggio non ideali.


\newpage

\subsubsection{Caso perturbato}
Dopo l'analisi del caso nominale, si \'{e} valutata la risposta degli autopiloti in presenza di 
condizioni meteorologiche avverse. Lo scenario perturbato includeva vento trasversale con 
raffiche variabili (0--30 nodi), turbolenza moderata e un wind shear localizzato a bassa quota. 
Tali disturbi rappresentano una condizione critica per la stabilit\'{a} del velivolo, soprattutto nelle 
fasi di decollo e atterraggio, e mettono in evidenza la robustezza delle leggi di controllo 
implementate.
\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/p1.png}
  \caption{Grafico Pitch hold.}
  \label{fig:pitchp}
\end{figure}

Il controllore di beccheggio ha mostrato una buona capacit\'{a} di mantenere l'assetto anche in 
presenza di raffiche improvvise (Figure~\ref{fig:pitchp}). La struttura \textit{lead--lag} ha permesso di reagire rapidamente 
alle variazioni indotte dalla turbolenza, limitando l'oscillazione del pitch entro valori accettabili. 
Si osservano transienti pi\'{u} accentuati rispetto al caso non perturbato, ma l'errore a regime 
rimane contenuto ($e_\infty < 0.5^\circ$). 

\newpage

\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/p2.png}
  \caption{Grafico Bank Hold.}
  \label{fig:bankp}
\end{figure}

Durante la turbolenza, il canale di rollio \'{e} stato quello maggiormente sollecitato. 
Il controllore \textit{Bank Hold} ha contrastato le deviazioni laterali generate dal vento 
trasversale, imponendo micro-correzioni continue sugli alettoni (Figure~\ref{fig:bankp}). 
La sovraelongazione non supera il 5\% e l'angolo di rollio massimo resta in linea con i limiti 
operativi ($\delta_a \approx 3^\circ$), a conferma della stabilit\'{a} del regolatore.

\newpage

\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/p3.png}
  \caption{Grafico autothrottle.}
  \label{fig:autop}
\end{figure}

Il canale di velocit\'{a} longitudinale ha evidenziato la maggiore criticit\'{a} in corrispondenza 
dell'ingresso nel wind shear, quando la velocit\'{a} indicata ha subito variazioni repentine. 
L'autothrottle ha compensato con un rapido incremento della manetta, saturando vicino 
al 90\%, ma \'{e} riuscito a ristabilizzare il regime in circa 25--30 s. 
Nonostante i transitori prolungati, l'errore a regime resta inferiore a 2 ft/s (Figure~\ref{fig:autop}).


\newpage

\begin{figure}[ht]
  \centering
  
  \includegraphics[width=.82\linewidth]{Figures/p4.png}
  \caption{Grafico altitude hold.}
  \label{fig:altp}
\end{figure}

Le variazioni verticali indotte dalla turbolenza hanno comportato oscillazioni della quota, 
corrette dal controllore con comandi aggressivi sull'elevatore (Figure~\ref{fig:altp}). 
La risposta resta comunque entro i valori nominali ($t_s \approx 12$--$14$ s, $e_\infty < 20$ ft), 
dimostrando la robustezza della struttura PID con retroazione sul pitch.
\newpage

\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/p5.png}
  \caption{Grafico heading hold.}
  \label{fig:headp}
\end{figure}

Il controllore di prua ha mantenuto la rotta desiderata anche sotto l'azione di vento trasversale. 
L'anello esterno (heading) ha generato banche di riferimento maggiori rispetto al caso nominale, 
raggiungendo $|\phi| \approx 35^\circ$, ma senza compromettere la stabilit\'{a} (Figure~\ref{fig:headp}). 
L'anti-windup ha impedito accumuli significativi, garantendo un errore finale inferiore a $0.5^\circ$.


\newpage

\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/p6.png}
  \caption{Grafico forward separation autopilot.}
  \label{fig:forwp}
\end{figure}

Il canale longitudinale ha mostrato oscillazioni dovute al wind shear, con errori massimi 
durante le manovre rapidi pari a 100 m circa. 
Tuttavia, il riallineamento con la traiettoria del leader \'{e} avvenuto entro 6--9 s, 
dimostrando che la coordinazione tra autothrottle e assetto longitudinale rimane efficace 
anche in condizioni perturbate (Figure~\ref{fig:forwp}).

\newpage

\begin{figure}[ht]
  \centering
  
  \includegraphics[width=\linewidth]{Figures/p7.png}
  \caption{Grafico lateral separation autopilot.}
  \label{fig:latp}
\end{figure}

Il mantenimento della separazione laterale dal leader \'{e} risultato il pi\'{u} sensibile alle 
raffiche di vento trasversale. Il controllore ha generato correzioni rapide in rollio, 
con picchi di bank comparabili a quelli del caso nominale ($30$--$35^\circ$)(Figure~\ref{fig:latp}). 
La distanza laterale \'{e} stata recuperata con un tempo di assestamento inferiore ai 10 s 
e con errore residuo $<2$ m.

\newpage

\begin{figure}[ht]
  \centering
  
  \includegraphics[width=.82\linewidth]{Figures/p8.png}
  \caption{Grafico vertical separation autopilot.}
  \label{fig:vertp}
\end{figure}

Le perturbazioni verticali hanno introdotto oscillazioni nella distanza dal leader, 
ma il controllore ha reagito con variazioni di pitch ($|\theta| \approx 18^\circ$) 
e deflessioni agli elevatori fino a $18^\circ$ (Figure~\ref{fig:vertp}). 
L'errore massimo non ha superato i 3 m e l'assestamento \'{e} avvenuto in circa 10 s. 


Nel complesso, i risultati numerici riportati in Tabella~\ref{tab:metrics} 
rimangono validi anche in condizioni perturbate, pur con transitori pi\'{u} energici e 
maggiore impegno degli attuatori. 
L'analisi conferma la robustezza dei controllori progettati, in grado di garantire 
la sicurezza operativa del volo in formazione anche in presenza di condizioni atmosferiche avverse.
\newpage

\begin{figure}[ht]
  \centering
  \begin{minipage}{0.5\textwidth}
  \includegraphics[width=\linewidth]{Figures/p9.png}
  \caption{Manovra di decollo e avvicinamento perturbati.}
  \label{fig:takeoff3d_pert}
  \end{minipage}\hfill
  \begin{minipage}{0.5\textwidth}
  \centering
  \includegraphics[width=\linewidth]{Figures/p10.png}
  \caption{NED decollo e avvicinamento  perturbati.}
  \label{fig:takeoffned_pert}
    \end{minipage}

\end{figure}

La manovra di decollo e avvicinamento perturbata (Figure~\ref{fig:takeoff3d_pert} e~\ref{fig:takeoffned_pert}) mette in evidenza l'efficacia del sistema di controllo in presenza di disturbi. 
Il confronto tra traiettorie perturbate e non perturbate mostra come il follower riesca a mantenere la separazione anche in condizioni non nominali. 
Nei grafici NED, gli scostamenti sono pi\'{u} marcati nella fase iniziale, in particolare lungo l'asse verticale, ma le traiettorie convergono rapidamente, segno di un buon comportamento correttivo. 
Gli assi Nord ed Est restano sostanzialmente sovrapposti, garantendo una traiettoria stabile e fedele.

\newpage

\begin{figure}[ht]
  \centering
  \begin{minipage}{0.5\textwidth}
  \includegraphics[width=\linewidth]{Figures/p11.png}
  \caption{Manovra di richiamata  perturbata.}
  \label{fig:pullup3d_pert}
  \end{minipage}\hfill
  \begin{minipage}{0.5\textwidth}
  \centering
  \includegraphics[width=\linewidth]{Figures/p12.png}
  \caption{NED richiamata perturbata.}
  \label{fig:pullupned_pert}
    \end{minipage}

\end{figure}

Durante la manovra di richiamata perturbata (Figure~\ref{fig:pullup3d_pert} e~\ref{fig:pullupned_pert}), il sistema mostra una maggiore sensibilit\'{a} ai disturbi, specialmente lungo l'asse Nord. 
Il follower perturbato evidenzia un errore pi\'{u} ampio e persistente rispetto al caso non perturbato, ma riesce comunque a seguire la variazione di quota imposta dal leader. 
Sul canale Down, il comportamento rimane controllato, con deviazioni simili tra scenario perturbato e non perturbato, a dimostrazione della robustezza del controllo in quota. 
Il canale Est evidenzia invece scostamenti ridotti, mantenendo una buona coerenza con il profilo desiderato.

\newpage

\begin{figure}[ht]
  \centering
  \begin{minipage}{0.5\textwidth}
  \includegraphics[width=\linewidth]{Figures/p13.png}
  \caption{Manovra di Virata perturbata.}
  \label{fig:turn3d_pert}
  \end{minipage}\hfill
  \begin{minipage}{0.5\textwidth}
  \centering
  \includegraphics[width=\linewidth]{Figures/p14.png}
  \caption{NED virata perturbata.}
  \label{fig:turnned_pert}
    \end{minipage}

\end{figure}

La virata perturbata (Figure~\ref{fig:turn3d_pert} e~\ref{fig:turnned_pert}) evidenzia gli effetti pi\'{u} rilevanti dei disturbi sul mantenimento della traiettoria. 
Nella vista 3D si osserva uno scostamento sistematico tra traiettoria perturbata e non perturbata, in particolare lungo l'asse verticale. 
Nei grafici NED, il follower perturbato mostra oscillazioni marcate nei tre canali, con deviazioni evidenti sul canale Nord e variazioni significative sul canale Down. 
Nonostante queste perturbazioni, la traiettoria rimane complessivamente vicina al profilo del leader, indicando che il sistema riesce a contenere gli effetti dei disturbi senza comprometterne la stabilit\'{a} globale.

\newpage

\subsection{Conclusioni}

Il progetto sviluppato ha evidenziato la concreta fattibilit\'{a} di implementare e validare, all'interno di un ambiente 
di simulazione, un sistema di autopiloti in grado di gestire missioni cooperative tra velivoli con e senza pilota, 
in uno scenario di \textit{Manned-Unmanned Teaming} (MUM-T).

Le prove condotte hanno dimostrato, in primo luogo, la robustezza dell'architettura di simulazione: la 
sincronizzazione in rete tra velivolo leader e velivolo follower si \'{e} dimostrata stabile e affidabile non 
solo in condizioni operative standard, ma anche in presenza di perturbazioni esterne introdotte artificialmente. 
Parallelamente, i controllori implementati, basati su strutture PID e compensatori di tipo lead-lag, hanno 
mostrato un comportamento coerente con le aspettative teoriche, garantendo risposte pronte e stabili e mantenendo 
la formazione anche in scenari caratterizzati da disturbi atmosferici significativi.

Un ulteriore aspetto emerso riguarda la scalabilit\'{a} del sistema. L'architettura sviluppata \'{e} risultata infatti 
sufficientemente flessibile da permettere un'estensione del numero di velivoli simulati, nonch\'{e} l'integrazione 
di moduli software e sensori aggiuntivi senza richiedere modifiche invasive all'infrastruttura di base.

Complessivamente, i risultati ottenuti confermano che la piattaforma proposta costituisce una base solida e 
adattabile per lo studio di missioni multi-velivolo, rappresentando un punto di partenza concreto per la futura 
introduzione di capacit\'{a} autonome pi\'{u} avanzate e per applicazioni operative in scenari complessi e realistici.

\subsection{Sviluppi futuri}

Il lavoro svolto pu\'{o} essere ulteriormente sviluppato lungo diverse direttrici di ricerca e innovazione tecnologica, 
capaci di aumentare il livello di autonomia e l'efficacia operativa del sistema.

Un primo ambito di approfondimento riguarda l'introduzione di algoritmi di \textit{collision avoidance}. In scenari 
caratterizzati dalla presenza di pi\'{u} UAV all'interno di spazi aerei condivisi, risulta fondamentale dotare i velivoli 
di strategie predittive in grado di anticipare situazioni di potenziale conflitto. L'adozione di approcci come il 
\textit{Model Predictive Control} (MPC) consentirebbe di calcolare traiettorie sicure in tempo reale, mentre 
l'integrazione di logiche cooperative ispirate alla \textit{swarm intelligence} permetterebbe di coordinare le manovre 
evasive sulla base delle informazioni provenienti da sensori e comunicazioni inter-veicolo.

Un secondo filone di ricerca riguarda la \textit{navigazione avanzata}. In questo contesto, lo sviluppo di algoritmi 
di \textit{sensor fusion} pi\'{u} sofisticati, basati su filtri come l'Extended Kalman Filter (EKF) o l'Unscented Kalman 
Filter (UKF), consentirebbe di migliorare l'accuratezza e l'affidabilit\'{a} della stima dello stato del velivolo. In prospettiva, l'integrazione di tecniche di 
\textit{terrain-aware navigation} permetterebbe inoltre di affrontare scenari complessi e non strutturati, sfruttando 
mappe dinamiche costantemente aggiornate per adattare il profilo di missione alle condizioni operative.

Infine, un ulteriore sviluppo riguarda gli aspetti di \textit{guidance} e \textit{mission planning}. La progettazione
 di logiche adattive, capaci di gestire missioni multi-velivolo con obiettivi dinamici, potrebbe essere potenziata 
 mediante l'impiego di algoritmi di \textit{reinforcement learning} e tecniche di pianificazione multi-obiettivo. Tali 
 approcci renderebbero possibile il \textit{re-planning} in tempo reale, consentendo al sistema di rispondere in maniera 
 efficace a eventi imprevisti, come condizioni meteorologiche variabili o perdita temporanea delle comunicazioni, 
 aumentando cos\'{i} la resilienza e l'affidabilit\'{a} complessiva della missione.
\newpage
 \bibliographystyle{IEEEtran}
\bibliography{bibliografia}
\newpage
\appendix
\section{Documentazione Aggiuntiva}
\includepdf[pages=-, angle=90]{Pdf/C2main.pdf}
\includepdf[pages=-, angle=90]{Pdf/drone main.pdf}
\includepdf[pages=-, angle=90]{Pdf/dispatch.pdf}
\includepdf[pages=-, angle=90]{Pdf/autopilots.pdf}
\includepdf[pages=-, angle=90]{Pdf/comunication.pdf}
\includepdf[pages=-, angle=90]{Pdf/miscellaneois.pdf}
\includepdf[pages=-, angle=90]{Pdf/readwrite.pdf}
\includepdf[pages=-, angle=90]{Pdf/globalvar.pdf}
\end{document}