lėktuvo trajektorijos vizualizavimas matlab...
Post on 02-Nov-2018
218 Views
Preview:
TRANSCRIPT
VILNIAUS UNIVERSITETAS
MATEMATIKOS IR INFORMATIKOS FAKULTETAS
PROGRAMŲ SISTEMŲ KATEDRA
Lėktuvo trajektorijos vizualizavimas MATLAB sistemoje
Aeroplane path visualization using MATALB system
Kursinis darbas
Atliko: 3 kurso, 2 grupės studentas
Domantas Nuobara (parašas)
Darbo vadovas: doc. Kristina Lapin (parašas)
Vilnius - 2010
2
Turinys
Įvadas ..................................................................................................................................... 3
1. Virtualaus pasaulio pritaikymas Pescaros oro uostui .................................................... 4
1.1. SKY-Scanner projektas ............................................................................................. 4
1.2. Sukruto virtualaus pasaulio nagrinėjimas .................................................................. 4
1.3. Skrydţių trajektorijų vaizdavimas virtualiame pasaulyje .......................................... 4
1.4. Idealios trajektorijos atvaizdavimas .......................................................................... 5
1.5. Ovalų koordinačių nustatymas .................................................................................. 5
1.6. Iškilusi problema su ovalų koordinatėmis ................................................................. 6
2. MATLAB ir VRML suderinamumas ............................................................................ 7
2.1. MATLAB ir VRML koordinačių sistemos ............................................................... 7
2.2. Skrydţių trajektorijų koordinačių keitimas ............................................................... 8
3. Lėktuvų skrydţių trajektorijų vaizdavimas virtualiame pasaulyje .............................. 10
3.1. Trajektorijų atvaizdavimas ...................................................................................... 10
3.2. Skrydţių trajektorijų koordinatės ............................................................................ 10
3.3. Lėktuvo sukimas virtualioje erdvėje........................................................................ 10
3.4. Lėktuvo pasukimo kampo nustatymas .................................................................... 11
3.5. Lėktuvo pasukimo kampo apskaičiavimas .............................................................. 12
Išvados ................................................................................................................................. 14
Naudotų šaltinių sąrašas ....................................................................................................... 15
Priedai .................................................................................................................................. 16
3
Įvadas
Pasirodţius naujiems matavimo prietaisams - lidarams (LIDARs – Light Detection And
Ranging systems) atsirado galimybė matavimus atlikti daug tiksliau negu naudojant radarus.
Projekte SKY-Scanner yra siekiama sukurti sistemą, padedančią oro uosto dispečeriui priimti
sprendimą. Nors lidarų išmatuoti duomenys yra šimtus kartų tikslesni nei radarų duomenys,
tačiau jie matavimus atlieka tik tuomet kai yra tiksliai nutaikyti į objektą. Be to, esant blogoms
oro sąlygomis (pvz.: rūkui, lyjant lietui ar sningant) lidarai neveikia, todėl juos galima naudoti
tik kaip pagalbinę priemonę tikslinant lėktuvo padėtį, kai radaras jau yra uţfiksavęs kurioje
padėtyje yra lėktuvas. Sistema turi būti tokia, kad jai pateikus lidarų ir radarų duomenis,
išvestyje būtų galimos rizikingos situacijos tikimybė bei patikslinta lėktuvo padėtis.
Italijoje, Pescaros mieste yra oro uostas, kuriam kuriama sprendimų priėmimo sistema
SKY-Scanner. Siekiant stebėti skrydţius, išanalizuoti jų duomenis, numatyti galimas problemas,
reikia tam tikro būdo skrydţiams atvaizduoti. Suprantamiausias ir realistiškiausias būdas
atvaizduoti lėktuvo skrydį – naudojant virtualią aplinką. Šio darbo tikslas – sukurti virtualią
aplinką (virtualų pasaulį), kurioje, pagal pateiktus skrydţių duomenis – koordinates, vaizduojami
įvykę skrydţiai ir būtų galima nustatyti ar lėktuvas skrenda nenukrypdamas nuo nustatytos
skrydţio trajektorijos.
4
1. Virtualaus pasaulio pritaikymas Pescaros oro uostui
1.1. SKY-Scanner projektas
Šis projektas vykdomas ne pirmus metus – dalis jo jau padaryta ir yra plėtojama.
Sprendimo priėmimo sistema yra kuriama Pescaros oro uostui, tačiau nėra pateikta jokių šio oro
uosto radarų uţfiksuotų duomenų. Tam, kad projekto dalyviai galėtų sukurti tokią sistemą
reikalingi duomenys, su kuriais būtų galima atlikti testavimus. Todėl buvo pateikti kito Italijos
oro uosto – Neapolio, radarų uţfiksuoti duomenys, kuriais remiantis buvo sukurta prototipinė
sistema Neapolio oro uostui. Toliau vykdant projektą prototipas yra perdaromas ir tobulinamas
taip, kad tiktų Pescaros oro uostui. Taigi autoriui tenkanti uţduotis yra ne sukurti virtualų pasaulį
iš naujo, o esantį Neapolio oro uosto prototipą pakeisti ir pritaikyti Pescaros oro uostui.
1.2. Sukruto virtualaus pasaulio nagrinėjimas
Neapolio oro uosto prototipą kūrė Gediminas Šumskas. Neţinant kokiomis priemonėmis,
kas ir kokiu tikslu yra sukurta, būtų neįmanoma to darbo pratęsti ir tobulinti. Taigi visų pirma
reikėjo detaliai išsianalizuoti ir išsiaiškinti kaip buvo kuriamas Neapolio oro uosto virtuali
aplinka. Perskaičius Gedimino Šumsko kursinį darbą [1 priedas] buvo aišku, kad tinkamiausias
įrankis kurti virtualiam pasauliui yra 3ds MAX modeliavimui skirta programa. Įgauti pradinių
ţinių apie darbą šiuo įrankiu padėjo jame esantys vaizdo įrašai, skirti susipaţinti su
pagrindinėmis programos funkcijomis. Tokiu būdu buvo išanalizuotas sukurtas virtualus
pasaulis, jame esantys objektai ir suţinota, kad lėktuvų skrydţių vizualizavimas atliekamas ne
3ds MAX pagalba, o naudojantis MATLAB programine įranga.
1.3. Skrydžių trajektorijų vaizdavimas virtualiame pasaulyje
Pescaros, kaip ir Neapolio, oro uoste lėktuvai leidţiasi tik iš vienos nusileidimo tako pusės.
Kiekviename oro uoste yra vietą, kurią pasiekęs lėktuvas skrenda tiesiai, maţindamas skrydţio
aukštį ir greitį – atlieką nusileidimą. Norint ţinoti ar nusileidimas vyksta pagal nustatytus
standartus, virtualiame pasaulyje yra išdėstomi ovalai, pro kuriuos turi praskristi lėktuvas, jei
nėra nukrypimų nuo trajektorijos. MATLAB sistemai parašyta programa, kuriai pateikus
skrydţio trajektorijos bei ovalų koordinates, atlieka skrydţio vizualizaciją. Programa naudoja
sukurtą virtualų pasaulį – 3ds MAX modeliavimo įrankiu yra sukurtas virtualus trimatis pasaulis,
vaizduojantis Pescaros oro uostą iš viršaus, taip pat jame yra sukurtas trimatis lėktuvo objektas
bei ovalai ir išsaugotas WRL formatu. Šiuo formatu saugomas VRML (Virtual Reality
Modelling Language) kodas, kurį supranta MATLAB sistema. MATLAB sistemoje atliekamas
5
šio virtualaus pasaulio vaizdavimas ir pagal pateiktas koordinates keičiama lėktuvo padėtis
virtualioje erdvėje – nustatomos naujos lėktuvo pozicijos koordinatės ir atnaujinamas virtualus
pasaulis, kur lėktuvas jau kitoje pozicijoje. Tai vyksta pakankamai greitai, priklauso nuo
kompiuterio vykdančio programą galingumą, todėl yra nurodomas parametras p, kuris reiškia
kokią sekundės dalį reikia uţlaikyti vaizdą, prieš atnaujinat lėktuvo padėtį, t.y. jeigu parametras
p yra labai maţas, o programą vykdantis kompiuteris greitas, tuomet skrydis gali būti
atvaizduojamas labai greitai ir ţmogus nespėtų pamatyti visos trajektorijos, todėl, parenkant
tinkamą uţlaikymą, skrydis atvaizduojamas norimu greičiu.
1.4. Idealios trajektorijos atvaizdavimas
Vienas pagrindinių projekto tikslų yra skrydţių nuokrypių vaizdavimas. Pescaros oro uosto
brėţiniuose [2 naudotas šaltinis] yra paţymėtas taškas FAF (Final Aproach Fix), kuris pasako
kokiomis aplinkybėmis lėktuvas turi leistis – yra nustatyta, kad lėktuvas turi būti 2000 pėdų
aukštyje, esant 7 jūrmylių atstumui iki nusileidimo tako ir turi leistis 4,8% nuoţulnumo kampu.
Šį tašką privalo pasiekti visi atskrendantys lėktuvai ir praskridę FAF būtinai turi leistis. Taip pat,
World Areo Data internetinėje svetainėje pateikti nusileidimo tako duomenys, išsiaiškinta, kad
Pescaros nusileidimo takas yra pasuktas 218 laipsnių kampu. Taigi dabar ţinomi visi reikalingi
duomenys, norint išdėstyti ovalus, į kuriuos telpa lėktuvas ir kurie sudaro tarsi tunelį,
vaizduojantį idealią nusileidimo trajektoriją nuo taško FAF.
1 pav. Ovalai, pro kurios skrenda lėktuvas
1.5. Ovalų koordinačių nustatymas
Virtualiame pasaulyje ovalai išdėstomi statiškai – sukuriant virtualų pasaulį MATLAB
aplinkoje. Todėl turime ţinote taškų, kuriuose turi būti ovalai, koordinates. Jų apskaičiavimui
Gedimino Šumsko kursiniame darbe buvo parašyta programa, kuriai pateikus nuolydţio ir
nusileidimo tako kampus, kaip pradinius duomenis, gaunamos taškų koordinatės. Be to, galima
6
pasirinkti kas kokį atstumą ir kiek ovalų norime turėti. Kadangi yra ţinoma, kad taškas FAF yra
7 jūrmylių atstumu, o mūsų naudojamos 64 koordinatės prilygsta vienai jūrmylei, gauname
atkarpos, kurioje turi būti ovalai, ilgį lygų 448. Tarkime, kad norime išdėstyti 20 ovalų, tai
atstumas tarp jų turi būtų apie 22. Įvedę į programą tokius parametrus, gauname taškų, kuriuose
turi būti ovalai, koordinates.
1.6. Iškilusi problema su ovalų koordinatėmis
Sudėliojus ovalus, pagal sugeneruotas koordinates, buvo pastebėta, kad ovalų sudaromo
tunelio kryptis nesutampa su nusileidimo taku, t.y. pasukta kitu kampu. Padaryta išvada, kad
sugeneruojamos koordinatės yra nekorektiškos. Panagrinėjus programos, parašytos c# kalba,
kodą ir pagilinus c# programavimo kalbos ţinias, nustatyta, kad nusileidimo tako pasukimo
kampą reikia pateikti radianais, o ne laipsniais. Pakoregavus programą (2 priedas) buvo
sugeneruotos tinkamas nusileidimo takui ovalų koordinatės.
7
2. MATLAB ir VRML suderinamumas
2.1. MATLAB ir VRML koordinačių sistemos
Atliekant skrydţių trajektorijų atvaizdavimo testavimus sukurtame pasaulyje buvo
pastebėta, kad nusileidimo tako kryptis nesutampa su kryptimi, kuria leidţiasi lėktuvai. Daugiau
pasidomėjus apie VRML paaiškėjo, kad šis formatas naudoja šiek tiek kitokią koordinačių
sistemą.
2 pav. MATLAB ir VRML koordinatės
Kaip matosi iš [2 pav. MATLAB ir VRML koordinatės] VRML koordinačių sistemoje
Y ašis sukeista su Z ašimi ir dar Z ašies kryptis yra pakeista. Trimatėje erdvėje aukščiu
atvaizduoti uţtenka sukeisti Y ir Z ašis, tuomet jokių problemų neiškyla, todėl nagrinėkime tik
dvimates koordinačių sistemas.
3 pav. Vektoriaus atvaizdavimas įprastoje ir VRML koordinačių sistemose
8
Nusileidimo tako centro koordinatės yra 6012; -3422, jis pasuktas tam tikru kampu.
Nusileidimo takas pavaizduotas vektoriumi, kurio kryptis rodo į kurią pusę leidţiasi lėktuvai.
Paveikslėlyje [3 pav. Vektoriaus atvaizdavimas įprastoje ir VRML koordinačių sistemose]
atveju a) matome kaip sumodeliuojame virtualų pasaulį 3ds MAX modeliavimo įrankiu, ir
išsaugoję WRL formatu, gauname b) modelį. Kadangi modeliuojant ir išsaugant WRL formatu
pat koordinačių plokštuma nekinta, keičiasi tik ţymėjimas ant koordinačių ašių, todėl a)
nusileidimo tako centro koordinatės yra 6012; 3422, o išsaugojus WRL formatu – nusileidimo
tako centro koordinatės tokios, kokios buvo nustatytos (6012; -3422). Be to, modeliuojant
objektus yra
2.2. Skrydžių trajektorijų koordinačių keitimas
Tarkime skrydţio trajektorija yra tokia: D->C->B->A (iš taško D skrenda į tašką A, per
taškus C ir B). Paprastoje koordinačių sistemoje toks skrydis atrodytų kaip [4 pav. Trajektorijos
vaizdavimas įprastoje ir VRML koordinačių sistemose] a) variantas, bet sukurtas pasaulis yra
VRML standarto, kuriame naudojama kitokia koordinačių sistema, todėl skrydis iš taško D į
tašką A atvaizduojamas b) paveiksle. Akivaizdţiai matos simetrija X ašies atţvilgiu. Todėl reikia
modifikuoti skrydţio trajektorijos koordinates.
4 pav. Trajektorijos vaizdavimas įprastoje ir VRML koordinačių sistemose
Pirmuoju atveju lėktuvo trajektorija yra teisinga ir jis tariamai leidţiasi į nusileidimo taką,
jei BA vektorių laikysime nusileidimo taku. Antruoju atveju – nusileidimo takas lyg pasuktas -
90º laipsnių kampu. Todėl buvo mėginama visą virtualų pasaulį pasukti -90º laipsnių kampu, ir
taip skrydţio trajektorija turėtų sutapti su nusileidimo taku, bet iškilo tokia problema, kad
trajektorija tapo simetriška nusileidimo tako centrui. Taigi, problemos sprendimas buvo ne sukti
visą pasaulį kampu, o trajektoriją vaizduoti simetriškai nusileidimo takui. Paveiksle [4 pav.
Trajektorijos vaizdavimas įprastoje ir VRML koordinačių sistemose] a) raudonai
9
pavaizduota modifikuota nusileidimo trajektorija D‘->C‘->B‘->A‘. Šiame pavyzdyje nusileidimo
tako centro koordinatės yra (6; -3), kiekvienas trajektorijos taško keičiama tik Y koordinatė:
nauja Y reikšmė gaunama iš dvigubos nusileidimo tako Y reikšmės atėmus seną Y reikšmę, t.y.
šiuo atveju A taško koordinatė 2*( 3) ( 4) 6 4 2naujaY . Tokiu būdu pakeitus
kiekvieno trajektorijos taško y koordinatę, gaunama nauja trajektorija, kurią VRML atvaizduoja
taip pat [4 pav. Trajektorijos vaizdavimas įprastoje ir VRML koordinačių sistemose]
(raudona trajektorija b) dalyje), kaip ji buvo atvaizduojama prieš modifikavimą a) dalyje. Taigi
suderinamumo problemos sprendimas yra surastas – reikia modifikuoti trajektorijų koordinates,
o ne sukti virtualų pasaulį. Trajektorijų koordinačių modifikavimas atliekamas MATLAB
programoje [5 pav. Koordinačių pakeitimas]. Nusileidimo tako centro Y koordinatė yra -3422,
todėl modifikuojant trajektorijos koordinates reikia iš dvigubos nusileidimo tako centro Y
koordinatės atimti trajektorijos Y koordinatę, t.y. -6488-Y(i). Programoje atimama z koordinatė,
nes ten Y reiškia aukštį, o Z – platumą.
5 pav. Koordinačių pakeitimas
10
3. Lėktuvų skrydžių trajektorijų vaizdavimas virtualiame pasaulyje
3.1. Trajektorijų atvaizdavimas
Virtualus skrydţių trajektorijų atvaizdavimas MATLAB aplinkoje atliekamas
transformacijų principu. Keisdami virtualaus pasaulio objekto, lėktuvo, koordinates, keičiami ir
jo padėtį virtualioje erdvėje. Koordinatės pateikiamos faile, kurį nuskaito programa ir pagal jas
transformuoja lėktuvo objekto padėtį.
3.2. Skrydžių trajektorijų koordinatės
Kadangi nėra Pescaros oro uosto radarų uţfiksuotų duomenų, projekto dalyviams teko
patiems sugeneruoti tariamų skrydţių koordinates, kurias būtų galima panaudoti atliekant
testavimus.
Šią uţduotį SKY-Scanner projekte vienam dalyviui, kuris pagal Pescaros oro uosto
nusileidimo procedūras sugeneravo skrydţių be nukrypimų trajektorijų koordinates. Sugeneruoti
duomenys išsaugoti viename faile, nurodant kuriuo laiko momentu, kokio skrydţio lėktuvas
buvo tam tikroje pozicijoje. Problema buvo tame, kad pateikti duomenys nebuvo skirti šiam
virtualiam pasauliui. Šio kursinio darbo metu kuriamoje programoje vienu metu atvaizduojamas
tik vienas skrydis, todėl programai pateikti reikia taip pat tik vieno skrydţio trajektorijos
koordinates. Taigi iš pateikto kelių skrydţių duomenų failo reikėjo išskirti atskirus skrydţius ir
jų koordinates. Be to, sugeneruotų koordinačių vienetai atitiko jūrmyles, o sukurtame virtualiame
pasaulyje vieną jūrmylę atitinka 64 koordinatės. Vadinasi, sugeneruotų koordinačių failas
negalėjo būti tiesiogiai pateikiamas programai, reikėjo prieš tai duomenis apdoroti ir sutvarkyti
taip, kad atitiktų programos reikalavimus. Mėginti pačiam išrinkti kiekvieno atskiro skrydţio
koordinates, jas padauginti ir ranka surašyti atskiruose failuose uţimtų nemaţai laiko bei
atsirastų didelė tikimybė privelti klaidų, kadangi yra skrydţių trajektorijų sudarytų net iš daugiau
nei 650 taškų. Šio kursinio darbo autorius, norėdamas sutaupyti laiko ir išvengti klaidų, parašė
programą JAVA programavimo kalba, kuriai pateikus sugeneruotų duomenų failą, duomenys
apdorojami, išrenkami atskiri skrydţiai ir jų koordinatės uţrašomos atskiruose failuose. Tokiu
būdų gauta 12 failų su atskirų skrydţių trajektorijų koordinatėmis.
3.3. Lėktuvo sukimas virtualioje erdvėje
Lėktuvas yra tiesiog virtualaus pasaulio objektas, kuris juda MATLAB aplinkoje
veikiančiame pasaulyje transformuojant jo pozicijos koordinates. Tačiau lėktuvo judėjimas yra
ganėtinai statiškas, t.y. jis kaip objektas yra pasuktas tam tikru kampu ir transformuojant tik jo
11
koordinates lėktuvas lieka pasuktas tuo pačiu kampu, nesvarbu kuria kryptimi vyksta judėjimas.
Siekiant, kad skrydţio atvaizdavimas atrodytų realistiškiau nutarta padaryti, kad vaizduojant
skrydţio trajektoriją lėktuvo priekis visada būtų nukreiptas judėjimo kryptimi, kitaip tariant,
lėktuvas suktųsi pagal skrydţio kryptį. Norint tai padaryti, reikia transformuoti ne tik lėktuvo
padėtį virtualioje erdvėje, bet ir pasukti jį kaip objektą z ašimi (prisiminkime, kad VRML
skirtingai atvaizduoja koordinačių ašis) tam tikru kampu.
3.4. Lėktuvo pasukimo kampo nustatymas
Pirminiame variante buvo bandoma nustatyti pasukimo kampą imant du trajektorijos
taškus, juos sujungiant gauname vektorių. Ţinant vektoriaus kryptį, galime nustatyti kokį kampą
jis sudaro su x ašimi. Kadangi testavimo trajektorijų koordinatės yra ţinomos iš anksto, tai
vektorius gaunamas imant dabartinės lėktuvo pozicijos taško koordinates ir sekančio taško
koordinates. Tačiau koordinatės yra fiksuojamas radarų, o kaip ţinoma, radarai nėra labai tikslūs.
Nors lėktuvo trajektorija yra beveik tiesi linija, bet koordinačių taškai yra šiek tiek nukrypę į
vieną ar kitą pusę, todėl vektorių kryptys irgi yra nukreiptos šiek tiek į šonus [6 pav. Kryptis į
kiekvieną tašką]. Atvaizduojant tokiu būdų apskaičiuotus pasukimo kampus lėktuvas
skrisdamas tiesiai smarkiai sukiojosi į šonus. Taigi, norint išspręsti šią problemą ir sumaţinti
bereikalingą lėktuvo sukiojimąsi į šonus, buvo nutarta lėktuvo priekį kreipti ne į sekantį
trajektorijos tašką, o į tašką esanti uţ 3 taškų nuo dabartinio [7 pav. Kryptis į trečia tašką ].
6 pav. Kryptis į kiekvieną tašką
7 pav. Kryptis į trečia tašką
Kaip matosi iš Error! Reference source not found. ir Error! Reference source not found.,
antruoju atveju trajektorija tiesesnė, nes pasukimo kampas nustatomas iš vektoriaus AD, o ne
sukiojama keletą kartų, kaip pirmuoju atveju.
Be to, buvo dirbama su iš anksto ţinomomis skrydţio trajektorijos koordinatėmis, o realiame
pasaulyje mes radaras pastoviai fiksuoja dabartinės lėktuvo pozicijos koordinates ir negalime
tiksliai ţinoti, kokiame taške lėktuvas bus po kelių sekundţių, tą galime tik numatyti, tačiau čia jau
visai kita SKY-Scanner projekto uţduotis. Todėl buvo nuspręsta lėktuvo pasukimo kampą
skaičiuoti ţiūrint ne į tašką esantį uţ kelių taškų į priekį, bet atsiţvelgiant į dabartinį tašką ir
12
kokiame taške buvo prieš tai buvo prieš tai. Jei anksčiau lėktuvas būdavo taške A ir vektorių
brėţėm į sekantį tašką D [6 pav. Kryptis į kiekvieną tašką] ir pagal tai nustatėme kokiu kampu
turi būti pasisukęs, tai dabar traktuojame, kad lėktuvas jau yra taško D pozicijoje ir jame turi būti
pasisukęs kampu, kurį sudaro vektorius AD su x ašimi [7 pav. Kryptis į trečia tašką].
3.5. Lėktuvo pasukimo kampo apskaičiavimas
Pasukimo kampas visada skaičiuojamas arktangentu, tokia formule: arctan( )B A
B A
y y
x x . yra
galimos kelios lėktuvo skrydţio kryptis, todėl gautą kampą gali reikėti modifikuoti.
8 pav. Skrydimo kryptys
Virtualiame pasaulyje lėktuvo modelis yra nukreiptas į vakaras, t.y. lėktuvo priekis ţiūri –X
ašies kryptimi. Tarkime lėktuvas skrenda iš taško A į tašką B [8 pav. Skrydimo kryptys. Pagal
formulę, kampas atitinka CAB ir DBA kampus. Reikia atkreipti dėmesį į tai, kad a) atveju
kampas visada gaunasi neigiamas, todėl lėktuvą uţtenka pasukti kampu, kuris yra neigiamas,
ir jo kryptis sutampa su vektoriaus AB kryptimi. Atveju b) kampas visada gaunasi teigiamas,
todėl lėktuvą uţtenka pasukti tik kampu. Šie abu atvejai yra tuomet, kai B Ax x .
9 pav. Skrydimo kryptys
13
Kitu atveju, kai B Ax x [Error! Reference source not found., kampas apskaičiavus a)
gaunasi neigiamas, o b) teigiamas. Pasukus tokiu kampu lėktuvo priekis yra nukreiptas į kitą pusę
nei vektoriaus AB, todėl prie kampo reikia pridėti 180º, tuomet lėktuvo ir vektoriaus kryptys
sutampa.
Dar galimi ir tokie atvejai kai trajektorijos taškų x arba z koordinatės yra lygios. Esant tokiai
situacijai, lėktuvas skrenda arba x, arba y ašies kryptimi. Lėktuvo pasukimo kampo skaičiavimo
programoje [10 pav. Lėktuvo pasukimo kampo skaičiavimo programos kodas] yra įtrauktos
tokios sąlygos.
10 pav. Lėktuvo pasukimo kampo skaičiavimo programos kodas
Kadangi kampas visada skaičiuojamas pagal x ašį, tai darant vis kitą lėktuvo pasukimą,
reikia iš pradţių jį atsukti į pradinę padėti. Todėl yra įsimenamas kiekvienas pasukimas, programoje
kintamasis rob. Kintamasis rot yra apskaičiuotas kampas . Paveiksle paţymėta I sąlyga, kai
skrydţio trajektorijos taškų x koordinatės sutampa, o dabartinio taško y koordinatė yra didesnė uţ
prieš tai buvusio taško y koordinatę, vadinasi lėktuvas skrido tiesiai į šiaurę, todėl turi būti pasuktas
-90º kampu, kad skrydimo kryptis sutaptų su lėktuvo kryptimi. Ţenklu II paţymėta sąlyga, kai x
koordinatės sutapo, o dabartinio taško y koordinatė maţesnė uţ prieš tai buvusio taško y koordinatę,
t.y. lėktuvas skrido pietų kryptimi, todėl lėktuvo objektą reikia pasukti 90º kampu. Situacijai kai
trajektorijos taškų y koordinatės yra lygios (lėktuvas skrenda į rytus arba vakarus) atskirai nagrinėti
nereikia, kadangi skrydţio kryptis priklausytų nuo dabartinio ir prieš tai buvusio taško x
koordinačių reikšmių, o tai programoje jau yra aprašyta.
14
Išvados
Dalyvaujant SKY-Scanner projekte buvo įgyvendintas šio kursinio darbo tikslas - sukurti
virtualią Pescaros oro uosto erdvę, skirta vaizduoti lėktuvų trajektorijoms. Sukurtas virtualus
pasaulis realistiškai vaizduoja buvusius skrydţius, kadangi yra sudėti ovalai, rodantys tikslia
nusileidimo trajektoriją, galime aiškiai matyti ar lėktuvas skrenda teisinga trajektorija ar yra
nukrypimų nuo trajektorijos. Taigi tai padeda analizuoti skrydţio duomenis, nagrinėjant jų
trajektorijas.
Šio kursinio darbo įgyvendinimas reikalo įdiegti koordinačių sistemų suderinamumą tarp
VRML ir MATLAB ir išsiaiškinti kaip atrodo VRML koordinačių sistema. Padirbėjus su MATLAB
tapo aišku, jog tai puikus įrankis atlikti virtualaus pasaulio vizualizacijoms kai reikia atlikinėti
sudėtingus ar paprastus matematinius skaičiavimus ir atlikti tiriamuosius darbus. Naudojant
MATLAB būtų labai sunku sukurti galingą ir našų produktą, kadangi ji skirta primityvioms
virtualaus pasaulio simuliacijoms ir norint paleisti detalesnius virtualaus pasaulio objektus reikia
galingesnio kompiuterio, nes MATLAB reikalauja nemaţai kompiuterio resursų.
15
Naudotų šaltinių sąrašas
1. Gedimino Šumsko kursinis darbas „Trimačių aplinkų kūrimo priemonės“
2. Pescaros oro uosto eismą reguliuojančios diagramos
http://uosis.mif.vu.lt/~moroz/SKY-Scanner/Francesco-Greco.rar
3. Pescaros oro uosto nusileidimo tako duomenys
http://worldaerodata.com/wad.cgi?runway=IT0726322
4. VRML ir MATLAB koordinačių sistemos
http://www.weizmann.ac.il/matlab/toolbox/vr/ch_int15.html
16
Priedai
1 priedas. Trajektorijų koordinačių atskyrimo programa
public void convert(){ //Procedūra atliekanti visą darbą
try{
FileInputStream fstream = new FileInputStream("C:\\visi.csv"); //Nurodomas duomenų failas
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine, procedure, coords;
while ((strLine = br.readLine()) != null){ //Nuskaitome po eilutę iš duomenų failo
procedure = strLine.substring(0, 10); //Paima skrydžio pavadinimą
coords = strLine.substring(strLine.indexOf(";;;;;;;")+7); //Paima skrydžio koordinates
addTo(procedure,coords); //Su pavadinimu ir koordinatėmis kreipiasi į procedūrą addTo
}
in.close();
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
makeFile(x1, y1, z1, "ILS_S_49"); //----- Sukūriami failai koordinatėms įrašyti -----//
makeFile(x2, y2, z2, "ILS_P");
makeFile(x3, y3, z3, "ILS_S_59");
makeFile(x4, y4, z4, "ILS_STRA");
makeFile(x5, y5, z5, "VORD_P");
makeFile(x6, y6, z6, "VORD_S51");
makeFile(x7, y7, z7, "VORD_S63");
makeFile(x8, y8, z8, "VORD_STR");
makeFile(x9, y9, z9, "VOR_P");
makeFile(x10, y10, z10, "VOR_S_51");
makeFile(x11, y11, z11, "VOR_S_63");
makeFile(x12, y11, z12, "VOR_STRA"); //----- Sukūriami failai koordinatėms įrašyti -----//
}
private void addTo (String procedure, String coords){
/*
* Procedūra pagal pateiktą skrydžio pavadinimą nustato
* į kurį failą įrašyti koordinates, radus tinkamą failą
* kreipaisi į kitą procedūrą, kuri įrašo duomenis į tam
* tikro skrydžio koordinačių masyvą
*/
if (procedure.compareTo((char)34+"ILS_S_49"+(char)34) == 0){
add(x1, y1, z1, coords);
}else
if (procedure.compareTo((char)34+"ILS-P "+(char)34) == 0){
add(x2, y2, z2, coords);
}else
if (procedure.compareTo((char)34+"ILS-S-59"+(char)34) == 0){
add(x3, y3, z3, coords);
}else
if (procedure.compareTo((char)34+"ILS-STRA"+(char)34) == 0){
add(x4, y4, z4, coords);
}else
if (procedure.compareTo((char)34+"VORD-P "+(char)34) == 0){
add(x5, y5, z5, coords);
}else
if (procedure.compareTo((char)34+"VORD-S51"+(char)34) == 0){
add(x6, y6, z6, coords);
}else
if (procedure.compareTo((char)34+"VORD-S63"+(char)34) == 0){
add(x7, y7, z7, coords);
}else
if (procedure.compareTo((char)34+"VORD-STR"+(char)34) == 0){
add(x8, y8, z8, coords);
}else
if (procedure.compareTo((char)34+"VOR-P "+(char)34) == 0){
add(x9, y9, z9, coords);
}else
if (procedure.compareTo((char)34+"VOR-S-51"+(char)34) == 0){
add(x10, y10, z10, coords);
}else
if (procedure.compareTo((char)34+"VOR-S-63"+(char)34) == 0){
add(x11, y11, z11, coords);
}else
if (procedure.compareTo((char)34+"VOR-STRA"+(char)34) == 0){
17
add(x12, y12, z12, coords);
}else
System.out.println("Procedure not found!!");
}
private void add (ArrayList<String> x, ArrayList<String> y, ArrayList<String> z, String
coords){
/*
* Procedūrai pateikiami masyvai ir
* skrydžio koordinatės. Atskiria x, y, z
* koordinates ir įrašo į masyvus
*/
x.add(coords.substring(0, coords.indexOf(';')));
coords = coords.substring(coords.indexOf(';')+1);
y.add(coords.substring(0, coords.indexOf(';')));
coords = coords.substring(coords.indexOf(';')+1);
z.add(coords.substring(0, coords.indexOf(';')));
}
private void makeFile(ArrayList<String> x, ArrayList<String> y, ArrayList<String> z, String
name){
/*
* Procedūrai paduodamas koordinačių
* masyvas ir skrydžio pavadinimas.
* Sukūriamas failas, tokių pavadinimu
* ir į jį surašomos koordinatės tam tikru
* formatu, kurio reikia MATLAB programai.
*/
Iterator<String> itr;
double dbl;
try{
FileWriter fstream = new FileWriter(name + ".m");
BufferedWriter out = new BufferedWriter(fstream);
out.write("x1 = [\n");
itr = x.iterator();
while (itr.hasNext()) {
String element = itr.next();
dbl = Double.parseDouble(element) * 64;
element = Integer.toString((int)dbl);
out.write(element + "\n");
}
out.write("];\n");
out.write("z1 = [\n");
itr = y.iterator();
while (itr.hasNext()) {
String element = itr.next();
dbl = Double.parseDouble(element) * 64;
element = Integer.toString((int)dbl);
out.write(element + "\n");
}
out.write("];\n");
out.write("y1 = [\n");
itr = z.iterator();
while (itr.hasNext()) {
String element = itr.next();
dbl = Double.parseDouble(element) / 100;
element = Integer.toString((int)dbl);
out.write(element + "\n");
}
out.write("];\n");
out.close();
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
2 priedas. Ovalų koordinačių skaičiavimo programa
public static void run()
{
double alfa = 232;
while (alfa >= 180) alfa = alfa - 180;
alfa = Math.PI * alfa /180; //laipsniais ne radianais
double h_proc = 4.8; // nuolydis procentais
StreamWriter sw = new StreamWriter(@"C:\fly_plan.csv"); // sukuriamas failas, kur bus
įkeltos koordinatės
Console.WriteLine("Kas kiek išvesti?"); // kas kokį intervalą kurti koordinates
18
int periodas = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Kiek kartų išvesti?"); // kiek kartų skaičiuoti koordinates
int kartai = Convert.ToInt32(Console.ReadLine());
int l = 0;
for (int i = 0; i < kartai; i++)
{
l = l + periodas;
double y = (int)(-3422 - Math.Sin(alfa) * l); // -3422; 6012 oro uosto koordinatės
double x = (int)(6012 + Math.Cos(alfa) * l);
double h = (int)(l / 100 * h_proc);
sw.WriteLine(x + "; " + y + "; " + h + ";");
}
sw.Close();
}
}
top related