Tartalomjegyzék:
- 1. lépés: A hardver beállítása
- 2. lépés: Az összes érzékelő megtalálása
- 3. lépés: Tesztelés a paraméterek beállításához
- 4. lépés: A kód elindítása
- 5. lépés: A while ciklus teteje: Fizikai ütésérzékelők
- 6. lépés: Kövesse az utat
- 7. lépés: Képfeldolgozás
- 8. lépés: A késztermék
Videó: Robo-technikus: 8 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:42
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
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
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 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:
Egyszerű Robo-Dog (zongorakulcsokból, játékpisztolyból és egérből): 20 lépés (képekkel)
Egyszerű Robo-Dog (zongorakulcsokból, játékpisztolyból és egérből): Ó, Azerbajdzsán! Tűzföld, nagy vendégszeretet, barátságos emberek és gyönyörű nők (… bocs, asszony! Persze csak szemem van rád, gözəl balaca ana ördəkburun feleségem!). De őszintén szólva, ez egy nagyon nehéz hely a készítő számára, különösen akkor, ha
Hex Robo V1 (ágyúval): 9 lépés (képekkel)
Hex Robo V1 (ágyúval): Inspiráld az előző robotomat, ezúttal a Hex Robo -t hozom létre a háborús játékhoz. Felszerelni ágyúval (következő a V2 -n), vagy esetleg joystick segítségével vezérelni (következő a V3 -on), szerintem szórakoztató lesz barátommal. lövöldözzük egymást kis ágyú műanyag golyóval és
Carro Robô Controlado a Bluetooth -on: 10 lépés
Carro Robô Controlado a Bluetooth -on: Um dos projetos mais ambiciosos para se fazer com Arduino é a konstrukció de um carro robô, para mim foi que me ösztönzi az estudar mais sobre o Arduino, na internet és possisvel encontrar diversas formas de constructionir um, seja um Linha seguidor, de
O Robô Cookie: 3 lépés
O Robô Cookie: Materiais: 1. Arduino; 2.Motores DC; 1. Bluetooth; 1. proto board .____________________________________________________________________________ Anyagok: 1. Arduino; 2. DC motorok; 1. Bluetooth; 1. Proto board
Baltazar, O Robô De Sucata: 7 lépés
Baltazar, O Robô De Sucata: Olá a todos meu Nome é Carlos Vitor e eu fiz um robô de sucata e vou estar deixando aqui a minha experiência de ter constructionído ele