Date: 10. September 2009
Øvelsens varighed: 3 timer
Gruppemedlemmer: Annette, Samuel og Rasmus
Mål:
Målet for denne uges øvelse er at undersøge NXT’s ultrasoniske sensor. Forskellige afstande testes og den faktiske afstand og sensorværdien sammenlignes.
Baggrundsinfo:
The ultrasonic sensor detects objects in front of the sensor, by emitting a short high-frequency sound and then listens for echoes. If an echo comes back there is an object in front. The time it takes for the echo to return can be used to measure the distance to the object. If there is no echo within some time limit the situation is interpreted as no object. The method getDistance() returns 255 if there is no echo, hence no object, and otherwise a number less than 255 which is the distance in cm.
(Fra øvelsesoplægget: http://www.legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson2.dir/Lesson.html )
Motorproblemer:
Vi haft nogle problemer med vores ”Bil”robots styring. Når den var sat til at køre lige ud, har den hele tiden drejet til venstre, især ved lav motor kraft. Vi har forsøgt at fiksere det roterende baghjul, men selv dette fejlede. Efter flere forsøg begyndte vi at rette opmærksomheden mod motorerne. Alle hjul og stænger sad lige og motorerne virkede ens, men ledningerne var ikke af samme længde. Ledningen til den højre motor, var flere centimeter længere end den venstre. Vi byttede derfor rundt på nogle ledninger, så begge motorer nu har samme længde ledning. Efter dette har de kørt så ens at vi ikke har bemærket en forskel.
Fremgangsmåde:
Fremgangsmåden er at bygge sensoren på LEGO9797 (s. 28-30 i instruktionsbladet) – robotten som vi byggede i sidste uge. Testen udføres med programmet SonicSensorTest.java. Der udføres målinger foran forskellige objekter, og den faktiske afstand sammenlignes med den udlæste afstand fra sensoren.
Tracker projektet afprøves også på bilen med sensoren monteret så den peger fremad. Robotten kører fremad og detekterer på et tidspunkt forhindringen og begynder at bremse og stopper til sidst. Der forsøges med forskellige værdier for nogle af konstanterne i programmet.
Philippe Hurbain har lavet et WallFollower projekt som vi tilpasser vores robot. Det kan få robotten til at følge en væg.
Resultater:
SonicSensorTest
Der laves målinger i forskellige afstande fra en væg. Intervallet mellem målingerne sættes til 300ms ved at kalde sleep() metoden på tråden. En afstand på 2,54m giver en samlet afstand på 5,08m og med lydens hastighed på 340,29m/s tager det i alt 14,9ms. Sleep har altså en betydning for udlæsningerne af sensorværdierne, men 300 ms. er rigeligt for lyden til at nå både frem og tilbage.
De faktiske afstande sammenlignes med de udlæste værdier fra sensoren:
Målt afstand ____ Udlæst afstand:
10cm _________ 13cm
15cm _________ 19cm
20cm _________ 22cm
25cm _________ 24cm
30cm _________ 30cm
50cm _________50cm
100cm ________ 101cm
180cm ________ 180cm
De 180cm er den maksimale afstand vores robot kan måle til en forhindring. Det ligger noget under de 254 som den efter sigende skulle kunne måle. Vi ved ikke hvad det kan skyldes men vi kan komme med nogle bud på det. Egenskaberne er forskellige fra sensor til sensor, måske har vi bare været uheldige at få en som ikke er lige så god som de andre. Det kan være opladning af batteriet har indflydelse eller måske er der forstyrrelser fra de andre holds sensorer.
Tracker
Når programmet startes på robotten kører robotten fremad og begynder at køre synligt langsommere omkring 80-85cm. inden forhindringen. Den fortsætter langsommere fremad indtil 35 cm. før forhindringen hvorefter den kører 2-3cm. tilbage. Den fortsætter med at køre 2-3 cm. frem og efterfølgende 2-3cm. tilbage og står på den måde og ’oscillerer’ omkring den ønskede afstand fra forhindringen.
Denne observation kan vi føre tilbage til teorien om proportional regulering der er givet ved:
error = distance – desiredDistance
power = gain*error
Jo større fejlen er, det vil sige jo større forskel der er mellem afstanden og den ønskede afstand, jo hurtigere kører robotten. I takt med at fejlen bliver mindre mindskes motorkraften og det stemmer godt overens med at den efterhånden som den nærmer sig forhindringen kører langsommere. Gain faktoren spiller også ind på den måde at hvis den er lav vil det tage længere tid for robotten at nå frem til forhindringen, da en gain faktor på fx 0.5, som i det afprøvede program, vil halvere motorkraften. Hvis den er alt for lille er der også risiko for at den ikke når frem til den ønskede position. Omvendt hvis den er høj vil motorkraften blive større og det vil resultere i at den skyder over og står og ’oscillerer’.
Kraften til motoren er desuden styret vha. en minimumskraft som bliver lagt til den power der beregnes ud fra error faktoren. MinPower konstanten er på 60.
Løsning
Vi forsøger nu at finde nogle værdier for gain faktoren og minimumkraften til motoren så den stopper helt op. Når gain faktoren sættes til 0,45 ser det umiddelbart ud til at den kører en smule mindre frem og tilbage og den bremser også en anelse hurtigere ned.
Ved 0,4 bremser den også hurtigere ned.
Med en kombination af gain på 0,4 og minPower på 50 går den i stå allerede på 50 cm. inden forhindringen
Med 0,4 gain og 55 minPower stopper den på præcis 35 men den hopper lidt på vej derhen
0,45 og 55 hopper den lige inden den når målet og kører så lidt tilbage igen.
Ved 55 og 0,42 stopper den hvor den skal ved 35cm. og den hopper ikke fremad eller tilbage, men kører og standser helt op glidende som ønsket. Minimumskraften til motorerne var altså for voldsom og gain faktoren var også en anelse for stor.
WallFollower
Kodning af robotten
Vi har konstrueret robotten, således at den ultrasoniske sensor sidder i en ca. 45 graders vinkel mod venstre. Derefter har vi set på koden skrevet af Philippe og lavet vores egen Java version af programmet.
Koden var ikke helt gennemskueligt, men vi har brugt visse dele af det.
Robotten er programmeret til at svinge omkring en fast afstand til væggen, som vi kalder ’desiredDistance’. Hvis afstanden er større, drejer den lidt til venstre for at komme tættere på væggen. Hvis afstanden er mindre, drejes der lidt til højre, for at komme længere væk.
Hvis robotten kommer alt for tæt på væggen, og afstanden bliver mindre end ?desiredDistance ? 10?, skal robotten foretage et kraftigt højresving. Dette gøres for at følge væggen, når denne drejer mod højre.
Hvis afstanden bliver større end ?desiredDistance + 10?, skal robotten foretage et kraftigt venstresving. Dette gør at robotten kan følge væggen i venstresving. Dette hjælper også hvis sensoren kommer ud i en vinkel for langt fra væggen, så den ikke for et signal tilbage. Når det sker, bliver sensor værdien sat til 255, hvilket klart er større end ?desiredDistance + 10?, og robotten drejer til venstre, så sensoren får en mindre vinkel til væggen.
Hvis robotten læser en værdi der er under 5, må det betyde at den er alt for tæt på væggen, og så skal den bakke tilbage indtil den får en tilpas stor værdi.
Afprøvning
Under afprøvning af robotten viste det sig, at den havde svært ved at dreje om hjørner. Især højresving har den svært ved, da sensoren ikke måler ret langt foran robotten, og derfor ikke opdager svinget, før den har ramt væggen.
Dette kan også skyldes at sensoren sender med den ene side af sensor klodsen, og modtager med den anden. Der forekommer også nogle gange fejl-målinger, muligvis fordi vinklen på overfladen der måles, er skrå og lydbølgen ikke kommer tilbage til sensoren, igen måske fordi den sender og modtager i hver sin side.
Ændring
Det største problem vi stødte på under afprøvningen, var målings fejl og for sene målinger af hjørner. Det ledte til en ny placering og orientering af sensoren.
Sensoren er blevet placeret på fronten af robotten, så den opdager sving og hjørner med det samme den kommer til dem. Sensoren sidder i samme ”sende vinkel” som før, men er blevet sat på højkant. Før, da sende og modtage hullerne sad vandret for hinanden, kan der have været problemer med målingerne, alt efter hvilket hul der sender, og hvilket der modtager, som vist på denne tegning:
Hvis sensoren længst fra væggen, er den der sender, vil modtageren ikke opfatte de fleste af lydbølgerne, og distancen vil virke større end den er, og måske vil signalet aldrig nå tilbage, og distancen bliver sat til 255.
Løsning:
For at løse dette problem, har vi valgt at vende sensoren på højkant. Altså så sende og modtage hullerne er over eller under hinanden. Det gør at de begge vil få samme vinkel på væggen, og forskydningen vist på ovenstående billede, vil ikke forekomme.
Konklusion:
SonicSensorTest
Målingerne vi lavede med dette program gav os et godt indblik i hvordan vi programmerer
Tracker
Ved at prøve os frem lykkedes det at finde nogle værdier for konstanterne gain og minimumpower til motoren så robottens bevægelse bliver mere jævn når den kører fremad mod en forhindring og bremser jævnt op.
Wallfollower
Efter disse ændringer virker robotten meget bedre. Signalet er konsistent og målingerne varierer ikke så meget. Placeringen af sensoren foran på robotten, gør at den håndterer sving meget bedre. De eneste steder den har problemer, er med højresving, som den ikke altid opdager i tide, og kommer til at kører ind i væggen i stedet for at dreje.
Referencer:
Øvelsesoplægget til øvelse2: http://www.legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson2.dir/Lesson.html
Litteratur om proportional control: Fred G. Martin, Robotic Explorations: A Hands-on Introduction to Engineering, Prentice Hall, 2001.
Koden til SonicSensorTest projektet af Ole Caprani: SonicSensorTest.java
Koden til Tracker projektet af Ole Caprani: Tracker.java
Koden til WallFollower projektet af Philippe Hurbain, WallFollower
Egen kode til WallFollower: http://www.daimi.au.dk/~u071252/DL/WallFollower3.java
torsdag den 17. september 2009
Abonner på:
Kommentarer til indlægget (Atom)
Ingen kommentarer:
Send en kommentar