Difference between revisions of "Czechbot"
(→Project Files) |
(→Project Files) |
||
(6 intermediate revisions by the same user not shown) | |||
Line 14: | Line 14: | ||
'''General Idea:''' | '''General Idea:''' | ||
− | Make a robot which can find a goal in a non-cycled maze (only with | + | Make a robot which can find a goal in a non-cycled maze (only with dead end tracks) of black lines by going left on every intersection. |
---- | ---- | ||
Line 26: | Line 26: | ||
'''Results:''' | '''Results:''' | ||
− | Our robot can follow the black line, | + | Our robot can follow the black line, he can recognize blind tracks and turn himself back to line. The only problem is with marking the intersections. Because robot hasn´t a ideal movement, there are still some inaccuracies. Theoreticaly we have some thoughts how to clean up, but we didn´t have enough of time to implement it right. |
+ | So our robot can`t recognize intersections properly and that is the reason why he makes so many mistakes. | ||
== Project Files == | == Project Files == | ||
Line 62: | Line 63: | ||
} | } | ||
− | public boolean isMiddleDark() { | + | public boolean isMiddleDark() { |
return middle.readValue() < 50; | return middle.readValue() < 50; | ||
} | } | ||
Line 71: | Line 72: | ||
if (isLeftDark()) { | if (isLeftDark()) { | ||
if (isRightDark()) { | if (isRightDark()) { | ||
− | navi.travel( | + | navi.travel(4); |
if (isMiddleDark()) { | if (isMiddleDark()) { | ||
Sound.twoBeeps(); | Sound.twoBeeps(); | ||
− | navi.rotate( | + | navi.travel(2); |
+ | navi.rotate(92); | ||
+ | } | ||
+ | else { | ||
+ | navi.travel(2); | ||
+ | navi.rotate(92); | ||
} | } | ||
− | |||
} | } | ||
// leve T nebo leva zatacka | // leve T nebo leva zatacka | ||
else { | else { | ||
− | navi.travel( | + | navi.travel(4); |
if (isMiddleDark()) { | if (isMiddleDark()) { | ||
Sound.twoBeeps(); | Sound.twoBeeps(); | ||
− | navi.rotate( | + | navi.travel(2); |
+ | navi.rotate(92); | ||
+ | } | ||
+ | else { | ||
+ | navi.travel(2); | ||
+ | navi.rotate(92); | ||
} | } | ||
− | |||
} | } | ||
} | } | ||
Line 91: | Line 100: | ||
else if (isRightDark()) { | else if (isRightDark()) { | ||
if (isLeftDark()) { | if (isLeftDark()) { | ||
− | navi.travel( | + | navi.travel(4); |
if (isMiddleDark()) { | if (isMiddleDark()) { | ||
Sound.twoBeeps(); | Sound.twoBeeps(); | ||
− | navi.rotate( | + | navi.travel(2); |
+ | navi.rotate(92); | ||
} | } | ||
} | } | ||
Line 100: | Line 110: | ||
else { | else { | ||
navi.rotate(-5); | navi.rotate(-5); | ||
− | navi.travel( | + | navi.travel(4); |
if (isMiddleDark()) { | if (isMiddleDark()) { | ||
+ | navi.travel(2); | ||
Sound.beep(); | Sound.beep(); | ||
} | } | ||
− | else navi.rotate(-80); | + | else { |
+ | navi.travel(2); | ||
+ | navi.rotate(-80); | ||
+ | } | ||
} | } | ||
} | } | ||
Line 111: | Line 125: | ||
public void followLine() { | public void followLine() { | ||
int dig = 0; | int dig = 0; | ||
− | Motor.C.setSpeed( | + | Motor.C.setSpeed(270); |
− | Motor.A.setSpeed( | + | Motor.A.setSpeed(270); |
if (middle.readValue() > 45) { | if (middle.readValue() > 45) { | ||
Motor.A.stop(); | Motor.A.stop(); | ||
Line 121: | Line 135: | ||
Motor.C.rotate(-dig); | Motor.C.rotate(-dig); | ||
navi.setSpeed(360); | navi.setSpeed(360); | ||
− | navi.travel( | + | navi.travel(8); |
− | navi.rotate( | + | navi.rotate(185); |
} | } | ||
Line 155: | Line 169: | ||
} | } | ||
+ | |||
</source> | </source> | ||
− | + | (illustration picture) | |
[[Image:Czechbot.jpg]] | [[Image:Czechbot.jpg]] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Latest revision as of 09:39, 14 August 2009
Overview
Author(s): Pavel Kuttelwascher, Vladimír Janouš
Country: Czech Republic
Date: 12.08.2009-14.8.2009
Activity: Centrobot Robotic Summer School 2009
Location: Vienna, Austria
Hardware: LEGO Mindstorms NXT
Abstract
General Idea:
Make a robot which can find a goal in a non-cycled maze (only with dead end tracks) of black lines by going left on every intersection.
Thoughts:
At first we tried robot only with two sensors and he did quite well. But finally we had to rewrite a source code for three sensors robot in a very short time because of troubles with implementation of two sensors ancestor. And that was the whole problem.
Results:
Our robot can follow the black line, he can recognize blind tracks and turn himself back to line. The only problem is with marking the intersections. Because robot hasn´t a ideal movement, there are still some inaccuracies. Theoreticaly we have some thoughts how to clean up, but we didn´t have enough of time to implement it right. So our robot can`t recognize intersections properly and that is the reason why he makes so many mistakes.
Project Files
import lejos.navigation.TachoNavigator;
import lejos.nxt.*;
@SuppressWarnings("deprecation")
public class TEst {
LightSensor left,right,middle;
TachoNavigator navi;
public static void main(String[] args) throws Exception {
TEst l=new TEst();
l.run();
}
public TEst() {
//init
right = new LightSensor(SensorPort.S3);
middle = new LightSensor(SensorPort.S2);
left = new LightSensor(SensorPort.S4);
navi = new TachoNavigator(5.6f, 11.5f, Motor.C, Motor.A);
}
public boolean isRightDark() {
return right.readValue() < 50;
}
public boolean isLeftDark() {
return left.readValue() < 50;
}
public boolean isMiddleDark() {
return middle.readValue() < 50;
}
public void findIntersection() {
navi.setSpeed(120);
navi.travel(1);
if (isLeftDark()) {
if (isRightDark()) {
navi.travel(4);
if (isMiddleDark()) {
Sound.twoBeeps();
navi.travel(2);
navi.rotate(92);
}
else {
navi.travel(2);
navi.rotate(92);
}
}
// leve T nebo leva zatacka
else {
navi.travel(4);
if (isMiddleDark()) {
Sound.twoBeeps();
navi.travel(2);
navi.rotate(92);
}
else {
navi.travel(2);
navi.rotate(92);
}
}
}
else if (isRightDark()) {
if (isLeftDark()) {
navi.travel(4);
if (isMiddleDark()) {
Sound.twoBeeps();
navi.travel(2);
navi.rotate(92);
}
}
// pravy T nebo prava zatacka
else {
navi.rotate(-5);
navi.travel(4);
if (isMiddleDark()) {
navi.travel(2);
Sound.beep();
}
else {
navi.travel(2);
navi.rotate(-80);
}
}
}
}
public void followLine() {
int dig = 0;
Motor.C.setSpeed(270);
Motor.A.setSpeed(270);
if (middle.readValue() > 45) {
Motor.A.stop();
Motor.C.forward();
dig = Motor.C.getTachoCount();
if (Math.abs(dig) > 270) {
Motor.C.rotate(-dig);
navi.setSpeed(360);
navi.travel(8);
navi.rotate(185);
}
}
else if (middle.readValue() <= 45) {
Motor.C.stop();
Motor.A.forward();
Motor.C.resetTachoCount();
}
}
public void run() throws InterruptedException {
while (!Button.ESCAPE.isPressed()) {
followLine();
if (isLeftDark()) {
navi.stop();
Motor.A.rotate(-5);
Motor.C.rotate(5);
findIntersection();
}
else if (isRightDark()) {
navi.stop();
Motor.A.rotate(5);
Motor.C.rotate(-5);
findIntersection();
}
LCD.drawInt(SensorPort.S3.readValue(), 4, 0, 0);
LCD.drawInt(SensorPort.S2.readValue(), 4, 0, 1);
LCD.drawInt(SensorPort.S4.readValue(), 4, 0, 2);
}
}
}
(illustration picture)
Go back to the List of the projects