FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch...

13
FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch [email protected]

Transcript of FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch...

Page 1: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

FB InformatikProf. Dr. R.Nitsch

Programmieren 2

Future Car Projekt

Reiner Nitsch [email protected]

Page 2: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 2

FB InformatikProf. Dr. R.Nitsch

FutureCar-Projekt - Einführung

• 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.

########################################

# #

# C #

#D ####### ##E #### ######## ##### #

# ####### ## ####E ######## ##### #

# ####### ## #### ######## ##### #

# ####### ## ############## ##### #

# ## ## #

# ## ## A #

# ####### ######## ######## ##### #

# ####### F # ######## ##### #

# ####### # ######## ##### #

# ################# ######## ##### #

# ## # #

# ## # B #

# ####### ################## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# # ## #

# # ## #

# ################# ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# # # #

# # # #

# ####### ################## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# #

# #

########################################

Page 3: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 3

FB InformatikProf. Dr. R.Nitsch

FutureCar-Projekt - Einführung

• 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.

########################################

# #

# C #

#D ####### ##E #### ######## ##### #

# ####### ## ####E ######## ##### #

# ####### ## #### ######## ##### #

# ####### ## ############## ##### #

# ## ## #

# ## ## A #

# ####### ######## ######## ##### #

# ####### F # ######## ##### #

# ####### # ######## ##### #

# ################# ######## ##### #

# ## # #

# ## # B #

# ####### ################## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# # ## #

# # ## #

# ################# ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# # # #

# # # #

# ####### ################## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# #

# #

########################################

Page 4: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 4

FB InformatikProf. Dr. R.Nitsch

Allgemeine Hinweise und Empfehlungen

• 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

Page 5: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 5

FB InformatikProf. Dr. R.Nitsch

Praktikum 1 - class World

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?

########################################

# #

# #

# ####### ##E #### ######## ##### #

# ####### ## #### ######## ##### #

# ####### ## #### ######## ##### #

# ####### ## ############## ##### #

# ## ## #

# ## ## #

# ####### ######## ######## ##### #

# ####### # ######## ##### #

# ####### # ######## ##### #

# ################# ######## ##### #

# ## # #

# ## # #

# ####### ################## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# # ## #

# # ## #

# ################# ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# # # #

# # # #

# ####### ################## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# #

# #

########################################

Page 6: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 6

FB InformatikProf. Dr. R.Nitsch

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;

########################################

# #

# #

# ####### ##E #### ######## ##### #

# ####### ## #### ######## ##### #

# ####### ## #### ######## ##### #

# ####### ## ############## ##### #

# ## ## #

# ## ## #

# ####### ######## ######## ##### #

# ####### # ######## ##### #

# ####### # ######## ##### #

# ################# ######## ##### #

# ## # #

# ## # #

# ####### ################## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# # ## #

# # ## #

# ################# ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# # # #

# # # #

# ####### ################## ##### #

# ####### ######## ######## ##### #

# ####### ######## ######## ##### #

# #

# #

########################################

Page 7: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 7

FB InformatikProf. Dr. R.Nitsch

Praktikum 1 - Scanner

• 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, … )

Page 8: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 8

FB InformatikProf. Dr. R.Nitsch

Praktikum 1 - class Scanner

Codierung der Richtung

A

N=0

E=90

S=180

W=270

Wie kann man - rechts abbiegen- links abbiegen kodieren?

enum Direction { N=0, E=90, S=180, W=270, UNKNOWN=-1 };

Sichtfeldadrressierung für alle 4 Fahrtrichtungen

10 32 4

65 87 9

1110 1312 14

1615 1817 19

Nord

10

32

4

65

87

9

11

10

13

12

14

16

15

18

17

19

Ost

1 03 24

6 58 79

11 1013 1214

16 1518 1719

Süd

10

32

4

65

87

9

11

10

13

12

14

16

15

18

17

19

West

Implementierung des Sichtfelds?

Implementierung scanForID?

Page 9: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 9

FB InformatikProf. Dr. R.Nitsch

Praktikum 1 - class Scanner - Implementation

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: …}

10 32 4

65 87 9

1110 1312 14

1615 1817 19

Nord

10

32

4

65

87

9

11

10

13

12

14

16

15

18

17

19

Ost

Page 10: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 10

FB InformatikProf. Dr. R.Nitsch

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)

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;}

Fahrtrichtung FC-Ort

######################################### ABCDE EJOT PKFA TSRQP ## FGHIJ DINS QLGB ONMLK ## KLMNO CHMR RMHC JIHGF ## PQRST BGLQ SNID EDCBA ## AFKP TOJE ## #########################################

Page 11: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 11

FB InformatikProf. Dr. R.Nitsch

Prinzip des kleinsten Wissens

Principle of Least Knowledge – talk only to your immediate friends!

Begründung: Im obigen Test-Programm findet man öfter die Anweisung

sc.scanForID( fieldOfViewNo, N, Location(x,y)).getIkon();

(a.k.a. Law of Demeter or "use only one dot" rule )

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!

Page 12: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 12

FB InformatikProf. Dr. R.Nitsch

Praktikum 1 - FutureCars

• 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

Page 13: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch r.nitsch@fbi.h-da.de.

09.10.2008 Projekt FutureCar 13

FB InformatikProf. Dr. R.Nitsch

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) { fc.step(); cout << world; fc.setDir(S); for( int i=0; i< 7; ++i) { fc.step(); cout << world; } fc.setDir(E); for( int i=0; i<10; ++i) { fc.step(); cout << world; } fc.setDir(N); for( int i=0; i< 7; ++i) { fc.step(); cout << world; } fc.setDir(W); for( int i=0; i< 9; ++i) { fc.step(); cout << world; } 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)}

1 Parzelle nach West

ab jetzt Richtung Süd7 Parzellen nach Süd

ab jetzt Richtung Ost10 Parzellen nach Ost

ab jetzt Richtung Nord7 Parzellen nach Nord

ab jetzt Richtung West

9 Parzellen nach NordWenn zwischenzeitlicheine bel. Taste gedrücktwurde …… hole das Zeichen vomEingabepuffer