RobonAUT – Autónom robotok versenye 2020

RobonAUT kiemelt kép

RobonAUT logó2020. február 15-én 11. alkalommal került megrendezésre a 2019/2020-as tanév őszi félévében a BME Villamosmérnöki és Informatikai Kar Automatizálási és Alkalmazott Informatikai Tanszékének a gondozásában a RobonAUT – Autónom robotok versenye.

Kaló Péter és Török Barbara szoftverfejlesztő OKJ képzésben résztvevő végzős hallgatók szakmai- és élménybeszámolója következik. Mindketten nagyon jól érezték magukat a versenyen. Beszámolójukat köszönjük.

Mi is az a RobonAUT?

A 2010 óta évente megrendezett programon egy műegyetemi tárgy keretében a résztvevőknek egy autonóm robotot és vezérlését kell elkészíteniük. A feladat, hogy a robotjárművek emberi beavatkozás nélkül, minél rövidebb idő alatt teljesítsék az akadálypályákat, egy előre nem ismert ügyességi pályán, útjuk során teljesítve a legtöbb részfeladatot. Az a csapat lesz a győztes, aki gyors és pontos irányítással szereli fel robotját, így szerezve a legtöbb pontot a futamokon.

A verseny sikerét egyértelműen jelzi a hallgatók aktivitása, valamint a külvilág érdeklődése a RobonAUT iránt. A versenyen villamosmérnökök, mérnökinformatikusok és mechatronikai mérnök mesterhallgatók vehetnek részt. Csapatonként egy robotot kell készíteni. A csapatok létszáma 3 fő (indokolt esetben 2 fő).

2020-ban a csapatok között volt 7 junior és 4 senior csapat, összesen 32 versenyző indult neki a kihívásnak. A jelentkező csapatok között fellelhető a 2019-es év junior győztese, az Override, és újra jelen van az összesítettben első helyezett Faketelen Taxi, és az összesített második, a Tesla Monsters is.

A tanszék biztosít eszközöket, illetve anyagi támogatást a robot megépítéséhez:

  • 1 db autómodell,
  • 1 db processzorkártya,
  • 2 db rádiós modul,
  • 75000 Ft szabadon felhasználható költségkeret,
  • egyéb alkatrészek (vonalszenzor, motorvezérlő, Bluetooth modul).

A csapatokat tematikus szemináriumokkal készítették fel a versenyre. Ezen alkalmakon egy-egy, a verseny szempontjából fontos tématerületeket érintettek és tekintettek meg. Négy szeminárium (Hardver, Altium Designer, Szoftver, Szabályozástechnika) támogatta a csapatokat a felkészülésben.

Versenyfeladat

A robotjárműveknek két akadálypályán kell végig haladniuk, és ennek során különböző feladatokat kell teljesíteniük. Egyik pályán az ügyesség, a másik pályán a gyorsaság számít.

A gyorsasági pályán enyhe lejtők és emelkedők nehezítik a robot haladását, illetve magát az útvonalat egy vezetővonal jelöli. A gyorsasági pályán minél jobb köridő elérése a cél.

Az ügyességi pálya egy labirintusnak felel meg, ahol a robotjárműnek fel kell térképeznie a területet, és ezt követően tud tovább haladni a gyorsasági pályára.

RobonAUT 1. kép

Ügyességi pálya elemei

A gyorsasági és ügyességi pálya előre definiált elemekből épül fel, ezek:

  • a pályaelemeket összekötő egyszerű vezetővonal,
  • start és cél,
  • elágazás és becsatlakozás,
  • zsákutca,
  • pályaszakasz kapu (18 db),
  • sávváltás.

RobonAUT 2. kép

Kvalifikációk

  • Előzetes kvalifikáció: az autók vonalkövetését és safety car (tanszék által készített autó) követését hivatott ellenőrizni.
  • Ügyességi kvalifikáció: az autóknak sikeresen kell teljesíteniük az ügyességi pályaelemeket egy versenybíró jelenlétében.
  • Gyorsasági kvalifikáció: az autóknak, egy előre felépített pályán kell végig haladniuk, egy megadott időn belül.

Az induló csapatok nevei és logói elérhetők a verseny weboldalán.

A Tesla Monsters csapat autójának terve és fényképe:

RobonAUT Tesla Monsters

Élménybeszámoló

Már kezdés előtt fél órával nagy tömeg várta a verseny kezdetét a BME Q épület aulájában. Dr. Tevesz Gábor egyetemi docens, a fő szervező, a verseny megálmodója kezdte beszéddel ezt a fantasztikus napot. Népes csapat munkálkodott a versenyen, kb. 40-50 ember. Kiss Domokos versenykoordinátor és versenybíró folytatta a beszédet, a nézőközönséggel ismertette a verseny szabályait.

Aznap reggelig nem volt ismert a pálya felépítése a csapatok számára. A döntőig 6 junior és 4 senior csapat jutott el, hogy hősiesen megküzdhessenek egymással. A versenyen vegyesen mérték össze az erejüket. A csapatoknak fél év felkészülési idejük volt, hogy egy jól működő robot autót készítsenek el. Sokat számított a találékonyság, az ötletelés és a robot autók design-ja.

A csapatok plusz 10 pontot tudtak gyűjteni a nézőközönség által. A közönség szavazhatott arra a csapatra, amelyik a legjobban tetszett nekik. Figyelembe vették ki milyen jól vette az akadályokat, vagy éppen kinek milyen design került az autójára. A közönség szavazásnál a Faketelen Taxi kapta a 10 pontot.

  • A versenyt elsőként az ABS nevű csapat kezdte. Az akadályokat jól vették.
  • A második csapat volt a Led Bull, akiknél egy ütközést követően megsérült az egyik szenzor, így az ügyességi pályát nem tudták befejezni. A gyorsasági pályát így is megpróbálták, de végül az autójuk kiment a pályáról.
  • Az Override nevű senior csapat folytatta harmadikként a mérkőzést.
  • Negyedikként a FalnakMegyek csapatnak csak 4 kaput sikerült teljesíteniük, majd a programjuk végtelen ciklusba került. Próbáltak javítani a helyzeten egy rögtönzött szereléssel, mert mint kiderült: kiégett az egyik biztosítékuk. A felkészülés alatt már történt ilyen velük, így tartalék biztosítékkal hamar megoldották a problémát.
  • A Stranger Gears volt az ötödik csapat, akik két kapu kivételével teljesítették az ügyességi pályát. Ők voltak az első csapat a verseny alatt, akik a gyorsasági pályán az autójukkal előzést hajtottak végre.
  • Az Unemployed & Single volt az első olyan csapat, akik minden kaput érintettek és sikeresen ki tudtak állni a safety car mögé. A gyorsaságin az első előzést sikeresen teljesítették, a másodikat sajnos nem.
  • A hetedik csapat a GITegylet volt, akik az autójukon díszként Nemecsek Ernő „kalapját” használták kabalaként. Az ügyességi pályán minden kaput érintettek, a gyorsasági pályán mindkét előzést sikeresen végrehajtották.
  • Nyolcadik csapatként következett a Riders of the ST ARM, akik az ügyességi pályán csak 3 kaput hagytak ki. A gyorsasági pályán már nem tudtak elindulni, mert az autójukban hiba keletkezett.
  • A Tesla Monsters kilencedikként vett részt a versenyen. Senior csapatként teljesen új autót készítettek, melyben két ventilátor helyezkedett el, hogy jobban le tudja szorítani az autót. Az összes kaput sikeresen teljesítették az ügyességi pályán.
  • Az utolsó induló csapat a Faketelen Taxi volt. Ők is egy teljesen új autót építettek, melynek összsúlya 8 kg lett. Az ügyességi pályán az összes kaput hibátlanul bejárták, a kiállást egy új manőverrel oldották meg, melytől a nézőközönség tapsviharban tört ki. A gyorsasági pályán mindkét előzést sikeresen teljesítették, és az idei legjobb kört futották.

Ezután fél órás szünet következett az eredményhirdetés előtt. A Faketelen Taxi egyik tagját, Sárközy Balázst kérdeztük meg arról, hogy milyen nyelven programoztak. Az autó alapját egy Raspberry Pi adta, amelyen Linux futott. Programozás terén az autót több részre osztották, egyes részek Python-ban, más részek C-ben és C++-ban voltak megírva. Az autójukba 14 szenzort építettek be, ezek segítségével navigált a robot autó a pályán. A pálya feltérképezésénél és követésénél Descartes koordináta-rendszerrel dolgoztak.

A verseny részletes eredményei megtalálhatóak a verseny weboldalán.

Dátumtartományok kezelése

dátumintervallumok logó

dátumintervallumok logóAki webáruházat üzemeltet és raktároz, befektet áruk raktározásába, biztosan folyamatosan követi a raktárkészlet (és egyúttal pénzügyei) alakulását különböző lekérdezésekkel. Aki online marketinggel foglalkozik, szintén mérheti/követheti/összevetheti egy-egy reklámkampány eszközeinek (Facebook hirdetés, Google Ads hirdetés, e-mail marketing, Instagram hirdetés, blog) eredményességét, hatékonyságát. Az adatok elemzése mindenképpen része a tervezésnek és folyamatosnak/periodikusnak kell lennie.

Tipikus felmerülő kérdések/problémák

  • Hány offline és/vagy online vásárlás/tranzakció volt eddig az aktuális hónapban?
  • Hogyan változott a raktárkészlet az előző hónapban? Miből kell utánrendelni? Mik a kifutó termékek?
  • A bevétel milyen arányban érkezett offline vagy online vásárlásból az aktuális hónapban?
  • Kik vásároltak az előző negyedévben nyomtatót? Küldjünk nekik e-mailt arról, most 10%-kal olcsóbban rendelhetnek tonert, ha kettőt vesznek!
  • Milyen értékben adtak le rendelést a webáruházban két adott dátum által megadott napon? Például hogyan alakult az utóbbi két Black Friday? Esetleg GLAMOUR-napok, húsvét, hosszú hétvége…
  • Kik azok a rendszeres visszatérő vásárlóink, akik nem vásároltak az előző hónapban?
  • Hogyan alakultak „a számok” az előző két év 3. negyedévében!

Egy webáruház raktárkészletének és számláinak nyilvántartása biztosan adatbázisban tárolódik, így könnyen megfogalmazható SQL lekérdező parancsok segíthetik a fenti kérdésekre/problémákra való válaszadást. Természetesen ezeket a műveleteket okosan ki kell vezetni a felhasználói felületre, hogy könnyen paraméterezhetők legyenek.

Lássunk néhány megoldást! A Java forráskódokból azokat a részeket mutatjuk be, amelyek egy lekérdező parancsba beágyazható dátumokra vonatkozó feltételeket kiírják. A dátumok megjelenítésére rövid formátumot használunk konstansként: SimpleDateFormat SHORT_DATE=new SimpleDateFormat("yyyy-MM-dd");.

Aktuális hónap

Érdemes készíteni két túlterhelt metódust. A paraméter nélküli változat az aktuális napot, a paraméteres változat a megadott napot tekinti maximálisnak és ehhez adja meg az adott hónap első/minimális napját. A két dátumnál az év és hónap megegyezik, a nap többnyire különbözik (ritkán megegyezik). A maxDate nem lehet jövőbeli és teljesül a minDate<=maxDate feltétel.

Előző hónap

Itt is érdemes készíteni két túlterhelt metódust. A paraméter nélküli változat az aktuális napot, a paraméteres változat a megadott napot tekinti kiinduló napnak, és ehhez adja meg az előző hónap első és utolsó napját. A két dátumnál az év és hónap megegyezik, a nap mindig különbözik. Mindkét dátum múltbeli és teljesül a minDate<maxDate feltétel. A megvalósítás kezeli az eltérő hosszúságú hónapokat és a szökőévet is. Ha a kiinduló dátum az adott év első hónapjába esik, akkor az előző hónap az előző év utolsó hónapja (ez most automatikusan teljesül, külön nem kell rá figyelni). Hasznos a dátumobjektum add() metódusa, ami az első paraméterében megadott dátummező alapján a második paraméterében megadott értékkel tudja változtatni a dátumot.

Előző negyedév

Itt is hasznos lehet a két túlterhelt metódus. A paraméter nélküli változat az aktuális napot, a paraméteres változat a megadott napot tekinti kiinduló napnak, és ehhez adja meg az előző negyedév első hónapjának első napját és az előző negyedév utolsó hónapjának utolsó napját. A két dátumnál az év megegyezik, a hónap és a nap mindig különbözik. Mindkét dátum múltbeli és teljesül a minDate<maxDate feltétel. A megvalósítás kezeli az eltérő hosszúságú hónapokat. A szökőév most nem számít. Ha a kiinduló dátum az adott év első negyedévébe esik, akkor az előző negyedév az előző év utolsó negyedéve (erre most külön figyelni kell). A negyedév ( quarter) képletén látszik, hogy épít arra, hogy a dátumobjektumtól elkért hónap ( month) 0 bázisú.

Eredmény

dátumintervallumok eredmény

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A feladat a Java SE szoftverfejlesztő tanfolyam 21-24. óra: Objektumorientált programozás, 2. rész kapcsolódik alapvetően, de a két visszakapott dátum használható több programozási tétellel (kiválogatás, szétválogatás) tömbbel, lambda kifejezésekkel kollekciókkal, SQL lekérdező parancsban adatbázis-kezeléshez kötődően.