Kristan Andersen, Simon Lykke, Jacob Styrup Bang

fredag den 9. november 2007

Lesson 8

Dagens mål:

  • Undersøge opførslen af en robot med flere behaviours.
  • Undersøge hvordan flere behaviours kan implementeres.
  • Implementere en behaviour og observere robottens opførsel.

Opbygning af robotten
For at kunne udføre eksperimenterne monterede vi ultrasonic sensoren, som vist s. 28-30 i LEGO-byggeinstruktionsbogen.

Eksperimenter med BehaviourTest1.java
BehaviourTest1.java og tilhørende klasser blev installeret på NXT'en, og programmet blev afviklet. Vi gjorde os følgende observationer:
  • Robotten kørte tilsyneladende tilfældigt rundt. Robotten valgte en retning, kørte et stykke, hvorefter den stoppede op, og startede forfra.
  • Robotten afspillede en lille melodi periodisk.
  • Hvis robotten møder en forhindring bakker den, og drejer rundt.
  • Undvige manøvren har højere prioritet end den tilfældige kørsel.
  • Melodien har højeste prioritet.
På LCD displayet kan man se følgende:
  • Klassenavnet "BehaviourTest1.java"
  • Navne på de tre behavior tråde "Drive", "Avoid" og "Play" efterfulgt af 0 eller 1. Tallet angiver om tråden er suspended.
  • Ud for "Avoid" angiver et tal fra 0 til 255 målingen fra ultrasonic sensoren. Til højre for tallet angiver et bogstav om robotten 'b' bakker, 'l' kører til venstre eller 's' i alle andre tilfælde (Vi går ud fra at 's' skal betyde stop, men displayet cleares ikke, så værdien bliver stående).
  • Til højre for "Play" står der altid et 's'. Vi går ud fra at det angiver, at når der afspilles en lyd skal robotten stoppes, men displayet cleares ikke, så bogstavet bliver stående.
Vi prøvede at deaktivere nogle af trådene, for at observere opførslen af de enkelte behaviours enkeltvis, men vi opdagede ikke noget nyt.

Behaviour Klassen og Locomotion Klassen
Formålet med at lave Behaviours daemon threads er at de kører i baggrunden og yder en service, og de kører kun så længe det service krævende program. kører.
Den private boolske værdi i trådene angiver om tråden er suppressed. I Locomotion klassen testes på om den aktive tråd er suppresed, hvis det er tilfældet gør den ingenting.
Når der kaldes delay på en Behaviour, fortager tråden busy waiting så længe tråden ikke er suppressed og tiden for delay'et ikke er gået.
Suppression mekanismen i Behaviour.java benytter en boolsk værdi til at afgøre om en behaviour har adgang til motorene. Der kan opstå problemer i forbindelse med at scheduleren skifter den aktive tråd. Da der ikke er synkroniseret adgang til metoderne i Locomotion kan følgende scenarie opstå.
  1. "AvoidFront" tråden kalder en metode i Locomotion.java.
  2. Checket på om den aktive tråd er suppressed bliver gennemført. Lige efter skifter scheduleren til "PlaySounds" tråden.
  3. "PlaySounds" tråden suppresser "AvoidFront" tråden.
  4. Scheduleren skifter tilbage til "AvoidFront" tråden, som fortsætter med at udføre metodekaldet i Locomotion, selvom tråden er suppressed.
Tilføj Behaviour
Fra sidste uges lektioner havde vi en implementation af braitenbergs køretøj, som har opførslen "kør mod lys". Implementationen er beskrevet i blogindlæget "Lesson 7". Implementationen kørte to tråde, et for hvert motor/sensor par. For at implementere opførslen "kør mod lys" i en behaviour tråd, lavede vi en behaviourtråd, som vi pakkede hele implementationen fra Lesson 7 ind i. Her sørgede vi for at suspend kald til behaviour tråden blev sendt videre til de to tråde, som styrede motor/sensor parene. Vi erstattede "Random Drive" opførslen i robotten med denne nye opførsel.

Eksperiment med "kør mod lys" behaviour
Da vi startede robotten med den nye "kør mod lys" opførsel, kunne vi observere at robotten kørte mod lys på samme måde som beskrevet i Lesson 7, og med samme opførsels hieraki, som beskrevet under eksperimenter med BehaviourTest1.java.

Konklusion
I vores forsøg har vi oplevet at det er nemt at implementere behaviours vha. tråde, og tilføje eller fjerne forskellige behaviours, dog skal man overveje designet grundigt, da der kan opstå race conditions, som beskrevet nederst i afstnittet Behaviour Klassen og Locomotion Klassen. En mulig forbedring ville være at implementere subsumption mekanismen, så race conditions ikke kan forekomme, f.eks ved at lave synkroniseret adgang til metoder og variable der bruges i flere tråde. Implementationen af "kør mod lys" opførslen gik uden de store problemer, og så snart opførslen var lavet om en til Behaviour(.java) kunne den uden problemer "samarbejde" med de eksisterende behaviours.

Ingen kommentarer: