#This file was created by <pantec> Wed Jan 28 22:58:04 1998
#LyX 0.10 (C) 1995 1996 Matthias Ettrich and the LyX Team
\lyxformat 2.10
\textclass article
\language german
\inputencoding latin1
\fontscheme default
\epsfig dvips
\papersize a4 
\paperfontsize 10 
\baselinestretch 1.00 
\secnumdepth 3 
\tocdepth 3 
\paragraph_separation indent 
\quotes_language english 
\quotes_times 2 
\paperorientation portrait 
\papercolumns 1 
\papersides 1 
\paperpagestyle plain 

\layout Title
\fill_top \fill_bottom 
Die Khepera C++ Bibliothek
\newline 

\family typewriter 

\series medium 

\size normal 
Thomas Pantzer, Februar 1997
\layout Standard


\begin_inset LatexDel \tableofcontents

\end_inset 


\layout Section

Einleitung
\layout Subsection

Was ist khepera
\layout Standard

Khepera ist
\layout Enumerate

der Name eines alten ägyptischen Gottes mit einem Kopf in Form eines Käfers
 
\newline 
(siehe 
\shape italic 
http://www.
khepera.
com/xpr/story.
html
\shape default 
).

\layout Enumerate

ein Miniaturroboter mit 8 Infrarot- und Umgebungslichtsensoren und zwei,
 von je einem Motor getriebenen, Rädern.
 Weiterhin kann man ihn mit einer 64-Pixel CCD-Kamera und/oder einem Greifer
 ausstatten.
 Dieser Roboter wird von der Firma 
\series bold 

\size normal 
Applied AI Systems, Inc.

\series default 

\size default 
 vertrieben.
 Genauere technische Daten kann man auch über deren Webseite 
\shape italic 
http://fox.
nstn.
ca/~aai/khepera.
htm
\shape default 
 erfahren.

\layout Enumerate

der Name (m)einer C++Bibliothek zur Kommunikation und Steuerung des unter
 Punkt 2 genannten Miniaturroboters.

\layout Standard

Der weitere Text behandelt ausschließlich um die im Punkt 3 genannte C++Biblioth
ek, deren Kernstück die Objektklasse 
\shape italic 
RobotContext
\shape default 
 ist.
 Die Implementation der Fast Fourier Transformation wurde von 
\shape smallcaps 
Philip Van Baren
\shape default 
 vorgenommen.
 Die Routinen zur Behandlung der seriellen Schnittstelle entstammen dem
 Programm 
\series bold 
sim
\series default 
 von 
\shape smallcaps 
Oliver Michel
\shape default 
 und wurden von 
\shape smallcaps 
M.
 von Holzen
\shape default 
 und 
\shape smallcaps 
L.
 Tettoni 
\shape default 
programmiert.
 Man beachte auch deren Copyrights in den entsprechenden Quelltexten und
 Headerdateien.

\layout Subsection

Motivation
\layout Standard

Im Rahmen des Praktikums Autonome Roboter an der Universität Leipzig kam
 ich das erste Mal mit dem khepera-Roboter in Berührung.
 Da diese Roboter mit zusätzlichen Komponenten (Greifer und Kamera) ausgestattet
 waren, und noch keine Beispielsoftware für diese Komponenten aufzutreiben
 war, faßte ich den Entschluß, selbst ein Steuerprogramm für diesen Roboter
 zu schreiben.
 Die Bibliothek wurde später aus verschiedenen Modulen dieses Steuerprogramms
 zusammengesetzt.
 
\layout Subsection

Funktionsumfang
\layout Itemize

alle Basisfunktionen wie aus dem Khepera Handbuch zum Roboter zu entnehmen
 werden als Funktionsaufruf unterstützt, mit Ausnahme der Abfrage der BIOS-Versi
onsnummer und des Hilfetextes.

\layout Itemize

weitere kombinierte Funktionen wie z.
Bsp.
 zum exakten Vorwärtsbewegen um einen bestimmten Weg
\layout Itemize

zur Positionsbestimmung (Odometrie) 
\layout Itemize

und zur Sensordatenverarbeitung (Kantenfilter, FFT) 
\layout Section

Die Objektklassen 
\layout Subsection

class RobotContext
\layout Standard

Diese Struktur dient hauptsächlich dazu, die internen Statusvariablen im
 Kontroller des Khepera - Roboters im Hostrechner abzubilden.
 Die Methoden dieser Objektklasse sind zum Teil Funktionen die 
\begin_inset Quotes eld
\end_inset 

hardwareseitig
\begin_inset Quotes erd
\end_inset 

 im Roboter implementiert sind, und zum anderen sind es aus mehreren einzelnen
 Funktionen kombinierte Methoden oder Algorithmen zur Vorverarbeitung und
 Aufbereitung der gelieferten Daten.
 
\layout Subsubsection

Definition
\layout Standard


\family typewriter 

\series bold 

\size small 
class
\series default 
 RobotContext {
\layout Standard


\family typewriter 

\series bold 

\size small 
public
\series default 
:
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 t_vertex_2d pos;
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\shape italic 
 // Position
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
double
\series default 
 alpha;
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\shape italic 
 // Orientierung, Winkel
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
double
\series default 
 aspect, delta;
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\shape italic 
 // polare Koordinaten, Winkel/Abstand
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
char
\series default 
 With_Camera,With_Gripper,socket_mode,used;
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 t_world World;
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\shape italic 
 // 
\begin_inset Quotes eld
\end_inset 

Eck
\begin_inset Quotes erd
\end_inset 

-daten des Koordinatensystems 
\layout Standard


\family typewriter 

\shape italic 

\size small 
// Statusvariablen, 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
double
\series default 
 gone;
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\shape italic 
// zurückgelegter Weg
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 arm_pos, gr_width, ohm;
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
char
\series default 
 catched;
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 speed_left,speed_right,darkness, motion_flags;
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 gpl,gpr; 
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 
\shape italic 
// [g]lobal_[p]osition_[l]eft enthält Summe 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 
\shape italic 
// Radimpulszähler links/rechts
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 ID; 
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 
\shape italic 
// Identifizierungsnummer
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 fd; 
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 
\shape italic 
//
\family default 

\shape default 

\size default 
 
\family typewriter 

\shape italic 

\size small 
filedescriptor für IO
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 SensorValue[2][8];
\protected_separator 

\shape italic 
 // Array für Sensordaten 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 SensorMax[3];
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 
\shape italic 
// maxima der versch.
 Sensoren
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
short
\series default 
 
\series bold 
int
\series default 
 Image[256];
\protected_separator 

\protected_separator 
 
\shape italic 
// Array für Kamera Pixel 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
char
\series default 
 device[256];
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 
\shape italic 
// Dateiname oder ( hostname + portnummer )
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 

\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Init(
\series bold 
char
\series default 
 *);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Done(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Reset(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Turn(
\series bold 
double
\series default 
 degrees);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Move(
\series bold 
double
\series default 
 millimeter);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 LookHome(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 SetOrientation(
\series bold 
double
\series default 
 deg);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Lift(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 WaitStopped(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Stop(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 SolveCoords(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 SetMotorSpeed(
\series bold 
double
\series default 
 left_speed, 
\series bold 
double
\series default 
 right_speed);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 SetMotorSpeed(
\series bold 
int
\series default 
 motor_num,
\series bold 
 double
\series default 
 speed);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
double
\series default 
 GetMotorSpeed(
\series bold 
int
\series default 
 motor_num);
\layout Standard


\family typewriter 

\shape italic 

\size small 
// BASIC-Turret,
\protected_separator 
 low level functions of the robot
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 SetWheelCounter(
\series bold 
int
\series default 
 left, 
\series bold 
int
\series default 
 right);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 TurnWheels(
\series bold 
int
\series default 
 left, 
\series bold 
int
\series default 
 right);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 ReadWheelCounter(
\series bold 
int
\series default 
 *left, 
\series bold 
int
\series default 
 *right);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 SetMotorSpeed(
\series bold 
int
\series default 
 left_speed, 
\series bold 
int
\series default 
 right_speed);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 GetMotorSpeed(
\series bold 
int
\series default 
 &left, 
\series bold 
int
\series default 
 &right);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
double
\series default 
 ReadSensor(
\series bold 
int
\series default 
 sensor_class, 
\series bold 
int
\series default 
 sensor_num);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 UpdateSensors(
\series bold 
void
\series default 
); 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 SetSpeedProfile(
\series bold 
int
\series default 
 left_max, 
\series bold 
int
\series default 
 right_max, 
\series bold 
int
\series default 
 left_acc, 
\series bold 
int
\series default 
 right_acc); 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 LED_Ctrl(
\series bold 
int
\series default 
 led_num, LED_Behavior);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 GetMotionCtrlFlags(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\layout Standard


\family typewriter 

\shape italic 

\size small 
// GRIP-Turret
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 SetArmPos(
\series bold 
int
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 ReadGripOhmMeter(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
char
\series default 
 CatchedObject(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 GrippedWidth(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 GetArmPos(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Grip(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\shape up 

\protected_separator 
 
\series bold 
void
\series default 
 Release(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\shape italic 

\size small 
// VISION-Turret
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
char
\series default 
 
\series medium 
ImageRead(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
float
\series default 
 GetIntensity(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 GetPixelMaxLight(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
int
\series default 
 GetPixelMinLight(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 SetScanningPeriod(
\series bold 
int
\series default 
);
\layout Standard


\family typewriter 

\size small 
};
\layout Subsubsection

Erläuterung der Methoden
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Init(
\series bold 
char
\series default 
 *);
\family default 

\size default 
 
\newline 
stellt die Verbindung zum Roboter her und initialisiert alle Variablen auf
 null, der Übergabe wert ist eine Zeichenkette und wird als Dateiname einer
 Gerätedatei interpretiert.
 Die Zeichenkette muß mit Ziffern enden.
 Falls ein Leerzeichen in der Zeichenkette enthalten ist, wird der erste
 Teil der Zeichenkette als Hostname und der zweite Teil als Portnummer interpret
iert.
 In diesem Fall wird versucht, anstelle einer Gerätedatei(serielle Schnittstelle
) einen Socket zu öffnen.
 Damit besteht die Möglichkeit auch mit einem Robotersimulator zu arbeiten.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Done(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
gibt allozierten Speicher wieder frei
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Reset(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
setzt alle Varablen auf null
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Turn(
\series bold 
double
\series default 
 degrees);
\family default 

\size default 
 
\newline 
dreht den Roboter um einen bestimmten Winkel
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Move(
\series bold 
double
\series default 
 millimeter);
\family default 

\size default 
 
\newline 
bewegt den Roboter vorwärts
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 SetOrientation(
\series bold 
double
\series default 
 deg);
\family default 

\size default 
 
\newline 
dreht den Roboter in seine Ursprungslage und dann um den angegebenen Winkel
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 LookHome(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
dreht den Roboter in Richtung seines Ursprungspunktes
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Lift(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
hebt den Greifer und stellt ihn auf ca.
 78° ein
\layout Enumerate


\family typewriter 

\series bold 

\size small 

\begin_inset Label stop

\end_inset 

void
\series default 
 WaitStopped(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
wartet bis sich kein Sensor des Roboters mehr verändert.
 Diese Funktion sollte nur mit sehr viel Vorsicht eingesetzt werden, da
 unter ungünstigen Umständen das ganze Program zum stehen kommen kann.
 Sie ist nur für kurze (einzeilige) Demoprogramme geeignet und gehöhrt nicht
 in eine echtzeitfähige Robotersteuerung.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Stop(
\series bold 
void
\series default 
); 
\family default 

\size default 

\newline 
schaltet die Motoren des Roboters ab und ruft die Funktion 
\shape italic 
WaitStopped()
\shape default 
 auf.
 diese Funktion sollte genau wie die unter Punkt 
\begin_inset LatexDel \ref{stop}

\end_inset 

 gemieden werden.
 
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 SolveCoords(
\series bold 
void
\series default 
);
\shape italic 
 
\family default 

\shape default 

\size default 

\newline 
berechnet die X/Y-Koordinaten des Roboters nur mit Hilfe der Radumdrehungen.
 Diese Methode wird auch aus den Funktionen 
\shape italic 
Move()
\shape default 
, 
\shape italic 
Turn()
\shape default 
 und 
\shape italic 
SetMotorSpeed() 
\shape default 
aufgerufen.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 SetWheelCounter(
\series bold 
int
\series default 
 left, 
\series bold 
int
\series default 
 right);
\family default 

\size default 
 
\newline 
setzt die Werte für den den linken und rechten Radzähler 
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 TurnWheels(
\series bold 
int
\series default 
 left, 
\series bold 
int
\series default 
 right);
\family default 

\size default 
 
\newline 
die Räder werden in Bewegung gesetzt bis die Werte für den linken und rechten
 Radzähler mit den übergebenen Werten übereinstimmen.
 Die erreichbare Maximalgeschwindigkeit und Beschleunigung kann vorher mit
 der Funktion 
\shape italic 
SetSpeedProfile(.
.
.
)
\shape default 
 eingestellt werden.
 
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 ReadWheelCounter(
\series bold 
int
\series default 
 *left, 
\series bold 
int
\series default 
 *right);
\family default 

\size default 
 
\newline 
Mit dieser Funktion können die Radzähler ausgelesen werden.
 Ein Wert von 600 entspricht einer Radumdrehung
\layout Enumerate


\family typewriter 

\series bold 

\size small 

\begin_inset Label speed

\end_inset 

void
\series default 
 SetMotorSpeed(
\series bold 
int
\series default 
 left_speed, 
\series bold 
int
\series default 
 right_speed);
\family default 

\size default 
 
\newline 
Schaltet beide Motoren gleichzeitig an.
 Die Geschwindigkeit der Motoren kann links und rechts unterschiedlich sein.
 Das Wert kann zwischen -128 und 127 variieren.
 Ein Wert von 127 entspricht einem Meter pro Sekunde.

\layout Enumerate


\family typewriter 

\series bold 

\size small 

\begin_inset Label fspeed

\end_inset 

void
\series default 
 SetMotorSpeed(
\series bold 
double
\series default 
 left_speed, 
\series bold 
double
\series default 
 right_speed);
\newline 

\family roman 

\size normal 
wie im Punkt 
\begin_inset LatexDel \ref{speed}

\end_inset 

 aber mit Werten zwischen -1.
0 und +1.
0 .
 Ein Wert von 1.
0 entspricht einer Geschwindigkeit von 0.
2 m/s.
 Dieser Wert kann zum Zeitpunkt der Kompilation anders festgelegt werden
 und wurde mit Absicht so gewählt, damit der Roboter nicht in einem unbeobachtet
en Moment vom Tisch fällt.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 SetMotorSpeed(
\series bold 
int
\series default 
 motor_num,
\series bold 
 double
\series default 
 speed);
\family default 

\size default 
 
\newline 
wie in Punkt 
\begin_inset LatexDel \ref{fspeed}

\end_inset 

 aber es wird nur ein Motor angesprochen.
 Der Index 0 steht für den linken, der Index 1 für den rechten Motor.
 
\layout Enumerate


\family typewriter 

\series bold 

\size small 
double
\series default 
 GetMotorSpeed(
\series bold 
int
\series default 
 motor_num);
\family default 

\size default 
 
\newline 
liest den aktuellen Geschwindigkeitswert eines Motors.
 Die Rückgabewerte sind in der selben Größenordnung wie die in der Funktion
 
\begin_inset LatexDel \ref{fspeed}

\end_inset 

 übergebenen Werte.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
double
\series default 
 ReadSensor(
\series bold 
int
\series default 
 sensor_class, 
\series bold 
int
\series default 
 sensor_num);
\family default 

\size default 
 
\newline 
gibt den skalierten Wert eines Sensors zurück.
 Das Ergebnis ist immer im Bereich [0,1.
0].
 Ein Wert 1.
0 entspricht dem Maximum aller bis dahin eingelesenen Werte.
 Als Argument wird die Art des Sensors ( 0 für Infrarot oder 1 für Umgebungslich
t) und die Nummer bzw.
 Position des Sensors angegeben.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 UpdateSensors(
\series bold 
void
\series default 
); 
\family default 

\size default 

\newline 
Diese Funktion liest nacheinander alle Infrarot- Entfernungssensoren und
 danach alle Umgebungslichtsensoren und speichert die Werte in einem Array
 ab.
 Mit der Funktion ReadSensor(.
.
) können die einzelnen Werte abgefragt werden
\family typewriter 

\series bold 

\size small 
.

\family default 

\series default 

\size default 
 
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 SetSpeedProfile(
\series bold 
int
\series default 
 left_max, 
\series bold 
int
\series default 
 right_max,
\series bold 
 
\newline 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 int
\series default 
 left_acc, 
\series bold 
int
\series default 
 right_acc); 
\newline 

\family roman 

\size normal 
Mit dieser Funktion kann der roboterinterne Positionierungskontroller konfigurie
rt werden.
 Die Einheiten sind 
\begin_inset Formula \( x*8\frac{mm}{s} \)
\end_inset 

 für die Geschwindigkeit und 
\begin_inset Formula \( x*3.125\frac{mm}{s^{2}} \)
\end_inset 

für die Beschleunigung.
 Der Roboter benutzt dieses Profil um die Motorgeschwindigkeit während der
 Ausführung der Funktion 
\shape italic 
TurnWheels(.
.
)
\family default 

\shape default 

\size default 
 zu regeln.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 LED_Ctrl(
\series bold 
int
\series default 
 led_num, LED_Behavior);
\family default 

\size default 
 
\newline 
schaltet die LEDs an, aus oder um
\layout Enumerate


\family typewriter 

\series bold 

\size small 
int
\series default 
 GetMotionCtrlFlags(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
gibt die Statusvariablen des Bewgungskontrollers im Roboter zurück.
 Für jeden Radzähler gibt es die drei Zustände 
\begin_inset Quotes eld
\end_inset 

am Ziel
\begin_inset Quotes erd
\end_inset 

, 
\begin_inset Quotes eld
\end_inset 

bewegt durch Geschwindigkeitsmodus
\begin_inset Quotes eld
\end_inset 

 und 
\begin_inset Quotes eld
\end_inset 

Positionierfehler
\begin_inset Quotes erd
\end_inset 

.
 Die entsprechenden Bitmasken kann man der Headerdatei entnehmen.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 SetArmPos(
\series bold 
int
\series default 
 degree);
\family default 

\size default 
 
\newline 
schwenkt dem Greifarm in die angegebene Position.
 Das Argument wird in Grad angegeben.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
int
\series default 
 ReadGripOhmMeter(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
mißt den elektrischen Widerstand des Objektes in der Greifzange.
 Der Wert 255 entspricht dem eines Null-Ohm-Widerstandes, der Wert 50 entspricht
 ungefähr 450 kOhm.
 Eine Kennlinie kann man aus 
\latex latex 

\backslash 
cite{gripper}
\latex default 
 entnehmen.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
char
\series default 
 CatchedObject(
\series bold 
void
\series default 
)
\family default 

\size default 
;
\family typewriter 

\shape italic 

\size small 
 
\family default 

\shape default 

\size default 

\newline 
gibt den Wert 
\shape italic 
true
\shape default 
 zurück, wenn die Lichtschranke in der Greifzange durch ein Objekt unterbrochen
 ist
\layout Enumerate


\family typewriter 

\series bold 

\size small 
int
\series default 
 GrippedWidth(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
gibt an, wie weit die Greifzange geschlossen ist
\layout Enumerate


\family typewriter 

\series bold 

\size small 
int
\series default 
 GetArmPos(
\series bold 
void
\series default 
);
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Grip(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
schließt die Greifzange
\layout Enumerate


\family typewriter 

\series bold 

\shape up 

\size small 
void
\series default 
 Release(
\series bold 
void
\series default 
);
\family default 

\shape default 

\size default 
 
\newline 
öffnet die Greifzange
\layout Enumerate


\family typewriter 

\series bold 

\size small 
char
\series default 
 
\series medium 
ReadImage
\series default 
(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
Diese Funktion gibt den Wert 
\shape italic 
true
\shape default 
 zurück, wenn ein Bild von der CCD-Kamera komplett und korrekt eingelesen
 wurde.
 Die Pixelwerte befinden sich in dem Array 
\shape italic 
Image
\shape default 
.
 Dieses Array enthält 256 Felder obwohl die Kamera nur 64 Pixel einlesen
 kann, d.
h.
 es können in dem Array 4 Bilder abgespeichert werden.
 Im ersten Bild (Indizes 0.
.
63) werden die Kamerawerte abgespeichert.
 In der momentanen Implementation wird das zweite und dritte Bild (Indizes
 64.
.
127 und 128.
.
191) benutzt, um die Ergebnisse einer Kantenfilterung bzw.
 einer Fourier-Transformation des ersten Bildes anzuzeigen.
 Das vierte Bild (Indizes 192.
.
255) ist temporärer Speicher für die Bildverarbeitungsalgorithmen
\layout Enumerate


\family typewriter 

\series bold 

\size small 
float
\series default 
 GetIntensity(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
gibt die durchschnittliche Lichtintensität im Sichtbereich aus
\layout Enumerate


\family typewriter 

\series bold 

\size small 
int
\series default 
 GetPixelMaxLight(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
gibt die Nummer des Pixels mit der größten Lichtintensität aus 
\layout Enumerate


\family typewriter 

\series bold 

\size small 
int
\series default 
 GetPixelMinLight(
\series bold 
void
\series default 
);
\family default 

\size default 
 
\newline 
gibt die Nummer des Pixels mit der kleinsten Lichtintensität aus 
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 SetScanningPeriod(
\series bold 
int
\series default 
);
\family default 

\size default 
 
\newline 
Diese Funktion setzt das Intervall mit dem der Bildspeicher der Kamera aktualisi
ert wird.
 Die zulässigen Werte sind in der nachfolgenden Tabelle aufgelistet.

\layout Standard
\added_space_top 0.30 \added_space_bottom 0.30 \align center \LyXTable
multicol2
9 2
1 1
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 1
8 1 0
8 1 1
0 8 1 1
0 8 1 1
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 0
0 8 1 1
0 8 1 1

Eingabewert
\newline 
Intervall in msec
\newline 
0
\newline 
20
\newline 
1
\newline 
50
\newline 
2
\newline 
100
\newline 
3
\newline 
150
\newline 
4
\newline 
250
\newline 
5
\newline 
500
\newline 
6
\newline 
1000
\newline 
7
\newline 
5000
\layout Subsection

class t_World
\layout Standard

Dieses Objekt besitzt drei 2-dimensionale Vektoren in denen die maximalen(minima
len) auftretenden Werte der Koordinaten des Roboters abgespeichert werden.
 Der Vektor 
\shape italic 
min
\shape default 
 markiert somit die linke untere Begrenzung des Koordinatensystems auf der
 internen Karte des Roboters, der Vektor 
\shape italic 
max
\shape default 
 hält entsprechend die rechte obere Begrenzung.
 Erreicht der Roboter einen Punkt hinter diesen Begrenzungen werden die
 neuen Werte übernommen und die Variable 
\shape italic 
grow
\shape default 
 auf den Wert 
\shape italic 
true
\shape default 
 gesetzt.
 Im nächsten Schritt wird die Variable 
\shape italic 
grow
\shape default 
 wieder auf 
\shape italic 
false
\shape default 
 zurückgesetzt.

\layout Subsubsection

Definition
\layout Standard


\protected_separator 

\layout Standard


\family typewriter 

\series bold 

\size small 
typedef
\series default 
 
\series bold 
struct
\series default 
 { 
\series bold 
double
\series default 
 x,y; } t_vertex_2d;
\family default 

\size default 
 
\layout Standard


\family typewriter 

\series bold 

\size small 
class
\series default 
 t_world { 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 
\series bold 
public
\series default 
: 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 t_vertex_2d max,min,size; 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 
\series bold 
char
\series default 
 grow; 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Update(t_vertex_2d); 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 
\series bold 
void
\series default 
 Init(
\series bold 
void
\series default 
); 
\layout Standard


\family typewriter 

\size small 

\protected_separator 

\protected_separator 
 };  
\layout Subsubsection

Erläuterung der Methoden
\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Init(
\series bold 
void
\series default 
); 
\newline 

\family roman 

\size normal 
Die Methode Init setzt die Variablen min(max) auf besonders hohe(niedrige)
 Werte, damit beim allerersten Aufruf der Methode Update alle Variablen
 auf korrekte Werte gesetzt werden können.

\layout Enumerate


\family typewriter 

\series bold 

\size small 
void
\series default 
 Update(t_vertex_2d P); 
\newline 

\family roman 

\size normal 
Hier wird geprüft ob der übergebene Punkt 
\shape italic 
P
\shape default 
 innerhalb des von 
\shape italic 
min
\shape default 
 und 
\shape italic 
max
\shape default 
 aufgespannten Rechtecks liegt.
 Ist das nicht der Fall, werden die Vektoren 
\shape italic 
min
\shape default 
 bzw.
 
\shape italic 
max
\shape default 
 so verändert, daß die obengenannte Bedingung wieder erfüllt ist.
 Dabei wird die Variable 
\shape italic 
grow
\shape default 
 auf den Wert 
\shape italic 
true
\shape default 
 gesetzt.
 Zurückgesetzt wird sie erst, wenn der übergebene Punkt 
\shape italic 
P
\shape default 
 von vornherein innerhalb des Rechtecks liegt.

\layout Section

Verschiedenes
\layout Subsection

Hilfsfunktionen
\layout Standard


\protected_separator 

\layout Standard


\family typewriter 

\series bold 
char
\series default 
 FD_Ready(
\series bold 
int
\series default 
 fd);
\layout Standard


\family typewriter 

\series bold 
void
\series default 
 InitTimer(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\series bold 
long
\series default 
 
\series bold 
int
\series default 
 GetTime(
\series bold 
void
\series default 
);
\layout Standard


\family typewriter 

\series bold 
void
\series default 
 DoneTimer(
\series bold 
void
\series default 
);
\layout Standard
\cursor 24 

\family typewriter 

\series bold 
void
\series default 
 usleep(
\series bold 
long int
\series default 
 
\begin_inset Formula \( \mu sec \)
\end_inset 

);
\layout Description

FD_Ready ist eine Funktion mit der man ohne Verzögerung prüfen kann, ob
 eine Eingabedatei Zeichen bereithält.
 Ist das nicht der Fall wird 
\shape italic 
false,
\shape default 
 ansonsten wird 
\shape italic 
true
\shape default 
 zurückgegeben.
 Als Argument wird der Dateideskriptor (Integerzahl) fuer die zu prüfende
 Datei erwartet.
 Es werden die Funktion 
\shape italic 
select()
\shape default 
 sowie die Makros 
\shape italic 
FD_SET
\shape default 
, 
\shape italic 
FD_ISSET
\shape default 
 und 
\shape italic 
FD_CLEAR
\shape default 
 benutzt.
 Beispiel: 
\shape italic 
FD_Ready(0)
\shape default 
 gibt aus, ob der Nutzer eine Taste gedrückt hatte.
 (ähnlich wie die aus Pascal bekannte Funktion 
\shape italic 
keypressed
\shape default 
), Der Wert 0 (Null) steht hier für den Dateideskriptor der Standardeingabe.

\layout Description

InitTimer initialisiert und startet einen Zeitzähler.
 
\layout Description

GetTime gibt die vom Start an verstrichene Zeit in Millisekunden zurück.

\layout Description

DoneTimer stellt den Zustand von vor dem Aufruf von 
\shape italic 
InitTimer()
\shape default 
 wieder her.

\layout Description

usleep läßt den aktuellen Prozess für eine bestimmte Mindestzeit warten.
 Das Argument ist ein integer-Wert und gibt die Wartezeit in Mikrosekunden
 an.
 Da alle UNIX Betriebssysteme multiuser- und multitaskingfähig sind und
 über einen Scheduler verfügen, kann diese Routine auch zu einer längeren
 Wartezeit, als angegeben, führen.
 Diese Funktion steht nur auf manchen Plattformen nicht zur Verfuegung (z.
B.
 HPUX) und ist durch eine Kompileranweisung noch ausgeschlossen.

\layout Subsection

Tips zur Installation
\layout Standard

Zur Installation benötigt man die GNU-Programme 
\shape italic 
tar
\shape default 
(
\shape italic 
gtar
\shape default 
), 
\shape italic 
install
\shape default 
(
\shape italic 
ginstall
\shape default 
), 
\shape italic 
gcc
\shape default 
 und 
\shape italic 
make
\shape default 
(
\shape italic 
gmake
\shape default 
).
 Als erstes packt man das Archiv in einem dafür vorgesehenen Verzeichnis
 mit 
\shape italic 
tar
\shape default 
 aus.
 Danach wählt man, der Architektur des Rechners entsprechend, ein Makefile
 aus (z.
B.
 ln -s Makefile Makefile.
sun).
 Leider habe ich an der Universität nur Zugang zu Rechnern mit 3 verschiedenen
 Plattformen, sodaß ich nur für diese Plattformen ein Makefile bereitstellen
 kann.
 Es sollte allerdings nicht schwer sein die Bibliothek auf eine andere Plattform
 zu portieren.
 Das Makefile enthält viele Variablen, sodaß nur an wenigen Stellen editiert
 werden muß.
 Die Pfadvariable PREFIX sollte allerdings in jedem Fall editiert werden.
Für eine systemweite Installation setzt man sie i.
A.
 auf 
\shape italic 

\begin_inset Quotes eld
\end_inset 

/usr/local
\begin_inset Quotes erd
\end_inset 


\shape default 
.
 Wenn man nicht über 
\shape italic 
root
\shape default 
-Rechte verfügt, bleibt nur noch die Installation im eigenen Homedirectory,
 die Variable PREFIX sollte dann diesen Wert enthalten.
 
\layout Standard

Dynamische Bibliotheken lassen sich auch dann noch benutzen, wenn man sie
 nicht mit den Systemverwalterrechten installieren kann.
 Vor der Ausführung von Programmen die solche dynamischen Bibliotheken benutzen,
 muß dann allerdings die Umgebungsvariable LD_LIBRARY_PATH auf das Verzeichnis
 mit den Bibliotheken setzen.
 Im nachfolgenden Beispiel hat der Nutzer 
\shape italic 
tom
\shape default 
 das Homedirectory 
\shape italic 
/home/tom
\shape default 
.
 Seine dynamischen Bibliotheken hat er im Verzeichnis 
\shape italic 
/home/tom/lib
\shape default 
 abgespeichert und er benutzt die 
\shape italic 
bash
\shape default 
 als Shell.
 
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
(sun):/home/tom/> export LD_LIBRARY_PATH=/home/tom/lib [ENTER]
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
(sun):/home/tom/> ldd demoprog [ENTER]
\begin_deeper 
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
libkhepera.
so =>
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 /home/tom/lib/libkhepera.
so
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
libm.
so.
1 =>
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 /usr/lib/libm.
so.
1
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
libnsl.
so.
1 =>
\protected_separator 

\protected_separator 
 /usr/lib/libnsl.
so.
1
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
libsocket.
so.
1 =>
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 /usr/lib/libsocket.
so.
1
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
libc.
so.
1 =>
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 /usr/lib/libc.
so.
1
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
libdl.
so.
1 =>
\protected_separator 

\protected_separator 

\protected_separator 
 /usr/lib/libdl.
so.
1
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
libintl.
so.
1 =>
\protected_separator 
 /usr/lib/libintl.
so.
1
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
libmp.
so.
1 =>
\protected_separator 

\protected_separator 

\protected_separator 
 /usr/lib/libmp.
so.
1
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
libw.
so.
1 =>
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 /usr/lib/libw.
so.
1
\end_deeper 
\layout List
\labelwidthstring 00.00.0000


\family typewriter 

\size small 
(sun):/home/tom/> demoprog [ENTER]
\layout Subsection

Ein kurzes Demo
\layout Standard

Wenn die Bibliothek fertig kompiliert ist, kann das Demo mit der Kommandozeile
 
\layout Standard


\family typewriter 
gcc -o demo -I.
/.
.
/include demo.
cc -L.
/.
.
 -lkhepera -lm
\layout Standard

übersetzt werden.
 Gegebenenfalls müssen noch die Bibliotheken libsocket.
a und libnsl.
a mit dazugelinkt werden.
 Die Praktikumsteilnehmer im Milab können die Optionen 
\family typewriter 
-I/home/public/kurs207/include
\family default 
 und 
\family typewriter 
-L/home/public/kurs207/lib
\family default 
 benutzen, wenn sie an der Bibliothek selbst keine Änderungen vornehmen
 möchten.

\layout Standard


\protected_separator 

\layout Standard


\family typewriter 
#include "khepera.
h"
\layout Standard


\family typewriter 
int main(void)
\layout Standard


\family typewriter 
{
\layout Standard

// Variablendeklaration
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 RobotContext robot;
\layout Standard

// Initialisierung auf COM2 unter dem Betriebssystem Linux
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 robot.
Init("/dev/ttyS1");
\layout Standard

// fahre 30 Zentimeter vorwärts
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 robot.
Move(300);
\layout Standard

// senke den Greifarm 
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 robot.
SetArmPos(-20);
\layout Standard

// schließe den Greifer
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 robot.
Grip();
\layout Standard

// hebe das Objekt an
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 robot.
Lift();
\layout Standard

// drehe dich um 90 Grad nach rechts
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 robot.
Turn(-90);
\layout Standard

// fahre einen Bogen vorwärts nach rechts 
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 robot.
SetMotorSpeed((int)10,(int)8);
\layout Standard

// lese den linken vorderen Entfernungssensor
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 robot.
UpdateSensors(300);
\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 double d = robot.
ReadSensor(IRED,FRONT_LEFT);
\layout Standard

.
.
.

\layout Standard


\family typewriter 

\protected_separator 

\protected_separator 
 robot.
Done();
\layout Standard

}
\layout Bibliography


\latex latex 
{user}
\latex default 
 Khepera User Manual, K-Team SA, 1995
\layout Bibliography


\latex latex 
{gripper}
\latex default 
 Khepera Gripper User Manual, K-Team SA, 1995.

\layout Bibliography


\latex latex 
{vision}
\latex default 
 Khepera K213 Vision Turet User Manual, K-Team SA, 1995
