FutureCar

Werbung
FB Informatik
Prof. Dr. R.Nitsch
Programmieren 2
Future Car Projekt
Reiner Nitsch
 [email protected]
FutureCar-Projekt - Einführung
FB Informatik
Prof. Dr. R.Nitsch
• Ein FutureCar (FC) ist ein autonomes fahrerloses Fahrzeug,
das im Straßenverkehr selbständig fahren kann, ohne dabei
mit anderen FutureCars zusammen zu stoßen.
• Allgemeine Vorgaben/Einschränkungen:
• Die FCWelt soll rechteckig sein. Sie ist unterteilt in
virtuelle Parzellen (s. Abbildung). In diesen gibt es
zunächst nur Strassen (' ') , Häuser ('#') und FutureCars.
Alle Strassen sind zweispurig und verlaufen senkrecht
zueinander. Sie werden begrenzt durch Häuser. Für den
ersten Entwurf verwenden Sie die rechts abgebildete
FCWelt.
• Alle FCs haben ein Kennzeichen (A bis Z) und haben eine
Breite/Länge von 1 Parzelle (=Schreibstelle auf Konsole).
• FCs 1 Parzelle (=Schreibstelle auf Konsole).
• Die FCs fahren parzellenweise weiter.
• FCs sind mit einem Laser-Scanner ausgerüstet, der die
umgebenden Parzellen im Bereich seines Sichtfeldes
abtasten und u.a. den dort festgestellten Hindernisse die
Merkmale "TRAVERSABLE", "NOTTRAVERSABLE",
"MOBILE" und "UNDEF" zuordnen kann.
09.10.2008
Projekt FutureCar
########################################
#
#
#
C
#
#D ####### ##E #### ######## ##### #
# ####### ## ####E ######## ##### #
# ####### ## #### ######## ##### #
# ####### ## ############## ##### #
#
##
##
#
#
##
##
A
#
# ####### ######## ######## ##### #
# #######
F # ######## ##### #
# #######
# ######## ##### #
# ################# ######## ##### #
#
##
#
#
#
##
#
B
#
# ####### ################## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
##
#
#
#
##
#
# ################# ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
#
#
#
#
#
#
# ####### ################## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
#
2 #
########################################
FutureCar-Projekt - Einführung
FB Informatik
Prof. Dr. R.Nitsch
• FCs verfügen über einen Autopiloten, der die
Informationen des Laser-Scanners verwendet, um sich in
der FCWelt zu orientieren.
• Ausser geradeaus zu fahren können FCs rechts/links
Abbiegen und wenden.
• Der Autopilot jedes FC arbeitet im Modus "Blaue Reise",
d.h. in jeder Parzelle wählt er aus den möglichen
Fahrtrichtungswechseln zufällig einen aus.
• Um einen realistischen Verkehrsfluss zu simulieren
entscheidet der Autopilot häufiger gerade aus zu fahren
(falls möglich). Die Rechts-oder-Links-Entscheidung wird
mit gleicher Häufigkeit getroffen ("Fahrt ins Blaue").
Gewendet wird nur bei längerem Stillstand wegen zu hoher
Verkehrsdichte (Stau) und in Sackgassen.
• Für FCs gelten folgende Verkehrsregeln:
– Rechtsfahrgebot
– Rechts vor Links
– Beim Wenden und Links-Abbiegen hat der
Gegenverkehr Vorfahrt.
– Nur Parzellen ohne feste Hindernisse (TRAVERSABLE)
dürfen befahren werden.
– Zusammenstöße sind natürlich verboten. Diese
Bedingung ist durch geeignete Zusicherungen mittels
assert vor jeder Weiterfahrt zu überwachen.
09.10.2008
Projekt FutureCar
########################################
#
#
#
C
#
#D ####### ##E #### ######## ##### #
# ####### ## ####E ######## ##### #
# ####### ## #### ######## ##### #
# ####### ## ############## ##### #
#
##
##
#
#
##
##
A
#
# ####### ######## ######## ##### #
# #######
F # ######## ##### #
# #######
# ######## ##### #
# ################# ######## ##### #
#
##
#
#
#
##
#
B
#
# ####### ################## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
##
#
#
#
##
#
# ################# ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
#
#
#
#
#
#
# ####### ################## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
#
3 #
########################################
Allgemeine Hinweise und Empfehlungen
FB Informatik
Prof. Dr. R.Nitsch
• Treffen Sie realitätsnahe Design-Entscheidungen
Beispiele:
– Das Auto hat einen Scanner, nicht umgekehrt.
– Der Fahrer (=Autopilot) trifft die Richtungsentscheidungen, ein Navi gibt nur
Empfehlungen.
– Der Fahrer fährt das Auto und nicht der Scanner
• Achten Sie auf ein sorgfältiges Design.
Sorgfältig designte Software
– läßt sich leicht an neue/andere Anforderungen anpassen
– ist leicht skalierbar
– unterstützt Wiederverwendung von Code und/oder nutzt wiederverwendbare Codeteile
– gute Dokumentation Ihrer Entscheidungen und Algorithmen (Schlecht dokumentierte
Software ist fast wertlos, da sie kaum wartbar ist. Nachlässigkeiten haben Sie selbst
auszubaden!)
– … (siehe Vorlesung "Objektorientierte Analyse und Design" )
• Ausblicke
– selbst lenkende Linienbusse mit fest vorgegebener Fahrstrecke
– selbst lenkende Limousinen, die auf kürzestem Weg zu vorgegebenen Zielen navigieren
– Die optische Darstellung der Straßenkarte kann angepasst werden (z.B. █ statt # für
Gebäude oder farbige Konsole).
– Ein- und Ausgabe eines kompletten Simulationsstatus mittels Dateioperationen
09.10.2008
Projekt FutureCar
4
Praktikum 1 - class World
FB Informatik
Prof. Dr. R.Nitsch
class World {
private:
std::string name;
int height, width;
char parcels [MAXHEIGHT][MAXWIDTH];
// oder
vector< ? > parcels;
public:
void create(const std::string& name="FC-City") ;
char getID(const Location& loc);
void setID(const Location& loc, const char& id );
}
ostream& operator<<(ostream& os, const World& w);
• Location?
• Darstellung von FCWelt-Objekten wird sich
wahrscheinlich ändern. Neue Objekte (z.B. Bäume)
können hinzu kommen. Konsequenzen für Entwurf?
09.10.2008
Projekt FutureCar
########################################
#
#
#
#
# ####### ##E #### ######## ##### #
# ####### ## #### ######## ##### #
# ####### ## #### ######## ##### #
# ####### ## ############## ##### #
#
##
##
#
#
##
##
#
# ####### ######## ######## ##### #
# #######
# ######## ##### #
# #######
# ######## ##### #
# ################# ######## ##### #
#
##
#
#
#
##
#
#
# ####### ################## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
##
#
#
#
##
#
# ################# ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
#
#
#
#
#
#
# ####### ################## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
#
#
5
########################################
Praktikum 1 - class World - Testanwendung
#include "ID.h";
typedef char Ikon;
int main() {
World world;
world.create("FC-City");
cout << world << endl;
cout << "Testsuite for class World\n";
cout << "\tWorld::getwidth\t"
<< (world.getWidth()==40 ? "PASSED":"FAILED")
<< endl;
cout << "\tWorld::getHeight\t"
<< (world.getHeight()==33 ? "PASSED":"FAILED")
<< endl;
cout << "\tWorld::getID\t"
<< ( ( world.getID(Location( 3, 3)==Ikon('#')
&& world.getID(Location(-1,-1)==Ikon('#')
&& world.getID(Location(50,50)==Ikon('#') )
? "PASSED" : "FAILED") << endl;
world.setID(Location(1,1), ID('Z'));
cout << "\tWorld::setID\t"
<< (world.getID(Location(1,1))==Ikon('Z')
? "PASSED":"FAILED") << endl;
return 0;
09.10.2008
Projekt FutureCar
FB Informatik
Prof. Dr. R.Nitsch
########################################
#
#
#
#
# ####### ##E #### ######## ##### #
# ####### ## #### ######## ##### #
# ####### ## #### ######## ##### #
# ####### ## ############## ##### #
#
##
##
#
#
##
##
#
# ####### ######## ######## ##### #
# #######
# ######## ##### #
# #######
# ######## ##### #
# ################# ######## ##### #
#
##
#
#
#
##
#
#
# ####### ################## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
##
#
#
#
##
#
# ################# ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
#
#
#
#
#
#
# ####### ################## ##### #
# ####### ######## ######## ##### #
# ####### ######## ######## ##### #
#
#
#
6 #
########################################
Praktikum 1 - Scanner
FB Informatik
Prof. Dr. R.Nitsch
•
•
•
•
Scanner haben ein begrenztes Sichtfeld (Fielf of view)
Scanner haben eine begrenzte Entfernungsauflösung
Scanner tasten ihre Umgebung nach Objekten ab
Scanner identifizieren die gefundenen Objekte (Strasse, Haus,
Fahrzeugkennzeichen, …)
• Scanner für Fahrzeuge können für die gefundenen Objekte Merkmale (Traits)
extrahieren (TRAVERSABLE, NONTRAVERSABLE, MOBILE, … )
09.10.2008
Projekt FutureCar
7
Praktikum 1 - class Scanner
FB Informatik
Prof. Dr. R.Nitsch
Sichtfeldadrressierung für alle 4 Fahrtrichtungen
1
2
3
4
15 16 17 18 19
5
6
7
8
9
10 11 12 13 14
10 11 12 13 14
5
9
8
10 11 12 13 14
15 16 17 18 19
7
6
5
2
1
0
4
4
4
3
3
9
2
2
8
1
1
7
3
9
0
6
Codierung der Richtung
Süd
Implementierung des Sichtfelds?
Implementierung scanForID?
0
8
5
10 11 12 13 14
15 16 17 18 19
Ost
7
15 16 17 18 19
6
Nord
0
West
enum Direction { N=0, E=90, S=180, W=270, UNKNOWN=-1 };
N=0
W=270
A
E=90
Wie kann man
- rechts abbiegen
- links abbiegen
kodieren?
S=180
09.10.2008
Projekt FutureCar
8
Praktikum 1 - class Scanner - Implementation
2
3
4
5
6
7
8
9
10 11 12 13 14
15 16 17 18 19
0
6
1
7
2
8
3
9
4
Ost
5
Projekt FutureCar
1
10 11 12 13 14
09.10.2008
Nord
0
15 16 17 18 19
ID Scanner::scanForID(…) {
switch (dir) {
case N:
switch(fieldOfView) {
case 0: return world.getID[loc.x-2, loc.y-2];
case 1: return world.getID[loc.x-1, loc.y-2];
…
}
case E:
switch(fieldOfView) {
case 0: return world.getID[loc.x+2, loc.y-2];
case 1: return world.getID[loc.x-2, loc.y-1];
…
case S: …
}
FB Informatik
Prof. Dr. R.Nitsch
9
Praktikum 1 - class Scanner - Testanwendung
World world;
void main()
{
world.create("testUnit_Scanner");
Scanner sc;
bool passed = true;
for(int fieldOfView =0; fieldOfView<20; ++ fieldOfView)
Fahrtrichtung
FB Informatik
Prof. Dr. R.Nitsch
########################################
# ABCDE
EJOT
PKFA
TSRQP
#
# FGHIJ
DINS
QLGB
ONMLK
#
# KLMNO
CHMR
RMHC
JIHGF
#
# PQRST
BGLQ
SNID
EDCBA
#
#
AFKP
TOJE
#
#
#
########################################
FC-Ort
if( sc.scanForID(fieldOfView, N, Location( 5, 3)).getIkon() != char('A'+ fieldOfView) ) passed=false;
for(int fieldOfView =0; fieldOfView <20; ++ fieldOfView)
if( sc. scanForID(fieldOfView, W, Location(14,3)).getIkon() != char('A'+ fieldOfView)) passed=false;
for(int fieldOfView =0; fieldOfView <20; ++ fieldOfView)
if( sc. scanForID(fieldOfView, E, Location(20,3)).getIkon() != char('A'+ fieldOfView)) passed=false;
for(int fieldOfView =0; fieldOfView <20; ++ fieldOfView)
if( sc. scanForID(fieldOfView, S, Location(28,2)).getIkon() != char('A'+ fieldOfView)) passed=false;
cout << "\tScanner:: scanForID \t\t"
<< ( passed ? "PASSED" : "FAILED: FieldOfView addressing error" ) << endl;
, bool isThrownException = false;
try { sc. scanForID ( 21, S, Location(28,2)).getIkon(); }
catch (const std::out_of_range&) { isThrownException=true; }
cout << "\tScanner:: scanForID \t\t"
<< (isThrownException ? "PASSED" : "FAILED: Exception not thrown") << endl;
} 09.10.2008
10
Projekt FutureCar
Prinzip des kleinsten Wissens
FB Informatik
Prof. Dr. R.Nitsch
Principle of Least Knowledge
– talk only to your immediate friends!
(a.k.a. Law of Demeter or "use only one dot" rule )
Begründung: Im obigen Test-Programm findet man öfter die Anweisung
sc.scanForID( fieldOfViewNo, N, Location(x,y)).getIkon();
Nachteil: Nutzer des Scanners (z.B. Klasse AutoPilot) müssen auch die Schnittstelle
der ID-Klasse kennen.
Besser: Scanner-Schnittstelle erweitern um
sc.scanForIkon( fieldOfViewNo, N, Location(x,y));
Nur noch 1 dot-Operator!
09.10.2008
Projekt FutureCar
11
Praktikum 1 - FutureCars
•
•
•
•
FB Informatik
Prof. Dr. R.Nitsch
Objekte dieser Klasse kennen
ihre aktuelle Position der FCWelt (loc),
ihre aktuelle Fahrtrichtung (dir) und natürlich
ihr Kennzeichen (id), d.h. das Symbol, mit dem sie
in der FCWelt dargestellt sind
09.10.2008
Projekt FutureCar
12
Praktikum 1 - class FutureCar - Testanwendung (Auszug)
World world; // Globales Objekt (hier sinnvoll)
void main(void) {
world.create(""); char c;
FCCompact fc(ID('A'), Location(2,1), W);
cout << world;
while(true) {
1 Parzelle nach West
fc.step(); cout << world;
fc.setDir(S);
ab jetzt Richtung Süd
7 Parzellen nach Süd
for( int i=0; i< 7; ++i) { fc.step(); cout << world; }
fc.setDir(E);
ab jetzt Richtung Ost
10 Parzellen nach Ost
for( int i=0; i<10; ++i) { fc.step(); cout << world; }
fc.setDir(N);
ab jetzt Richtung Nord
for( int i=0; i< 7; ++i) { fc.step(); cout << world; }
7 Parzellen nach Nord
ab jetzt Richtung West
fc.setDir(W);
for( int i=0; i< 9; ++i) { fc.step(); cout << world; }
9 Parzellen nach Nord
if(_kbhit()) {
// Checks the console for keyboard input (include <conio.h>)
// more: http://msdn.microsoft.com/en-us/library/58w7c94c(VS.80).aspx
c = _getch(); // Gets a character from the console without echo
// http://msdn.microsoft.com/en-us/library/078sfkak(VS.80).aspx
break; // beendet Endlosschleife
}
} // END while(true)
}
09.10.2008
Projekt FutureCar
FB Informatik
Prof. Dr. R.Nitsch
Wenn zwischenzeitlich
eine bel. Taste gedrückt
wurde …
… hole das Zeichen vom
Eingabepuffer
13
Herunterladen