Mikkel Nielsen
Søren Bramer Schmidt
Peter Jessen
Mål
Målet med dagens øvelse er at lave en robotbil, som kan følge en linje og stoppe på en blå farve. Vi vil forsøge dette med både 2 og 1 lys-sensorer.
Plan
Planen er skrevet således, at vi følger opgaveformuleringen for uge 4 [1]
1. Vi vil undersøge lys-sensorernes værdier over forskellige farver, og sammenligne disse resultater med hinanden..
2. Installere og køre test-programmet LineFollowerCal.
3. Skrive et program, der via lyssensoren kan kende forskel på sort, hvid og en målfarve.
4. Programmere og teste et program, der kan følge en linje og stoppe på et farvet målområde vha. 2 lyssensorer.
5. Gentage punkt 4 med kun 1 lys-sensor, ved at bruge en PID-regulator.
Resultater
1. Sort-hvid måling
Eksperimentet med at teste værdien på forskellige farver, er nøjagtig det samme vi gjorde i uge 1. Vi holdt skiftevis den ene og den anden lyssensor over forskellige farver. Af dette lærte vi, at der kan være forskel på lyssensorer, og at det derfor giver mening at kalibrere hver enkelte lyssensor inden brug. De to sensorer vi testede i dag havde en forskel imellem forskellige farver på mellem 1 og 5 procent-point.
2. Line Follower med kalibrering
Vi kørte LineFollowerCal som givet fra [1].
Programmet
har et problem med at nå at rette op, hvis svinget er for skarpt.
Sensoren kommer ud over den forkerte side af linjen inden den når at
rette op. Det betyder, at den kan tage sving i den ene retning uden
problemer, men misser sving i den anden retning. Hvis linjen var meget
bredere ville dette ikke være et problem. Problemet er illustreret på
videoen her:
3. Farve-genkending med kalibrering
Vi har skrevet colorsensor programmet således, at hvid og sort er værdier, der er henholdsvis over og under et threshold. Målfarven er en zone på +/- 2 procentpoint omkring en bestemt procent værdi for målfarven, som vi kalibrerer før robotbilen bliver sat til at køre.
Da
værdien for blå er i området mellem hvid og sort vil lyssensoren ofte
registrere “blå” i overgangen mellem linje og ikke-linje. Derfor har vi
monteret en ekstra lyssensor, der sidder så langt ude til siden, at den
aldrig kommer ind over linjen som robotten følger.
4. Line Follower som stopper over blå
Med den ekstra sensor har vi kombineret vores colorsensor med linefollower koden. Robotten følger linjen med oscillerende adfærde som i linefolloweren fra uge 1. Den anden sensor måler alene efter den målfarve som indikerer at vi har nået målet.
Video:
Kode for FollowStopSensor [2]:
while (true) {
if (sort) {
Drej til venstre!
}
if (sort) {
Drej til venstre!
}
else {
Drej til højre!
}
if (mål) {
Stop!
}
}
if (mål) {
Stop!
}
}
5. PID Linefollower
Vi
startede med at implementere P-controlleren som beskrevet i
pseudo-koden i [3]. Her bliver der målt en error og kraften til de to
motorer bliver sat herefter. Vi lavede et forsøg på en bane med denne
kode alene.
Herefter tilførte vi ‘I’ delen således, at vi fik en PI-controller.
Vi
prøvede at bruge programmet direkte, men det gav nogle problemer.
Integral variablen steg for hurtigt, så vi måtte tilføje nogle check. Vi
rettede det ved at dele error med 1000 inden vi lagde den til integral.
Desuden indførte vi et treshold på +/- 50 for integral, og nulstillede
integral variablen hver gang error blev 0. Dette fik robotten til at
følge en linje nogenlunde.
Disse ændringer kan ses i pseudo-kode her:
if (error skifter fortegn) {
integral = 0;
}
integral = 0;
}
integral = integral + error/1000;
if (integral > 50) {
integral = 50;
}
if (integral < -50) {
integral = -50;
}
if (integral > 50) {
integral = 50;
}
if (integral < -50) {
integral = -50;
}
Tilsidst
programmerede vi ‘D’ delen ind, så vi havde en PID controller. D delen
sørger for at forskellen mellem error værdien og foregående error værdi
bliver lagt til hastigheden. Dette sørger for at mindske
oscilleringerne.
Vi sammenlignede P, PI, og PID delen med tidsmålinger på en bane med en lige sort streg, som vist på billedet her:
Tidsmålingerne er vist her:
målingerne er vist i sekunder
50 100 basis hastighed
PID 16,4 6
PI 9,4 3,9
P 9,2 n/a
P kunne ikke gennemføre banen med en basis hastighed på 100.
PID
var meget langsom på 50, dette skyldes formentlig, at error fik sænket
hastigheden på begge motorer. PI fik de bedste tider, men dette skyldes
at banen var helt lige. PI reagerede for langsomt, så på banen med mange
sving, kørte den let af banen. PID var den eneste version, som kunne
klare banen med sving, med en basis hastighed på 100. Banen er vist her:
Videoen her er af PID med basis hastighed 100 på bane med sving
Video af PID på 100
Status
Ialt har vi brugt 6 timer på denne øvelsesgang. Vi nåede alt hvad vi havde planlagt. Vi brugte det meste af tiden på at programmere og teste PID-controlleren. Vi havde især problemer med PI delen, da vi måtte lave flere ændringer fra designet givet i [3]. Vi blev positivt overrasket over hvor godt PID virkede, efter vi havde haft problemer med PI.
Referencer
[1] Uge 4 opgaver
[2] Kode fra uge 4






