prosojnice iz poletne šole fri “naredil bom kar želiš” ali...
TRANSCRIPT
8.-12. julij 2013
Prosojnice iz poletne šole FRI
“Naredil bom kar želiš” aliKako vzgojiti ubogljivega robotka?
Lego Mindstorms NXT
2
Lego Mindstorms NXT
• Programirljiva kocka (brick)– Računalnik
• Procesor: 48 MHz, 32 bit (ARM7)• Pomnilnik: 256 kB flash, 64 kB RAM
– Uporabniški vmesnik• LCD zaslon 64 x 100 točk• 4 tipke• Zvočnik
– Vmesniki• USB, Bluetooth
– Baterije (6 x AA)– Vhodi in izhodi
• Motorji A, B, C• Senzorji 1, 2, 3, 4
3
Lego Mindstorms NXT
• Motorji– 2 načina upravljanja
• Nastavitev hitrosti• Nastavitev kota zasuka
– Merjenje položaja• 360 pulzov na obrat
4
Lego Mindstorms NXT
• Senzorji v paketu– Senzor dotika– Zvočni senzor (mikrofon)– Svetlobni senzor (črno-bel)– Ultrazvočni senzor (sonar)
• Dodatni – Kompas– Merilnik pospeška (žiroskop)– Svetlobni senzor (barvni) – Infrardeči senzor
5
Lego Mindstorms NXT
• Senzor dotika– Z njim robot otipa stvari– Vrača vrednosti
• 1 pritisnjen• 0 sproščen
6
Lego Mindstorms NXT
• Zvočni senzor – Robot z njim sliši– Meritev v decibelih– Vrača vrednosti od 0 do 100
• 4 – 5 mirno okolje• 5 – 10 govor iz razdalje• 10 – 30 normalni govor v bližini senzorja• 30 – 100 kričanje, glasna glasba
– Začetek izvajanja akcij na vašo zahtevo (plosk, vzklik)
7
Lego Mindstorms NXT
• Svetlobni senzor– Robot z njim loči temno in svetlo – Intenziteta svetlobe
• Barve, sivine– Vrača vrednosti od 0 do 100
• 0 temno• 100 svetlo
– Vgrajen vir svetlobe• Vklop po želji• Boljše meritve (manj senc)
8
Lego Mindstorms NXT
• Ultrazvočni senzor – Senzor za vid, z njim zazna objekte– Primeren za detekcijo ovir na poti– Kako deluje
• Netopir• Oddajnik in sprejemnik• Računanje razdalje iz časa med oddajanjem
zvoka in sprejemom odboja– Vrača razdaljo v centimetrih (zelo približno)
• 0 – 255 • 255 pomeni neskončno
9
Lego Mindstorms NXT
• Programiranje– Program se izvaja
na kocki• LEGO: NXT-G• Ostali programski jeziki
– C: RobotC, nxtOSEEK,Next Byte Codes & Not eXactly C, …
– Java: LeJOS NXJ (Java)– Ada, Lua, Ruby, URBI, …
• Prednosti: boljša odzivnost, robot je samostojen
– Komunikacija preko vmesnikov USB ali Bluetooth• Python, Matlab, …• Prednosti: poljubni programski jeziki, boljša razvojna okolja
10
Prijava v računalnik
• Zbudite/prižgite računalnik• Pritisnite Ctrl+Alt+Delete, da se pojavi prijavno
okence• Vnesite naslednje:
– Uporabniško ime FRI1\priprave00
– Geslostudij
11
RobotC
12
RobotC
• Zmogljivo razvojno okolje – Grafični vmesnik– Programiranje v jeziku C– Razhroščevalnik– MS Windows Vista, 7, 8– http://www.robotc.net– 30 dnevno preizkusno obdobje
• Posebna programska oprema– Firmware za programirljivo kocko– Gonilnik za operacijski sistem
• Programiranje preko vmesnikov USB ali Bluetooth13
RobotC
• Nalaganje firmware-a– Povezava USB– Postopek
• Refresh Lists• Rename NXT• F/W
Download
14
RobotC
• Prvi program– Glavni meni– Orodna vrstica– Levo okno – pomoč– Desno okno – urejevalnik programske kode
15
RobotC
• Prenos programa na programirljivo kocko– Compile and Download Program – F5
16
RobotC
• Vzpostavitev povezave Bluetooth– Communication Link Setup
17
RobotC
• Spremljanje vrednosti na kocki– Poll Brick: motorji in senzorji
18
Lego Mindstorms NXT
• Težave ko se programirljiva kocka ne odziva več– Kratek pritisk na gumb, skrit v kocki,
jo resetira– Kocka mora biti prižgana
• Povezava Bluetooth– Omogočite povezavo preko vmesnika na kocki– Dela samo z Microsoftovimi Bluetooth gonilniki: če ima
vaš računalnik drugačnega, uporabite USB Bluetooth
19
Lego Mindstorms NXT
• Izgubljena brezžična povezava Bluetooth– Ugasnite kocko– Odstranite USB Bluetooth iz računalnika– Ponovno vstavite USB Bluetooth– Prižgite kocko
20
Naloga 1
• Vzemite programirljivo kocko • Priklopite vse senzorje in motorje • Naložite firmware• Prepišite “Prvi program” iz prosojnice 34
– Prevedite program – Prenesite ga na kocko in zaženite (USB)
• Oglejte si delovanje motorjev in senzorjev (Poll brick)
21
8.-12. julij 2013
Osnove programiranja
v RobotC
Kako se programira?
• Programer in stroj (robot)– Roboti so namenjeni za opravljanje uporabnih nalog– Vsak je zgrajen za reševanje določenih nalog na
določen način
• Kako robot opravlja svoje delo?
Problem Cilj?
23
Kako se programira?
• Kako naj robot napiše številko 5?– Širina 20 cm– Višina 40 cm
• Rešitev:Pojdi naprej za 20 cmObrni se za pravi kot v levoPojdi naprej za 20 cmObrni se za pravi kot v levoPojdi naprej za 20 cmObrni se za pravi kot v desnoPojdi naprej za 20 cmObrni se za pravi kot v desnoPojdi naprej za 20 cm
24
Kako se programira?
• Dosežen cilj je skupno delo človeka in robota– Človek
• Določi problem • Določi postopek reševanja• Razloži postopek robotu
– Robot• Izvrši zadane ukaze
priprava rešitve
izdelava programa
sledenjeprogramuProblem Cilj
človek robot
25
Kako se programira?
• Težava: ljudje in stroji ne govorimoistega jezika!
• Za komunikacijo uporabljamo posebne (programske) jezike– Obstaja mnogo programskih
jezikov (Java, PHP, Python, C, …)
• Ukazi robotu, ki jih napišemo v programskem jeziku, so programi.
01000001
???
26
Kako se programira?
• Program je zaporedje akcij– Napišemo kot besedilo
v izbranem okolju (RobotC)– To besedilo imenujemo
programska koda– Kodo je potrebno pretvoriti v robotu
razumljivo obliko (prevajanje)• Prevajalnik prevede program
v strojni jezik, ki ga razumeračunalnik
• Zaporedje enic in ničel, 110101010101
27
• Pri pisanju programa se moramo držati "slovničnih" pravil– Velike in male črke!– Ločila: ;,{},(),[]– Besede se vedno začnejo s črko– Presledki in prazne vrstice za
preglednost– Rezervirane besede so barvno
označene, na primer task main()
Kako se programira?
28
Kako se programira?
• Komentarji– Prevajalnik jih ignorira– Pomoč za programerja– Pomagajo pri berljivosti kode– Začasno izključijo del kode
– Dve vrsti• Enovrstični //• Večvrstični /* ... */
29
Kako se programira?
• Prevajanje– V meniju izberemo
Robot | Compile Program (tipka F7)
• Rdeč križ označuje napako– Pod programsko kodo so
opisane napake– Prevajalnik ne razume akcije naprej()
– Akcijo naprej() je potrebno definirati
30
Akcije
• Definiranje akcije naprej()– Združimo dva ukaza
• motor[oznaka] = hitrost;
• wait1Msec(število);
• Slovnična pravila– Z besedo void napovemo akcijo– V [] oklepajih navedemo želeni
motor (motorB, motorC)– V () oklepajih navedemo čas v
milisekundah
31
Akcije
• Ukazi motorjem in akcije robota– Naprej hitro– Naprej počasi– Nazaj hitro– Stop– Vrtenje okrog
središča– Vrtenje okrog
kolesa
32
Poimenovanje motorjev
• Ukazi s prejšnje strani delujejo samo, če sta– motorC levi motor– motorB desni motor
• Definiramo spomenke za motorC, motorB– #define motorLevi motorC– #define motorDesni motorB
• V nadaljevanju uporabljamo samo sopomenke– Namesto: motor[motorC] = 100;
– Raje: motor[motorLevi] = 100;
33
Naloga 2
• Prepišite program in ga zaženite
• Odstranite komentarje vtask main()
• Dopišite akciji– zavijLevo()
– zavijDesno()
• Preizkusite, če vaš robot napiše številko 5
34
Naloga 2 (rešitev)
35
Spremenljivke
• So deli spomina – "predalčki" za shranjevanje vrednosti (števil)
• Zakaj jih rabimo?– Večkrat moramo stvari shraniti za kasnejšo uporabo
• Izračunavanje vmesnih rezultatov• Shranjevanje starih vrednosti
• Definicija spremenljivke– Podatkovni tip in poljubno ime– Primer: int mojaStevilka;
36
• Podatkovni tipi– Različni tipi zaradi različnih zapisov podatkov v
pomnilniku računalnika
• int cela števila• float decimalna števila• string niz znakov (besedilo)• bool logični vrednosti
• resnično (1, true)• neresnično (0, false)
Spremenljivke
37
Spremenljivke
• Področje delovanja
– Globalne spremenljivke• Definiramo jih nad task main()• Vidne so povsod
– Lokalne spremenljivke• Definiramo jih znotraj akcije • Vidne so samo v akciji, v kateri so
definirane
38
Spremenljivke
• Prirejanje vrednosti (dva načina)
– Deklaracija in priredbaint pot;
pot = 20;
– Oboje skupajint pot = 20;
39
• Primer uporabe:– Robot gre naprej in nazaj za cas milisekund
Spremenljivke
40
Naloga 3
• Nalogo 2 popravite tako,da bo številka 5 velika:– 40 cm x 80 cm– 30 cm x 60 cm
• Uporabite spremenljivke
41
Naloga 3 (rešitev)
Različica 1
Različica 2
42
• So akcije, sestavljene iz enega ali več ukazov• Proceduri: naprej() in naprejDalec()
– Dve različici akcije vožnja naprej– Razlikujeta se samo v času čakanja
Procedure
43
Procedure
• Deklaracija Parametra– Podatkovni tip– Ime, ki ga nato uporabljamo
znotraj procedure– void naprej(int razdalja)
– Premik za razdalja centimetrov
• Klic procedure– Določi se vrednost razdalja
44
• Procedure samo izvršujejo ukaze– Ne vračajo vrednosti, zato pred imenom nastopa void
• Funkcije vračajo določeno vrednost– Primeri: abs(stevilo), sqrt(stevilo), sin(kot), …– Podatkovni tip vrednosti,
ki jo funkcija vrne,povemo pred imenom funkcije
– Vrednost iz funkcijevrnemo z ukazom return
Funkcije
45
• V programu za pisanje številke 5– Uporabite proceduro naprej(int razdalja), v kateri
naj se robot vsakič premakne za razdalja centimetrov
– Napišite proceduri, s katerima se robot zavrti za poljuben kot (v stopinjah):
• zavijLevo(int kot)
• zavijDesno(int kot)
Naloga 4
46
Naloga 4 (rešitev)
47
Premikanje robota
• Merjenje razdalje
– Na podlagi časa• Kaj se zgodi, če spremenimo hitrost?
– S pomočjo merilnika položaja motorja (enkoder)• V enem obratu nameri 360 impulzov• Ne pozna začetnega položaja
48
Premikanje robota
• Merjenje razdalje– Nastavimo vrednost enkoderja na nič
• nMotorEncoder[motorC] = 0;
– Nastavimo ciljni premik v številu impulzov• nMotorEncoderTarget[motorC] = 1000;
– Gibanje motorjev sprožimo z željeno hitrostjo• motor[motorC] = hitrost;
– Počakamo, da se premik konča• wait1Msec(10000);
49
Premikanje robota
• Merjenje razdalje (primer)
50
Mali triki velikih mojstrov
• Ukaz wait1Msec(…) lahko nadomestimo z ukazom– while(nMotorRunState[motorLevi] != runStateIdle){}
• Motor ima pri hitrosti nič dva načina delovanja:– Lebdenje: bFloatDuringInactiveMotorPWM = 1;
– Zaviranje: bFloatDuringInactiveMotorPWM = 0;
– Z vklopljenim zaviranjem so premiki natančnejši– Ukaz začne veljati šele ob naslednji nastavitvi hitrosti
na 0!
51
Mali triki velikih mojstrov
• Razhroščevanje
– Spremljanje izvajanja programa, po korakih• Step Into
– Uporabno za iskanje napak v programu (hroščev)
52
Naloga 5
• Izboljšajte proceduro za premikanje naprej– Dopolnite jo s prvim trikom iz prosojnice 66– Kot parameter dodajte še hitrost (negativna hitrost je
premikanje nazaj)• Napišite proceduro zavij(int kot, int hitrost), s
katero robota obrnemo na mestu z dano hitrostjo za zahtevani kot– Negativna hitrost naj pomeni obračanje v nasprotno stran
• Robota čim bolj natančno umerite• Poskusite, kako sprememba hitrosti vpliva na izvajanje
ukazov naprej in zavij• Namig: premer kolesa je 5,4 cm, medosno razdaljo pa
izmerite
53
Naloga 5 (rešitev)
54
Naloga 6 – dodatna
• Robot naj z "eno potezo" nariše hišico s podano stranico a
a
55
Naloga 6 – dodatna (rešitev)
56
Pisanje na zaslon
• Pisanje besedila– nxtDisplayString(vrstica, "Pozdravljena Poldka!");
– Številka vrstice od 0 (zgornja) do 7 (spodnja)– Šumniki ne delujejo
• Brisanje zaslona– eraseDisplay();
57
Pisanje na zaslon
• Pisanje besedila in števil (primer)– float b = 3.14;
nxtDisplayString(0, "Stevilo %d ni enako %f", 3, b);
• Razlaga– nxtDisplayString(vrstica, format, p1, p2, p3, …);
– format lahko vsebuje oznake za parametre• %d celo število (int)• %f decimalno število (float)• %s niz znakov (string)
– p1, p2, p3 so vrednosti ali imena spremenljivk, katerih vrednosti želimo izpisati na zaslon.
• Ukaz, ki sproti pobriše neuporabljeni del vrstice:– nxtDisplayTextLine(vrstica, format, p1, p2, p3, …);
58
Naloga 7
• Preverite kaj naredi naslednji program
59
Piskanje
60
• Igranje vgrajenih zvokov– PlaySound(sound)
– sound je lahko soundBeepBeep , soundBlip, soundLowBuzz, soundFastUpwardTones, soundShortBlip,…
• Igranje poljubnih tonov– PlayImmediateTone(frekvenca, trajanje)
– Frekvenca v Hz– Trajanje v stotinkah sekunde
• Frekvence tonovTON C’ Cis’
Des’D’ Dis’
Es’E’ F’ Fis’
Ges’G’ Gis’
As’A’ Ais’
B’H’ C’’
FREK-VENCA
261.626
277.183
293.665
311.127
329.628
349.228
369.994
391.995
415.305
440.000
466.164
493.883
523.251
• Preverite, če naslednji program pravilno zaigranapisane note
Naloga 8
61
Zaznavanje
• Lego Mindstorms kocka ima štiri vhode, na katere lahko priklopimo različne senzorje (S1, S2, S3, S4)
• Senzorje je pred uporabo potrebno pravilno nastaviti
62
Zaznavanje
• Delo s senzorji v programski kodi– #define oznakaSenzorja S1
• Poljubno ime senzorja povežemo z oznako senzorja S1, …, S4
– SensorType[oznakaSenzorja] = …• Programsko nastavi tip senzorja
sensorTouch, sensorLightActive, sensorLightInActive, sensorSONAR, sensorSoundDB, sensorSoundDBA, …
– SensorMode[oznakaSenzorja] = …• Programsko nastavi kakšne vrednosti naj senzor vrača
modeBoolean, modePercentage, modeRaw, …
– SensorValue(oznakaSenzorja) • Funkcija, ki vrne trenutno vrednost (stanje) senzorja
63
Izvajanje programa
• Enostaven program– Izvajanje ukazov od
začetka do konca
64
Začetek
Zvoni budilka
Splezaj iz postelje
Konec
Ugasni budilko
Vejitve
• Program se glede na pogoj nadaljuje po različnih poteh
• if (če)
65
Začetek
Zvoni budilka
Splezaj iz postelje
Konec
Počitnice?
Ugasni budilko
Da Ne
Spi še kako uro
Samo še pet
minutk…
Zanke
• Ponavljanje določenihukazov
• while (dokler)• for (za)
66
Začetek
Zvoni budilka
Splezaj iz postelje
Konec
Bi še malo
poležal/a?
Vključi dremež
Ne Da
Zanka WHILE
• Trije sestavni deli– Ključna (rezervirana) beseda
while
– Pogoj• Napisan mora biti v obliki logičnih izjav, na katere vedno
obstaja odgovor RESNIČNO ali NERESNIČNO• Primer: "Vrednost senzorja dotika je enaka 0"
» Izjava je RESNIČNA (1), če vrednost senzorja je 0» Izjava je NERESNIČNA (0), če vrednost senzorja ni 0
– Telo zanke – sestavljajo ga ukazi znotraj zavitih oklepajev ukaz1, … ukazN
• Telo zanke se izvaja dokler je pogoj izpolnjen
67
while( pogoj ){
ukaz1;…ukazN;
}
Pogoji
• Primerjalni operatorji== vrednost na levi in desni sta enaki
dvojni enačaj preverjanje enakostienojni enačaj prireditev vrednosti
!= vrednost na levi je različna od vrednosti na desni< vrednost na levi je manjša od vrednosti na desni<= vrednost na levi je manjša ali enaka vrednosti na desni> vrednost na levi je večja od vrednosti na desni>= vrednost na levi je večja ali enaka vrednosti na desni
• Primeri1 == 1 je 1 enako 1?, vedno resnično1 == 0 je 1 enako 0?, vedno neresnično
68
Pogoji
• Enostavni pogoji– senzorSvetlobe > 45
– sezorDotika == 1
• Sestavljeni pogoji– (senzorSvetlobe > 45) && (senzorDotika == 1)
– Enostavne pogoje zavijemo v oklepaje• Logični operatorji za povezovanje enostavnih
pogojev:
– ! negacija (not) – && in (and)– || ali (or)
69
Logični operatorji
• Negacija!Pogoj
• In(Pogoj1 ) && (Pogoj2)Sestavljeni pogoj JE RESNIČEN samo, če sta OBAenostavna pogoja RESNIČNA
• Ali(Pogoj1) || (Pogoj2)Sestavljeni pogoj JE RESNIČEN, če je VSAJ EDEN od enostavnih pogojev RESNIČEN
70
Pogoj !Pogoj
0 11 0
Pogoj 1 Pogoj 2 && ||0 0 0 00 1 0 11 0 0 11 1 1 1
Zanke (primer)
• Dokler se robot ne zaleti v steno naj se s polnohitrostjo premika naravnost naprej. Po trku naj vozi 0,5 sekunde vzvratno.
– Nastavitev senzorja– Branje senzorja– Zanka WHILE
71
Naloga 9
• Senzor dotika zamenjajte s svetlobnim senzorjem in ponovite prejšnji primer– Na mizo nalepite košček črnega lepilnega traku– Robot naj se ustavi, ko senzor zazna lepilni trak– Senzor ustrezno nastavite
• Luč v senzorju naj bo aktivna bolj natančno delovanje ob spremenljivih pogojih
• Senzor naj vrača vrednosti v odstotkih– Nizka vrednost senzor zaznava temno podlago– Visoka vrednost senzor zaznava svetlo podlago
• Glede na meritve na obeh podlagah nastavite prag za zaznavanje temne podlage
– Preverite delovanje programa
72
Zanke (primer)
• Robot naj se vozi naravnost naprej dokler se ne zaleti– Med vožnjo naj na svoj
zaslon izpisuje ali se vozi po temni ali po svetli podlagi
– Gnezdenje zank while– Rešitev ni najbolj
elegantna• Ukazi za premikanje
se ponavljajo v obeh zankah
73
Vejitve
• V prejšnjem primeru je primernejša uporaba vejitev• Stavek if-else
– Običajno programiramo tako, da v eno vrstico napišemo en ukaz
– Temu stilu bolj ustreza desniprikaz vejitve
74
Stavek if-else
• Če je pogoj izpolnjen, seizvršijo samo ukaziukazDA
• Če pogoj ni izpolnjen, se izvršijo samo ukaziukazNE
• Zamikanje povečapreglednost kode
75
if( pogoj ){
ukazDA1;…ukazDAn;
}else{
ukazNE1;…ukazNEn;
}
Stavek if
• Kadar je potrebnoukrepati samo obizpolnjenem pogoju, del else… izpustimo
76
if( pogoj ){
ukazDA1;…ukazDAn;
}
Vejitve (primer)
• Robot naj se vozi naravnost naprej dokler se ne zaleti– Med vožnjo naj na svoj
zaslon izpisuje ali se vozi po temni ali po svetli podlagi
– Izboljšava prejšnjegaprimera
77
Vejitve (primer)
• Robot naj se vozi dokler se ne zaleti– Pri vožnji po
temni podlagi naj piska
78
Naloga 10
• Robot naj se s pomočjo ultrazvočnega senzorja ali sonarja postavi na oddaljenost približno 20 cm od ovire– Če oviro oddaljimo, naj se ji približa– Če oviro približamo, naj se od nje ustrezno oddalji– Program zaključimo s pritiskom na senzor dotika
79
Zanke (štetje ponovitev)
• Kako bi s splošnimi proceduramiza premikanje in zavijanje narisali kvadrat?– Zaporedje funkcij naprej() in zavij() se ponovi štirikrat
– Boljša rešitev (psevdokoda)• Kako prepričati robota, da
ukaza 4-krat ponovi?
80
Zanke (štetje ponovitev)
• Ponavljanje ukazov lahkodosežemo z zanko while– Števec i– Kaj naredi i = i + 1?
81
Naloga 11
• Napišite proceduro, ki bo robota vozila po stranicah poljubnega enakostraničnega n-kotnika (n>2)
• Namigi– Robot se mora vrniti v isto točko. – Skupaj mora zaviti za 3600
– Procedura naj ima dva parametra:• Število kotov n in • Dolžino stranice a
82
Naloga 12
• Robot naj pri vožnji naravnost naprej šteje kolikokrat je prešel iz svetlega področja na temno področje– Uporabite
• Senzor za merjenje svetlosti podlage in• Senzor za dotik, da robota ustavite
– S črnim lepilnim trakom si na mizi naredite nekaj različno debelih črt
– Prehod zaznamo tako, da se stara vrednost in nova vrednost senzorja močno razlikujeta
83
Sledenje črti
• Uporaba enega senzorja• Robot naj sledi enemu od robov črte
84
Sledenje črti
• Sledimo levemu robu– Če vidi temno, je na črti, rob je levo
• Približa se mu z gibanjem naprej in v levo– Če vidi svetlo, ni na črti, rob je desno
• Približa se mu z gibanjem naprej in desno
85
Naloga 13
• Napišite program, ki bo z uporabo enega senzorja za svetlobo sledil črti– Sledite prej opisani ideji– Robot naj bo kar najhitrejši– Sledenje sprožite in prekinete
s pritiskom na senzor dotika
86
Naloga 14 - dodatna
• Sledenje črti – nadaljevanje– Zanesljivost robota in njegovo hitrost poskusite
izboljšati z dodatnim senzorjem za svetlobo
87