onsdag den 19. december 2007

Vejfinder 9

Blog9:

Varighed: 7 timer, Deltagere: Rolf og Janus

Dagens mål er at færdiggøre selve projekt-delen, så robotten kan finde et relativt stort kort med så få problemer som muligt

Vi vil opnå vores mål idag ved at:

  • Rette fejl i vores kalibreringsmetoder
  • Finde kilden til den store mængde fejlrotationer, som begyndte at opstå i går eftermiddag.
  • Kigge på muligheder for dynamisk at justere den aktuelle rotation i koordinatsystemet baseret på input fra sensorer. Rotationen er den eneste problematiske variable faktor; specielt fordi den akkumulerede fejlmargin over tid er problematisk i sig selv - og den skaleres når der køres ligeud.
  • Forsøge at rette i BlueTooth-kommunikationsklassen, så den kan genoptage en forbindelse, hvor kommunikationslinket har været brudt

Korrekt kalibrering er vigtigt

Tidligere i denne blog (i afsnittet omkring robotten som finder vej rundt om kasser) fandt vi ud af at lejOS systemet ikke roterer præcist 90 grader når man laver rotate(90). Istedet roterer den ca. 88-92 grader, men gemmer fejlen i systemet. Kalibreringsmetoden fra i går antog at robotten foretog 90-graders sving og var derfor forkert, hvilket resulterede i en direkte forkert kalibrering.

Løsningen var at ændre kalibreringsmetoden, så den drejer i bestemte retninger med rotateTo() istedet for rotate(): Først rotateTo(90) grader (et 90 graders sving til højre), så rotateTo(135) grader (et 45 graders sving til højre) osv. På denne måde følger robotten sit indbyggede koordinatsystem og korrigerer for eventuel overskydende rotation i den næste rotering.

Ud fra dette fandt vi at den tidligere kalibrering var forkert med næsten en hel grads fejl i hvert sving. Efter at have testet de nye indstillinger i Vejfinder-programmet (og opladet batteriet, hvilket som nævnt andetsteds påvirkede præcisionen også), fandt robotten igen kortet helt korrekt. Efter at foretaget yderligere et par tests fandt vi at værdien 11.65cm (den faktiske afstand imellem hjulene er stadig 11cm) giver perfekte drejninger. Umiddelbart kan dette forklares ved at hjulenes omdrejningspunkt ikke er midt på hjulet, men derimod forskudt en smule imod ydersiden i nogle situationer, denne teori kan dog ikke understøttes af slidmærkerne på hjulene, som derimod peger på at de drejer omkring et punkt tættere på indersiden af hjulet.

Selv om at vi i sidste blogpost understregede vigtigheden i kalibrering må vi indrømme at det er endnu vigtigere at denne kalibrering så rent faktisk er korrekt.

Autokalibrering af position/rotation

Grundet små unøjagtigheder som sniger sig ind i positionen/rotationen i TachoNavigator, og pga. at vi bruger TachoNavigator's koordinatsystem til at navigere på det færdige kort, har vi lavet så robotten kan autokalibrere sig selv.

Kalibreringen er kun implementeret til at kunne finde sted på et "fuldt" kryds, men der er mulighed for at implementere lignende kalibreringer på andre typer vej.

Ideen med autokalibreringen var at når vi var færdige med at detektere et vejkryds, burde robotten stå i en position, som vi ved hvor er: præcist midt på vejen, ca. 4cm fra det næste vejstykke og parallelt med vejretningen. Med andre ord har vi en metode til at regulere for de små unøjagtigheder hvis vi kan få robotten til at kalibrere sig selv, så den rent faktisk står på denne måde i den virkelige verden også.

Kalibreringen af en enkelt koordinat-akse foregår som følger:

  1. Robotten gemmer sin position og nuværende retning.
  2. Robotten kører til midten af krydset. Dette gøres ud fra TachoNavigator-koordinaterne, hvilket betyder at robotten bevæger sig til det punkt, som den tror er midten. Dette punkt kan på grund af ovennævnte fejl være forskudt for den faktiske midte med op til flere centimeter.
  3. Et loop startes:
    1. Robotten drejer sig, så den kigger ud af en sidevej, der ligger på aksen.
    2. En metode i stil med findAndGotoEdge() udføres, og vinklen som robotten nu står i gemmes.
    3. Der drejes nu 180 grader, så robotten burde stå i modsat retning.
    4. Igen udføres findAndGotoEdge().
    5. Vinklen w, mellem den gemte og den nuværende vinkel udregnes.
      • Hvis w afviger mere end 2 grader fra 180, drejes robotten 90 grader, så den nu står vinkelret på den akse, der kalibreres. Der køres lidt frem/tilbage alt efter om den fundne vinkelforskel var negativ eller positiv. Denne bevægelse flytter robotten tættere på det faktisk centrum.
      • Hvis ikke, springes ud af loopet.
  4. Robotten drejes nu så den kigger ned af den sidevej, som er i den gemte retning.
  5. findAndGotoEdge() udføres igen, for at være sikker på at robotten står lige.
  6. Positon og rotation nulstilles til de gemte værdier på TachoNavigator.

Denne algoritme udføres for hver akse, så robotten bliver kalibreret i begge retninger.

Selve algoritmen bliver udført hver gang robotten lige har opdaget et fuldt kryds, eller efter kortet er færdigopbygget og man via UI'en trykker på "Calibrate" (hvilket får robotten til at køre til et kendt kryds og autokalibrere).

Videomateriale


Her ses robotten efter dagens arbejde med forbedring af systemet. Det ses tydeligt at robotten nu bevæger sig mere flydende, og at den bruger den aktive GridBuilder ved kryds / t-kryds.



Her er en optagelse af map UIen, hvor man kan se hvordan robotten langsomt finder vejsystemet. (Grunden til at robotten står længe inde i krydset, er at denne video er optaget efter autokalibreringen er aktiveret.)

Konklusion

Idag handlede det meste om fejlrettelser og fejlkilder, da vi allerede sidste gang havde en robot der rent faktisk kunne finde hele kortet, men som blot ikke var 100% stabil.
Primært var der problemet med at robotten sidste gang, hen på eftermiddagen, begyndte at blive upræcis og ikke kunne finde kortet. Dette viste sig dog, til dels som antaget at være batteriets skyld og dels kalibreringen, da vi den her gang med et frisk opladet batteri atter kunne finde hele kortet.
Der var dog stadig små unøjagtigheder i positionen på TachoNavigator. Efter den nye metode til kalibreringen, som er beskrevet herover, blev det dog meget bedre. Den nye autokalibreringsalgoritme betyder også at vi nu hver gang vi kommer til et kryds, kan fjerne eventuelle unøjagtigheder, der skulle være opstået i løbet af et gennemløb. Dette resulterede tilsammen i at robotten nu finder kortet korrekt mere end 3/4 af gangene. De få gange, hvor det ikke virkede var fordi lyset havde ændret sig siden sidste lyskalibrering - og efter en rekalibrering virker det igen. Resultatet af arbejdet idag har været at vores robot nu virker helt stabil, så længe den er sat op til de lysforhold, som den bliver udsat for.

Ingen kommentarer: