Developer blog / Software

hun Megújult weboldal

November 19, 2016,Software

A sok-sok kézműves poszt mellett úgy tűnhet, hogy végleg felhagytam a szoftverekkel, de ne tévesszen meg senkit sem a látszat! Tény, hogy a munka mellett kevesebb időm van, és munkából hazajőve még kevesebb kedvem, elvégre bent is ugyanezt csinálom napi 8 órában, de ilyen könnyen nem adom fel.

Az utóbbi hetekben a weboldalamat írtam át Bootstrap keretrendszer alá, ehhez a teljes dizájnt újra kellett írni, úgy, hogy minden tartalom automatikusan igazodjon az éppen aktuális képernyő mérethez. Ennek eredményeként a weboldalam mostantól elérhető asztali gépről, tabletről és telefonról is egyaránt!

A következő, amit ezután csinálni fogok – nem, még mindig nem Codename Z, de jön az is – hogy a körmére nézek a mostani publikált munkáimnak és kijavítok pár dolgot amit már egy ideje tervezek, elvégre nem a mennyiség, hanem a minőség a fontos.

Már 3 éve annak, hogy utoljára jelentkeztem a Codename Z-vel kapcsolatban. Még 2013. márciusában raktam ki a legutolsó állapotát a játéknak, amit le is lehetett tölteni, és utána úgy tűnhetett, hogy ennyi volt, vége, nem lesz már belőle semmi, vaporware lett... de nem! Tény, hogy nem foglalkoztam vele évekig, mert az egyetemen bejött a szakirány és a féléves programokat írtam, meg a szakdolgozat projektet, vagy ha pedig épp nem azt, akkor arduino-ra fejlesztettem és ez gyakorlatilag felemésztette minden időmet, de ennek most vége, az egyetemmel kész vagyok, így a hozzátartozó projektekkel is, és most az elmúlt 2 hónapban szinte nonstop a Codename Z fejlesztésével voltam elfoglalva.

Az eddigi fontosabb újdonságok:

  • Lua script rendszer, amellyel bármilyen komplex működést le lehet kódolni a pályáknak.
  • Mentés, ezzel egyúttal megoldottá vált, hogy át lehessen járni pályák között, és vissza is lehessen térni régi helyekre. (A Lua kódot is menti, majd onnan folytatja)
  • Brutális render optimalizáció, modern Intel processzorokon 40-90 frame/sec-el is elfut (és ez még nem a vége!).
  • Teljes joystic támogatás, lehet gamepad-al is játszani, ha valakinek ez a szíve vágya.
  • A falak rajzolása teljesen újra lett gondolva, a szerkesztőn belül voxelenként megrajzolhatóak az egyes csempék.

...na meg hát nagyjából a fél programot újraírtam, csak azok semmi említésre méltó újdonságot nem hoztak be, de a jövőbeli frissítéseket megalapozták. Inkább ezekkel ment el az idő java része, úgyhogy ezért tűnhet még úgy, hogy nincs olyan sok újdonság.

Ez egyelőre még az alpha verzió, de közeleg a béta, aminél már publikálni fogom a pályatervezőt is. Az lenne az ötlet, hogy bárki tudjon pályákat csinálni hozzá és remekül moddolható legyen. Az alap sztory kampányra is ez az elképzelésem, hogy alapvetően outsource-olom minél több embernek a pályák elkészítésének a feladatát, így azok igazán változatosak és kreatívak lesznek (elvégre ezen áll vagy bukik az egész, nem az engine-en).

Na és a lényeg, egy kis demó!

Érdkességnek pedig egy példa, hogy a fenti videón látható rész hogyan is néz ki a pályatervezőből:

CodenameZ editor minta

LED szalag vezérlőAz előző dobozolt változatban csak próba nyák volt, és az egész inkább prototípus volt, mint sem kész termék. Ezt most rendesen nyomtatott áramkörrel csináltam meg, és kijavítottam pár hiányosságot is, ami a gyakorlati tesztelés során merült fel, szoftver és hardver területen egyaránt. 4 példány készül most belőle, és ha van igény, továbbiak jöhetnek.

A nyomtatott áramkört noha „nyomtatottnak” hívják, ezt is kézzel rajzoltam, mint a korábbiakat, de nem is ez a lényeg, hanem hogy ezáltal hogy az alkatrészek közti összeköttetések vezetékek helyett a panel felületén futnak, így bírja a rázkódást, aminek főként szállítás közben lehet kitéve.

Ami újdonság az előző verzióhoz képest:

  • A programok végigléptetésére most már két gomb van, mindkettő saját indikátor LED-el. Erre azért volt szükség, hogy az aktív (zenére reagáló) és passzív programokat külön tudjam választani, és könnyebben lehessen váltogatni közöttük.
  • A két gomb megléte egyúttal lehetővé tette többféle gombnyomás kombinációkkal további funkciók megvalósítását, úgy mint egyes programoknál a színváltás, vagy hogy az eszköznek be lehessen állítani, hogy bekapcsoláskor melyik programot indítsa elsőnek.
  • A gombok és a potenciométer elhelyezését most jobban átgondoltam, a kényelmes és esztétikus elhelyezés volt a fő szempont.

Aki kíváncsi mélyebben az eszköz képességeire, itt letöltheti a hozzá készített útmutatót.

A teljes funkcionalitást szemléltető videó megtekinthető lent a képgalériában!

VoltmérőNoha ilyet lehet kapni készen is, saját kezűleg elkészíteni mégis sokkal izgalmasabb. A lényege, hogy az autó akkumulátorának a feszültségét tudja mérni, anélkül, hogy a motorháztető alatt kéne kotorászni. Ehhez csupán a szivargyújtóba kell bedugni.

Az eszközt az előző blogbejegyzésben említett 8 lábú ATtiny85 mikrovezérlő működteti. A végleges kapcsolási rajz a tervezés során majdnem a felére redukálódott, ahogy haladtam végig a mikrovezérlő dokumentációján és jöttem rá, hogy több dolgot is meglehet sokkal egyszerűbben is csinálni a beépített okosságokkal.

Az egész eszköz 3,3 voltról üzemel, ezt a stabilizált feszültséget ugyanabból a feszültségből csinálja, mint amit mér, emiatt a mérési tartomány alsó határa körülbelül 4V. A felső határ bármekkora lehetne, de a kijelzőkhöz igazítva 19,9V-ra lett beállítva, így a 3 kijelző meghajtható két darab 8 bites sorosból párhuzamossá alakító IC-vel (két teljes kijelző = 2 ∙ 7, plusz az 1-es és a pont, az összesen 16 bit).

A tápfeszültséget az ATtiny analog-digital converter bemenete méri a belső 1,1V-os referenciafeszültségéhez képest. Mivel a mérendő feszültség magasabb, mint a referencia, ezért szükséges egy feszültségosztó. A mikrovezérlő rendelkezik beépített brownout védelemmel, azaz reset-be állítja saját magát, ha a tápfeszültség egy bizonyos szint alá esik. Erre felhasználja ezt az 1,1V referenciafeszültséget is, ugyanis ez bőven a működéshez szükséges szint alatt van. Épp emiatt a mérés során is amíg még megy, a referenciafeszültség mindig pontos lesz, és ezáltal a mérés is. Brownout reset-et a mikrovezérlő szoftveresen is megvalósít a kijelzőket meghajtó IC-k számára, így azok bekapcsoláskor, túl alacsony feszültségből való ébredéskor, vagy a ATtiny saját reset állapota alatt sem mutatnak helytelen információt.

Hogy kiküszöböljem a kijelzett érték esetleges oszcillálását, a kijelző az utolsó 128 mérés eredményét átlagolja ki és erre még Schmitt trigger-t használ. Ez utóbbi ugyan plusz-mínusz fél tizedessel meghamisítja a mérést, de jelen esetben nincs akkora jelentősége, és fontosabb, hogy vezetés közben az ember szeme sarkában ne villogjon.

Még karácsony előtt lőttünk pár új jelenetet a szakdolgozat projektben. Az egyik jobban sikerült jelenetből összeállítottam az alábbi kis videót. A helyszín az egyik egyetemi labor.

Ami a videón látszik: betölt fájlból egy korábban kimentett jelenetet, szeletenként, majd az egészet kitörli és a csúcspontokból generálja ki újra. A végén pedig végigrepül a csúcspotokon, ezzel követve azt az utat, amit eredetileg a kamera megtett.

Megkaptuk az első helyezést a projektünkre a 2015 őszi Tudományos Diákköri Konferencián.

TDK első díj

Mint azt már korábban is írtam, a projekten ketten dolgozunk, Takács Dániel kolléga Úrral, melynek címe:

Gráf-alapú Egyidejű Lokalizáció és Térképezés.

Projektünk alapvető célja egy olyan szoftverrendszer elkészítése, amely képes egy Microsoft Kinect szenzor jeleit feldolgozni és ezek alapján feltérképezni a környezetét. A feltérképezett munkatér ezek után virtuálisan bejárható, illetve a munkatérben lehet útvonalat keresni, és ez alapján dönt a rendszer arról, hogyan navigálhat az ismert területen. A rendszer érzékeli, ha egy már korábban feltérképezett térrészt újra azonosít, és javítja a térképet a régi és az új adatok segítségével. Figyelembe véve a szenzor által szolgáltatott adatokban fellépő zajokat, a modellel szemben elvárás, hogy minél pontosabban közelítse a környezetet, amelyből alkotja azt.

A projekt jelenlegi állapotában a kamerát kézben visszük, ez főleg tesztelésnél gyorsabb is. Az alábbi videóban a TDK előadás során is felhasznált videóanyagot szerkesztettem egybe (magyarázat a videó után).

Feltérképezés

Első lépésben történik a feltérképezés, ilyenkor a kamerát (világoskék nyíl) végigvezetjük a feltérképezendő térben, a program pedig igyekszik a képekből meghatározni a térbeli elmozdulást. Hogy spóroljunk az erőforrásokkal, a program csúcspontokkal dolgozik (a sötétkék nyilak), ahol nem az egymás után következő képkockákat veti össze, hanem mindig az aktuális képet az utolsó csúcspont képével. Új csúcspontot akkor rak le, ha az előző óta az elfordulás vagy elmozdulás egy bizonyos értéket meghaladott.

Az egyes képkockák közti relatív elmozdulást könnyedén ki tudjuk számolni, mivel a Kinect szenzor biztosít az egyes pixelek mellé mélység adatot is, így miután kinyertük a közös jellemzőket a két képen, lesz két pontfelhőnk, amik ugyanazokat a pontokat írják le, csak más orientációban és elhelyezésben.

A térképezés során minden csúcspont lementésekor a hozzátartozó kép képpontjait leképezzük a voxel térbe. Itt nagy voxelekkel dolgozunk, és nem minden pixelt számítunk be, így egy gyors, vázlatos képet kapunk arról, hogy milyen lesz. A csúcspontok ismeretében a voxel teret bármikor és bármilyen felbontásban újragenerálhatjuk.

Útvonalkeresés

Az útvonalkeresésnél a legfontosabb, hogy a padlót külön tudjuk választani a többi objektumtól. Noha a padló sík, a különféle zajok és pontatlanság miatt soha nem lesz tökéletesen sík, így a padló kiválasztásánál ezt figyelembe kell venni, hogy hol van az, ahol egy voxel ugrás még zaj, és hol számít már akadálynak. Ennek a végeredménye egy 2D térkép lesz, amiben gyorsan és könnyedén tudunk Dijkstra-féle hullámtovábbterjesztéses algoritmussal útvonalat keresni. Mivel ez az algoritmus nem számol fizikai kiterjedéssel, így magát az utat kell lesoványítani úgy, hogy az akadályokat hízlaljuk fel a robot méretével. A videón ezt jelzik a színek: a piros szín mutatja azt a padlórészt, ahol nem férne el a robot, a zöld pedig a járható utat.

3D megjelenítés

A videó utolsó része egy ilyen nagyfelbontású voxel tér körbejárását mutatja be. Itt a kamera a csúcspontokat járja végig időrendi sorrendben.

Kész állapotba került hát a LED-sor projekt. Elkészült a dobozba szerelt változata és a szoftver finomhangolása is.

A szoftver része kapott egy új üzemmódot, ahol a LED-sor ritmusra váltogatja véletlenszerűen a színét. Ehhez kellett egy beat-detektáló algoritmus, ami a dob és egyéb kitűnő hangosabb részeket keresi a zenében, majd ezek észlelésekor vált a színek között. Ezt azt is jelenti, hogy a fényerő így mindig egységes és akkor is világít valamilyen színnel, ha épp nem szól alatta zene.

Az SMD-s változatot egyelőre hanyagolom, olyat majd akkor csinálok, ha már ott tartok, hogy egy ehhez szükséges áramkör tervező szoftvert kitanultam.

A tervezésnél külön kiemelt szempont volt, hogy az egész minél egyszerűbb és univerzálisabb legyen. Ahogyan a lenti galériában látszik, a dobozon van összesen 3 csatlakozó, ebből egy a táp, egy a kimenet a ledsorra és egy Jack bemenet, amelyre tetszőleges eszköz hangkimenete rácsatlakoztatható. Vonalszintre van belőve, ami egy szabványos jelszint, az összes kommersz eszköz ezt adja ki (stúdiós felszerelésnél eltérő lehet), így elég csak csatlakoztatni, és már megy is.

Most hogy ez kész, ha valakinek felkeltettem az érdeklődését egy ilyen ketyere iránt, nyugodtan keressen meg vele és készíthetek neki egyet.