Fachbereich IT/Robotik
Schülerforschungszentrum Lörrach
 

Abräumer

Aufgabenstellung

Abräumer 3x3

Konstruieren und programmieren Sie einen Roboter, der sich auf einem Spielfeld an aufgemalten schwarzen Kreuzen orientiert und der das gesamte Spielfeld abfährt.
Dem Roboter sind die Größe des Feldes, die Größe, Form und Abstände der Markierungen, sowie seine Startposition bekannt.
Das Spielfeld besteht aus 5cm breiten Kreuzen, welche in 10cm Abständen in einem 3x3 Raster angeordnet sind.

Der Roboter zeichnet sich aus durch:

  • zwei einzeln angetriebene Räder
  • zwei Lichtsensoren, die gegen den Boden gerichtet sind

Abräumer 8x12

Konstruieren und programmieren Sie einen Roboter, der sich auf einem Spielfeld an aufgemalten schwarzen Kreuzen orientiert und der das gesamte Spielfeld abfährt.
Dem Roboter sind die Größe des Feldes, die Größe, Form und Abstände der Markierungen bekannt. Nicht bekannt sind dem Roboter seine Startposition, sowie als Hindernisse im Feld aufgestellte Wände.
Das Spielfeld besteht aus 5cm breiten Kreuzen, welche in 10cm Abständen in einem 8x12 Raster angeordnet sind. Das Spielfeld ist von einer mind. 6cm hohen Bande umgeben. Auf dem Spielfeld befinden sich gleich hohe Wände deren Position vorab nicht bekannt ist.

Der Roboter zeichnet sich aus durch:

  • zwei einzeln angetriebene Räder
  • zwei Lichtsensoren, die gegen den Boden gerichtet sind
  • einen an der Front montierten Ultraschallsensor der den Abstand zu den Wänden detektieren kann

Abräumer zerlegt in Interfaces

Um die Komplexität zu reduzieren, kann der Abräumer in einzelne Komponenten zerlegt werden. Werden die öffentlichen (public) Attribute und Methoden dieser Komponenten vorher definiert, können sie bereits in anderen Klassen verwendet werden, bevor sie fertig programmiert wurden. In Java erfolgt diese Definition über Interfaces.

Materialien

Interfaces

Navigator.java
/**
 * The Navigator keeps track of where the Abraeumer is and tells him where to go
 * next.
 * 
 * @author phaenovum - IT/Robotik
 * 
 */
public interface Navigator {
 
	/**
	 * Ask the navigator where to move next.
	 * 
	 * @return Direction to move to
	 */
	public Direction nextMove();
 
	/**
	 * Tell the Navigator that the last movement command could not be executed,
	 * since there was a barrier preventing this move.
	 */
	public void movePrevented();
}

IT-Seminar TeilnehmerInnen benutzen bitte ihren eigenene Pilot.

Pilot.java
/**
 * Pilot is responsible for coordinating the motors and keeping track of the
 * tacho count.
 * 
 * All methods should be implemented non-blocking and movements should run
 * infinitely until they are stopped by resetTachoCount() .
 * 
 * @author phaenovum - IT/Robotik
 * 
 */
public interface Pilot {
 
	/**
	 * Antrieb vorwaerts
	 */
	public void moveForward();
 
	/**
	 * Antrieb rueckwaerts
	 */
	public void moveBackward();
 
	/**
	 * Antrieb nach Links drehen
	 */
	public void turnLeft();
 
	/**
	 * Antrieb nach Rechts drehen
	 */
	public void turnRight();
 
	/**
	 * Antrieb anhalten
	 */
	public void stop();
 
	/**
	 * Resets the tacho counter for both motors. To do this the motors am
	 * implicitly stopped.
	 */
	public void resetTachoCount();
 
	/**
	 * Ueberprueft, ob sich die Motoren des Roboter um den uebergebenen
	 * Soll-Wert gedreht haben.
	 * 
	 * @param nominalRotation
	 *            Soll-Wert fuer die Drehung
	 * @return true: Drehung ist abgeschlossen
	 * @return false: Drehung ist noch nicht abgeschlossen
	 */
	public boolean isRotationComplete(float nominalRotation);
 
}
GroundDetector.java
public interface GroundDetector {
 
	/**
	 * Ueberprueft, ob sich der linke Lichtsensor ueber einer schwarzen Markierung
	 * befindet.
	 * 
	 * @return true: Linker Lichtsensor befindet sich ueber einer schwarzen
	 *         Markierung
	 * @return false: Linker Lichtsensor befindet sich nicht ueber einer
	 *         schwarzen Markierung
	 */
	public boolean isLeftDark();
 
	/**
	 * Ueberprueft, ob sich der rechte Lichtsensor ueber einer schwarzen Markierung
	 * befindet.
	 * 
	 * @return true: Rechter Lichtsensor befindet sich ueber einer schwarzen
	 *         Markierung
	 * @return false: Rechter Lichtsensor befindet sich nicht ueber einer
	 *         schwarzen Markierung
	 */
	public boolean isRightDark();
 
	/**
	 * Ueberprueft, ob sich einer der beiden Lichtsensoren ueber einer schwarzen
	 * Markierung befindet.
	 * 
	 * @return true: Einer der Lichtsensoren befindet sich ueber einer schwarzen
	 *         Markierung
	 * @return false: Keiner der Lichtsensor befindet sich ueber einer schwarzen
	 *         Markierung
	 */
	public boolean isAnyDark();
 
	/**
	 * Ueberprueft, ob sich beide Lichtsensoren ueber einer schwarzen
	 * Markierung befindet.
	 * 
	 * @return true: Beide Lichtsensoren befinden sich ueber einer schwarzen
	 *         Markierung
	 * @return false: Kein Lichtsensor befindet sich ueber einer schwarzen
	 *         Markierung
	 */
	public boolean areBothDark();
 
	/**
	 * Setzt den Schwellwert zur Unterscheidung von Schwarz und Weiss anhand des
	 * Lichtsensorwertes ueber dem weissen Spielfeldbereich.
	 */
	public void calibrateLightLimit();
 
}

Enumeration

Direction.java
/**
 * These are the commands given to the Abraeumer by the Navigator.
 * 
 * @author phaenovum - IT/Robotik
 * 
 */
public enum Direction {
	/** Move forward to the next cross (if possible) */
	FORWARD,
	/** Move backward to the next cross (if possible) */
	BACKWARD,
	/** Turn left and move to the next cross (if possible) */
	LEFT,
	/** Turn right and move to the next cross (if possible) */
	RIGHT,
	/** Stop, you are finished */
	STOP
}
 
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki