Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

Kolmnurga trigonomeetria: robotiprogrammeerija raudvara

See teema kulub igal robotiprogrammeerijal marjaks ära. Järgmine tund seletan need lihtsad kuid väga võimsad funktsioonid lahti.

AC=23 AB=55 BC=50

Teooria

Matemaatika

NXC

Excel

Mathe-

matics

sin, cos, tan leidmine

clip_image002[4]

 

clip_image004[4]

 

clip_image006[4]

 

clip_image008[13]

 

clip_image010[4]

 

clip_image012[4]

 

sind(65)

 

cosd(65)
 
tand(65)

 

 

=SIN(RADIANS(65))

 

=COS(RADIANS(65))

 

=TAN(RADIANS(65))

 

sin(65)

 

cos(65)

 

tan(65)

Kraadide leidmine

arcsin, arccos, arctan

clip_image020[4]

 

clip_image022[4]

 

clip_image024[4]

clip_image026[4]

 

clip_image028[4]

 

clip_image030[4]

 

 

asind(50/55)

 

acosd(23/55)
 
atand(50/23)

 

 

=DEGREES(ASIN(50/55))

 

=DEGREES(ACOS(23/55))

 

=DEGREES(ATAN(50/23))

arcsin(50/55)

 

arccos(23/55)

 

arctan(50/23)

image

Kuidas lahendada võrratusi Mathematics abil

Käesolev võrratuste lahendamise juhend õpetab võrratusi lahendama Microsoft Mathematics (tasuta Microsofti tarkvara) abil ja neid graafiliselt kujutama.

Kui kahe avaldise (arvu) vahel on võrratusmärk (<, >, <= või >= ), siis sellist seost nimetatakse võrratuseks.

Võrratuste ja nende ettekujutamine joonisel annab parema mõistmise võrratuste lahendamisele.

Võrratustel võib olla

a)      üks lahend

b)      mitu või lõpmatu arv lahendeid

c)      lahendid võivad puududa

Võrratuste lahendamine tähendab selle kõigi lahendite leidmist. Ülesanded võivad olla antud tekstiga „leia ühine positiivsus- või negatiivsuspiirkond“. Ka sellisel juhul on tegemist võrratuste lahendamise ülesannetega.

 

Ruut- ja lineaarne võrratus

On antud järgmised võrratused, mis tuleb lahendada.

ruutvõrratus

lineaarvõrratus

Võrratuse lahendamiseks tuleb see sisestada Mathematics töölehele (Worksheet) viisil, et nende võrratuste vahel on sõna and. See annab programmile teada, et tegemist on kahe võrratuse samaaegse lahendamisega.

 Microsoft Mathematics

Vajuta enter, tulemusena kuvatakse lahendus x > 3. See on mõlema võrratuse ühine piirkond.

Lisaks pannakse lahendatav võrrand sulgudesse, mis algab sõnaga solveIneq ja mille lõpus on „x“. SolveIneq tähendab et lahednatakse võrratust ja x tähistab, et seda lahendatakse muutuja x-suhtes. Mathematics leidis, et antud võrrandis on ainult üks muutuja ning eeldas, et kasutaja soovib leida just seda muutujat.

Microsoft Mathematics

Selleks, et paremini mõista, mida tähendab võrratuse lahendamine graafiliselt, kuva antud tulemus joonisel. Selleks vajuta lingil „plot this inequality“. Joonisel on näha viirutatud ala, mis asub x-teljel number 3-st paremal. See iseloomustabki lahendust x > 3.

Microsoft Mathematics 

Selleks, et aru saada kuidas need kaks võrratust kokku sellise tulemuse annavad, kirjutame need üles võrranditena ja kuvame joonisel.

Töölehele sisesta see võrrand järgmisel kujul: clip_image012[6] ja vajuta enter. Tulemusena kuvatakse võrrandi lahendid, kuid praegusel juhul huvitab meid rohkem graafik.

Microsoft Mathematics

Vajuta lingile „plot both sides of this expression in 2D“. Kõrvutades antud tulemus esialgse võrratuse graafikuga, on näha et mõlemad graafikud on positiivsed alates kolmest, ehk siit jooniselt on lihtne välja lugeda nende võrratuste lahend x > 3.

 Microsoft Mathematics

Leia ühine negatiivsuspiirkond

Olgu antud kaks võrrandit ning ülesanne on leida ühine negatiivsuspiirkond.

ruutvõrrand

lineaarvõrrand

Ülesande tekst nõuab, et need mõlemad võrrandid tuleb teisendada võrratusteks ja seejärel lahendada. Seega ülesande täitmiseks Mathematics abil on tarvis need võrratustena sisestada töölehele järgmisel kujul.

mathematics

Mõlema võrrandi puhul on = y ära vahetatud võrratusega < 0. Ehk siis leitakse mõlema võrratuse ühised lahendid, mis on väiksemad kui 0.

Sisesta see Mathematics töölehele ja vajuta enter. Mathematics annab lahenduseks 3 varianti: x < -1, x > 5/3 ja x < 3.

Microsoft Mathematics 

Kuvame selle tulemuse graafikul, vajutades lingil „plot this inequality“. Graafiline lahendus on viirutatud ala joonisel.

 Microsoft Mathematics

Vaata nüüd kuidas need graafikud joonisel välja näevad ja miks tekkis lahenduseks selline situatsioon.
Sisesta antud võrrandid töölehele ja vajuta enter.

võrrandisüsteem

Microsoft Mathematics

 

Kuva need graafikud joonisel vajutades linki „plot both sides of this expression in 2D“. Alljärgneval joonisel on näha graafiliselt tulemus mõlema graafiku negatiivsest piirkonnast. See on vasakul pool y-telge alates sellest punktist kus parabool on allpool x-telge. Y-teljest paremal pool on näha väike kolmnurkne piirkond, kus parabool on allpool x telge ning sirge pole veel jõudnud veel x-telge ületada.

Microsoft Mathematics

 

 

Kuidas lahendada võrrandeid Mathematics abil

Käesolev võrrandite lahendamise juhend õpetab võrrandeid lahendama Microsoft Mathematics (tasuta Microsofti tarkvara) abil ja neid graafiliselt kujutama.

Võrrandite ja nende kuvamine joonisel annab parema mõistmise võrrandite lahendamisele.

Võrranditel võib olla

a)      üks lahend

b)      mitu või lõpmatu arv lahendeid

c)      lahendid võivad puududa

 

Kaks ruutvõrrandit

Antud võrrandi mõlemal pool on ruutvõrrand seega on siin situatsioon, kus üks ruutvõrrand võrdub teise ruutvõrrandiga.

kaks ruutvõrrandit

1.      Kirjuta Mathematics töölehele (Worksheet) ülaltoodud võrrand ja vajuta enter.

Microsoft Mathematics

2.      Mathematics väljastab koheselt võrrandi tulemuse, x=-3.

Lisaks pannakse lahendatav võrrand sulgudesse, mis algab sõnaga solve ja mille lõpus on „x“. See tähendab et antud võrrand lahendatakse muutuja x-suhtes. Mathematics leidis, et antud võrrandis on ainult üks muutuja ning eeldas, et kasutaja soovib leida just seda muutujat.

 Microsoft Mathematics

3.      Kuna tegemist on numbrite ja x-dega mida on keeruline hoomata, tekib paratamatult küsimus et mis asi on õigupoolest see x mida otsitakse. Sellise võrrandi lahendust on kõige lihtsam mõista graafikul. Vajuta lingile „ploth both sides of this expression in 2D“, et näha antud lahendust joonisel.

Selle lingi vajutamise järel suunatakse kasutaja automaatselt joonise (Graphing) vahelelehele ja kuvatakse antud võrrand graafikul. Joonisel on näha kaks joont, kummagi võrrandi poole jaoks üks joon. Joonise kohal kuvatakse mõlemad võrrandid vastava värviga, millele need joonisel vastavad.

Toodud joonisel on näha, et x, mida otsitakse on mõlema võrrandi lõikekoht x-teljel, mis asubki täpselt -3 peal.

Microsoft Mathematics

 

Kaks lineaarvõrrandit ehk sirget

kaks lineaarvõrrandit ehk sirget

Sisesta võrrand Worksheet lehele, vajuta enter ja kuva lahendus joonisel. Näeme, et mõlemal võrrandi poolel asuvad lineaarvõrrandid ehk sirged ning neil on ühine lõikepunkt x-teljel, x=1/8=0,125.

 Microsoft Mathematics

Ruutvõrrand ja sirge

ruutvõrrand ja sirge

Käesoleva võrrandi esimene pool on absoluutväärtus ruutvõrrandist ning teine pool tavaline sirge ehk lineaarvõrrand. Sellel võrrandisüstemil on kolm lahendust, see tähendab et mõlema graafiku lõikuvad üksteisega kolmel korral: x=-3, x=2, x=0.

 Microsoft Mathematics

Vaatame jooniselt kuidas selline kolme x-ga lahendus on võimalik.

Joonisel on näha, et ruutvõrrandi kaar mis tavaliselt on allpool x-telge on nüüd ülespoole keeratud. Põhjus on selles, et antud ruutvõrrand on absoluutväärtuse märkide vahel, st see ei saa olla negatiivne. Selle tulemusena ongi võimalik saavutada kolm puutepunkti sirgega.

 Microsoft Mathematics

Juhend: Matemaatika C-keeles

Programmide kirjutamisel on tarvis liita-lahutada-korrutada-jagada. Oma tavapärasest matemaatikas oleme harjunud kirjutama, et a + b = c.

C-keeles saab aga asju lühemalt väljendada, kõik ikka selleks et programm oleks lihtsam.

Tüüpiliselt on programmis muutuja (see on mingi arv näiteks), millele on vaja juurde liita mingi teine number.

Matemaatiliselt tavaline liitmistehe on võimalik C-keeles järgmiselt teha x += y. Hea lühike.

Tehe C-keeles Kirjeldus

liitmine

x += 2

Liidab muutujale juurde teise arvu. 

  • Olgu x alguses 1
  • Seejärel liidame x-le juurde 2 (x + 2 = 3)
  • Tulemuse kirjutame iseendasse, st. x-le omistatakse väärtus 3 ja seega x = 3

See tehe on pikemalt välja kirjutades x = x + 2

Näide 2. x += y

  • olgu x alguses 3 ja y väärtus 2
  • ülaltoodud tehe on x + y ehk siis 3 + 2 = 5
  • antud arv 5 omistatakse x-le, ja seega x = 5

lahutamine

x –= 2

Lahutab muutujast teise arvu. 

  • Olgu x alguses 5
  • Seejärel lahutame x-st arvu 2 (x – 2 = 3)
  • Tulemuse kirjutame iseendasse, st. x-le omistatakse väärtus 3 ja seega x = 3

See tehe on pikemalt välja kirjutades x = x - 2

korrutamine

x *= 2

Korrutab muutujat teise arvuga. 

  • Olgu x alguses 3
  • Seejärel korrutame x-i arvuga 2 (x * 2 = 6)
  • Tulemuse kirjutame iseendasse, st. x-le omistatakse väärtus 6 ja seega x = 6

See tehe on pikemalt välja kirjutades x = x * 2

jagamine

x /= 2

Jagab muutujat teise arvuga. 

  • Olgu x alguses 6
  • Seejärel jagame x-i arvuga 2 (x / 2 = 3)
  • Tulemuse kirjutame iseendasse, st. x-le omistatakse väärtus 3 ja seega x = 3

See tehe on pikemalt välja kirjutades x = x / 2

liitmine
ühe ühiku võrra

i++

Kahekordne pluss tähistab seda, et muutujale i liidetakse juurde üks ühik.

  • Olgu i alguses 1
  • peale selle käsu käivitamist on tehtud tehe i + 1
  • seega tulemus, i = 2

lahutamine
ühe ühiku võrra

i--

Kahekordne miinus tähistab seda, et muutujast i lahutatakse üks ühik.

  • Olgu i alguses 10
  • peale selle käsu käivitamist on tehtud tehe i - 1
  • seega tulemus, i = 9

Juhend: Lihtne matemaatika

lihtne matemaatikaAegajalt tuleb robootikas ette olukordi, kus on vaja muuta mingist andurist tulev signaal märgiliselt vastupidiseks või mingil muul moel lihtsalt teisendada.

Näide 1

Kaugusandurist tulevad välja numbrid 0..100, kuid mootorile oleks vaja sisse anda vastupidine väärtus 100 .. 0. Ehk kui robot on seina lähedal siis eemaldub sellest kiiresti, kuid mida kaugemal on sein seda aeglasemalt robot liigub.

Lihtne matemaatiline tehe: 100 - algne arv = soovitud arv

 


Näide 2

lihtne matemaatikaInfrapuna otsijast (IR seekerist) tulevad välja numbrid 1..9. Nüüd oleks vaja luua keskkoht (5), mis võrdub nulliga ning 6-9 korral lasta robotil paremale keerata ning 1-4 korral lasta robotil vasakule keerata. 0 korral sõidab otse.

Lihtne matemaatika:

esmalt keskkoha arvutamiseks: algne arv – keskkoht (5) = soovitud arv

seejärel võimendus mootorile pööramise jaoks: algne arv x 25 = soovitud arv


Näide 3

lihtne matemaatikaKompassist saame relatiivse nurga mõõtmise korral väljundisse –90 .. 0 .. 90. Nüüd oleks vaja see number muundada vastupidiseks, et kui kompassist saame väljundi –90 siis roboti keeramiseks anname mootori sisendisse 90 ja vastupidi, kui kompass väljastab 90 kraadi siis roboti pööramiseks anname mootori sisendisse –90.

Lihtne matemaatika: 0 – algne arv = soovitud arv

Juhend: Lego rattad ja matemaatika

Alljärgnevalt juhis, kuidas arvutada erinevate Lego rataste korral välja otseliikumiseks või pööramiseks vajalik rattanurk kraadides.
 
Need kolm on peamised rattad mida kasutatakse Lego Mindstorm robotite ehitamisel.
Ratas
Diameeter
Ümbermõõt
Väike ratas
clip_image002
43,2 mm
135,7 mm
Keskmine ratas
clip_image004
56 mm
175,9 mm
Suur ratas
clip_image006
82 mm
257,6 mm
Alljärgnevalt on ära kirjeldatud moodused, kuidas arvutada välja mootori pöörded kraadides kui robot peab a) kindla maa edasi liikuma b) pöörama teatud nurga võrra nii, et üks ratas seisab c) pöörama teatud nurga võrra kohapeal.
Kraadides on tarvis tulemust seetõttu, et NXC-s ehk C-keeles programmeerides saab kasutada funktsiooni RotateMotorEx, mille abil saab roboti väga täpselt liikuma panna.
Huvitav nüanss on see, et peale keeramist funktsiooniga RotateMotorEx on vaja panna kasvõi 10ms pikkune wait, kuna muidu lähevad mootorid peast segi.
Kui näiteks alljärgnevas näites Wait lõpust ära võtta on tulemuseks mõõdetamatu segadus. Õigupoolest üritab robot oma mootorid sünkroonis panna liikuma esialgses suunas. Seega peale kolmandat repeati robot ainult keerleb kohapeal.

repeat(4){
RotateMotorEx(OUT_AB, 50, 500, 0, TRUE, TRUE);
RotateMotorEx(OUT_AB, 50, 365, 0, TRUE, TRUE);
Wait(MS_10);
}

 

Otseliikumine

Roboti otseliikumise korral teepikkuse väljendamine mootori pöörded kraadides.
image
Distants - vahemaa, mille robot peab läbima. Näiteks 200 mm (20 cm)
Ümbermõõt – roboti ratta ümbermõõt
x kraadi – mootori pöörded kraadides
 

Pööramine ühe rattaga

clip_image010Roboti keeramisel ühe rattaga (st. teine ratas on paigal) liikumise väljendamine mootori pööretes mis on antud kraadides.
image
Roboti pööramise nurk – see on kraadides väljendatud nurk, mille robot peab pöörama. Näiteks 90*
Rataste vahe – rataste keskkohast mõõdetud nende omavaheline kaugus. Näiteks 135 mm
x kraadi – mootori pöörded kraadides
 

Pööramine kohapeal

clip_image014Roboti keeramisel mõlema rattaga (st. rattad liiguvad vastassuundades) liikumise väljendamine mootori pööretes mis on antud kraadides.
image
Roboti pööramise nurk – see on kraadides väljendatud nurk, mille robot peab pöörama. Näiteks 90*
Rataste vahe – rataste keskkohast mõõdetud omavaheline kaugus. Näiteks 135 mm
x kraadi – mootori pöörded kraadides

2 tund: Ratta läbimõõt ja mootori pöörete arv

Eelmisel tunnil õppisime arvutama roboti pööramiseks vajalikku mootori pöördenurka. Täna tuleb seda kasutada praktikas.

Kasutatavad materjalid:
Juhend- Lego rattad ja matemaatika
Juhend- Mootorite peamised käsud NXC-s

Tunni sisu:

Igaühel oli vaja endale BOT teha. Mõni oli juba valmis ja puuduolevad valmisid kiirelt.

Edasi oli vaja mõõta roboti andmed, ratta diameeter (lasin kõigil BOT-del erinevate suurustega rattad panna) ning ratastevaheline kaugus.

Enne programmeerimise juurde asumist tuli välja arvutada ülesandes vajaminevad numbrid.

Kõige rohkem tekitas probleeme viimase ülesande nurga arvutus. Antud on sisenurk, kuid robot pidi tegelikkuses keerama 180’ – 36’ = 144’

Lisaks tekitas probleeme funktsioon RotateMotorEx, mille keeramise järele tuli kirjutada Wait(10), kuid sellest on täpsemalt juttu pööramise arvutamise juhendis. Sisuliselt oli nende kolme ülesande lahendamisega poistel tegemist terveks tunniks (2h).


Arvuta välja ning kirjuta programm roboti liigutamiseks.

Roboti andmed.

·         Roboti ratta diameeter DR = ….   cm

·         Rataste vahe LR = ….  cm

Kirjuta alati välja valem arvutuskäigu kohta ja arvuta roboti liikumine.

Ülesanne 1.

Robot sõidab mööda joont edasi tagasi. Joone pikkus on 1m.

image

Esimese ülesande lahendus, numbrid sõltuvad konkreetsest BOT-st:

task main(){
repeat(2){                                     
RotateMotorEx(OUT_BC, 50, -1400, 0, TRUE, TRUE);
RotateMotorEx(OUT_BC, 17, 333, 100, TRUE, TRUE);
Wait(10);
} }

imageÜlesanne 2.

Robot sõidab ruudu, mille küljepikkus on 30cm. Nurk = 90’

 

Teise ülesande lahendus, kolmanda oma on analoogiline.

task main(){
repeat(4){
RotateMotorEx(OUT_BC, 50, -420, 0, TRUE, TRUE);
RotateMotorEx(OUT_BC, 17, 166, 100, TRUE, TRUE);
Wait(10);
}
}

image

Ülesanne 3.

Robot sõidab viisnurga, mille küljepikkus on 50cm. Nurk = 36’

 

 

 

.

Juhend: PID controlleriga NXT joonejälgija robot

Robootikas on joonejälgija roboti ehitamine üks esmaseid asju mida tavaliselt õpitakse ja tehakse. Ja alati on eesmärgiks luua robot, mis suudab joonel püsides kõige kiiremini liikuda.
NXT robotile saab joonejälgimise anduritena kasutada algselt kaasasolevat valgusandurit, NXT 2.0 värviandurit, Hitechnic värviandurit, Hitechnic EOPD andurit (ehk infrapuna kaugusandur). Lisaks on olemas spetsiaalne Mindsensori joonejälgija andur, mis koosneb 8-st infrapuna diood-andurist, tagades erakordselt nobeda liikumise.
Joonejälgija robot töötab alati põhimõttel, et jälgitakse joone serva ehk siis musta-valge vahekohta. See tähendab, et ühe sensoriga joonejälgija on ehitatud alati järgima kas joone parem- või vasakpoolset serva. Kui andur satub valgele, keerab robot tagasi musta peale ja vastupidi – tulemuseks on sik-sak sõitmine. Selle väite juures on paar erisust:
  1. NXT 2.0 värviandurit kasutades saame jälgida joone mõlemat serva, kuna 3 andur-dioodi paiknevad kolmnurkselt ja äärmistel dioodidelt saadud erineva värviinfo alusel saame otsustada kummal pool joont robot asub. Kuid tehniliselt toimub ikkagi joone serva lugemine.
  2. Kasutades 2-te või enamat andurit saame luua kiiremini liikuva roboti, kuna siis saame jälgida joone mõlemat serva, lastes robotile suurema veahälbe ja seeläbi kiiremini liikuva roboti ehitada.
Lego Light sensorHitechnic Color sensorHitechnic EOPD sensorLego Color sensor
Mindsensors Line Follower
Kiirema ja töökindlama joonejälgija loomiseks on mitu võimalust, muuta programm keerukamaks ja või suurendades andurite arvu, millega kaasneb samuti paratamatult programmi keerukus.
Siinkohal on ülevaade selle kohta, kuidas teha kiire joonejälgija ühe anduriga kasutades PID controlleri põhimõtet.
 
PID teooria
PID controller koosneb tegelikkuses kolmest controllerist: proportional-integral-derivative (proportsionaalne – integreeruv - tuletav). Igal kontrolleril on oma funktsioon ning igaühe häälestamiseks vajame konstanti või teisisõnu kontrolleri võimendust: Kproportional, Kintegral, Kderivative.
 
Proportional controller
See iseloomustab roboti keeramise intensiivsust sõltuvalt sellest kui kaugele robot parasjagu on hälbinud oma joonest.
Proportional controlleri juures kõige olulisem omadus on lineaarsus, st. kui robot on natuke joonelt kõrvale hälbinud, keeratakse robotit aeglaselt ja sarnaselt kui robot on palju kõrvale hälbinud keeratakse robotit proportsionaalselt kiiremini tagasi joonele. Antud kontrollerit häälestatakse konstandiga Kp.
Matemaatiliselt väljendades: Turn = Kp(error)
Turn - lineaarne suurus mille võrra tuleb robotit joone suunas keerata, see tuleb teisendada roboti pööramiseks.
Teisenduseks kasutada moodust, kus VOTSE (see on kiirus, mis on mootorile ettenähtu otseliikumise korral) muudetakse vastavalt suuremaks/väiksemaks ja tulemuseks on uued kiirused mootoritele vastavalt VA ja VB.
VA = VOTSE + Turn (mootori A poweri suurendamine)
VB = VOTSE – Turn (mootori B poweri vähendamine)
Kp – konstant mis antakse ette vastavalt roboti ehitusele ja selle alusel määratakse Turn keeramise võimendus. Selle määramiseks on mõningad aluseks võetavad rusikareeglid, kuid katsetamine annab viimase lihvi. See sõltub ka konkreetse raja keerukusest, kas on väikeste raadiustega tihedad keeramised täpsussõiduks või suhteliselt lauge kurvid võidusõiduks.
Error – suurus, kui palju on robot hälbinud oma ideaalselt ehk otsesõitmise trajektoorilt. See number saabub andurist. Mida laiema amplituudiga on võimalik errorit saada, seda efektiivsemalt sõitva roboti saame. Näiteks tõstes anduri kõrgemale, saame lugeda aluselt laiema ala millelt hälbimist lugeda, kuid samas muutub andur ebatäpseks, lastes aga anduri väga lähedale joonele saame täpse asukoha info kuid hälbe ulatus on väike ning seeläbi kannatab roboti kiirus.
 
Integral controller
Integral controlleri tundmaõppimine on vajalik, et tasandada P controlleri tulemusena tekkivat paratamatut sik-sak sõitu. I controller summeerib roboti hälbed ja arvutab selle põhjal uue hälbe, millega juhitakse P controllerit.
Programmaatiliselt lihtne: integral = integral + error
Error – ikka seesama roboti hälbe suurus mis saadakse andurist.
Integral – summeeritud error väärtused. Edaspidi tuleb mängu ka see, kui tihti võetakse andurilt summeeritavaid lugemeid – see on suurusjärgus iga 20ms järel. See on seotud juba NXT protsessori kiirusega.
Edasi võtame saadud integrali ning korrutame selle läbi uue konstandiga KI millega seejärel korrigeeritakse roboti keeramist. Vaatame matemaatiliselt:
Turn = KP*(error) + KI*(integral)*dT
Ülaltoodud valemi alusel on meil tegemist PI kontrolleriga, kusjuures proportional controller on KP*(error) ja integral controller KI*(integral)*dT. Parameetrist dT on kirjas allpool.
Nüüd aga valemite juurest sisulise arusaamise juurde. I controller tasandab P controllerist tulenevat sik-sakitamist tänu oma mäluefektile.
Nimelt kui error annab meile hetkelise hälbe joone serva suhtes siis integral muudkui kasvab ja kasvab (kui robot on jätkuvalt ühele poole viltu). Ja arvestama peab, et integral kasvab tohutu kiirusega, kuna error ehk anduri lugem saadakse iga ca 20ms järel. Edasi sõltub integrali nö. töösserakendumine temaga seotud konstandist KI.
Ja nüüd natuke veel lihtsat matemaatikat, et aru saada, kuidas I controller aitab robotil sujuvamalt joonel püsida ja tasandab sik-sakitamist. Olgu näiteks hälbe suurused 1+2+3+3+4+1=14, seega integral on 14, kuigi anduri viimane lugem oli 1. Kuna selle tulemusena keerab robot teisele poole hakkab tekkiv miinuspool tasandama pööramise intensiivsust. Oletame et saadi andurist lugemid -1-2-3-3=-9, seega keeramise intensiivsus on ikka veel +poolel, mis omakorda tähendab, et robot ei keera veel tagasi seega roboti sik-sakitamisest on saanud sujuvam lainetamine.
Eelnevalt esitatud valemites on kirjeldatud aeg dT, mis kulub kahe andurist saadava info lugemisks.
I = KI*(integral)*dT
dT – see on ajaühik mis jääb kahe lugemi vahele ja tuleb konkreetse programmi juures välja arvutada. Selle arvutamiseks võib kasutada loop-i, mis loeb andurit 1000 korda ning mõõdab selleks kulunud aega. Hiljem siis jagame saadud aja 1000-ga ning vastuseks ongi dT. See võib varieeruda vahemikus 10ms – 30ms, sõltudes programmi keerukusest ning saadaolevast protsessori ressursist.
 
Derivative controller
Derivative controller ehk teisisõnu tuletis-kontroller annab robotile ennustamisvõime ning omab enim tähtsust joone keerukohtade juures.
Antud situatsioonis eeldame roboti liikumisel, et järgmine error on sama mis oli eelmine error ehk hälve ehk robot sõidab otse. Selle eelduse abil tuletatakse roboti tegelik hälve, ehk tegelik hälve on võrdne praegune hälve + uuest lugemist saadud praeguse ja uue hälbe vahe. Lihtsustatult,
derivative = (praegune error) – (eelmine error)
Seda muutust kahe hälbe vahel nimetataksegi derivative ehk tuletiseks. Kuna lugemite vahe võtmiseks kulub taas protsessori aega, peab arvesse võtma ka ajakomponendi. Kõik selle kokku pannes saame järgmise lihtsustatud matemaatilise valemi:
D = KD*(derivative)/dT
KD – konstant mille abil määratakse sarnaselt eelmistele kontrolleritele tuletise võimendus ehk selle mõjuulatus.
On ilmselge, et tuleviku ennustamine ehk teisisõnu joone suuna ette teadmine võimaldab robotil kiiremini liikuda. D controlleri lisamine mõjutab roboti liikumist järgmiselt: kui praegune hälve on suurem kui eelmine hälve – püüab robot oma positsiooni parandada keeramise läbi kui aga praegune hälve on väiksem kui eelmine siis D controller püüab robotit enam mitte sundida tagasi keerama vaid et see liiguks otse.
Teisisõnu, kui derivative on positiivne number siis D controller suurendab roboti tagasikeeramise kiirust, kui aga derivative on negatiivne number (ehk hälve juba väheneb) püüab D controller vähendada jõuliselt tagasikeeramise kiirust. Olulist rolli mängib siinkohal muidugi konstant, mille abil antakse D controllerile korrigeerimise võimendus.
 
Seega, lõplik matemaatiline PID controlleri valem.
Turn = KP*(error) + KI*(integral)*dT + KD*(derivative)/dT
Lõpliku lahendusena on tegemist suhteliselt lihtsa valemiga ja selle matemaatika programmaatiline realiseerimine robotil on suhteliselt lihtne.
Alljärgnevalt PID controlleri pseudokood, millest on kerge kirjutada nii NXT-G visuaalses kui ka NXC C-keeles töötav kood.
previous_error = 0
integral = 0
start:
  error = setpoint - actual_position
  integral = integral + (error*dt)
  derivative = (error - previous_error)/dt
  turn = (Kp*error) + (Ki*integral) + (Kd*derivative)
  previous_error = error
//  wait(dt)
  goto start
 
PID controlleri häälestamine
Mis aga on keeruline, õigete konstantide leidmine PID controlleritele. Peamine oskus robot kiirelt liikuma panna seisnebki õigete konstantide ja nendevahelise suhte määramises.
Mõned võtted siinkohal.
Meil on vaja neli komponenti omavahel õigesti tööle sättida, need on KP, KI, KD, VOTSE.
1. Elimineeri alguses KI, ja KD ehk pane need nulliks ning pane VOTSE kiiruseks 50 (kiirus sõltub siiski robotiehitusest ja kasutatavatest ratastest/ülekannetest)
2. Arvuta välja soovituslik võimendus KP. Olgu mootori otsesõitmise võimsus 50 ja maksimaalse hälbe (olgu hälve näiteks +/-5) korral tahame saavutada mootori võimsuseks 100 siis selle arvutamiseks vastav valem on järgmine: KP = (VAB - VOTSE)/error = (100 – 50)/5 = 10
Nüüd pane robot tööle ja vaata kuidas ta käitub joonel. Kui sik-sakitab liiga palju siis tuleb KP vähendada seni kuni sõidab silma järgi vaadates väikse jonksutamisega. Saadud väärtust nimetatakse KC ehk kriitiline võimendus (critical gain). Järgmiseks on vaja ära mõõta roboti võnke amplituudi kestus PC. See on aeg, mis kulub robotil ühe nö sik-saki tegemiseks. See aeg algab tüüpiliselt 0,5 sekundist kuid võib olla ka kuni 1-2 sekundit.
Teades ülalnimetatud väärtusi on võimalik järgmise tabeli abil arvutada välja ülejäänud sobivad konstandid. Antud tabelis toodud metoodikat nimetatakse Ziegler-Nichols meetodiks.
Ziegler-Nichols meetod PID controlleri konstantide määramiseks.
Controller
KP
KI
KD
P
0,5 * KC
0
0
PI
0,45 * KC
1,2 * KP / PC
0
PID
0,6 * KC
2 * KP / PC
KP*PC / 8
Peale konstantide häälestamist vaata kuidas robot joonel käitub ja proovi hakata suurendama VOTSE kiirust. Kui selle tulemusena muutub robot ebastabiilseks tasub kogu matemaatika uuesti läbi teha, ehk määra alguses P controlleri konstant Kp, roboti amplituudi kestus Pc ning siis arvuta ülejäänud.
 
Konstantide mõju roboti käitumisele
Kui oled PID controlleriga piisavalt kaua mänginud ja katsetanud siis oskad juba tunnetuslikult parameetreid häälestada. Siinkohal ongi esitatud mittematemaatiline ehk tunnetuslik juhend konstantide häälestamiseks.
Konstantide suurendamise tagajärjel tekkiv mõju roboti liikumisele
Parameeter
Joone hoidmise täpsus
Üle keeramise amplituud
Nulli jõudmise kiirus
Hälve tasakaaluasendis
KP
Väheneb
Suureneb
Väike mõju
Väheneb
KI
Väheneb
Suureneb
Suureneb
Kõrvaldab
KD
Väga väike mõju
Väheneb
Väheneb
Puudb
Roboti liikumise eripärade täpsustamine.
Joone hoidmise täpsus – iseloomustab seda, kui kiiresti üritab robot tagasi keerata joonelt kõrvalekaldumise korral.
Üle keeramise amplituud – on roboti liikumise amplituud ehk suurus kui kaugele robot võib joonelt ära „kaduda“.
Nulli jõudmise kiirus – iseloomustab aega mis kulub robotil selleks, et error väärtus nulli jõuaks. See muutub oluliseks järskude keeramiste korral.
Hälve tasakaaluasendis – on suurus, mis iseloomustab roboti hälvet otse liikumise korral, kuid mille korral veel ei võeta roboti juhtimiseks midagi ette.
Järgmistes artiklites annan ülevaate selle kohta kui palju on võimalik erinevate anduritega joonejälgijast välja pigistada kasutades tavalist valgusandurit, NXT 2.0 värviandurit, Hitechnic värviandurit, Hitechnic EOPD andurit ja Mindsensori spetsiaalset joonejälgijat.
Kasutatud materjalid: