Linijos sekimo algoritmai
Download
Report
Transcript Linijos sekimo algoritmai
Intelektikos pagrindai
P176B100
2012 m
Robertas Damaševičius
[email protected]
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.