Intelektikos pagrindai P176B100 2012 m Robertas Damaševičius robertas.damasevicius@ktu.lt Klasikiniai robotų valdymo algoritmai Klasikiniai algoritmai Klasikiniai algoritmai Klajojimo algoritmai Kliūčių vengimo algoritmai Linijos sekimo algoritmai Sienos sekimo algoritmai Kelio planavimo algoritmai „Bug“ algoritmų šeimyna Labirinto praėjimo algoritmai Kliūčių apėjimo algoritmas (1) Priekyje kliūties nėra M1 – į priekį M2 – į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Kliūčių apėjimo algoritmas (2) Kliūtis iš dešinės M1 – stop / lėtai į priekį M2 – į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Kliūčių apėjimo algoritmas (3) Kliūtis iš kairės M1 – į priekį M2 – stop / lėtai į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Kliūčių apėjimo algoritmas (4) Kliūtis tiesiai priešais robotą M1 – į priekį M2 – atgal Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Klasikiniai algoritmai Klasikiniai algoritmai Klajojimo algoritmai Kliūčių vengimo algoritmai Linijos sekimo algoritmai Sienos sekimo algoritmai Kelio planavimo algoritmai „Bug“ algoritmų šeimyna Labirinto praėjimo algoritmai Klajojimo (roaming) algoritmai Kad būtų autonomiškas, robotas turi sugebėti siekdamas savo tikslo (užduočių įvykdymo) pats nuspręsti, kaip aplenkti kliūtis: vengti kliūčių arba apeiti kliūtis autonomiškai Kaip robotas gali išvengti kliūčių: Apsisukti ir keliauti tolyn nuo kliūties Pasukti toliau nuo kliūties, bet neapsisukti visiškai Aplenkti kliūtį ir keliauti toliau ta pačia kryptimi Jei kliūtis yra mobilus objektas, palaukti kol ji pasitrauks Aukščiau aprašytų veiksmų kombinacija Papr. roboto klajojimo algoritmas Ar kelias roboto priekyje yra laisvas? Jei laisvas, robotas pajuda į priekį per vieną poziciją Jei užimtas, robotas pasuka į šoną atsitiktiniu kampu ir tęsia savo kelionę toliau, kol nesutinka kitos kliūties RoamAround: while true // roam forever // move forward until an object is found while rFeel( )=0 rForward 1 wend // turn 180 degrees plus or minus 30 degrees rTurn 150 + random (60) wend Return Roboto klajojimo algoritmas su krypties patikrinimu Trūkumas: robotas gali įstrigti tarp dviejų kliūčių Patobulinimas: prieš posūkį patikrinti, ar naujoje roboto trajektorijoje nėra kliūčių ir sukti tik laisva kryptimi RoamAround: while true // forward until an object is found while rFeel( )=0 rForward 1 wend // try to intelligently turn away from the object if rFeel()&Right then Ta = -45 // object on right,turn left if rFeel()&Left then Ta = 45 // object on left,turn right if rFeel()&Front then Ta = 160 // object infront,turn around // turn Ta deg plus a random amount no more than 40 deg rTurn Ta+random(40)*sign(Ta) wend Return Reaktyvioji klajojimo architektūra Šaltinis: RF Guedes, LP Reis, A Sousa. Efficient Robotics using the Lego NXT Platform and Net Klasikiniai algoritmai Klasikiniai algoritmai Klajojimo algoritmai Kliūčių vengimo algoritmai Linijos sekimo algoritmai Sienos sekimo algoritmai Kelio planavimo algoritmai „Bug“ algoritmų šeimyna Labirinto praėjimo algoritmai Linijos sekimo algoritmas (1) Linija yra tiesiai po robotu M1 – į priekį M2 – į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Linijos sekimo algoritmas (2) Linija yra į dešinę nuo roboto M1 – į priekį M2 – nejuda / lėtai į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Linijos sekimo algoritmas (3) Linija yra į kairę nuo roboto M1 – nejuda / lėtai į priekį M2 – į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Linijos sekimo algoritmas (4) Linija staigiai suka į dešinę M1 – į priekį M2 – atgal Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Linijos sekimo algoritmas (5) Linija staigiai suka į kairę M1 – atgal M2 – į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Linijos sekimo algoritmas Linijos sekimas naudinga, kai robotui reikia pateikti iš vieno taško į kitą be jokių kliūčių savo kelyje Tarkime, kad robotas turi 3 jutiklius: Galima išvengti sudėtingo kliūčių vengimo algoritmo programavimo Robotas gali sekti ant grindų nupieštą liniją vienas yra sumontuotas tiesiogiai roboto priekyje kiti 2 yra sumontuoti į kairę ir į dešinę nuo pirmojo jutiklio Jutiklių gražinamos reikšmės yra išvardintos žemiau a = rSense( ) if a & 1 then right sensor sees the line if a = 4 then only the left sensor sees the line if a & 6 then left OR middle OR both sensors see the line if a true then any sensor sees the line if (a = 2) then only the middle sensor sees the line if a & 7 then any sensor sees the line if a = 7 then ALL the sensors see the line Paprasčiausias linijos sekimo algoritmas Sekama beveik tiesia linija FollowLine: while true if rSense() & 1 then rTurn 1 if rSense() & 4 then rTurn -1 rForward 1 wend Return // right // left Patobulintas linijos sekimo algoritmas su jutiklių tikrinimu Roboto jutikliai nuolat tikrina, ar robotas seka liniją Tik jei jutikliai nemato linijos 50 kartų iš eilės, robotas sustoja FollowLine: c=0 while c<50 //exit loop if line is not seen for 50 tries if rSense() & 1 then rTurn 1 // right if rSense() & 4 then rTurn -1 // left rForward 1 if rSense() // if any sensor sees the line c = 0 // start the counter over else c = c + 1 // increment counter if no line is seen endif wend Return Patobulintas linijos sekimo algoritmas Tačiau ir pastarasis algoritmas veikia blogai, jei linijoje yra staigių posūkių, ty jei linija pasisuka staigiau negu gali suktis robotas Tada robotas prašoka posūkį, juda toliau ir jau negali aptikti linijos Galimi du sprendimai: 1) toliau suktis tol, kol vėl bus aptikta linija; 2) prisiminti kelią, kuriuo būtų galima grįžti atgal Linijos sekimo algoritmas su posūkių kartojimu staigiuose linijos posūkiuose Robotas toliau sukasi, kol vėl bus aptikta linija Trūkumas: robotas staigiuose posūkiuose bus lėtesnis, nes turės atlikti daugiau posūkių FollowLine: while true rForward 1 while rSense() & 1 rTurn 1 wend while rSense() & 4 return -1 wend wend Return // right // left Linijos sekimo algoritmas su grįžimu Robotas judės greičiau, bet kartais (linijos pametimo atveju) turės sugrįžti atgal Kadangi, jo jutikliai jau negali sekti linijos, robotas nežino, kur reikia sukti toliau, todėl jis grįžta keliu, kurį įsiminė Tačiau, tai gali būti nesaugu, nes robotas judės nepažymėta trajektorija Linijos sekimo algoritmas su grįžimu Jei visi jutikliai neaptinka linijos, grįžtama kryptimi, priešingai paskutinio posūkio krypties reikšmei Robotui kiekviename linijos posūkyje pakanka tik 1 posūkio, tačiau linijos pametimo atveju reikia atlikti 3 posūkius Jei linija pasisuka > 90º, robotas vis tiek gali pamesti liniją FollowLine: while true if rSense() & 1 rTurn 1 LastTurn = 1 //remember which direction we WERE turning endif if rSense() & 4 rTurn -1 LastTurn = -1 // remember which direction we WERE turning endif rForward 2 // move forward twice if rSense()=0 rTurn 3*LastTurn // if we lose the line make a BIG endif // turn back towards it wend Return Patobulintas linijos sekimo algoritmas staigiems linijos posūkiams įveikti FollowLine: while true rForward 1 if rSense() = 3 rForward 20 //move the centre over the corner while rSense() = 0 rTurn 1 //turn back to the line wend endif if rSense() = 6 rForward 20 //move the centre over the corner while rSense() = 0 rTurn -1 //turn back to the line wend endif //-- reposition over the line while rSense() & 1 rTurn 1 wend while rSense() & 4 return -1 wend wend Return Linijos sekimo algoritmų palyginimas (1) Algoritmas 1 – FOLLOW GRAY Algoritmas 2 – ONE INSIDE Algoritmas 3 – ONE BOUNCE Algoritmas 4 – STRADDLE Algoritmas 5 – TWO INSIDE Algoritmas 6 – TWO BOUNCE Šaltinis: JA Gray Toeing the Line: Experiments with Line-following Algorithms Linijos sekimo algoritmų palyginimas (2) Algoritmas: FOLLOW GRAY Robotas seka linijos kraštą: Jei aptinka „pilka“, robotas važiuoja tiesiai Jei aptinka „juoda“, suka į kairę Jei aptinka „balta“, suka į dešinę Jutikliai: 1 priekyje Šaltinis: JA Gray Toeing the Line: Experiments with Line-following Algorithms Linijos sekimo algoritmų palyginimas (3) Algoritmas: ONE INSIDE Robotas juda zigzagu išilgai linijos ir kartoja: Suka į kairę, kol aptinka „balta“ Suka į dešinę, kol aptinka „juoda“ ir vėl „balta“ Suka į kairę, kol aptinka „balta“ ir vėl „juoda“ Jutikliai: 1 priekyje Šaltinis: JA Gray Toeing the Line: Experiments with Line-following Algorithms Linijos sekimo algoritmų palyginimas (4) Algoritmas: ONE BOUNCE Robotas „atšoka“ nuo linijos krašto Kartoja: Suka į kairę, kol aptinka „balta“ Suka į dešinę, kol aptinka „juoda“ Jutikliai: 1 priekyje Šaltinis: JA Gray Toeing the Line: Experiments with Line-following Algorithms Linijos sekimo algoritmų palyginimas (5) Algoritmas: STRADDLE Jutikliai išdėstomi linijos šonuose Jei abu jutikliai rodo „balta“, robotas važiuoja tiesiai Jei kairysis jutiklis rodo „juoda“, robotas suka į kairę Jei dešinysis jutiklis rodo „juoda“, robotas suka į dešinę Jutikliai: 2 priekyje Šaltinis: JA Gray Toeing the Line: Experiments with Line-following Algorithms Linijos sekimo algoritmų palyginimas (6) Algoritmas: TWO INSIDE Jutikliai išdėstyti linijos viduje Jei abu jutikliai rodo „juoda“, robotas važiuoja tiesiai Jei kairysis jutiklis rodo „balta“, robotas suka į dešinę Jei dešinysis jutiklis rodo „balta“, robotas suka į kairę Jutikliai: 2 priekyje Šaltinis: JA Gray Toeing the Line: Experiments with Line-following Algorithms Linijos sekimo algoritmų palyginimas (7) Algoritmas: TWO BOUNCE Robotas atšoko nuo linijos krašto Suka į dešinę, kol priekinis jutiklis aptinka „balta“ Suka į kairę stovėdamas vietoje, kol užpakalinis jutiklis aptinka „juoda“ Suka į dešinę, kol priekinis jutiklis aptinka „juoda“ ir t.t. Jutikliai: 2 (1 – priekyje, 1 - gale) Šaltinis: JA Gray Toeing the Line: Experiments with Line-following Algorithms Linijos sekimo algoritmų palyginimas (8) Šaltinis: JA Gray Toeing the Line: Experiments with Line-following Algorithms Sudėtingesnė problema Linijos sekimas, kai yra susikertančių linijų (t.y. sankryžos) Reikia daugiau jutiklių Klasikiniai algoritmai Klasikiniai algoritmai Klajojimo algoritmai Kliūčių vengimo algoritmai Linijos sekimo algoritmai Sienos sekimo algoritmai Kelio planavimo algoritmai „Bug“ algoritmų šeimyna Labirinto praėjimo algoritmai Sienos sekimo algoritmas Roboto užduotis yra sekti objekto kontūrą Jei robotas aptinka savo judėjimo kelyje objektą, jis gali keliauti aplink objektą judėdamas jo perimetru Sienos sekimas (1) Robotas yra lygiagretus sienai M1 – į priekį M2 – į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Sienos sekimas (2) Robotas juda tolyn nuo sienos M1 – į priekį M2 – stop / lėtai į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Sienos sekimas (3) Robotas artėja prie sienos M1 – stop / lėtai į priekį M2 – į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Sienos sekimas (4) Robotas yra per arti sienos M1 – stop / lėtai į priekį M2 – į priekį Šaltinis: http://www.mlees-robotronics.in/home/robotics/ Realizacija P valdikliu Paprasčiausias sienos sekimo algoritmas Trūkumai: robotas juda lankais vietoje to, kad judėtų lygiagrečiai sienos robotas atsitrenkia į sieną esant pirmam staigiam jos posūkiui FollowWall: while true // anything on right makes you turn left while rFeel() & 3 rTurn -1 wend rForward 1 rTurn 1 wend Return Patobulintas sienos sekimo algoritmas FollowWall: if TurnDir > 0 FN = 6 else FN = 12 endif while true while (rFeel()&FN) or (rBumper()&4) // if bumper detects a wall rTurn -TurnDir wend rForward 1 rTurn TurnDir wend Return Draudžiamų zonų vengimas Tikslas: robotas turi būti (arba vengti) tam tikroje zonoje, kuri neapribota sienomis arba kitokiais barjerais Robotas gali judėti laisvai, turi sugebėti apeiti kliūtis Galimi sprendimai: nubrėžtos linijos, infraraudonųjų spindulių barjeras, palaidotas elektros laidas, kuriuos galėtų aptikti roboto jutikliai; GPS koordinatės ir GPS imtuvas Klasikiniai algoritmai Klasikiniai algoritmai Klajojimo algoritmai Kliūčių vengimo algoritmai Linijos sekimo algoritmai Sienos sekimo algoritmai Kelio planavimo algoritmai „Bug“ algoritmų šeimyna Labirinto praėjimo algoritmai Kelio planavimo algoritmai Bug-0 Bug1 Bug2 Alg1 Alg2 DistBug TangentBug Class1 Rev1 Rev2 HD-I Ave VisBug-21 VisBug-22 WedgeBug CautiousBug 3DBug Angulus Optim-Bug UncertainBug SensBug K-Bug ABUG T2 Problema Laisva erdvė Pradžia kliūtis kliūtis kelias Pabaiga kliūtis 48 Lumelsky „Bug“ algoritmai Prielaidos: Pasaulis yra dvimatė plokštuma Žinoma kelio pradžia ir pabaiga Kliūtys nežinomos Robotas modeliuojamas kaip taškas plokštumoje Robotas žino savo padėtį Naudojami paprasti susidūrimo jutikliai Robotas gali suktis bet kuria kryptimi Motion is like an ant walking around: In Bug 1 the robot goes all the way around each obstacle encountered, recording the point nearest the goal, then goes around again to leave the obstacle from that point In Bug 2 the robot goes around each obstacle encountered until it can continue on its previous path toward the goal Bug-0 Algoritmas Pabaiga 2 1 3 Kartoti: 1. Eiti link tikslo 2. Jei pasiektas tikslas, sustoti 3. Jei kliūtis – sekti kliūties kraštu į kairę tol, kol vėl galima eiti link tikslo 1 3 1 Pradžia 50 Bug-0 trūkumas: negali garantuoti pabaigos pasiekimo Ne! Pabaiga Pabaiga Pradžia Pradžia 51 Bug-1 Algoritmas L2 Pabaiga Kartoti: 1. Eiti link tikslo 2. Jei pasiektas tikslas, sustoti 3. Jei kliūtis – eiti aplink kliūtį ir ieškoti taško Li , artimiausio tikslui 4. Grįžti trumpiausiu keliu prie Li L1 Pradžia 52 Bug-1 trūkumas: negali nustatyti, kad tikslas nepasiekiamas Pabaiga L1 Pradžia Kartoti: 1. Eiti link tikslo 2. Jei pasiektas tikslas, sustoti 3. Jei kliūtis – eiti aplink kliūtį ir ieškoti taško Li , artimiausio tikslui 4. Grįžti trumpiausiu keliu prie Li 5. Jei vektorius nuo Li link pabaigos rodo į kliūtį, tuomet tikslo pasiekti negalima, sustoti 53 Bug-2 Algoritmas Kartoti: nuvažiavimo taškas Pabaiga 1. Eiti link tikslo išilgai tikslo linijos 2. Jei tikslas pasiektas, sustoti 3. susidūrimo taškas Tikslo linija Pradžia Jei pasiektas susidūrimo taškas, sukti į kairę ir sekti kliūties siena tol, kol pasiekiama tikslo linija ties nuvažiavimo tašku arčiau tikslo nei ankstesni susidūrimo taškai 54 Bug-1 ir Bug-2 palyginimas Bug-2 geriau nei Bug-1 Bug-1 geriau nei Bug-2 Pabaiga Pabaiga Pradžia Pradžia 55 Bug-2‘ algoritmas Pradžia Kartoti: 1. Eiti link tikslo išilgai tikslo linijos 2. Jei tikslas pasiektas, sustoti 3. 4. Pabaiga Jei pasiektas susidūrimo taškas, sukti į kairę ir sekti kliūties siena tol, kol pasiekiama tikslo linija ties nuvažiavimo tašku, kuris nebuvo aplankytas anksčiau If a hit point is reached then follow the obstacle’s boundary (toward the left) until the goalline is crossed at a leave point that has not been visited yet 56 Bug-1 ir Bug-2 palyginimas Tangent Bug algoritmas Bug-2 algoritmo patobulinimas Nustato trumpesnį kelią iki tikslo naudodamas atstumo daviklį su 360º apžvalgos lauku Tangent Bug algoritmas WHILE REPEAT continuously move toward the point n belong to [T, O(i)] which minimizes d(x, n) + d(n, q_goal) UNTIL the goal is encountered OR the direction that minimizes d(x, n) + d(x, q_goal) begins to increase d(x, q_goal) choose a boundary following direction which continues in the same direction as the most recent motion-to-goal direction REPEAT continuously update d_reach, d_followed, and [O(i)] continuously moves toward n belong to [O(i)] that is in the chosen boundary direction UNTIL q_goal is reached OR the robot completes a cycle around the obstacle in which case the goal cannot be achieved d_reach < d_followed END Tangent Bug algoritmas Klasikiniai algoritmai Klasikiniai algoritmai Klajojimo algoritmai Kliūčių vengimo algoritmai Linijos sekimo algoritmai Sienos sekimo algoritmai Kelio planavimo algoritmai „Bug“ algoritmų šeimyna Labirinto praėjimo algoritmai Labirinto praėjimo algoritmas Paprastas Depth-First Search (DFS) algoritmas Robotas skenuoja kiekvienos celės sienas ir sukonstruoja DFS medį, kurio šaknis yra START celė Sukonstravus medį, jame randamas kelias Algoritmas baigiamas, kai randama GOAL celė Labirinto struktūra GOAL START DFS medžio pavyzdys GOAL START DFS medžio duomenų struktūra Dvimatis masyvas Cell maze[MAX_HEIGHT][MAX_WIDTH] typedef struct { bool isExplored; (= false) Direction parentDirection; (= NO_DIRECTION) WallStatus[4] wallStatus; (= {UNKNOWN}) } Cell; DFS algoritmas while (true) { if robot is at GOAL cell victoryDance(); if there is an unexplored, unobstructed neighbor Mark parent of neighbor as current cell; Proceed to the neighbor; else if robot is not in START cell Backtrack; else return; //No GOAL cell exists, so we exit } Pledge algoritmas 1) Eiti link sienos 2) Eiti tol, kol siena yra dešinėje 3) Tęsti, kol bus išeita iš labirinto Kiti žinomi labirinto problemos sprendimo algoritmai A* Algoritmas Dirbtiniai neuroniniai tinklai Genetiniai algoritmai Multi-Neuronų heuristinė paieška (MNHS) Neuro-Fuzzy Algoritmų palyginimas Algoritmas Pranašumai Trūkumai A* Algoritmas Greitas, randa trumpiausią kelią Veikia tik su mažais grafais Dirbt. neuroniniai tinklai Labai greitas Veikia tik su paprastais grafais. Kelias ne optimalus Genetiniai algoritmai Veikia su dideliais ir sudėtingais grafais Daug skaičiavimų MNHS Mažai skaičiavimų, randa geriausią kelią Veikia tik su mažais grafais NeuroFuzzy Labai greitas Veikia tik su paprastais grafais. Kelias ne optimalus. Literatūra S.M. LaValle, Planning Algorithms, 2006 Laisvai platinama: http://msl.cs.uiuc.edu/planning/ H. Choset et al. Principles of Robot Motion: Theory, Algorithms, and Implementations, 2005.