marvin:lab8
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
marvin:lab8 [2008/11/07 13:02] – rieper | marvin:lab8 [2008/11/09 10:34] – deva | ||
---|---|---|---|
Line 11: | Line 11: | ||
* Test individual behaviors seperately and re-calibrate constants. | * Test individual behaviors seperately and re-calibrate constants. | ||
* Make modular priority system. | * Make modular priority system. | ||
- | * Investegate | + | * Investigate |
====Execution==== | ====Execution==== | ||
We modified the code to be more modular. This was not part of the exercise, but it made it a lot easier to test individual modules. Below follows | We modified the code to be more modular. This was not part of the exercise, but it made it a lot easier to test individual modules. Below follows | ||
- | | + | |
- | * The constants in the thread RandonDrive.java has been change to accomdate | + | {{marvin: |
+ | | ||
+ | * The constants in the thread | ||
+ | **Video of Marvin running with default code**\\ | ||
+ | [[http:// | ||
===RandomDrive=== | ===RandomDrive=== | ||
- | Prints an f on the screen to show the direction of movement. The thread drives forward with different random numbers between 50 and 100 on each motor. This means that Marvin not nessesarily | + | Prints an f on the screen to show the direction of movement. The thread drives forward with different random numbers between 50 and 100 on each motor. This means that Marvin not necessarily |
===AvoidFront=== | ===AvoidFront=== | ||
- | Implemented using a sonic sensor. Prints a b on the screen to indecate | + | Implemented using a sonic sensor. Prints a b on the screen to indicate |
===PlaySound=== | ===PlaySound=== | ||
This thread waits for 10 seconds, then stops and plays a sound while printing an s on the screen. | This thread waits for 10 seconds, then stops and plays a sound while printing an s on the screen. | ||
- | [[http://java.sun.com/j2se/1.4.2/docs/api/java/ | + | ====Modular Priority System==== |
+ | The priority handling was in the initial code created by handing pointers to all lower priority Behavior to each Behavior, as shown in the code below: | ||
+ | < | ||
+ | rd = new RandomDrive(" | ||
+ | af = new AvoidFront (" | ||
+ | ps = new PlaySounds ("Play ", | ||
+ | </code> | ||
+ | This however makes shuffling of the priorities, as well as making the introduction of new Behaviors, a very tedious task. We therefore rewrote the priority system to make it more modular and flexible.\\ | ||
+ | Below is the new structure: | ||
+ | < | ||
+ | ArrayList behaviors = new ArrayList(); | ||
- | **Video and pictures**\\ | + | RandomDrive rd; |
- | [[http://www.youtube.com/v/OuSbJ5-chXI|{{marvin:lab8-1.jpg}}]]\\ | + | AvoidFront af; |
- | {{marvin:lab8-2.jpg?300}} | + | PlaySounds ps; |
+ | DriveTowardsLight dl; | ||
+ | |||
+ | rd = new RandomDrive(" | ||
+ | dl = new DriveTowardsLight(" | ||
+ | af = new AvoidFront(" | ||
+ | ps = new PlaySounds(" | ||
+ | </ | ||
+ | The idea is to use an array of Behaviors containing all lower priority Behaviors in each Behavior.\\ | ||
+ | this array is copied and stored in the constructor of each Behavior, and can then be iterated whenever suppression of the lower levels are needed. | ||
+ | <code java> | ||
+ | private ArrayList behaviors; | ||
+ | |||
+ | public Behavior(String name, ArrayList behaviors) | ||
+ | { | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | |||
+ | // Clone the Behavior list. | ||
+ | this.behaviors = new ArrayList(); | ||
+ | for(int i = 0; i < behaviors.size(); | ||
+ | Behavior b = (Behavior)behaviors.get(i); | ||
+ | this.behaviors.add(b); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public void suppressLower() | ||
+ | { | ||
+ | for(int i = 0; i < behaviors.size(); | ||
+ | Behavior b = (Behavior)behaviors.get(i); | ||
+ | b.setSuppress(true); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | The code in its entirety can be found in the '' | ||
+ | |||
+ | ====Java Thread==== | ||
+ | The '' | ||
+ | |||
+ | ====Threaded implementation of " | ||
+ | The '' | ||
+ | The wanted behavior is the following: | ||
+ | * suppress lower behaviors | ||
+ | * read light values | ||
+ | * assign modified light values as motor power (l1 -> m2, l2 -> m1). | ||
+ | * unsuppress lower behaviors | ||
+ | Here is the most important code from the class: | ||
+ | <code java> | ||
+ | private LightSensor l1; | ||
+ | private LightSensor l2; | ||
+ | private int offset = 60; | ||
+ | |||
+ | public DriveTowardsLight(String name, ArrayList behaviors) | ||
+ | { | ||
+ | ... | ||
+ | l1 = new LightSensor(SensorPort.S2); | ||
+ | l2 = new LightSensor(SensorPort.S3); | ||
+ | l1.setFloodlight(false); | ||
+ | l2.setFloodlight(false); | ||
+ | } | ||
+ | |||
+ | public void run() | ||
+ | { | ||
+ | while (true) | ||
+ | { | ||
+ | // Read value from light sensors | ||
+ | int val1 = l1.readValue() + offset; | ||
+ | int val2 = l2.readValue() + offset; | ||
+ | |||
+ | suppressLower(); | ||
+ | forward(val2, | ||
+ | delay(500); | ||
+ | unsuppressLower(); | ||
+ | } | ||
+ | </ | ||
+ | This code however would take over entirely the control of the car since it is active all the time.\\ | ||
+ | We therefore introduced a light threshold to make the car search for light, only when there is some light to search for.\\ | ||
+ | the code for that is shown below: | ||
+ | <code java> | ||
+ | private int threshold = 80; | ||
+ | |||
+ | public void run() | ||
+ | { | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | |||
+ | if(val1 > threshold || val2 > threshold) | ||
+ | suppressLower(); | ||
+ | forward(val2, | ||
+ | delay(500); | ||
+ | unsuppressLower(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | The code in its entirety can be found in the '' | ||
**Video for "Drive towards light test" | **Video for "Drive towards light test" | ||
[[http:// | [[http:// | ||
+ | |||
+ | ====Conclusion==== | ||
+ | The layered behavior model seems to work very well for the implementation of an autonomous robot. We believe that with an added push sensor Marvin would be able to navigate in any room avoiding any obstacles and find the exit with lights. |
marvin/lab8.txt · Last modified: 2008/11/14 08:50 by rieper