tirsdag den 11. januar 2011

NXT Programming, lesson 17

Dato: 7-1-2011
Varighed: 7 timer
Deltagere: JC, Allan


Formål:

Vi skal kode videre på de opførelser, der skal få robotten til at bevæge sig fra midt på banen, ned til de to målzoner. Derefter skal vi lave en opførelse, som får robotten til at bruge de røde eller grønne cirkler til at rette sig op og køre i mål.



Plan:
-Skrive opførelse klassen GreyNavigator(tidligere kladt NavigateBack), som får robotten til at køre mod mål.

-Skrive opførelsen ColorNavigator der får robotten til at rette op, vha. de røde/grønne striber.


GreyNavigator:


Koden:




package BrickSorter;


import Robot.Claw;
import Robot.LightSensorNavigator;
import Robot.Movement;
import lejos.nxt.LCD;
import lejos.nxt.Sound;
import lejos.robotics.subsumption.Behavior;


public class GreyNavigator implements Behavior{

private LightSensorNavigator lsn;
private boolean _suppressed = false;
private int actionTime = 40;
private int actionSpeed = 50;

public GreyNavigator(LightSensorNavigator lsn) {
this.lsn = lsn;
}


@Override
public void action() {
trueP();
}

private void trueP() {
int right = lsn.getRight();
int left = lsn.getLeft();
int x = right - left;
int powerL = -x + 30;
int powerR = x + 30;
Movement.drive(powerL, powerR);
Sound.pause(actionTime);
}


public void noP(){
int right = lsn.getRight();
int left = lsn.getLeft();
if(left > right){
Movement.drive(40, 10);
Sound.pause(actionTime);
}
else if(left < right){
Movement.drive(10, 40);
Sound.pause(actionTime);
}
else {
Movement.drive(30, 30);
Sound.pause(actionTime);
}
}


@Override
public void suppress() {
_suppressed = true;

}

@Override
public boolean takeControl() {
return !Claw.isOpen();
}


}


Dette er hele koden til GreyNavigator. Den har tilgang til de to lyssensorer igennem klassen LightSensorNavigator og kan hente værdierne med getRight() og getLeft(). 

For at tjekke om den må tage kontrollen med takeControl(), ser den på om kloen er lukket. Hvis dette er tilfældet, så har vi en brik og skal derfor finde i mål. Vi vil måske senere se på at udvide denne, så vi med kameraet kan se om der rent faktisk er en brik i kloen, og den ikke bare er lukket for tidligt eller om brikken er tabt.

I action() kalder vi metoden trueP(), som er et forsøg på at lave proportionel krafttilførelse [PID] på de to motorer ud fra hvad lyssensorerne har af værdi. Vi tager værdien fra de to sensorer og udregner differencen. Denne værdi bliver derefter enten lagt til eller trukket fra 30 som er den maksimale difference vi kan se mellem de to sensore ude på banen (empirisk test), når robotten står sidelæns. Dette giver begge motorer muligheden for at få tilført kraft mellem 0% og 60% og hvis begge sensorer giver den samme værdi, vil begge få tilført 30%. Denne kraft bliver tilført i 40 ms, hvorefter alle adfærdsmønstrenes takeAction() skal tjekkes igen.


Vi har også efterladt vores initielle implementation som nu hedder noP(), som er for simpel til at give robotten en flydende bevægelse mod målzonerne.

Dette virker så godt som man kunne forvente på den nuværende bane. Derfor har vi også valgt at købe en ny bane. Mere om dette til sidst i bloggen.

ColorNavigator:

Koden:

package BrickSorter;

import Robot.LightSensorNavigator;
import Robot.Movement;
import lejos.nxt.Sound;
import lejos.robotics.subsumption.Behavior;

public class ColorNavigator implements Behavior{

private LightSensorNavigator lsn;
private boolean _suppressed = false;
private int actionTime = 20;
private int diffLevel = 2;
private int rightDiff;
private int leftDiff;
public ColorNavigator(LightSensorNavigator lsn) {
this.lsn = lsn;
}

@Override
public void action() {
int diff = Math.abs(lsn.getRight() - lsn.getLeft());
while (diff != 0) {
if (rightDiff > leftDiff) {
Movement.drive(10, 1);
Sound.pause(actionTime);
}
else {
Movement.drive(1, 10);
Sound.pause(actionTime);
}
diff = Math.abs(lsn.getRight() - lsn.getLeft());
}
Movement.drive(0, 0);
Sound.pause(10000);
}

@Override
public void suppress() {
_suppressed = true;// standard practice for suppress methods
}

@Override
public boolean takeControl() {
int[] rightBuffer = lsn.getRightBuffer();
int[] leftBuffer = lsn.getLeftBuffer();
rightDiff = Math.abs(rightBuffer[rightBuffer.length - 1] - rightBuffer[rightBuffer.length - 2]);
leftDiff = Math.abs(leftBuffer[leftBuffer.length - 1] - leftBuffer[leftBuffer.length - 2]);
return rightDiff > diffLevel || leftDiff > diffLevel;
}

}

!DETTE ER MIDLERTIDIG KODE!

Denne opførelse skulle gerne få robotten til at stoppe op når den rammer en af de to halvcirkler og rette sig op. Da det midlertidige underlag ikke er godt nok til at lave ordenlige tests på, har vi ikke lave dette kode færdig.

Ideen er at takeControl() tjekker de sidste værdier i bufferen og de nye i LightSensorNavigator og ser om der er sket en spring på mere end diffLevel. Hvis detter er sket, så har robotten set et farveskift der kun kan være de farvede cirkler og den skal derfor udføre oprettelsen.

Oprettelsen består i at den side der så skiftet i værdi står stille mens den anden side kører frem indtil den også  ser dette skift. Dette skulle gerne får robotten til at rette op. Derefter har vi ikke valgt om GreyNavigator skal overtage igen og køre frem til det næste sorte, eller om vi skal lave en scriptet indkørsel. Igen var banen ikke tilfredsstillende.


Adfærdshierarki:


Adfærdshierarki ser nu sådan ud:



DetectWall er stadig den øverste i hierarkiet, men ColorNavigator er kommet ind imellem DetectWall og GreyNavigator.

Banen:

Vi har besluttet efter en samtale med Ole om økonomien og internt i gruppen, at vi var nødt til at købe en professionelt udprintet bane. Vi har derfor været nede i forretningen "Huset" og den skulle gerne være klar på mandag. Spændingen stiger!

Resultat:

GreyNavigator kan nu få robotten til at flytte sig fra den lyse enden af banen til den mørke ende, i en næsten lige linie. Den nye bane skulle gerne gøre dette bedre.


ColorNavigator er ikke en færdig løsning på dette problem og vi skal derfor arbejde videre på den næste gang. Dog håber vi at vores første idéer kan videreføres til en endelig løsning.


Banen skulle gerne komme mandag. Fingers Crossed.



Ingen kommentarer:

Send en kommentar