• Non ci sono risultati.

Conclusioni: una visione per il futuro

Nel 1952 il sig. J.L.G Fitz Patrick, direttore della ricerca dell’omonima Fitz Patrick Co. (50 Fort Hill Circle, Staten Island 1, N.Y.), si è presentato all’ufficio brevetti degli Stati Uniti d’America con il progetto di un veicolo defiinito come “Air, Land and Water Craft”. Si trattava di una capsula destinata, apparentemente, ad ospitare uno o due membri di equipaggio, intorno alla quale sono fissate due ali che rendono la struttura nel suo complesso molto simile ad un grosso pipistrello.

Queste ultime, fissate ad un telaio, racchiudono, al di sotto di quelli che sembrano pannelli flessibili, una serie di meccanismi elettro-meccanici di attuazione che consentono ampi margini di regolazione delle variabili alari in maniera del tutto simile al sistema muscolo-scheletrico di molti volatili a cui, evidentemente, il progetto si ispira.

A quasi 70 anni di distanza il tema di sistemi artificiali biomimetici è ancora di grande interesse. Im moltissimi campi il design si ispira a soluzioni che la natura offre a chiunque sappia cogliere il suggerimento.

Questa ricerca, nata con l’intento di esplorare l’utilizzo delle strutture intelligenti nella progettazione di veicoli subacquei si conclude con una visione per certi versi ancora sfuocata ma che nelle sue linee essenziali trova un consistente riscontro nella letteratura più recente e meno.

Solo per coerenza con le pagine che precedono continuerò a riferirmi ai glider, tuttavia le suggestioni che intendo trasmettere possono trovare analoga applicazione in veicoli subacquei sia manned che unmanned.

Il punto di partenza di tutti i ragionamenti sono state le appendici alari e relativamente a queste si applicano gran parte delle idee proposte nelle pagine precedenti.

E’ facile accettare l’idea che una coppia di ali in grado di alterare le variabili che le caratterizzano, in piena autonomia, sulla base di indicazioni fornite da una logica di controllo in grado di interpretare la situazione contingente, abbia una performance migliore di due ali sostanzialmente immutabili se non attraverso limitati interventi umani.

Per rimanere coerente alla linea di pensiero sviluppata in precedenza prenderò in considerazione solo le variabili già considerate ad esclusione del profilo: angolo di freccia (sweep) ed apertura alare (wingspan).

Fig. 46 Brevetto per glider sottomarino con ali a geometria variabile attuate mediante sistema pneumatico di J.L.G Fitz Patrick, 1957

Si tratta in entrambi i casi di alterazioni di forma che avvengono sullo stesso piano e che hanno la caratteristica di incidere significativamente sul rapporto portanza-resistenza.

Per entrambi gli spostamenti (variazione dell’angolo di freccia e di apertura alare) la soluzione proposta prevede l’utilizzo di mini-attuatori basati sull’utilizzo di un sistema a pantografo accoppiato a tre segmenti di muscolo artificiale in gomma siliconica. L’estensione del segmento centrale unita alla contrazione dei segmenti periferici dovrebbe determinare l’estensione della struttura e viceversa.

Fig. 47 Smart glider concept

La superficie esterna, o pelle, dovrebbe possedere caratteristiche tali da sostenere, senza deformarsi, gli sforzi prodotti dalla trasformazione dell’ala, consentendo allo stesso tempo il rilevamento di variabili esterne come la pressione e la velocità del fluido.

E’ solo disponendo costantemente di questi valori, per l’intera superficie alare, che un algoritmo di ottimizzazione potrebbe elaborare il corretto segnale di correzione da inviare agli attuatori.

Come ho indicato nelle prime pagine, la presenza dell’intelligenza artificiale permea gran parte di questo lavoro. Pur continuando a sostenere che ad una trattazione incompleta è preferibile la completa omissione, sottolineo che nulla di quanto descrivo è possibile in assenza di un efficace ed autonomo algoritmo di ottimizzazione implementato a bordo del mezzo.

Fig. 438 Rappresentazione concettuale di un attuatore realizzato con muscoli artificiali

Lo scafo del glider non è stato oggetto di questa ricerca: nella sua forma essenziale risiede uno dei punti di forza di questo mezzo che, nel panorama dei veicoli subacquei autonomi, è probabilmente il più economico. La modularità garantita da una sezione perfettamente circolare consente di aggiungere o modificare alcune componenti del veicolo che in questo modo risulta facilmente riconfigurabile in base alle esigenze operative.

Un discorso diverso vale per i mezzi subacquei di maggiori dimensioni, in particolar modo per quelli dotati di equipaggio relativamente ai quali il problema della detection sia ottica che acustica è ancora oggi estremamente attuale.

Mentre sebbene sia di grande importanza e possa certamente beneficiare dell’impiego di strutture intelligenti, la localizzazione ottica dei mezzi subacquei è un tema che non è stato affrontato nel contesto di questa ricerca ma che rappresenta un importante spunto per futuri approfondimenti. Al contrario, l’analisi delle caratteristiche dei materiali compositi in fibra attiva (AFC), ha consentito di ipotizzare una soluzione al problema della localizzazione acustica dei mezzi subacquei.

Quest’ultima si basa su due metodi: quello passivo e quello attivo. In entrambi i casi l’unità viene localizzata perché emette un’onda sonora: autoprodotta nel primo caso, re-irradiata nel secondo. Pertanto, se con il metodo passivo l’unità cacciatrice sta ferma in ascolto, in quello attivo emette impulsi acustici per cogliere l’eco del sottomarino nemico.

Gran parte del rumore prodotto dai sottomarini viene dal sistema di propulsione: per quanto ottimizzate le eliche contribuiscono per una quota consistente. Poi vengono tutti gli altri rumori che, per quanto limitati al massimo, un ambiente che deve ospitare esseri umani necessariamente emette.

Tuttavia, l’impiego degli AFC unito, ancora una volta, ad una evoluta unità di elaborazione potrebbe consentire una soluzione, almeno parziale, del problema.

Il principio alla base è il fenomeno dell’interferenza distruttiva: quando due segnali opposti in fase si sovrappongono la somma è zero (Fig.49).

Fig. 49 Abbattimento dell’eco tramite interferenza distruttiva: caso ideale

Questo significa che se all’onda che dal sottomarino si sovrappone un’onda identica ma sfasata di 180° il segnale risultante sarà nullo. Niente segnale, nessuna possibilità di essere localizzati.

Nel caso della localizzazione passiva il meccanismo è leggermente più semplice perché trattandosi del rumore autoprodotto, entro certi limiti, le sue caratteristiche (la sua statistica) può essere conosciuta con un buon livello di approssimazione.

Nel caso della localizzazione attiva il processo è più complesso: si tratta di accorgersi in tempo che sta arrivando un segnale sonar e di sapere come reagirà il veicolo (in termini di rumore re-irradiato) una volta colpito dall’impulso acustico.

Pertanto, se nel primo caso è sufficiente generare un segnale opposto in fase al rumore, come già avviene, per esempio, in alcuni auricolari, nel secondo caso i passaggi necessari sono diversi. Nel caso del controllo attivo della risposta strutturale (ACSR) ad un impulso acustico il meccanismo proposto si basa su alcune ipotesi:

 la risposta acustica del veicolo sia nota a priori;

 sia possibile rilevare l’onda incidente prima che quest’ultima colpisca il veicolo;

 che il veicolo sia dotato di capacità di elaborazione ed irradiazione del segnale in controfase in tempo ragionevolmente breve.

Il calcolo della risposta acustica del veicolo avviene tramite una sequenza precisa di passaggi matematici:

 campionamento dell’onda incidente x(t);

 trasformazione in frequenza tramite FFT (Fast Fourier Transform) per ottenere 𝑿(𝒋𝝎);  calcolo dello spettro dell’eco retro-diffuso 𝒀(𝒋𝝎) tramite il prodotto in frequenza tra lo spettro del segnale incidente e la funzione di trasferimento del veicolo (equazione 99)

 anti-trasformata tramite IFFT (Inverse Fast Fourier Transform) dello spettro calcolato. La funzione di trasferimento acustica del veicolo può essere ricavata sperimentalmente tramite l’impiego di segnali sonar a diversa frequenza ed energia, in ambiente controllato.

𝒀(𝒋𝝎) = 𝑿(𝒋𝝎)𝑯(𝒋𝝎) ( 118)

𝓕 𝟏[𝒀(𝒋𝝎)] + 𝓕 𝟏[𝒀′(𝒋𝝎)]=𝒚(𝒕) + 𝒚′(𝒕) ≠ 𝟎 ( 119)

𝒚 (𝒕) = 𝒚(𝒕 + 𝒌𝝅), 𝒌 𝒅𝒊𝒔𝒑𝒂𝒓𝒊 ( 120)

La risposta acustica così calcolata nel dominio del tempo rappresenta l’onda retro-diffusa dal veicolo quando investito dall’onda incidente.

Nel caso ideale, a questo punto, sarebbe sufficiente sfasare la fase del segnale calcolato di 180° per ottenere un segnale che, sovrapposto al primo, determinerebbe una perfetta interferenza distruttiva, annullando di fatto l’eco risultante e facendo scomparire acusticamente il veicolo

Nel caso reale, la presenza di ritardi introdotti dal calcolo del segnale in opposizione di fase, la risultante di due segnali è un segnale ridotto considerevolmente in ampiezza ma non del tutto nullo (Fig. 50).

Nel contesto di questo progetto l’utilizzo di una pelle intelligente, grazie alla possibilità di sensing ed attuazione diffusa su tutta la superficie, potrebbe consentire, sia il rilevamento precoce del segnale incidente, sia di veicolare l’eco riprodotto in anti-fase.

Appendici

Appendix A – Matrici di rotazione ed angoli di Eulero A.1 – Matrici di rotazione

Una matrice ortogonale ad elementi reali 𝑹 è una matrice i cui elementi soddisfano la relazione 𝑹 − 1 = 𝑹 = (o, equivalentemente 𝑹 𝑹 = 𝑰, dove 𝑰 è la matrice identica di dimensioni n × n). Preso il determinante dell’equazione 𝑹 𝑹 = 𝑰 e considerando il fatto che det (𝑹 ) = det 𝑹, ne consegue che (det 𝑹)2 = 1, il che implica sia che det 𝑹 = 1 sia det 𝑹 = −1.

Una matrice ad elementi reali 𝑹 di dimensioni n × n con det 𝑹 = 1 viene definita come matrice ortogonale speciale e fornisce una rappresentazione matriciale delle possibili rotazioni proprie in uno spazio n-dimensionale.

La forma più generale di una matrice di rotazione tridimensionale rappresenta una rotazione antioraria di un angolo θ rispetto ad un asse fisso che giace lungo l’n-esimo versore.

La matrice di rotazione agisce sui vettori producendo lo stesso vettore ruotato rispetto agli assi che rimangono invece fissi.

A.2 – Angoli di Eulero

Gli angoli di Eulero descrivono l’orientamento del sistema di assi solidale con il veicolo rispetto al sistema di riferimento inerziale mediante una serie di singole rotazioni rispetto agli assi del sistema inerziale.

La scelta della sequenza di rotazione viene definita dalla convenzione utilizzata; in questo senso la convenzione 𝑋𝑌𝑍, o yaw, pitch, roll, rappresenta lo standard in aviazione e nel caso di veicoli subacquei.

La rotazione viene parametrizzata tramite tre angoli: yaw 𝜓, pitch 𝜃 and roll 𝜙. La convenzione 𝑋𝑌𝑍 definisce la rotazione nel modo che segue:

1. Si comincia con il sistema di riferimento solidale al veicolo e quello inerziale allineati;

dove 𝑋’ ed 𝑌’ rappresentano i nuovi assi non più coincidenti con gli assi 𝑋 ed 𝑌 del sistema di riferimento inerziale mentre 𝑍 mantiene il suo orientamento originale.

3. La rotazione successiva della terna 𝑋’𝑌’𝑍 avviene rispetto all’asse 𝑌’ di un angolo 𝜃 così da ottenere la nuova terna ruotata 𝑋”𝑌’𝑍’

4. Si procede quindi con la rotazione della terna 𝑋”𝑌’𝑍’rispetto all’asse 𝑋” di un angolo 𝜙. Questo completa la rotazione, l’orientamento di (𝒆 , 𝒆 , 𝒆 ) coincide con 𝑋”𝑌”𝑍”.

Ricordando che la matrice 𝑹 mappa i vettori espressi in coordinate non inerziali in vettori espressi in coordinate inerziali è possibile utilizzarla per rappresentare le tre rotazioni appena viste:

𝑹 = 𝑐𝑜𝑠 𝜓 𝑠𝑖𝑛 𝜓 0 − 𝑠𝑖𝑛 𝜓 𝑐𝑜𝑠 𝜓 0 0 0 1 , 𝑹 = 𝑐𝑜𝑠 𝜃 0 −𝑠𝑖𝑛 𝜃 0 1 0 𝑠𝑖𝑛 𝜃 0 𝑐𝑜𝑠 𝜃 , 𝑹 = 1 0 0 0 𝑐𝑜𝑠 𝜙 𝑠𝑖𝑛 𝜙 0 − 𝑠𝑖𝑛 𝜙 𝑐𝑜𝑠 𝜙 ,

La rotazione completa dal sistema di riferimento inerziale rispetto a quello non inerziale è quindi rappresentata dalla matrice:

𝑹 = 𝑹 𝑹 𝑹 =

= −

𝑐𝑜𝑠 𝜓 𝑐𝑜𝑠 𝜃 𝑠𝑖𝑛 𝜓 𝑐𝑜𝑠 𝜃 − 𝑠𝑖𝑛 𝜃

𝑠𝑖𝑛 𝜓 𝑐𝑜𝑠 𝜙 + 𝑐𝑜𝑠 𝜓 𝑠𝑖𝑛 𝜃 𝑠𝑖𝑛 𝜙 𝑐𝑜𝑠 𝜓 𝑐𝑜𝑠 𝜙 + 𝑠𝑖𝑛 𝜙 𝑠𝑖𝑛 𝜃 𝑠𝑖𝑛 𝜓 𝑐𝑜𝑠 𝜃 𝑠𝑖𝑛 𝜙 𝑠𝑖𝑛 𝜓 𝑠𝑖𝑛 𝜙 + 𝑐𝑜𝑠 𝜓 𝑐𝑜𝑠 𝜙 𝑠𝑖𝑛 𝜃 − 𝑐𝑜𝑠 𝜓 𝑠𝑖𝑛 𝜙 + 𝑠𝑖𝑛 𝜃 𝑠𝑖𝑛 𝜓 𝑐𝑜𝑠 𝜙 𝑐𝑜𝑠 𝜃 𝑐𝑜𝑠 𝜙

Mentre la rotazione del sistema di riferimento non inerziale rispetto a quello inerziale:

=

𝑐𝑜𝑠 𝜓 𝑐𝑜𝑠 𝜃 −𝑠𝑖𝑛 𝜓 𝑐𝑜𝑠 𝜙 + 𝑐𝑜𝑠 𝜓 𝑠𝑖𝑛 𝜃 𝑠𝑖𝑛 𝜙 𝑠𝑖𝑛 𝜓 𝑠𝑖𝑛 𝜙 + 𝑐𝑜𝑠 𝜓 𝑐𝑜𝑠 𝜙 𝑠𝑖𝑛 𝜃 𝑠𝑖𝑛 𝜓 𝑐𝑜𝑠 𝜃 𝑐𝑜𝑠 𝜓 𝑐𝑜𝑠 𝜙 + 𝑠𝑖𝑛 𝜙 𝑠𝑖𝑛 𝜃 𝑠𝑖𝑛 𝜓 − 𝑐𝑜𝑠 𝜓 𝑠𝑖𝑛 𝜙 + 𝑠𝑖𝑛 𝜃 𝑠𝑖𝑛 𝜓 𝑐𝑜𝑠 𝜙

− 𝑠𝑖𝑛 𝜃 𝑐𝑜𝑠 𝜃 𝑠𝑖𝑛 𝜙 𝑐𝑜𝑠 𝜃 𝑐𝑜𝑠 𝜙

A.2.1 – Espressione della velocità angolare mediante angoli di Eulero

La velocità angolare del veicolo 𝛀, espressa rispetto al sistema di riferimento non inerziale può essere scritta in termini di angoli di Eulero:

𝜴 = 𝛺 𝛺 𝛺 = 𝜙̇0 0 + 𝑹 0𝜃̇ 0 + 𝑹 𝑹 0 0 𝜓̇ = 1 0 − 𝑠𝑖𝑛 𝜃 0 𝑐𝑜𝑠 𝜙 𝑐𝑜𝑠 𝜃 𝑠𝑖𝑛 𝜙 0 − 𝑠𝑖𝑛 𝜙 𝑐𝑜𝑠 𝜃 𝑐𝑜𝑠 𝜙 𝜙̇ 𝜃̇ 𝜓̇

Invertendo l’ultima matrice si ottiene:

𝜙̇ 𝜃̇ 𝜓̇ = 1 𝑠𝑖𝑛 𝜙 𝑡𝑎𝑛 𝜃 𝑐𝑜𝑠 𝜙 𝑡𝑎𝑛 𝜃 0 𝑐𝑜𝑠 𝜙 − 𝑠𝑖𝑛 𝜙 0 𝜴

Questa trasformazione è singolare per angoli 𝜃 = ±90°, dove il termine 𝑐𝑜𝑠(𝜃) = 0. La presenza di tali singolarità determina il fatto che gli angoli di Eulero non possono essere utilizzati come sistema di orientamento globale.

Qualora il veicolo debba operare ad angoli prossimi alle condizioni di singolarità è necessario utilizzare metodi alternativi come i quaternioni.

A.3 – Quaternioni

Mediante l’uso dei quaternioni è possibile parametrizzare l’orientamento del veicolo mediante quattro parametri ed una costante. Nonostante siano un metodo per evitare I problemi connessi alle singolarità viste per gli angoli di Eulero, l’uso dei quaternioni introduce una certa ridondanza legata al fatto che ciascuna rotazione viene descritta tramite due insiemi di quaternioni.

Il teorema di Eulero sulla rotazione stabilisce che “lo spostamento di un corpo rigido con un punto vincolato è una rotazione rispetto ad un asse”. In atri termini qualsiasi rotazione di un corpo rigido può essere parametrizzata specificando un asse di rotazione ed un angolo rispetto a tale asse. Sia quindi 𝒄 = (𝑐 , 𝑐 , 𝑐 ) il vettore unitario che giace sull’asse di rotazione e sia δ l’angolo di rotazione rispetto a detto asse.

La corrispondente matrice di rotazione può essere espressa come 𝐵 = 𝑒𝒄 .

Per parametrizzare la rotazione in termini di quaternioni occorre definire il vettore

𝒒 = 𝑞 𝑞 𝑞 𝑞 = ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ cos𝛿 2 𝐶 sin𝛿 2 𝐶 sin𝛿 2 𝐶 sin𝛿 2⎠ ⎟ ⎟ ⎟ ⎟ ⎟ ⎞ = cos𝛿 2 𝒄 sin𝛿 2

dove 𝒒 è soggetto al vincolo:

𝒒 𝒒 = 𝑞 + 𝑞 + 𝑞 + 𝑞 = 1

La corrispondente matrice di rotazione può essere scritta come:

𝑹 =

𝑞 + 𝑞 + 𝑞 + 𝑞 2(𝑞 𝑞 + 𝑞 𝑞 ) 2(𝑞 𝑞 + 𝑞 𝑞 )

2(𝑞 𝑞 + 𝑞 𝑞 ) 𝑞 + 𝑞 + 𝑞 + 𝑞 2(𝑞 𝑞 + 𝑞 𝑞 )

2(𝑞 𝑞 + 𝑞 𝑞 ) 2(𝑞 𝑞 + 𝑞 𝑞 ) 𝑞 + 𝑞 + 𝑞 + 𝑞

𝑞 = cos 𝜙 2 cos 𝜃 2 cos 𝜓 2 + sin 𝜙 2 sin 𝜃 2 sin 𝜓 2 𝑞 = sin 𝜙 2 cos 𝜃 2 cos 𝜓 2 + cos 𝜙 2 sin 𝜃 2 sin 𝜓 2 𝑞 = cos 𝜙 2 sin 𝜃 2 cos 𝜓 2 + sin 𝜙 2 cos 𝜃 2 sin 𝜓 2 𝑞 = cos 𝜙 2 cos 𝜃 2 sin 𝜓 2 + sin 𝜙 2 sin 𝜃 2 cos 𝜓 2

Viceversa, gli angoli di Eulero possono essere determinati in termini di quaternioni mediante le seguenti: tan 𝜙 = 2(𝑞 𝑞 + 𝑞 𝑞 ) (𝑞 − 𝑞 − 𝑞 + 𝑞 ) tan 𝜃 = 2(𝑞 𝑞 + 𝑞 𝑞 ) 2(𝑞 𝑞 + 𝑞 𝑞 ) sin 𝜙 + (𝑞 − 𝑞 )(𝑞 + 𝑞 ) cos 𝜙 tan 𝜙 = 2(𝑞 𝑞 + 𝑞 𝑞 ) (𝑞 + 𝑞 − 𝑞 − 𝑞 )

Le derivate temporali possono essere espresse in termini. di velocità angolari del corpo 𝛺 = (𝛺 , 𝛺 , 𝛺 ) 𝑞̇ 𝑞̇ 𝑞̇ 𝑞̇ = 1 2 0 −𝛺 𝛺 0 −𝛺 −𝛺 𝛺 −𝛺 𝛺 −𝛺 𝛺 𝛺 0 𝛺 −𝛺 0 𝑞 𝑞 𝑞 𝑞 e vice versa: 𝛺 𝛺 = 2 −𝑞 −𝑞 𝑞 −𝑞 𝑞 𝑞 −𝑞 𝑞 𝑞̇ 𝑞̇

Appendix B – MATLAB wings simulation files

I file che seguono sono stati utilizzati nella simulazione preliminare finalizzata a scegliere la combinazione delle variabili di progetto in grado di massimizzare il rapporto portanza-resistenza. B.1 – File DeterminePanelGeometry.m

function [panel, Vol] = DeterminePanelGeometry(inputgeo, figs)

% find coordinates for horseshoe vortices and control points and plot % Glider-Fixed coordinate system:

% x: forward along fuselage axis % y: out starboard wing

% z: down

% Local Profile coordinate system:

% x: along chord from leading edge toward trailing edge % z: up

plot_on = 1;

%% constants

halfSpan=inputgeo.b/2; % half wingspan

sweep=inputgeo.sweep; % wing sweep angle in radians

dihedral=inputgeo.dih; %dihedral angle in radians

nc=inputgeo.nc; %number of panels on camber line, upper and lower surfaces

ns = inputgeo.ns; % number of span segments per side

M = inputgeo.M; %Freestream mach number

beta = sqrt(1-M^2); %Prandtl-Glauert correction %% Root Airfoil data

y=0; % span station

chord=inputgeo.c_r; % chord length

alphaRoot=inputgeo.i_r; % geometric angle of incidence at root in radians % call function

[Croot,Troot,Aroot]=NacaCoord(inputgeo.root,y,nc); % Croot = nondimensional camber line, Troot = nondimensional surface;

%Croot coordinates = [x location in fraction chord, y location in fraction % chord, z location in fraction chord]

%Troot coordinates = [x location in fraction chord, y location in fraction % chord, z location in fraction chord]

%% Scale to chord length

Croot(:,1)=chord*Croot(:,1);Croot(:,3)=chord*Croot(:,3); Troot(:,1)=chord*Troot(:,1);Troot(:,3)=chord*Troot(:,3); Aroot=Aroot*chord^2;

%Calculate slope of camber line for each panel at the root %Calculate the chord along each elemental panel

dzdxRoot = zeros(1,nc); ccRoot = zeros(1,nc);

if nc == 1 %If there is only one chordwise element

i=1;

dzdxRoot(i)=-(Croot(i+1,3)-Croot(i,3))/(Croot(i+1,1)-Croot(i,1)); ccRoot(i)=0.75*(Croot(i+1,1)-Croot(i,1));

else %if there are more than one chordwise elements

for i=1:nc dzdxRoot(i)=(Croot(i+1,3)-Croot(i,3))/(Croot(i+1,1)-Croot(i,1)); if i==nc ccRoot(i)=0.75*(Croot(i+1,1)-Croot(i,1)); else ccRoot(i)=0.75*(Croot(i+1,1)-Croot(i,1))+0.25*(Croot(i+2,1)-Croot(i+1,1)); end end end if plot_on axes(figs.root); cla;

plot(Croot(:,1)*-3.2808,Croot(:,3)*-3.2808,'r') %Convert to feet; plot with z-axis positive up and x-axis to the left

plot(Troot(:,1)*-3.2808,Troot(:,3)*-3.2808,'b') %Convert to feet; plot with z-axis positive up and x-axis to the left

axis equal

title('Root airfoil')

end

%% Tip Airfoil data

y=-halfSpan; % span station; left wing

chord=inputgeo.taper*inputgeo.c_r; % chord length

alphaTip=inputgeo.i_r+inputgeo.twist; % geometric angle of incidence at tip in radians %call function

[Ctip,Ttip,Atip]=NacaCoord(inputgeo.tip,y,nc);

%% scale to chord length

Ctip(:,1)=chord*Ctip(:,1);Ctip(:,3)=chord*Ctip(:,3); Ttip(:,1)=chord*Ttip(:,1);Ttip(:,3)=chord*Ttip(:,3); Atip=Atip*chord^2;

%Calculate slope of camber line for each panel at the tip %Calculate the chord along each elemental panel

dzdxTip = zeros(1,nc); ccTip = zeros(1,nc);

if nc == 1 %If there is only one chordwise element

dzdxTip(i)=-(Ctip(i+1,3)-Ctip(i,3))/(Ctip(i+1,1)-Ctip(i,1)); ccTip(i)=0.75*(Ctip(i+1,1)-Ctip(i,1));

else %if there are more than one chordwise elements

for i=1:nc dzdxTip(i)=(Ctip(i+1,3)-Ctip(i,3))/(Ctip(i+1,1)-Ctip(i,1)); if i==nc ccTip(i)=0.75*(Ctip(i+1,1)-Ctip(i,1)); else ccTip(i)=0.75*(Ctip(i+1,1)-Ctip(i,1))+0.25*(Ctip(i+2,1)-Ctip(i+1,1)); end end end if plot_on axes(figs.tip); cla;

plot(Ctip(:,1)*-3.2808,Ctip(:,3)*-3.2808,'r') %Convert to feet; plot with z-axis positive up and x-axis to the left

hold on

plot(Ttip(:,1)*-3.2808,Ttip(:,3)*-3.2808,'b') %Convert to feet; plot with z-axis positive up and x-axis to the left

axis equal

title('Tip airfoil')

end

%% Root: Transform to Glider-Fixed Coordinate System: % skin:

%Skin(number of spanwise sections, number of chordwise sections, coordinates in 3 dimensions (x,y,z))

Skin(1,1:2*nc+1,1:3) = Troot*[cos(alphaRoot) 0 sin(alphaRoot); 0 1 0; -sin(alphaRoot) 0 cos(alphaRoot)];

% Mean camber line:

Camber(1,1:nc+1,1:3) = Croot*[cos(alphaRoot) 0 sin(alphaRoot); 0 1 0; -sin(alphaRoot) 0 cos(alphaRoot)];

%% Tip: Transform to Glider-Fixed Coordinate System: % sweep and dihedral

% Negative sign occurs because local axes are opposite to global

xLETip = -halfSpan*(tan(sweep));% x coordinate of Leading Edge at Tip

zLETip = -halfSpan*(tan(dihedral));% z coordinate of Leading Edge at Tip % Skin:

LETip=ones(2*nc+1,1)*[xLETip 0 zLETip];

Skin(ns+1,1:2*nc+1,1:3) = Ttip*[cos(alphaTip) 0 sin(alphaTip); 0 1 0; -sin(alphaTip) 0 cos(alphaTip)]+LETip;

% Mean camber line

LETip=ones(nc+1,1)*[xLETip 0 zLETip];

Camber(ns+1,1:nc+1,1:3) = Ctip*[cos(alphaTip) 0 sin(alphaTip); 0 1 0; -sin(alphaTip) 0 cos(alphaTip)]+LETip;

for i=1:nc+1 % along camber

Camber(k+1,i,:) = Camber(1,i,:)+eta*(Camber(ns+1,i,:)-Camber(1,i,:)); end

for i=1:2*nc+1 %along surface

Skin(k+1,i,:) = Skin(1,i,:)+eta*(Skin(ns+1,i,:)-Skin(1,i,:)); end

end if plot_on

%Plot wing surface

axes(figs.fig); cla; hold on; axis equal; for k=1:ns+1

plot3(Skin(k,:,1)*-3.2808,Skin(k,:,2)*3.2808,Skin(k,:,3)*-3.2808); %Convert to feet; plot with z-axis positive up and x-axis to the left

plot3(Skin(k,:,1)*-3.2808,-Skin(k,:,2)*3.2808,Skin(k,:,3)*-3.2808); %Convert to feet; plot with z-axis positive up and x-axis to the left

plot3(Camber(k,:,1)*-3.2808,Camber(k,:,2)*3.2808,Camber(k,:,3)*-3.2808,'r') %Convert to feet; plot with z-axis positive up and x-axis to the left

end for i=1:size(Skin,2) plot3(Skin(:,i,1)*-3.2808,Skin(:,i,2)*3.2808,Skin(:,i,3)*-3.2808); plot3(Skin(:,i,1)*-3.2808,-Skin(:,i,2)*3.2808,Skin(:,i,3)*-3.2808); end end

%Determine panel properties

twist = zeros(1,ns); dzdx = zeros(ns,nc); cc = zeros(ns,nc); CP = zeros(ns,nc,3); BV = zeros(ns,nc,3); BV1 = zeros(ns,nc,3); BV2 = zeros(ns,nc,3); BVhalfspan = zeros(ns,nc); sweep_c4 = zeros(ns,nc); for k = 1:ns

%Determine local twist at each panel, dz/dx at control points, and

%chord along left trailing leg of elemental panel

eta=k/(ns+1);

twist(k)=alphaRoot+eta*(alphaTip-alphaRoot); dzdx(k,:)=dzdxRoot+eta*(dzdxTip-dzdxRoot); cc(k,:)=ccRoot+eta*(ccTip-ccRoot); %Validated

%Determine control point coordinates, coordinates to center of bound

%vortex, half span of bound vortex, and quarter-chord sweep angle

for i = 1:nc CP(k,i,:)=0.5*(Camber(k,i,:)+Camber(k+1,i,:))+0.75*(0.5*(Camber(k,i+1,:)+Camber(k+1,i+1,:) )-0.5*(Camber(k,i,:)+Camber(k+1,i,:))); BV(k,i,:)=0.5*(Camber(k,i,:)+Camber(k+1,i,:))+0.25*(0.5*(Camber(k,i+1,:)+Camber(k+1,i+1,:) )-0.5*(Camber(k,i,:)+Camber(k+1,i,:)));

BV1(k,i,:)=0.75*Camber(k+1,i,:)+0.25*Camber(k+1,i+1,:); %Left bound vortex coordinate

BV2(k,i,:)=0.75*Camber(k,i,:)+0.25*Camber(k,i+1,:); %Right bound vortex coordinate

BVhalfspan(k,i)= 0.5*(0.75*norm(shiftdim(Camber(k,i,2:3)-

Camber(k+1,i,2:3)))+0.25*norm(shiftdim(Camber(k,i+1,2:3)-Camber(k+1,i+1,2:3)))); %Only consider [Y,Z] distances due to definition of halfspan in

%NASA paper; considering X distance as well makes halfspan increase

%greatly as you increase sweep and invalidates calculations

%Validated BVhalfspan calculation through (1:ns-1,1:nc)

sweep_c4(k,i)=atan((Camber(k,i,1)-Camber(k+1,i,1))/(Camber(k,i,2)- Camber(k+1,i,2))); %Validated end end %Prandtl-Glauert corrections CPprime = CP(:,:,1)/beta; BVprime = BV(:,:,1)/beta; BV1prime = BV1(:,:,1)/beta; BV2prime = BV2(:,:,1)/beta;

sweep_c4_prime = atan(tan(sweep_c4)/beta);

for k = 1:ns for i = 1:nc

panel(k,i).CP=shiftdim(CP(k,i,:)); %Removing singleton dimensions

panel(k,i).BV=shiftdim(BV(k,i,:)); %Removing singleton dimensions

panel(k,i).BV1=shiftdim(BV1(k,i,:)); %Removing singleton dimensions

panel(k,i).BV2=shiftdim(BV2(k,i,:)); %Removing singleton dimensions

panel(k,i).dzdx=dzdx(k,i); panel(k,i).twist=twist(k); panel(k,i).s=BVhalfspan(k,i); panel(k,i).sweep=sweep_c4(k,i); panel(k,i).sweepprime=sweep_c4_prime(k,i); panel(k,i).CPprime=CPprime(k,i); panel(k,i).BVprime=BVprime(k,i); panel(k,i).BV1prime=BV1prime(k,i); panel(k,i).BV2prime=BV2prime(k,i); panel(k,i).cc=cc(k,i); end end

%Determine wing volume

Vol = 1/3*(Aroot +sqrt(Aroot*Atip) + Atip)*inputgeo.b; B.2 – File DetermineProfileDrag.m

function [CD0] = DetermineProfileDrag(airfoildata,geo,panel)

%Determine the wing profile drag from the airfoils' drag polars

airfoil_r = geo.rootindex; airfoil_t = geo.tipindex;

%Root dimensions

chord_r = geo.c_r;

%Determine Reynolds number at root; using log10 because regression was %done this way

Re_r = log10(geo.Re_r);

%Convert back to degrees because the polynomial regression of the XFOIL %drag data is in terms of degrees

alpha_r = (geo.i_r + geo.alpha)*180/pi;

b = cell2mat(airfoildata{2}(airfoil_r)); %Load the coefficients

c = cell2mat(airfoildata{3}(airfoil_r)); d = cell2mat(airfoildata{4}(airfoil_r)); k = cell2mat(airfoildata{5}(airfoil_r)); cd0_r = b(1) + b(2)*Re_r + b(3)*Re_r^2; cd1_r = c(1) + c(2)*Re_r + c(3)*Re_r^2; cd2_r = d(1) + d(2)*Re_r + d(3)*Re_r^2;

alpha_stall_r = k(1) + k(2)*Re_r + k(3)*Re_r^2;

%Test to see if airfoil is past stall angle of attack

if alpha_r > alpha_stall_r cd2_r = 2*cd2_r;

%Double the last coefficient to account for the large increase in drag

%past stall

end

%Tip dimensions

chord_t = geo.c_r*geo.taper;

%Determine Reynolds number at tip, use log10 because performed regression %using log10

Re_t = log10(geo.Re_t);

%Convert back to degrees because the polynomial regression of the XFOIL %drag data is in terms of degrees

alpha_t = (geo.i_r + geo.twist + geo.alpha)*180/pi;

b = cell2mat(airfoildata{2}(airfoil_t)); %Load the coefficients

c = cell2mat(airfoildata{3}(airfoil_t)); d = cell2mat(airfoildata{4}(airfoil_t)); k = cell2mat(airfoildata{5}(airfoil_t)); cd0_t = b(1) + b(2)*Re_t + b(3)*Re_t^2;

%Test to see if airfoil is past stall angle of attack

if alpha_t > alpha_stall_t cd2_t = 2*cd2_t;

%Double the last coefficient to account for the large increase in drag

%past stall

end

%eta represents the fraction from 0 to 1 at the center of the panel where 0 %corresponds to y = 0 and 1 corresponds to y = b

eta = (2*(1:geo.ns)-1)/(2*geo.ns); chord = chord_r + eta*(chord_t-chord_r); alpha = alpha_r + eta*(alpha_t-alpha_r); cd0 = cd0_r + eta*(cd0_t-cd0_r);

cd1 = cd1_r + eta*(cd1_t-cd1_r); cd2 = cd2_r + eta*(cd2_t-cd2_r); Deltay = zeros(1,geo.ns);

for i = 1:geo.ns

Deltay(i) = panel(i,1).BV2(2) - panel(i,1).BV1(2);

end

D_q = (cd0 + cd1.*alpha + cd2.*alpha.^2).*chord.*Deltay; CD0 = 2*sum(D_q,2)/geo.S;

B.3 – File FinalOutput.m

function [] = FinalOutput(CL, CDi, CD0, y_cp, geo, WingVolume, airfoildata, output)

% calculate score and other outputs, post to the GUI

q = 1/2*geo.density*geo.V^2;

%Determine the stall angles of attack for root and tip airfoils

alpha_r = (geo.i_r + geo.alpha)*180/pi; chord_r = geo.c_r;

thick_r = str2num(geo.root(end-1:end)); %Determine thickness of root airfoil

Re_r = geo.V*geo.density*chord_r/geo.visc; k = cell2mat(airfoildata{5}(geo.rootindex));

alpha_stall_r = k(1) + k(2)*log10(Re_r) + k(3)*log10(Re_r)^2; alpha_t = (geo.i_r + geo.twist + geo.alpha)*180/pi;

chord_t = geo.c_r*geo.taper;

thick_t = str2num(geo.tip(end-1:end)); %#ok<ST2NM> %Determine thickness of tip airfoil

Re_t = geo.V*geo.density*chord_t/geo.visc; k = cell2mat(airfoildata{5}(geo.tipindex));

alpha_stall_t = k(1) + k(2)*log10(Re_t) + k(3)*log10(Re_t)^2; eta = (2*(1:geo.ns)-1)/(2*geo.ns);

chord = chord_r + eta*(chord_t-chord_r); alpha = alpha_r + eta*(alpha_t-alpha_r);

alpha_stall = alpha_stall_r + eta*(alpha_stall_t-alpha_stall_r); thick = thick_r + eta*(thick_t-thick_r);

counter = 0; %Tracks the number of panels that are stalled

percentstalled = 0; %Tracks percentage of wing that is stalled

Documenti correlati