Tartalomjegyzék:

Robo-technikus: 8 lépés
Robo-technikus: 8 lépés

Videó: Robo-technikus: 8 lépés

Videó: Robo-technikus: 8 lépés
Videó: Котика ударило током, 10 т. Вольт 2024, Július
Anonim
Robo-technikus
Robo-technikus

Képzeld el egy pillanatra, hogy te vagy az egyik űrhajós, aki leszáll a Marsra. Millió dolgot kell elvégeznie, mintákat venni, kísérleteket futtatni, adatokat gyűjteni, de naponta egyszer vagy kétszer körbe kell futnia a lakóhelyeken és/vagy a kutatási modulokban, amelyekben él és dolgozik, hogy ellenőrizze őket. Szükséges, hogy valakinek gondoskodnia kell arról, hogy a dolog jó állapotban legyen, hogy a több ezer darab és alkatrész működjön és a helyén legyen. De mi van, ha van egy automatikus segítő, aki mentesít néhány feladata alól. Mi lenne, ha lenne egy kis robot, amely képes mozogni a modulok belsejében, hogy megbizonyosodjon arról, hogy minden a helyén van, működik és biztonságos.

Robo-technikus a mentésre.

Lényegében ez a kód vezérli a Robo-technikust, miközben világos színű utat követ a földön. Ezt az utat követi mindaddig, amíg talál egy csomópontot az ösvényen vagy egy kanyart, ami egy fénykép készítését kéri a képfeldolgozáshoz, hogy a Robo-Technikus eldöntse, merre tovább. A fényütés- és ütésérzékelők megvédik a Robo-Technichet a sérülésektől, a dudorérzékelők pedig szabályozzák, hogy mikor készüljön diagnosztikai fotó. Összességében a Robo-Technician-t úgy tervezték, hogy nagyítsa a Mar moduljait, felszabadítva az űrhajósok idejét, miközben elvégzi az alapvető ellenőrzési feladatot, és csak akkor kér emberi segítséget, ha valami hibát talál.

Ismét figyelmeztetésül: ez egy folyamatban lévő munka. A kód, ahogy létezik, működik, de van benne csuklás, különösen azért, mert több, egymást átfedő program is érintett. Ezenkívül ahhoz, hogy ez a projekt tényleges Mars -küldetésben működjön, egy robotot kell megépíteni erre a célra, tehát ismét azt hiszem, ez a "koncepció bizonyítéka".

Van néhány dolog, amire szükséged lesz ennek működéséhez. Szüksége lesz egy drága programra, az adott program támogató csomagjaira és egy kis kódolási háttérre. Mivel diák vagyok, és a földszinti kódok egy részét megadtuk (a málna pi), nem beszélek kifejezetten a beállításról. Az alapkódhoz tartozó összes linket alább találja. Menjünk az anyagok listájához.

Hardver

  • Raspberry Pi (a 3. verziót használtuk)
  • iRobot ®
  • valamilyen tartóberendezés a Raspberry Pi rögzítéséhez a Robo-Technikushoz
  • Raspberry Pi kamera (nem számít, milyen, amíg jó az autofókusz és a képfelbontás)
  • valamilyen állvány vagy tok, amellyel a kamera előre néz a Robo-Technikuson
  • fehér (vagy nagyon világos) csíkként használható anyag, amelyet biztonságosan a padlóhoz tartanak. Csak kissé szélesebbnek kell lennie, mint az első két sziklaérzékelő közötti tér.
  • 4 jel nagyon nagy szöveggel (az IMAGE, RIGHT, BACK és BAL szavakkal nyomtatva)
  • Színes papírlapok (legalább három, lehetőleg piros, zöld és kék)

Szoftver

  • Matlab (2018a és 2017b egyaránt használták, és úgy tűnik, hogy nem sokat változtatnak)
  • Raspberry Pi támogatási csomag a Matlab számára
  • Raspberry Pi kód a Matlabhoz való csatlakozáshoz (link a forráskódhoz alább)
  • Képfeldolgozó eszköztár a Matlab számára (ezt a projektet szinte nem tudja elvégezni az eszköztár nélkül)
  • Választható: A Matlab Mobile telepítve van a telefonjára, amelyet később elmagyarázok

1. lépés: A hardver beállítása

ef.engr.utk.edu/ef230-2018-08/projects/roo…

Ez az alapkód hivatkozása annak biztosítására, hogy az iRobot® kommunikálni tudjon a Matlab -lal, egy alapvető oktatóanyaggal együtt. Ahogy korábban mondtam, nem fogom lefedni ezt a konkrét részt, mivel az oktatóanyag már nagyon jól le van írva. Megemlítem, hogy miután követte a linken található lépéseket, a Matlab "doc" parancsával átnézheti a mellékelt információkat. Kimondottan:

doktor Roomba

És még egy nagyon fontos pont.

Amikor a fájlokat a fenti linkről tölti le, helyezze őket a fent leírt mappába, mivel a Matlab megköveteli, hogy a felhasználó által létrehozott fájlok az aktuális munkamappában legyenek.

Ha nem így, akkor térjünk át a kódra.

2. lépés: Az összes érzékelő megtalálása

Mindezek az érzékelők megtalálása
Mindezek az érzékelők megtalálása
Mindezek az érzékelők megtalálása
Mindezek az érzékelők megtalálása

Szánjon rá egy percet, és ellenőrizze az iRobot® -ot. Jó tudni, hogy hol vannak ezek, így van elképzelése a Robo-technikus által kapott bemenetekről, és képes lesz rájönni, hogy miért forog körben a dolog, ahelyett, hogy követné a beállított utat (ez vagy talán nem történt meg). Nyilvánvalóan látni fogja a nagy fizikai ütésérzékelőt az elején. A sziklaérzékelőket egy kicsit nehezebb látni, meg kell fordítani, és meg kell keresni a négy, tiszta műanyag ablakot az elülső szél közelében. A fényütés -érzékelők még rejtettebbek, de most elég lesz azt mondani, hogy a fényes fekete sávban élőben az iRobot® eleje körül fut, ami a fizikai ütésérzékelő sáv elején található.

Vannak kerékcsepp -érzékelők, de ezek nem használhatók ebben a projektben, ezért folytatjuk az érzékelők tesztelését.

3. lépés: Tesztelés a paraméterek beállításához

Tesztelés a paraméterek beállításához
Tesztelés a paraméterek beállításához

Mielőtt elküldhetjük a Robo-technikust, hogy elvégezze a munkáját, meg kell találnunk a sajátos furcsaságait és érzékelőtartományait. Mivel minden iRobot® egy kicsit más, és változik a robot élettartama során, ki kell találnunk, hogyan olvassák le az érzékelők azokat a területeket, ahol működni fognak. Ennek legegyszerűbb módja az, ha világos színű utat állít be (Fehér nyomtatópapír csíkokat használtam, de bármi világos színű lesz) azon a felületen, amelyet a Robo-Technikus működni fog.

Indítsa el a Matlab alkalmazást, és nyisson meg egy új szkriptet. Mentse a szkriptet ugyanabba a mappába, amelyet korábban leírtam, és nevezze el, amit csak akar (próbáljon rövid lenni, mert ennek a fájlnak a neve a függvény neve lesz). Kapcsolja be a robotot, és használja a roomba változó beállítását az oktatóanyagból, írja be a parancsokat a parancsablakba.

Győződjön meg arról, hogy a Raspberry Pi csatlakoztatva van az iRobot® -hoz, és számítógépe ugyanahhoz az internetkapcsolathoz csatlakozik. Kevesebb időt fog húzni a haja kipróbálásával, hogy kiderítse, miért nem csatlakozik a Matlab

r = roomba (a beállított szám)

Az "r" változó ebben az esetben nem szükséges, bármikor nevezheti, de megkönnyíti az életet, ha egyetlen betűből álló változót használ.

Miután beállította az utat, és a roomba sikeresen csatlakozott, helyezze a leendő Robo-Technicist oda, ahol egy vagy két sziklaérzékelő az út tetején található. Nyilvánvalóan ez azt jelenti, hogy a másik kettő vagy három a kiválasztott felület tetején van.

Most indítsa el a tesztérzékelőket a következő paranccsal:

r.testSensors

Ne feledje, hogy az "r" a korábban definiált változó, ezért ha nem "r", akkor módosítsa az "r" -t. bármire is döntött. Ezzel megjelenik a tesztérzékelő képernyő, amely rengeteg információt tartalmaz.

Ebben a projektben a lightBumperekre, lökhárítókra és a sziklaszakaszokra kell összpontosítani. Mozgassa körbe a Robo-technikust, figyelve, hogy az érzékelők hogyan változnak a különböző felületeken, vagy milyen közel kell lennie egy objektumnak ahhoz, hogy a lámpás lökhárító értékei megváltozzanak, stb. Tartsa észben ezeket a számokat (vagy írja le őket), mert szüksége van rájuk, hogy pillanatok alatt beállítsa paramétereit.

4. lépés: A kód elindítása

Először egy függvényt kell létrehozni. "Útvonalnak" neveztem, de a név megint nem szükséges, de ezentúl "útvonalként" fogok hivatkozni rá.

A kód felső része bizonyos felhasználói beviteli beállításokat állít be. Létrehoz néhány listát, amelyeket használni fog a listdlg -ben, majd megjelenik egy lista párbeszédpanel. Ez lehetővé teszi a felhasználó számára, hogy válassza ki, melyik útvonal színét kívánja követni, amely később kerül játékba.

list = {'Piros', 'Kék', 'Zöld'}

problist = {'Baleset, Kép mentése', 'Alkotórész helytelen, Kép mentése', 'Várható, folytatás'} pathcolor = listdlg ('PromptString', 'Válasszon útvonalat', … 'SelectionMode', 'single', 'ListString', list) prob = 0; hajtás = ;

A "prob" és a "driv" változókat itt kell megadni, mivel azokat a függvény fő while ciklusán belül fogják használni, de ha ezeket a változókat át akarja nevezni, vagy módosítani szeretné a lista kiválasztását, akkor jó, ha következetes vagy a kód többi részében.

5. lépés: A while ciklus teteje: Fizikai ütésérzékelők

A while ciklus teteje tartalmazza a fizikai ütésérzékelő logikát. Alapvetően, amikor a Robo-Technikus beleütközik valamibe, ami megáll (vagy az első ütközésérzékelőnél 0,1 métert hátralép), majd pozicionálja magát, hogy képet készítsen. Először fedjük le a sebesség- és helyzetszabályozó részt.

Ha az előző lépésekben tesztelte a Robo-Technician összes érzékelőjét, akkor tudni fogja, hogy a dudorérzékelők logikai értéke (0 vagy 1) nulla, ami az érzékelő normál, nem nyomott helyzetét jelenti. Ezt tartsa szem előtt a kódnál.

míg true %main miközben loop %kap lökhárító információkat S = r.getBumpers if S.left ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S. front ~ = 0 r.stop end

Ez az alapvető "ha eltalál valamit, állj meg" rész. Ha az érzékelők észlelik az ütközést, akkor a kód következő részére lép, amely újra beállítja a Robo-Technikus pozícióját, hogy fényképet kapjon.

ha S.left ~ = 0 %, ha a hurok lökhárító információkat vesz fel, és igazítja a fényképezőgépet a fényképhez PromptString ',' Váratlan akadályt talált, kérjük azonosítsa '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pause (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Váratlan akadályt talált, kérjük azonosítsa' …, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) szünet (0.5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Found a Unexpected akadály, Please Identify' …, 'SelectionMode', 'single', 'ListString', problemist) end

Alapvetően, ha a kép elkészült, megjelenik egy másik párbeszédpanel három lehetőséggel. Az első két lehetőség egy adott mappába menti a fényképet, amelyet később lefedek, míg a harmadik lehetőség egyszerűen bezárja a párbeszédpanelt, és folytatja a cikluson keresztül. Ha nem emlékszik a lehetőségekre, nézze meg az előző lépést.

Most beillesztettem egy kódszakaszt az ütésérzékelő rész és a fényképmentési rész közé. Ez figyelembe veszi a lightBumper értékeket, és a meghajtási sebességet 0,025 méter/másodpercre állítja (nagyon lassú), ami valójában nem szükséges, de csökkenti, hogy a Robo-Technikus beleütközik a dolgokba, és végül elkopik a fizikai ütésérzékelő.

L = r.getLightBumpers, ha L. bal> 100 || L.baloldal> 100 || L.rightFront> 100 || L. jobb> 100 hajtás = 0,025 r.setDriveVelocity (0,025) más hajtás = 0,1 vége

Ez lenne az a rész, ahol az általad megfigyelt (és remélhetőleg leírt) értékek kerülnek előtérbe

Az "L. (érzékelő oldala és iránya)> 100" az általam megfigyelt értékeken alapult, ezért ha eltérnek a megfigyelései, módosítsa ezeket a számokat. Az ötlet az, hogy ha a Robo-Technikus érzékel valamit néhány centiméterrel előtte, akkor le fog lassulni, annál is inkább felesleges.

A következő rész a fényképek későbbi tárolására szolgál.

%, ha az első vagy a második opciót választotta a prob párbeszédablakban, elmenti a képet, ha prob == 1 %, ha a ciklus fájlinformációkat készít a fényképhez, és időbélyeggel ír t = clock; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = teljes fájl (mappa, alapnév); imwrite (img, fullFileName) bezár 1. ábra szünet (2) elseif prob == 2 t = óra; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = teljes fájl (mappa, alapnév); imwrite (img, fullFileName) bezár 1. ábra pause (2) end

Az összes fájlnév és a fotók mentésének helye nem kötelező. Olyan mappát választottam, amely a bevezető lépésben létrehozott roomba mappába van beágyazva, de bárhol lehet. Ezenkívül a fényképek az időbélyegzővel kerülnek mentésre, de ez nem különösen szükséges (bár hipotetikusan hasznos lenne egy Mars -küldetéshez).

Ha a fizikai ütésérzékelőket lefedjük, továbbléphetünk a sziklaérzékelőkre és a követendő útra.

6. lépés: Kövesse az utat

A sziklaérzékelők kódja úgy van beállítva, hogy összehasonlítsa a két első és két oldalsó érzékelő értékét. Ezeket az értékeket (valószínűleg) módosítania kell a megfigyelt értékek alapján. Valószínűleg néhány próbaüzem után is módosítania kell ezeket az értékeket, és módosítania kell őket a környezeti fény, a napszak (attól függően, hogy mennyire jól megvilágított a vizsgálati terület) vagy az érzékelőablakok koszának megfelelően.

Mielőtt azonban megérkeznénk a sziklaérzékelő kódjához, van egy rövid kódszegmens, amelyet beillesztettem a Matlab felesleges adatainak törléséhez. Erre a részre nincs szükség, de ezzel csökkentettem a program futtatásához szükséges tárhelyet.

clear img clear t clear basename clear fullFileName clear mappa

A következő kódszegmens a projekt húsa. Lehetővé teszi a Robo-technikus számára, hogy kövesse a padlón elhelyezett világos színű utat. Dióhéjban megpróbálja úgy kormányozni magát, hogy az elülső két sziklaérzékelő a megfigyelt értékek alapján a küszöb felett legyen, és lehetővé teszi, hogy a program egy kicsit később megkezdje a képfeldolgozási lépéseket.

C = r.getCliffSensors %, ha a hurok színsávot követ (fehér), ha C.leftFront> 2000 && C.rightFront> 2000 %egyenes útvonalvezetés r.setDriveVelocity (hajtás) elseif C.leftFront 2000 %jobbra fordul, ha a robot túl messzire megy bal r.turnAngle (-2,5) elseif C.leftFront> 2000 && C.rightFront <2000%balra fordul, ha a robot túl messzire megy jobbra r.turnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 img = r.getImage end %ellenőrzi, hogy van-e kanyarodás az úton, ha C. bal> 2800 && C. jobb <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) vég %helytartó az útvonal -képfelismerő kijelző ('GETTING IMAGE') végének végén

Ne feledje, hogy az általam választott változónevek opcionálisak, de ismét azt gondolom, hogy megkönnyíti az életet, ha lehetséges, egybetűs változókat használni

A kód középső szakaszának magyarázataként, amikor a két első érzékelő lefut az út széléről (amikor egy kereszteződésről van szó, vagy amikor eléri az út végét), úgy néz ki, van -e valami előtte. Ahhoz, hogy ez működjön, egy tárgyat kell elhelyezni a talajon az út végén vagy bármelyik kereszteződésben.

A fénykép elkészülte után a képfelismerés segítségével kitalálja, mit kell tennie. Ebben a kódrészben is van helyfoglaló:

%helytartó az elérési út képfelismeréséhez

Ezt egyelőre azért használtam, mert konkrétan az előforduló szöveg- és színfeldolgozásról akartam beszélni, ami a következő lépés.

7. lépés: Képfeldolgozás

A képfeldolgozásnak két része van. Az első a színfelismerés, amely kiszámítja a kép színintenzitását, és eldönti, hogy folytatja -e a szövegfelismerést. A színszámítások azon alapulnak, hogy az első legelső párbeszédpanelen mit választottak (vöröset, kéket, zöldet használtam, de tetszés szerinti színeket választhat, amennyiben a színintenzitás átlagértékei felismerhetők Raspberry Pi kamera).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) piros = átlagos (átlagos (imgb (:,:, 1))); g = átlag (átlag (imgb (:,:, 2))); b = átlag (átlag (imgb (:,:, 3)));

Ez az intenzitás ellenőrzése. Ezt a következő szegmensben fogják használni annak eldöntésére, hogy mit akar tenni.

ha piros> g && vörös> b, ha az út színe == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img), ha R. Szavak {1} == KÉP || R. Szavak {2} == KÉP || R. Szavak {3} == KÉP t = óra; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = teljes fájl (mappa, alapnév); imwrite (img, fullFileName) pause (2) elseif R. Szavak {1} == JOBB || R. Szavak {2} == JOBB || R. Words {3} == JOBB r.turnAngle (-75) elseif R. Words {1} == BALRA || R. Szavak {2} == BALRA || R. Words {3} == BALRA r.turnAngle (75) elseif R. Words {1} == VISSZA || R. Szavak {2} == VISSZA || R. Words {3} == VISSZA r.turnAngle (110) end else r.turnAngle (110) end end

Ez a szegmens határozza meg, hogy az első párbeszédpanelen kiválasztott szín megegyezik -e a kamera által látott színnel. Ha igen, akkor a szövegfelismerést futtatja. Látja, hogy melyik szó (KÉP, VISSZA, JOBB vagy BAL) jelenik meg, majd vagy elfordul (jobbra és balra), megfordul (hátul), vagy készít egy képet, és ugyanúgy menti, mint korábban.

A kódok egyetlen szakaszát adtam meg a különböző színekhez

Annak érdekében, hogy a kód felismerje a kéket és a zöldet, egyszerűen másolja ki a kódot, és módosítsa a szegmens tetején található logikai ellenőrzést, és állítsa be a "pathcolor == (szám)" értéket, hogy megfeleljen a felső párbeszédpanel színválasztásának (a kódot, ahogyan az megjelenik, a kék 2, a zöld 3) lenne.

8. lépés: A késztermék

A késztermék
A késztermék

A Robo-technikusnak nagyítania kell a Mars küldetési moduljait, és jelentenie kell az űrhajósoknak, ha valami nincs a helyén.

Ne feledje, hogy a sziklaérzékelő és a LightBumper összes értékét módosítani kell a megfigyelt értékekre. Ezenkívül tapasztalatból azt találtam, hogy jobb, ha ezt a projektet sötét színű padlón teszteljük, és még jobb, ha a padló nem fényvisszaverő. Ez növeli a kontrasztot az út és a padló között, ami valószínűbbé teszi, hogy a Robo-Technikus helyesen követi azt.

Remélem, tetszett egy kis segítő felállítása a Mars -küldetéshez, és jó szórakozást az építkezéshez.

Ajánlott: