Mozgáskövető Dínó (Kinect+Arduino)

Egy egyetemi projektemet szeretném bemutatni ebben a blogbejegyzésben, amelyet az MSc-s képzésem 3. félévében- egy úgynevezett - Virtuális Termékfejlesztés című tárgy keretein belül készítettem el.

A tantárgy teljesítésének egyik feltétele egy féléves feladat elkészítése, és annak dokumentálása, prezentálása volt. A nagy többséggel ellentétben én nem egy, a labor eszközei által elkészíthető Reverse engineering feladatot találtam ki (fizikai modell bescannelése és 3d cad modellé alakítása), hanem annál valamivel komplexebb, a tantárgy határain egyensúlyozó mókás feladatot.

Mivel a Virtuális labor rendelkezett több fajta 3D scanner eszközzel, így volt lehetőségem kölcsönkérni egy Kinect-et, ami inkább alkalmas hobbi célokra, semmint mérnöki feladatokra, de az én elképzeléseimnek tökéletesen megfelelt.

A tervem az volt, hogy építek egy olyan kis "robotot" amely a Kinect-en keresztül követi a mozgásomat, és ez valamiféle reakciót vált ki belőle.

A címből és a képből, már sejthető, hogy az a bizonyos robot egy dínó lett. Az elkészítéséhez a tanulmányaim során szerzett elektronikai és programozói tudásomat felhasználva, az Arduino platformot és a Processing szoftvert hívtam segítségül. Ahhoz, hogy mindez egy igazán esztétikus és használható projekt legyen, egy általam tervezett és modellezett burkolatba kívántam elhelyezni. Ezt a burkolatot a már előző cikkben ismertetett saját 3D nyomtatóm segítségével fehér PLA filament-ből nyomtattam ki.

A Kinect adatainak kinyerése

Feladatom során az első fontos kérdés az volt, hogy hogyan tudom kinyerni a Kinect szenzorjai által készített élő képet. Erre az interneten jó pár megoldást találtam, viszont amelyhez a számomra legtöbb hasznos dokumentáció fellelhető volt, az nem más, mint a Simple-Openni, amely egy olyan könyvtár-csomag, ami megkönnyíti az általam ismert Processing és a Kinect közötti kommunikáció létrehozását.
Az OpenNI már előre definiálta azokat a változókat, értékeket, amelyekre a programozás során szükség lesz, így azokra hivatkozva egyszerűbb volt a dolgom.

A hardverelemek megválasztása

servo_TowerPro_SG90_4Ahhoz, hogy egy egyszerű mozgáskövető szenzort létre tudjunk hozni szükségünk van egy szervomotorra. Ezért esett a választásom a piac egyik költséghatékony megoldására a TowerPro SG90-re.

Ennek a motornak mind a mérete mind a sebessége megfelelő arra, hogy egy viszonylag kisméretű borításba bekerülhessen. Köszönhetően a 4.8V-6V-os tápfeszültség igényének, így könnyűszerrel irányítható egy Arduino kártyával is.

A prototípus létrehozása során az Arduino Uno típusjelzésű mikrokontrollert használtam, viszont a működő prototípus megléte után aktuálissá vált áttérni az Arduino család egy kisebb tagjára, hiszen így rengeteg helyet spórolhatunk meg, ez által egy jóval kisebb, ergonomikusabb eszközt tudtam létrehozni. Az említett mikrokontroller az Arduino Nano lett.

Sematikus kapcsolási rajz

Ez a fejezet azt hivatott szemléltetni, hogy mely lábakon csatlakozik az Arduino Nano a szervomotorhoz. Tekintve, hogy a Nano rendelkezik egy USB MINI-B porttal, ezért az közvetlenül tud csatlakozni ahhoz a számítógéphez, amelyhez a Kinect van kötve, így a Processing programunk futtatásán kívül nincs is szükségünk másra, mint a kamera előtt elhaladva figyelni a szervomotor mozgását.sematikus

A fenti ábrán jól látható, hogy a pirossal jelölt kábelt az 5V-os tápellátást szolgáltató lábhoz, a fekete kábelt a GND, azaz a földelést jelképező lábhoz, míg a sárga a D9-hez, tehát a kilences számú digitális jelfeldolgozó lábhoz forrasztjuk. Az áramellátásért az 5V-os USB aljzat gondoskodik, amit a géphez csatlakoztatva tudunk üzembe helyezni.

 

Arduino program

arduinoAz előző fejezetekből kiderült, hogy milyen eszközöket használtam, és hogy az Arduino mely lábait kellett definiálni ahhoz, hogy életre keltsem a projektemet. A következő képen az arduino mikrokontrollerre töltendő program soraiba nyújtok betekintést.

 

Processing program

processingA következő fázis a számítógépünkön futó alkalmazás megtervezése, amely a már sokadszorra említett Kinect kamera által kapott jelek feldolgozását, és usb port-on keresztül, a mikrokontrollerünkkel való kommunikációt hivatott megteremteni. Az elkészült programot a play gomb megnyomásával indíthatjuk el, ekkor egy felugró ablakban, valósidőben láthatjuk a Kinect kamerája által sugárzott képet.

A fenti videón megtekinthető az általam készített prototípus első verziója, ahol az arduino egyszerre két szervomotort irányít. A későbbiek során már csak egy motort használok, mivel arra törekedtem, hogy minél egyszerűbb és olcsóbb eszközt tudjak létrehozni.

A burkolat megtervezése

Ipari termék- és formatervező mérnökként fontosnak tartom, hogy egy jól működő eszköz ne csak elektronikailag, hanem külsőleg is igényesen legyen megtervezve. Ezt szem előtt tartva határoztam el, hogy egy olyan burkolatot fogok tervezni a már működő prototípusomnak, amely tükrözi a játékos és egyszerű mivoltát is.
Ennek a gondolatnak a mentén született meg az az ötlet, hogy ez az eszköz ne csak egy egyszerű nyomkövető szenzor legyen, hanem egy dísztárgy is. Ezt az otthonunkban elhelyezve tökéletes díszítő elemmé válhat, és amennyiben szeretnénk barátainkat lenyűgözni, a szenzorunkat bekapcsolva megmutathatjuk a mozgáskövető képességét is. (marketing bullshit?!)

A burkolat modellezése

Dino_1Köszönhetően annak, hogy az eszközbe szánt elektronikát is én magam terveztem, így teljes tudatában voltam annak, hogy az adott mikrovezérlő és a hozzá tartozó szervomotor mekkora helyet foglal. Ezek után a burkolat megtervezése mérnöki szempontból már nem okozhatott problémát.
Mivel úgy döntöttem, hogy a féléves feladatom dísztárgyként is funkcionál, amit ahhoz, hogy használni tudjunk, számítógép mellett kell elhelyezni, ebből fakadóan egy fiatalos, mókás, több korosztálynak is tetsző témát szerettem volna feldolgozni. Ez a téma a dinoszaurusz lett, főleg azon okból, hogy én is gyerekkoromtól rajongok ezen őslényekért, és úgy gondolom, hogy ez egy úgynevezett „kortalan kedvenc”.
A modellezésnél elsődleges szempont volt az, hogy a 3D nyomtatáshoz is alkalmas objektumot hozzak létre.

3dsmaxA modell az Autodesk 3DS MAX 2014 programban lett elkészítve, célszerűnek találtam, hogy egy olyan programot válasszak a modell megalkotása során, amelyet jól ismerek, és könnyen használható organikus testek modellezésére, valószínűnek tartom, hogy egy mérnöki CAD modellező programban ugyanezt az eredményt jóval körülményesebben értem volna el. A könnyű használhatóságot segítette a low-poly modellezési eljárás, amely nemcsak egy manapság divatos látványtervet szült, hanem az alacsony polygon számnak köszönhetően (793 poly) akár egy jóval gyengébb konfiguráción is könnyen módosítható a file.

A modell kettévágását több paraméter is indokolta. A legfontosabb, és egyben nem elhanyagolható tény az volt, hogy a már fentebb említett szervomotort a dínó testében kellett elhelyeznem. Ezen kívül úgy gondoltam, hogy jóval egyszerűbb dolga lesz a nyomtatómnak is, ha a supportot nem a dínó hasából kinőve kell felépítenie, hanem közvetlenül a nyomtató-tálcáról.

A modell kettévágása ezenkívül is megannyi előnnyel járt, hiszen egyrészt egy kisebb nyomtatási területű gépben is könnyűszerrel elkészíthető a nyomat, valamint, ha az olykor előforduló nyomtatási hibával szembesülünk, akkor máris egyszerűbb dolgunk van, hiszen csak az elrontott modellrészünket kell újból kinyomtatni.

Ez után nem volt más hátra, mint a 3D nyomtatáshoz előkészíteni a modellt (.stl file-ba kimenteni), majd egy slicer programmal elkészíteni a nyomtató által kezelt .gcode-ot.

3d_print

Ezek után kezdetét vette a nyomtatás, amelynek végeztével eltávolítottam a fentebbi képen kékkel jelölt támasztékokat, majd lecsiszoltam a nyomat felületét.

 IMG_3432IMG_3504

Miután ezzel elkészültem nem volt más hátra, mint az elektronika elhelyezése.

A dinoszaurusz teste úgy lett megtervezve, hogy pontosan beleférjen az SG90-es szervomotor, ennek rögzítését ragasztópisztoly segítségével oldottam meg.

A szervomotor tengelycsonkján elhelyezett fogaskerék átmérőjét lemértem, majd a dinoszaurusz fejének talpazatában furatot vágtam, ügyelve a pontos illeszkedésre.

Ezek után a fejrészt felhelyeztem a szervomotor tengelyére, majd a testben végigfutó 3 eres kábelt forrasztottam össze az Arduino Nano megfelelő lábaival. Így véglegessé vált a vezérlőelektronika, amit a testben kialakított alsó üregben helyeztem el. Nem volt más hátra, mint összekötni a számítógéppel és kipróbálni.

Motion_TrackerRRR_anim

Miután a Kinect-tel ellátott számítógéphez csatlakoztattam az eszközt, elindítottam a Processing-ben írt programot. Ekkor a Microsoft mozgásérzékelője előtt elhaladva megtekinthető, amint a dinoszaurusz feje elkezdi követni a testünk útvonalát.

Amennyiben a szenzor látóköréből eltűnök, a dinoszauruszba épített szervomotor imitálni kezdi a keresésemet úgy, mintha pásztázná a teret, viszont ha sokáig nem talál ránk, akkor azt egy mérges „toporzékolással” hozza tudtomra.

 

A projekttel kapcsolatos jövőbeli tervek, hogy akár vezeték nélküli adatátvitelre is képes legyen. Elképzelésem szerint a felhasználó több, általa meghatározott testbeszéddel, különböző utasításokat tud majd végrehajttatni a számítógépünkön, vagy akár az okos-otthonunkban egyaránt.