Varighed: 11-14
Deltagere: Daniel, Leni, Martin A og Martin N
1. Formål
Formålet med denne øvelse er at lave eksperimentelle tests som tydeliggøre effektiviteten af NXT motorernes tacho countere til at holde styr på henholdsvis position og retning. Derudover vil tests blive udført for at teste TachoPilot samt SimpleNavigator (tidligere TachoNavigator) klasserne som er implementeret direkte i leJOS API'et.
Robotten som anvendes til denne øvelse benytter differential drive, og modellen er opbygget ud fra LEGO Car 9797 byggevejledningen.
2. Øvelsesgennemgang
Øvelsen vil være opdelt i tre dele:
1) Præcision for henholdsvis TachoPilot og SimpleNavigator klasserne
2) Undvigelse af objekter under navigation
3) Forbedring af robottens evne til at navigerer
Del 1 - Præcision af simple navigation
Indledningvis vil vi forsøge at implementerer adfærden fra Brian Bagnall's robot "Blightbot", hvor vi udnytter den eksperimentelle dataopsamling beskrevet af Maja Mataric's journal om robotten "Toto".
Robottens opgave vil derfor være at benytte henholdsvis TachoPilot og SimpleNavigator klasserne fra leJOS API'et til kontinuert at navigere i 4 taller , mens en tudspen fastgjort til robottens front optegner den rute som følges, således at bevægelserne danner et timeglas. Ved at lade robotten gennemløbe adskillige 4 taller, vil det være muligt eksperimentelt at afgøre hvilken af de to implementerede klasser er den mest præcise.
Brian Bagnall gør sig den observation at hans robot "Blightbot" (som udnytter TachnoNavigator klassen, der er forgængeren til SimpleNavigator klassen) i praksis måler de korrekte afstande mens den navigerer rundt, men at dens svaghed (i form af dårligere præcision) opstår når den skal dreje (roterer). Dette spørgsmål vil blive forsøgt besvaret til sidst i dette afsnit, for bedre at kunne inddrage egne observationer fra de udførte tests.
Implemetering
De indbyggede TachoPilot og SimpleNavigator klasser kræver begge kendskab til robottens hjuldiameter, afstand fra center-center mellem de to hjul samt hvilke motor porte der benyttes.
Afstanden mellem de to hjul blev fundet til værende 11,15cm, mens hjul diameteren blev målt til 3,8cm. Derfor initialiseres klasserne på følgende måder:
public TachoNav(String type) {
float wheelDiameter = 3.8f;
float trackWidth = 11.15f;
if (type.equals("SimpleNavigator")) {
navigator = new SimpleNavigator(wheelDiameter, trackWidth, Motor.C, Motor.A);
} else {
pilot = new TachoPilot(wheelDiameter, trackWidth, Motor.C, Motor.A);
}
}
Da hjul diameteren samt hjul afstanden opgives i cm, vil de målte/ønskede afstande også fremgå i cm.
For ikke at skulle loade ny sourcekode over på NXT'en for at skifte mellem benyttelse af TachoPilot og SimpleNavigator under testene blev følgende main rutine dannet:
private static void main(String [] args) {
String navigationType = "TachoPilot";
buttonListen = new ButtonListen();
Button.ESCAPE.addButtonListener(buttonListen);
LCD.drawString("Nav style:", 0, 0);
while (!Button.ENTER.isPressed()) {
LCD.drawString(navigationType, 0, 1);
if (Button.LEFT.isPressed() || Button.RIGHT.isPressed()) {
if (navigationType.equals("SimpleNavigator")) {
navigationType = "TachoPilot ";
} else {
navigationType = "SimpleNavigator";
}
while(Button.LEFT.isPressed() || Button.RIGHT.isPressed());
}
}
while (Button.ENTER.isPressed());
TachoNav tn = new TachoNav(navigationType);
if (navigationType.equals("SimpleNavigator")) {
tn.SimpleNavigation(50.0f);
} else {
tn.PilotNavigation(100.0f);
}
}
TachoPilot
TachoPilot implementeringen fungerer ved at benytte funktionskaldene travel(distance) samt rotate(degrees). Den ønskede bevægelse kan ses ud fra figuren i forrige afsnit.
Når travel() funktionen kaldes, benyttes tacho counterne seperat på de to motorer, til at udregne hvor langt den pågældende motor har kørt. Fordelen ved at benytte tacho counterne er at selvom motorerne ikke bevæger sig lige hurtigt (hvis den ene motor eksempelvis belastes mere eller er ældre), skulle dette blive udkompenseret da motorerne ikke bare er tændt i en given periode, hvilket også skulle få robotten til at køre mere ligeud.
private void PilotNavigation(float travelDist) {
int loops = 5;
float rotation = 135.0f;
float turnSpeed = 60.0f; // degress per second
float speed = 20.0f; // wheel diameter units per second
pilot.setMoveSpeed(speed);
pilot.setTurnSpeed(turnSpeed);
LCD.drawString("Press ENTER", 0, 0);
while ( !Button.ENTER.isPressed() );
LCD.drawString("LET GO TO START!", 0, 0);
while ( Button.ENTER.isPressed() );
LCD.clear();
LCD.drawString("Travelling... ", 0, 0);
LCD.drawString("Speed: ", 0, 1);
LCD.drawString("Status:", 0, 3);
LCD.drawString("Loops remaining: ", 0, 6);
for(int i=loops; i!=0; i--) {
LCD.drawInt(i, 0, 7);
LCD.drawInt((int)speed, 8, 1);
LCD.drawString("Travel ", 0, 4);
LCD.drawInt((int)travelDist, 8, 4);
pilot.travel(travelDist);
LCD.drawString("Rotating ", 0, 4);
LCD.drawInt((int)rotation, 10, 4);
pilot.rotate(rotation);
LCD.drawString("Travel ", 0, 4);
LCD.drawInt((int)travelDist, 8, 4);
pilot.travel(travelDist*(float)Math.sqrt(2)/2);
LCD.drawString("Rotating ", 0, 4);
LCD.drawInt((int)rotation, 10, 4);
pilot.rotate(rotation);
LCD.drawString("Travel ", 0, 4);
LCD.drawInt((int)travelDist, 8, 4);
pilot.travel(travelDist);
LCD.drawString("Rotating ", 0, 4);
LCD.drawInt((int)-rotation, 10, 4);
pilot.rotate(-rotation);
LCD.drawString("Travel ", 0, 4);
LCD.drawInt((int)travelDist, 8, 4);
pilot.travel(travelDist*(float)Math.sqrt(2)/2);
LCD.drawString("Rotating ", 0, 4);
LCD.drawInt((int)-rotation, 10, 4);
pilot.rotate(-rotation);
}
}
SimpleNavigator
SimpleNavigator implementeringen benytter et internt koordinat system, samt tacho counterne til at holde styr på dens placering i forhold til dens udgangspunkt. Udgangspunktet vil altid være (0,0) i koordinatsystemet, hvorved robotten kan blive flyttet til en anden placering ved at benytte funktionerne goTo(x, y).
private void SimpleNavigation(float travelDist) {
int loops = 5;
float turnSpeed = 60.0f; // degress per second
float speed = 20.0f; // wheel diameter units per second
navigator.setMoveSpeed(speed);
navigator.setTurnSpeed(turnSpeed);
LCD.drawString("Press ENTER", 0, 0);
while ( !Button.ENTER.isPressed() );
LCD.drawString("LET GO TO START!", 0, 0);
while ( Button.ENTER.isPressed() );
LCD.drawString("Travelling... ", 0, 0);
LCD.drawString("Speed: ", 0, 1);
LCD.drawInt((int)speed, 8, 1);
LCD.drawString("Goto: ( , )", 0, 4);
LCD.drawString("Loops remaining:", 0, 6);
for (int i=loops; i!=0; i--) {
LCD.drawInt(i, 0, 7);
LCD.drawInt((int)(2*travelDist), 3, 9, 4);
LCD.drawInt(0, 3, 13, 4);
navigator.goTo(2*travelDist, 0.0f);
LCD.drawInt((int)(travelDist), 3, 9, 4);
LCD.drawInt((int)(travelDist), 3, 13, 4);
navigator.goTo(travelDist, travelDist);
LCD.drawInt((int)(travelDist), 3, 9, 4);
LCD.drawInt((int)-(travelDist), 3, 13, 4);
navigator.goTo(travelDist, -travelDist);
LCD.drawInt(0, 3, 9, 4);
LCD.drawInt(0, 3, 13, 4);
navigator.goTo(0.0f, 0.0f);
}
}
Test resultater
Begge implementeringer blev testet eksperimentelt ved fastgøre en tudspen til fronten på robotten og placerer den på et whiteboard.
Robottens bevægelse blev derefter optaget med et kamera og kan ses herunder for både TachoPilot og SimpleNavigator klasserne:
Video af TachoPilot
Video af SimpleNavigator
Som det fremgår af begge videoer er bevægelserne stortset ens når de to klasser benyttes. Fælles for dem er at de i begge tilfælde med tiden bevæger sig mere og mere nedad. Dette vurderer vi skyldes at der opsamles mere støv på hjulene jo længere tid robotten kører. Herved mindskes hjulenes evne til at køre rundt på overfladen og pålideligheden af målingerne fra tacho counterne bliver derved mindre.
Betragter vi istedet billeder af robottens bevægelser ved brug af de to klasser er det muligt at se en lille forskel:
Billede af TachoPilot
Billede af SimpleNavigator
Vi ser at nøjagtigheden når robotten roterer ved at benytte SimpleNavigator klassen ser ud til at være marginalt bedre end ved TachoPilot. En forklaring herpå kunne være at SimpleNavigator ved at benytte det interne koordinatsystem giver en bedre kortlægning af robottens bevægelser end ved kun at benytte tacho counterne til at måle rotationerne.
Som tidligere nævnt observerer Brian Bagnall at hans robot BlightBot har en mindre præcision når den skal roterer end når den kører ligeud. XXX noget med tacho counterne, ingen bud!
Del 2 - Undvigelse af objekter under navigation
Test
Del 3 - Forbedring af robottens evne til at navigerer
Vi nåede aldrig at gennemfører dette punkt, da vi brugte en del tid på at få robotten til at kunne undvige objekter under navigering. Dette blev prioriteret da vi følte at dette aspekt kunne blive aktuelt i forhold til eksamensprojektet.
3. Konklusion
XXX
4. Referencer
XXX
No comments:
Post a Comment