Varighed: 3,5 Timer
Deltagere: Mikkel, Bjarke, Jesper
takeControl of DriveForward is called when the triggering condition of DetectWall is true": Det gør den ikke. Den løber igennem arrayet og hvis den finder en behavior med højere prioritet breaker den og den når aldrig at tjekke om TakeControl for DriveForward er True.
" Try to implement the behavior DetectWall so the actions taken also involve to move backwards for 1 sec before turning." - Vi implementede det ved at indsætte sætte motorne til at køre bagud (hvilket pga vores konstruktion af robotten er forward() ), derefter sleeper tråden i et sekund og fortsætter derfra.
Deltagere: Mikkel, Bjarke, Jesper
Plan:
- Lav BumperTeddy - Installer Bumpercar på Teddy.
- Udvid BumperTeddy med presure sensor og ultralydsensor.
- Test de forskellige behaviors, som beskrevet i Bumpercar afnittet.
- Følg planen i afsnitet "Motivation functions", for at gøre Teddy til en MotivationalTeddy.
Resultater:
1: Vi fandt BumperCar classen i samples-mappen og fik det overført til Teddy.
2: Da vi allerede havde en grund-bil tilføjede vi bare en touch-sensor og en ultrasonicsensor - tog lige to forsøg at få sat sensorer og motorer i de rigtige porte.
3:
"Press the touchsensor and keep it pressed - what happens": Ved at holde touchsensoren nede og holde den nede, bliver robotten ved med at prøve og dreje til venstre. Den kører i fuld "drej til venstre" behavior hver gang før den næste begynder.
"Implement and Exit Command, so i has highest priority - test how it works":
- Vi har implementeret vores exit-metode som et nyt behavior, som tager kontrol hvis Esc er trykket ned.
- Ved test skal Esc holdes nede et lille stykke tid før den exiter. Den opfører sig også forskelligt om den er igang med "DetectWall" eller "DriveForward". Når den kører detectWall kan skyldes at "Rotate" kommandoen ikke går videre i koden for at robotten har roteret det angivende antal grader. Når den kører DriveForward ser det ud til at man skal vente på at hjulene er stoppet helt.
"To avoid the pause in the takeControl method of DetectWall a local thread in DetectWall could be implemented that sample the ultrasonic sensor e.g. every 20 msec and stores the result in a variable distance accessible to takeControl . Try that." - Vi flyttede læsning af sensor ud i sin egen tråd. Første implementation virkede ikke som det skulle. Dette var fordi vi havde glemt at "Pinge" sonaren med sonar.ping.
"Try to implement the behavior DetectWall so it can be interrupted and started again e.g. if the touch sensor is pressed again while turning". Vi startede med at flytte action'en fra DetectWall ud i en tråd for sig selv, da tanken var at stoppe og genstarte tråden hvis touchsensoren blev aktiveret. Dette var umuligt da funktionaliteten af tråde i java ikke understøtter dette. Vi ændrede derfor koden til at kalde:
Derved kunne vi, i et while loop, kontrollere hvornår rotation var færdig ved at kalde:
While loopet blev holdt kørende delvist af isMoving() og en variabel vi kunne ændre udenfor tråden, hvor vi kontrollerede om touchsensoren blev aktiveret.
Udover at være dårligt designet, kastede koden også forskellige exceptions vi ikke var i stand til at genkende eller fikse. Derfor opgav vi tråden og rykkede aktiviteten ind i en metode. Koden for dette kan ses nedenfor:
public void rotate(int angle, boolean immediateReturn)
causes motor to rotate through angle;
iff immediateReturn is true, method returns immediately and the motor stops by itself
Derved kunne vi, i et while loop, kontrollere hvornår rotation var færdig ved at kalde:
public boolean isMoving()
Returns true iff the motor is in motion.
While loopet blev holdt kørende delvist af isMoving() og en variabel vi kunne ændre udenfor tråden, hvor vi kontrollerede om touchsensoren blev aktiveret.
Udover at være dårligt designet, kastede koden også forskellige exceptions vi ikke var i stand til at genkende eller fikse. Derfor opgav vi tråden og rykkede aktiviteten ind i en metode. Koden for dette kan ses nedenfor:
Motor.A.rotate(-180, true);// start Motor.A rotating backward
Motor.C.rotate(-360, true); // rotate C farther to make the turn
while(Motor.C.isMoving() || Motor.A.isMoving()) {
if(touch.isPressed()) {
Motor.A.stop();
Motor.C.stop();
break;
}
}
Status
Alt er gået efter planen i dag, men vi nåede ikke at implementere sidste del af vejledningen ("Motivation Functions") selv. I stedet hentede vi Oles implementation af BumperCar og Arbitrator, overførte den til robotten og iagtog opførslen. Derefter gik vi igennem koden for at forstå præcis hvad der skete.
Ingen kommentarer:
Send en kommentar