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
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 2
Į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. 3
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 4
š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 5
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. 6
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 7
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 8
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ė Y nauja 2*( 3) ( 4) 6 4 2. 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 9
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 10
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ą ]. 7 pav. Kryptis į trečia tašką 6 pav. Kryptis į kiekvieną 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 11
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 yb ya Pasukimo kampas visada skaičiuojamas arktangentu, tokia formule: arctan( ) x x galimos kelios lėktuvo skrydţio kryptis, todėl gautą kampą gali reikėti modifikuoti. B A. yra 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 todėl lėktuvą uţtenka pasukti tik kampu. Šie abu atvejai yra tuomet, kai xb x A. visada gaunasi teigiamas, 9 pav. Skrydimo kryptys 12
Kitu atveju, kai xb x A [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 sutampa. reikia pridėti 180º, tuomet lėktuvo ir vektoriaus kryptys 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. 13
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ų. 14
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 15
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){ 16
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 17
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(); 18