Naprendszer szimuláció – megvalósítás Java nyelven

Naprendszer szimulációt terveztünk és valósítottunk meg Java nyelven, amit három részből álló blog bejegyzés sorozatban mutatunk be (ez a 3. rész):

A Naprendszer szimuláció megvalósítása Java nyelven

Fejlesztőeszközként a Java Swinges projekthez a JDK+JRE aktuális verziót támogató NetBeans IDE-t használtuk. Hibakeresés során, a modell adatainak ellenőrzését és a működés helyességének egyszerű tesztelését, debuggolást konzolra történő szöveges kiírással oldottuk meg. A megvalósítás során az előre megtervezett osztálydiagramok alapján készült el Java nyelven a forráskód. Az MVC modell szerint elkülönített programrészek külön csomagokba kerültek, ezzel is kiemelve a funkciók szerinti szétválasztást – eleget téve a terv követelményeinek.

Részlet a Java forráskódból

Megmutatjuk a Java forráskódnak azt a részét, ami megvalósítja az elméleti háttérnél ismertetett transzformációs mátrix alkalmazását X tengely körüli elforgatásra, a nézőponttól való távolság függvényében az égitest látható méretének kiszámítását, valamint a 3D→2D leképezést.

A teljes és megjegyzésekkel ellátott forráskód ILIAS e-learning tananyagban hozzáférhető, letölthető, tesztelhető tanfolyamaink résztvevői számára.

Az elkészült Java Swinges alkalmazás felhasználói felülete

Tapasztalatok

  • A Java nyelv erősen típusos, így a kötelező és sok lebegőpontos/egész átalakítás miatt észrevehető, hogy a legkisebb égitest (Hold) kissé ugrál.
  • Az OO szempontból szép Java megvalósítás könnyen módosítható és bővíthető, a funkciók jól csoportosítottak, a felelősségi kör egyértelműen meghatározott.
  • A projekt megtervezéséhez és elkészítéséhez magasabb szintű absztrakciós készség szükséges.
  • A példaprogram alkalmas a különböző szakterületek, témakörök (matematika – lineáris algebra, fizika, számítógépes grafika, virtuális valóság modellezése) közötti kapcsolatok felismertetésére, megerősítésére, a (legalább részben) egymásra épülések felderítésére.
  • A ter­v átgondolásával, implementálásával gyors, látványos eredmény érhető el, a sikerélmény hamar jelentkezik.

Továbbfejlesztési lehetőségek

  • Célszerű ötlet a hardveres gyorsítás és 3D megjelenítés megvalósítása.
  • Felkínálható lenne a felhasználó számára több paraméter módosítása.
  • Az égitestek lehetnének textúrázhatók is.
  • Az égitestek pozíciója kiinduló helyzetben lehetne valós.
  • A szimuláció szükség esetén lehetne elindítható, leállítható, újraindítható, gyorsítható, lassítható.
  • A terv könnyen implementálható lehet Java3D techno­lógia alkalmazásával, illetve DirectX és/vagy OpenGL támogatással is.
  • Az égitestek pozíciója és mozgása demonstrálhatna/modellezhetne nevezetes együttállást is, külön esettanulmányként.
  • A program paraméterezhető lehetne konfigurációs fájlból (amelynek formátuma tetszőleges: INI, XML).
  • Fejlettebb matematikai modell is alkalmazható lenne.

Forrás

  • Friedel, A.; Kaczur, S. (előadó: Friedel, A.): Naprendszer szimuláció a Virtuális valóság modellezése tantárgyban, Informatika Korszerű Technikái Konferencia, Dunaújváros, Dunaújvárosi Főiskola, 2012. november 16-17. (előadás hazai konferencián)
  • Friedel, A.; Kaczur, S.: Naprendszer szimuláció a Virtuális valóság modellezése tantárgyban, Cserny, L.; Hadaricsné Dudás, N.; Nagy, B. (szerk): Dunakavics Könyvek 2. – Az Informatika Korszerű Technikái, Dunaújvárosi Főiskola, Új Mandátum Könyvkiadó, 2014, ISBN 978 963 287 069 4, ISSN 2064-3837, p. 72-84 (magyar nyelvű szakcikk)

Naprendszer szimuláció – objektumorientált tervezés

Naprendszer szimulációt terveztünk és valósítottunk meg Java nyelven, amit három részből álló blog bejegyzés sorozatban mutatunk be (ez a 2. rész):

A Naprendszer szimuláció objektumorientált tervezése

A Naprendszer égitestjeinek ábrázolása a valódi világban előforduló méretük és távolságuk szerint történik azért, hogy a szimuláció stabil legyen. A példában a Nap és a három belső bolygó szerepel, valamint a Hold. Utóbbi igazolja, hogy nem csak Nap középpontú égitestekre működőképes a modell. A szimuláció diszkrét lépések véges sorozataként valósul meg, az egyes lépések között az égitestek a virtuális térben egyenes vonalú egyenletes mozgást végeznek. Olyan lépésközt kell választani, amely rövid idő alatt kellően nagy változást képes bemutatni, ilyen például az 1 számítási ciklus / 1 nap érték. 10 képkocka / másodperces megjelenítést feltételezve – melyet egy időzítő biztosít – egy virtuális év kb. 37 másodperc alatt telik el, vagyis a Föld ennyi idő alatt tesz meg egy teljes fordulatot a Nap körül. Az égitestek kezdő pozíciója fiktív, nem függ konkrét dátumtól, együttállástól, méretük a jobb láthatóság érdekében torzított.

A program indításakor a szimuláció automatikusan indul, és nincs lehetőség a leállításra. Az alkalmazás felületének tetején foglalnak helyet a kezelő nyomógombok, a többi részt a megjelenítés/transzformált modelltér tölti ki. Futás közben – egyszerű ese­mény­ke­zelést megvalósítva – lehet változtatni a méretarányt és a nézőpontot, így az ekliptika síkját felülről és elbillentve is ábrázolhatjuk.

Kivételkezelés nem szükséges a programhoz, mert ez egy önálló demonstrációs eszköz, nem épül rá több elem, nem érhetőek el a szolgáltatásai külső programok számára.

Meghatározott cél és a szempontok: a Java projektben a csomagokat az MVC szerint hozzuk létre, a funkciókat logikusan osszuk szét, csoportosítsuk, tartsuk be az objektumorientált szemléletmód elveit, használjunk interfészt, biztosítsuk az egység­bezárást, legyen öröklődés, alkalmazzuk a polimorfizmust, legyen szép és elegáns megoldás, legyen a jelölésrendszer UML osztálydiagram. Mindez grafikus asztali Java alkalmazásként valósuljon meg.

A modell csomag (M – Model)

A modellhez 1 interfész és 5 osztály tartozik:


Az AdatInterfesz tárolja a modell számításhoz és megjelenítéshez tartozó konstansait (ezek a szimuláció paraméterei), és metódusfejet nem tartalmaz. A Pont2D osztály egy kétdimenziós pont sémája, valós x és y koordinátapárral, eltol() és túlterhelt tavolsag() metódusokkal. Ennek leszármazottja a Pont3D osztály, amely mindezt három dimenzióban biztosítja, valamint pozícióként és sebességvektorként is használható. Az Egitest osztályból létrehozott objektumnak van mérete, pozíciója, sebessége, színe és tömege. Az interfészt implementálja az Adattar osztály, amelynek egitestLista nevű generikus listája elérhetővé és egységesen kezel­hetővé teszi a tervben felsorolt 5 égitestet. A ZIndex osztályú objektumok az égitestek kirajzolásakor szükséges mélységpufferbeli adatot képesek kezelni.

A nézet csomag (V – View)

A nézet 2 osztályból áll:


Az Ablak osztály egy javax.swing.JFrame le­szár­mazott, az alkalmazás teljes grafikus felületét biztosítja, valamint előkészíti az eseménykezelést. Tartalompanelje négy vezérlő nyomógombot tartalmaz és rajta található a rajzpanel objektum, a vaszon. A RajzPanel osztály egy javax.swing.JPanel leszármazott, amely kapcsolatban áll az adattárral, és kezeli a mélységpuffert. Ez felel a szimulált 3D térben lévő objektumok 2D-beli leképezéséért, figyelembe véve a nézőpont elmozdulását is. A rajzolást a felüldefiniált (öröklődés) paintComponent() metódus végzi el.

Az Ablak osztályú objektum elsődleges szerepet tölt be a megjelenítésben, keretbe foglalva a látható komponenseket, vagyis a kezelő nyomógombokat és a modellteret. Az objektum megvalósít egy ActionListener eseménykezelőt, így a program reagálni tud a felhasználó által kiváltott eseményekre. Az ablakobjektum nagyítás és forgatás üzenetek küldésével saját vásznát – és csak azt – frissíti.

A vezérlő csomag (C – Controller)

A vezérlőt 2 osztály valósítja meg:

A Main osztály összefogja a projektet, ez a végrehajtás belépési pontja. Szükség szerint átadja az MVC szerinti objektumok referenciáit egymásnak, ezzel biztosítva a kommunikációt közöttük, valamint el is indítja a szimulációt. A Logika osztály képes az égitestek gyorsulásának és vonzásának kiszámítására, az égitestek mozgatására, továbbá a megjelenítésért felelős komponenst megfelelő időközönként értesíti a képernyő frissítésének szükségességéről, ami az alapbeállítás szerint 30 frissítés másod­percenként.

Naprendszer szimuláció – elméleti háttér

Naprendszer szimulációt terveztünk és valósítottunk meg Java nyelven, amit három részből álló blog bejegyzés sorozatban mutatunk be (ez az 1. rész):

A Naprendszer szimuláció elméleti háttere

A Naprendszer szimulációhoz elengedhetetlen, hogy ismerjük a homogén koordinátákat, az elemi műveletek egységes megvalósításához szükséges transzformációs mátrixokat, a tömegvonzás elvét és az implementációhoz szükséges MVC modellt.

Homogén koordináták

Számítógépes algoritmusokkal egyszerű a térbeli transzformáció megvalósítása, ha homogén koordinátákat használunk. Segítségükkel az affin transzformációk egységesen kezelhetők. A cél egy egységes matematikai formalizmus alkalmazása. A pontok az égitestek középpontjait fogják jelölni. Legyen a P pont 3D-beli koordinátái: P=(x, y, z). Szükséges egy konstans érték. Ha w≠0, akkor a P pont koordinátái: P=(w·x, w·y, w·z, w). Ha w=1, akkor a P pont normalizált homogén koordinátái: P=(x, y, z, 1). A pontnégyes kijelölése kölcsönösen egyértelmű.

Transzformációk

Koordináta transzformáció során az ábrázolandó grafikus objektum pontjaihoz (tárgypontokhoz) új koordináta-rendszert rendelünk hozzá. Az objektum nem változik (nem torzul, nem változtatja meg az alakját), csupán a nézőpont változik meg. Például: a koordináta-rendszer eltolása, elforgatása, a koordinátatengelyek felcserélése, tükrözése, és a léptékváltás (nagyítás, kicsinyítés, összenyomás, széthúzás), elforgatjuk az ekliptika síkját a szimulált Naprendszerben.

Pont transzformáció esetén a tárgypontokhoz hozzárendeljük azok egy adott szempont szerinti hasonmását. Például: 3D-s tárgyak leképezése 2D-s képre, objektumok eltolása, forgatása, mozgatása, égitestek mozgatása tömegvonzás alapján. Affin transzformációk (egybevágósági és hasonlósági transzformációk) alkalmazása esetén pont képe pont, szakasz képe szakasz, felület képe felület, valamint metsző térelemek eredeti metszésvonala megegyezik azok leképezett metszésvonalával.

A számítógépes grafika területén az affin transzformációk általános alakja (mátrixosan):

A pont a B=(bx, by, bz) vektorral eltolható. A pont – a T=(t11, t12, …, t33) mátrixot használva – adott szöggel elforgatható, skálázható, tükrözhető. A számítógépes grafikában ezt a transzformációs mátrixot a homogén koordinátákkal alkalmazva, az összes geometriai transzformáció hatékonyan megvalósítható, visszavezethető mátrixok szorzására. Mindezt saját magunk is implementálhatjuk, de része a DirectX és OpenGL rendering pipeline-jának is.

Más módon is lehetne: egyenes és ehhez tartozó szög párossal is dolgozhatnánk.

A tömegvonzás elve

A tömegvonzás bármely két égitest között meghatározott, függ a gravitációs állandótól és az égitestek tömegétől egyenes arányban, az égitestek (tömeg)középpontjainak távolságától fordított arányban. Ez a Newton szerinti értelmezés, amelynek képlete:

A hatás-ellenhatás törvénye miatt a vonzás – egymás felé való gyorsulás – kölcsönös, a gyorsulás az égitestek tömegével fordítottan arányos, sosem nulla. A Naprendszerben a bolygók a Nap körül keringenek, és a bolygóknak lehetnek holdjaik. Egységesen kezelve: égitestek.

A tömegvonzásnak más elméleti megközelítései is vannak: Einstein gödör-modellje, Kepler törvényei, illetve differenciál-egyenletrendszer, integrálszámítás is használható a közelítő képlet helyett (csak ideális modell esetén pontszerű az égitest és gömbszimmetrikus azok tömegeloszlása), illetve ismeretes többféle értelmezés a rendszer/modell stabilitására: Lagrange pontok, Lyapunov stabilitás.

Az MVC modell

A klasszikus megközelítés szerint a szoftveres alkalmazások három, egymástól jól elkülöníthető szereppel rendelkező egységből állnak: modell (model), nézet (view), vezérlő (controller). A Java nyelv Swing komponensei az MVC architektúra szerint működnek.

A vezérlő reagál az érkező eseményre, hozzáfér a modell adatszerkezeteihez, azaz igénybe veszi a modell szolgáltatásait, valamint frissítheti a nézetet. A nézet a vezérlő frissítési kérésére a közvetlenül megkapott adatok alapján, vagy a modelltől elkért adatok alapján frissíti saját magát. A vezérlő határozza meg az alkalmazás, komponens, program működését. Egy modellt több nézet is használhat. A modell közvetlenül is üzenheti a nézetnek, hogy megváltozott. A nézet adja a látványt, amelyet angolul skin vagy „look and feel”-nek neveznek.

FIRST® LEGO® League robot verseny 2018

First Lego League

First Lego LeagueA Nemzetközi LEGO® Robot versenyek azért jöttek létre, hogy a segítsék/erősítsék a műszaki, természettudományos és informatikai kompetenciák fejlesztésén túl a kooperatív csoportmunkát, a problémamegoldásra orientáló komplex gondolkodásmódot. A hazai oktatási rendszerben ezek az összetevők is egyre hangsúlyosabban jelennek meg. A Magyarországon is „játszható” nemzetközi versenyek közül kiemelkedik két verseny: a FIRST® LEGO® League (FLL) és a World Robot Olympiad™ (WRO).

2018. december 15-én FLL bíróként részt vettem az Edutus Egyetem által – már sokadik alkalommal – megrendezett FLL robotika verseny tatabányai regionális fordulóján. 3 fős zsűri tagjaként a feladatom a versenyre elkészült kutatási projektek értékelése volt.

FIRST® LEGO® League robot verseny 2018

Az FLL verseny 1998-ban indult, melyen 70 országból, mintegy 30 000 csapat vesz részt évente. Magyarország a Central Europe régióban vesz részt, ahol kb. 800-900 csapat mérkőzik meg egymással. Egy csapat 3-10 főből áll, választott csapatvezetőjük van és mindannyian 9-16 év közötti tanulók.

FIRST® LEGO® League robot verseny 2018

Minden évben van egy központi témája a versenynek, ami két szálon fut:

  • Kutatási projekt: a kutatási feladat témáját megismerve a csapatok egy problémát keresnek, amelyre az életkoruknak megfelelő megoldást kell adniuk és tevékenységükről 5 perces prezentációban számolnak be a versenyen. A zsűri értékeli a kutatási projekt megvalósítása során a probléma azonosítását, elemzését, a meglévő megoldások áttekintését, a csapat megoldását, a megjelenő innovációt, a prototípust, a prezentáció felépítését, hatékonyságát, eredetiségét, a csoportmunkát. Letölthető a 2018-as kutatási feladat leírása.
  • Robotika: egy kb. 3 m2-es akadálypályán tűznek ki 10-15 megoldandó feladatot, amelyre a csapatnak robotot kell tervezni, építeni és programozni. A robotnak 2,5 perc alatt kell önállóan, a programja által vezérelve megoldania a feladatokat. Az akadálypálya egységes, minden évben központilag készítik el. A feladatok teljesen probléma centrikusak, a csapat találja ki, hogyan oldja meg, nincs abszolút jó megoldás. A verseny során a robotot át lehet építeni, és csak a pálya kijelölt területén lehet kézzel hozzáérni. A zsűri értékeli a robot dizájnt, amely a megépített konstrukció ötletességét, hatékonyságát, valamint a programok forráskódjainak működését jelenti. Külön feladat alapján értékelik a csapatmunkát is. A nemzeti fordulókból a legjobbak jutnak tovább a nemzetközi fordulókba. Letölthető a 2018-as robotverseny feladat leírása.

A 2018-as verseny során az INTO ORBIT nevű projektet kellett megvalósítani, amelyben a csapatnak azonosítania kellett egy olyan fizikai vagy társadalmi problémát, amellyel szembe kell néznie az embereknek egy hosszú távú űrutazás során a naprendszerünkön belül, és javaslato(ka)t kellett tenniük a megoldására. A korábbi évek projekt témakörei is, illetve korábbi események hírei is elérhetők: Edutus 2017, Debrecen 2018, valamint nemzetközi és hazai robotversenyek általában.

FIRST® LEGO® League robot verseny 2018

FIRST® LEGO® League robot verseny 2018

A verseny teljes dokumentációja, specifikációja több száz oldal angol nyelven és részben nonverbálisan elérhető anyagból áll és évről-évre változnak a konkrétumok, de a koncepció (alapértékek: discovery, innovation, impact, inclusion, teamwork, fun) állandó. A 2018-as robotverseny akadálypálya megépítve így nézett ki:

FIRST® LEGO® League robot verseny 2018

FIRST® LEGO® League robot verseny 2018

5 csapat mérkőzött meg egymással: Refisek, RoboGo_5vos, Maros Robo Team, legÓÁG, FrankaRobotics. A kutatási projektben többféle megközelítést alkalmaztak. Volt, ahol a technológiai, informatikai eszközorientált, kommunikációs problémák, fiziológiai szükségletek domináltak, máshol inkább perspektivikusabb társadalmi, szociológiai aspektusok és a fenntarthatóság kerültek előtérbe. Három csapat igazán kiemelkedett a délelőtti zsűri előtti fordulóban prezentációjukkal és kaptak sok-sok ötletet, javaslatot. Ők délután még egyszer megtartották előadásaikat, immár a teljes – kb. 120 fős tanulókból, felkészítő tanáraikból, szülőkből, testvérekből álló – közönség előtt. Szeretném kiemelni, hogy – miközben több szálon is futottak az egész napos rendezvényen az események – a TOP 3 csapat tagjai kiegészítették, átdolgozták délutánra a délelőtti prezentációikat és figyelembe vették a kapott ötleteket, javaslatokat. Egy markáns példa: a Plútóra küldött expedíció vezetője délelőtt még erősen autokratikus diktátor politikusként jelent meg, de délutánra már inkább emberközpontú spirituális vezetővé szelídült.

Örülök, hogy részt vehettem az FLL 2018 versenyen. Tartalmasnak bizonyult ez a nap. A szervezés nagyon profi volt. Legközelebb is szívesen csatlakozom.