Entwickler-Ecke

Open Source Projekte - Delphin V1.00


wdbee - So 07.01.07 21:56
Titel: Delphin V1.00
Aktuelles:

Der Delphin V1.00 fährt seine ersten Rennen und Band 2 des Tutoriums ist fertig (siehe unten). wdbee [http://wdbee.gotdns.org:8080]

Delphin V1.00 ist ein TORCS-Roboter, der komplett in Delphi programmiert wurde (Turbo Delphi 2006).

TORCS steht für "The Open Racing Car Simulator" und ist ein Open Source Project, dass für Linux, Windows und andere Betriebssysteme verfügbar ist. Bisher mussten TORCS-Roboter in C oder C++ programmiert werden.
Auf seiner Hompage stellt Bernhard Wymann [http://www.berniw.org] ein Tutorial zur Verfügung, dass sehr detaillert zeigt, wie ein TORCS-Roboter in C++ programmiert werden kann. Delphin V1.00 ist nun eine Alternative für Windows. In der Leistung ist dieser Roboter mit dem von Bernhard Wymann vorgestellten bt-Roboter vergleichbar.

TORCS [http://torcs.sourceforge.net] - "The Open Racing Car Simulator"

Auf den ersten Blick erscheint TORCS als ein Computerspiel wie viele andere auch. Simuliert werden Autorennen, bei denen ein menschlicher Spieler gegen computergesteuerte Gegner antritt. Dabei stehen verschiedene Rennstrecken und Autotypen zur Auswahl.
Das besondere an TORCS ist aber, dass jeder eigene Gegner programmieren oder auch eigene Rennstrecken entwerfen kann. Selbst eigene Rennwagen lassen sich integrieren! Zum einen ist TORCS ein "Open Source Project", dass für verschiedene Betriebssysteme wie Linux und Windows verfügbar ist. Zum anderen wird ein computergesteuerter Gegner durch ein "Shared Object" (so) bzw. eine "Dynamic Link Library" (dll) mit einer relativ einfachen Schnittstelle im "C-Stil" realisiert.
Diese Programmerweiterungen werden "Roboter" genannt. Legt man im vorgesehenen Verzeichnis für den neuen Roboter ein Unterverzeichnis an und kopiert die DLL dort hin, kann TORCS mit dem neuen Roboter zusammenarbeiten. Analog lassen sich so eigene Rennstrecken und Rennwagen bereitstellen.
Genau das ist es, was TORCS interessant macht. Nicht das Spiel Mensch gegen Computer sondern Roboter gegen Roboter reizt den Programmierer zum mitmachen.
Im Internet werden auch Meisterschaften ausgetragen, an denen jeder mit einem eigenen Roboter teilnehmen kann.
Bisher wurden die Rennen unter Linux durchgeführt und die Roboter mussten in C oder C++ programmiert werden. Zwar werden mit TORCS auch einige Roboter mitgeliefert - in den Download-Paketen mit Quellcode sind auch die Sourcecodes dieser Roboter enthalten - aber die wichtigste Quelle von Informationen für die Programmierung eines TORCS-Roboters ist das Robot-Tutorial von Bernhard Wymann.
Hier wird Schritt für Schritt gezeigt, was ein Roboter können muss und wie sich das realisieren lässt.
Allerdings muss der angehende Roboter-Programmierer einiges an Wissen mitbringen, um die dort bereitgestellten Quellen so anzupassen, dass er sie für einen eigenen Roboter verwenden kann.
Linux-Anwender sind das ja gewohnt, es macht ihnen sogar Spaß.

Windows-Anwender sind da einfach zu verwöhnt.
Um ihnen und besonders Programmier-Einsteigern den Anfang zu erleichtern, wurde der TORCS-Roboter "Delphin" geschaffen. Er ist komplett in Delphi programmiert und stellt einige Units und Klassen bereit, mit denen sich sehr einfach ein TORCS-Roboter realisieren lässt. Die Schnittstelle zu TORCS ist in einer separaten Wrapper-Unit gekapselt, so dass ein Delphi-Programmierer ohne C-Kenntnisse auskommen kann.

Auf dieser Basis ist TORCS ein Top-Thema für Projekte in Schulen oder anderen inhomogenen Gruppen, denn hier können nicht nur eigene Roboter gegeneinander antreten. Rennwagen und Team-Logo können künstlerisch gestaltet werden und ein Designwettbewerb mag manchen Teilnehmer mehr reizen.
Ein Roboter fährt den Rennwagen mehr oder weniger gut, aber die Abstimmung des Rennwagens auf die Rennstrecke ist auch ein Thema. Wer ist der beste Mechaniker, findet die optimale Abstimmung der Bremsen und des Fahrwerkes?

TORCS kommt mit relativ geringen Hardware-Anforderungen zu brauchbaren Ergebnissen. Benötigt wird nur ein PC mit Windows XP (bei Verwendung des Delphins als Basis) und einer Grafikkarte, die 3D unterstützt. Selbst auf Motherboards mit integriertem Grafikchip kann das gehen, wenn aktuelle 3D-Treiber installiert sind!
Alle erforderlichen Programme sind kostenfrei im Internet als Download erhältlich.

Edit: Um den zweiten Band des Tutoriums anhängen zu können, wurde der Anhang des Bildes entfernt. Dafür gibt es weiter unten im Thread die Möglichkeit, ein Video zu laden, dass einen besseren Eindruck vermittelt als ein stehendes Bild.

Auch Einsteiger können hier gerne mitmachen, wer Fragen hat bekommt Antwort, wer Hilfe braucht, dem soll geholfen werden.


Florian.K - Mo 08.01.07 08:24

Großen Respekt


freedy - Mo 08.01.07 10:47

Hi!

Das könnte ja sogar mal richtig Spaß machen... kannte ich vorher gar nicht.


GTA-Place - Di 09.01.07 22:43

Boah, klingt das geil! Na, wer hat Lust zum 1. offiziellen Windows-TORCS-Wettbewerb? Ich habs mir noch net angeguckt, aber ich mach trotzdem mit :mrgreen:.

Gibt es schon sowas wie einen TORCS-Wettbewerb unter Windows? Wenn nicht, was das richtig super!


EDIT: Musste {$IFDEF TORCS_V1.3.0} auskommentieren, sonst hätte er nicht kompiliert.


wdbee - Mi 10.01.07 18:55

@GTA-Place:
Ich habe, bevor ich das hier veröffentlicht habe, mit Bernhard Wymann Kontakt aufgenommen. Fazit: Wenn es eine entsprechende Anzahl von Teilnehmern gibt, setzt er uns eine Windows-Delphi-Meisterschaft auf dem Server auf. Die Roboter sollten dann unter Turbo-Delphi 2006 übersetzt werden können, denn es müssen immer die Quellen bereitgestellt werden, keine DLLs (Wegen Viren usw.).
Das könnte dann so ähnlich aussehen, wie die TORCS-Meisterschaft [http://www.berniw.org/trb] für LINUX. Dort waren es bisher maximal 8 Teams, die in einem Jahr teilgenommen haben. Pro Team starten zwei Roboter, macht dann also 16 Fahrzeuge. Aber es würden speziell zum Anfang auch weniger Teams reichen, um interessante Rennen zu fahren.

Der Roboter, der hier vorgestellt wird, umfasst schon alle Funktionen, die gebraucht werden, auch wenn die Lösungen z. T. noch nicht ideal sind. Im Tutorium sind die noch nicht alle beschrieben, aber es liegen ja alle Quellen offen, und Fragen lassen sich im Forum vorab klären, bis der Rest als Tutorium verfügbar ist.
Ausnahme: Pit-Sharing (Wenn mehrere Fahrzeuge sich eine Box Teilen müssen). Das ist neu in TORCS V1.3.0 und im Delphin noch nicht realisiert.

Mit TORCS_V1.3.0 wird zwichen den Datenstrukturen von TORCS V1.2.4 und TORCS V1.3.0 unterschieden, da hat sich einiges geändert. Wer nur TORCS V1.3.0 verwendet, kann die Unterscheidung raus schmeißen.


GTA-Place - Mi 10.01.07 19:02

Die DLL geht bei mir nicht. Bekomme beim Rennstart eine Zugriffsverletzung.


EDIT:
1x bei delphin-NewTrack, Konsole sagt: OnGetParam <<<
1x bei delphin-NewTrack, Konsole sagt: NewRace 0 >>>
1x bei delphin-Drive, Konsole sagt: GfParmWriteFile ... graph.xml file written

EDIT2:
Zu Fehler 1: Der tritt genau hier auf:

Delphi-Quelltext
1:
if Seg.SType = TR_STR then                    


wdbee - Mi 10.01.07 22:19

Das sieht so aus, als hättest du die Datenstrukturen durcheinander gebracht.
Die ersten Versuche hatte ich mit Delphi 5 unternommen. Dabei stellte sich heraus, dass das Alignment von Delphi (4 Byte) und TORCS (8 Byte) nicht zusammenpassen. Deshalb musste ich an einigen Stellen Dummies in die Record-Definitionen einbauen. Das galt auch schon für TORCS V1.2.4.
Mit TORCS V1.3.0 kamen noch einige zusätzliche Felder in den Records dazu. Die Unterschiede sind an den Stellen zu finden, an denen die Befehle für die bedingte Kompilierung stehen.

Du hattest gepostet, dass du da Änderungen machen musstest (Warum ist mir nicht klar). Schau dir den Teil noch mal im Original an. Ich vermute, dass da der Fehler liegt.
Um selbst die richtigen Werte zu finden, hatte ich die Dump-Funktion eingebaut (UnitTorcsData, Aufruf in UnitTorcsIntf ist nur auskommentiert).
Am Anfang werden die Offsets ausgegeben.
Die Werte, die bei TORCS V1.3.0 verwendet werden, sind:

oIndex: 0
oInfo: 4
oPub: 328
oRace: 664
Priv: 792
oCtrl: 1444
oPitCmd: 1616
oRobot: 1628

Damit solltest du feststellen können, ob das bei dir passt.


GTA-Place - Mi 10.01.07 22:52

Delphi ging nicht in den {$ifdef}-Bereich, weil TORCS_V1.3.0 vermutlich nicht definiert ist ;-) Wo genau muss die Definition das hin? Benutze D7.
user profile iconwdbee hat folgendes geschrieben:
Am Anfang werden die Offsets ausgegeben.
Die Werte, die bei TORCS V1.3.0 verwendet werden, sind:

Was heißt am Anfang und wo genau seh ich das? In der Konsole hab ich die Werte nicht gefunden.


wdbee - Mi 10.01.07 23:04

Ich benutze das Feld in den Projektoptionen:

D5: Projekt - Optionen - Verzeichnisse/Bedingungen - Definition: TORCS_V1.3.0

Unter TD2k6 gilt der Weg genauso, auch wenn es ganz anders aussieht.

Da das Projekt mit Turbo Delphi 2006 erzeugt wurde, ist die Definition in der Datei delphin.bdsproj gespeichert, die dein D7 nicht auswertet.

Wer will kann die Definition auch mit {$define TORCS_V1.3.0} an den Anfang der Dateien stellen. Ich ziehe den anderen Weg vor, weil ich dann an einer Stelle die Version ändern kann.

Edit: Die Offsets werden in der Konsole ausgegeben, wenn der Kommentar vor dem Aufruf entfernt wurde. Da dann aber sehr viel Text ausgegeben wird, benutze ich den folgenden Trick: Wenn ich mit der Maus den Button der ScrollBar rechts anklicke und halte, bleibt die Ausgabe stehen, so daß ich die Werte finden und lesen kann. Außerdem habe ich den Puffer des Konsolenfensters entsprechend groß eingestellt.


GTA-Place - Mi 10.01.07 23:17

Zugriffverletzung bleibt, obwohl ich nochmal den Original-Source benutzt habe und TORCS_V1.3.0 (über Optionen) definiert habe.


wdbee - Mi 10.01.07 23:34

Dann lass dir mal die Offsets ausgeben.
Kennt D7 Einstellungen für das Alignment?


GTA-Place - Do 11.01.07 00:00

oIndex, oInfo und oPub sind gleich;
oRace ist 668 statt 664;
Priv ist 796 statt 792;
oCtrl ist 1448 statts 1444;
oPitCmd ist 1620 statts 1616;
oRobot ist 1632 statt 1628;

Also fast alle um 4 größer als normal.


wdbee - Do 11.01.07 00:12

Da die Werte Offsets sind, bedeutet das, das in der Datenstruktur vor Race 4 Byte zuviel sind. Das könnte der Wert Dummy1 in TCarElt sein.
Kommentier den mal aus (UnitTorcsTypes).
Den musste ich für meine beiden Delphi-Versionen einschieben.


GTA-Place - Do 11.01.07 00:15

Und schon ist die ZV weg, thx - aber fahren tut er immer noch nicht. Die ganze Kraft wirkt nach links, als wäre statts gasgeben lenken eingestellt.


EDIT: War noch ne Dummy. Aber er tut jetzt gar nix. Er steht still, Zeit läuft.


wdbee - Do 11.01.07 00:24

Also ist das Alignment bei deinem Delphi 7 anders (eingestellt?).
Schau dir mal die anderen Dummies an:
In TCarRaceInfo sind auch zwei. Anhand der Werte die Dump ausgibt, solltest du erkennen können, wann die Werte sinnvoll werden.
Werde morgen noch mal hier nach sehen.

Edit: Wenn Dump aktiviert ist, ist das normal, weil zuviel Text in die Konsole geht. Wie sieht es aus, wenn du Dump deaktivierst?


GTA-Place - Do 11.01.07 08:06

Dump war deaktiviert. Ich guck mir das heut Mittag nochmal an.


wdbee - Do 11.01.07 12:23

Inzwischen konnte ich dein Problem nachvollziehen:

Das Alignment spielt jeweils an zwei Stellen eine Rolle. Die erste ist die Definition der Records selbst (UnitTorcsTypes), wobei die einzelnen Records in sich stimmen müssen und außerdem deren Zusammenfassung im Record TCarElt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
//==========================================================================*
// Main Car Data record
//--------------------------------------------------------------------------*
  TCarElt = packed record                       // car.h
    Index: Int;         // car index
    Info: TInitCar;     // public
    Pub: TPublicCar;    // public
{$IFDEF TORCS_V1.3.0}
    Dummy1: Int;
{$ELSE}
    Dummy1: Int;
{$ENDIF}
    Race: TCarRaceInfo; // public
    Priv: TPrivCar;     // private
    Ctrl: TCarCtrl;     // private
    PitCmd: TCarPitCmd; // private
    Robot: PRobotItf;   // private
    Next: PCarElt;      // Next in List
    Dummy2: Int;
  end;
//==========================================================================*


Die zweite Stelle ist die Klasse TIPCCarData (UnitTorcsData):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
type 
  TIPCCarData = class
  private
    // >>> Instanzlokaler Datenbereich:
    oTORCSIndex: Int;                            // Index des Wagens
//>>>  oTORCSInfo: TInitCar;                        // Infos zum Wagen
    oInfoName: TTorcsName;                       // Driver's name
{$IFDEF TORCS_V1.3.0}
    oInfoTeamName: TTorcsName;                   // Team name
{$ENDIF}
    oInfoCarName: TTorcsName;                    // Car's object name
    oInfoCategory: TTorcsName;                   // Car's category
    oInfoRaceNumber: Int;                        // Car's race number
    oInfoStartRank: Int;                         // Car's starting position
    oInfoDriverType: Int;                        // Driver type
    oInfoSkillLevel: Int;                        // Driver's skill level (0=rookie -> 3=pro)
    oInfoIconColorR: Tdble;                      // Car color in leaders board
    oInfoIconColorG: Tdble;                      // Car color in leaders board
    oInfoIconColorB: Tdble;                      // Car color in leaders board
    oInfoDimension: T3Dd;                        // Car's mesures
    oInfoDrvPos: T3Dd;                           // Driver's position
    oInfoBonnetPos: T3Dd;                        // Bonnet's position
    oInfoTank: Tdble;                            // Fuel tank capacity
    oInfoSteerLock: Tdble;                       // Steer lock angle
    oInfoStatGC: T3Dd;                           // Static pos of GC (should be the origin of car axis)
    oInfoWheel: array [0..3of TWheelSpec;      // Wheels specifications
    oInfoVisualAttr: tVisualAttributes;          // Visual attributes
//<<<
//>>>  oTORCSPub: TPublicCar;
    oPubDynGC: TDynPt;                           // GC data (car axis)
    oPubDynGCg: TDynPt;                          // GC data (world axis)
    oPubPosMat: TSGMat4;                         // Position matrix
    oPubTrkPos: TTrkLocPos;                      // Current track position. The segment is the track segment (not sides)
    oPubState: Int;                              // State of the car.
    oPubCorner: array [0..3of tPosd;
{$IFDEF TORCS_V1.3.0}
  oAlignmentDummy: Int;
{$ELSE}
  oAlignmentDummy: Int;
{$ENDIF}
//<<<
//>>>  oTORCSRace: TCarRaceInfo;
    oRaceBestLapTime: Double;
    oRaceDeltaBestLapTime: Double;
    oRaceCurLapTime: Double;
    oRaceLastLapTime: Double;
    oRaceCurTime: Double;
    oRaceTopSpeed: Tdble;
    oRaceLaps: Int;
    oRaceNbPitStops: Int;
    oRaceRemainingLaps: Int;
    oRacePos: Int;
    oRaceDummy1: Int;
    oRaceTimeBehindLeader: Double;
    oRaceLapsBehindLeader: Int;
    oRaceDummy2: Int;
    oRaceTimeBehindPrev: Double;
    oRaceTimeBeforeNext: Double;
    oRaceDistRaced: Tdble;
    oRaceDistFromStartLine: Tdble;
    oRaceScheduledEventTime: Double;
    oRacePit: PTrackOwnPit;
    oRaceEvent: Int;
    oRacePenaltyList: TCarPenaltyHead; // List of current penalties
//<<<
//>>>  oTORCSPriv: TPrivCar;
    oPrivParamsHandle: Pointer;                  // accessible parameters for modules
    oPrivCarHandle: Pointer;                     // parameters for car caracteristics
    oPrivDriverIndex: Int;                       // index when multiple drivers are in the same dll
    oPrivModName: TTorcsName;                    // dll name
    oPrivWheel: array [0..3of TWheelState;
    oPrivCorner: array [0..3of TPosd;          // car's corners position
    oPrivGear: Int;             // current gear
    oPrivFuel: Tdble;           // remaining fuel (liters)
    oPrivFuel_consumption_total: Tdble; // l
    oPrivFuel_consumption_instant: Tdble; // l/100km (>100 means infinity)
    oPrivEnginerpm: Tdble;
    oPrivEnginerpmRedLine: Tdble;
    oPrivEnginerpmMax: Tdble;
    oPrivEnginerpmMaxTq: Tdble;
    oPrivEnginerpmMaxPw: Tdble;
    oPrivEngineMaxTq: Tdble;
    oPrivEngineMaxPw: Tdble;
    oPrivGearRatio: array [0..MAX_GEARS - 1of Tdble; // including final drive
    oPrivGearNb: Int;                     // incl reverse and neutral
    oPrivGearOffset: Int;                 // gearRatio[gear + gearOffset] is the ratio for gear
    oPrivSkid: array [0..3of Tdble;     // skid intensity
    oPrivReaction: array [0..3of Tdble; // reaction on wheels
    oPrivCollision: Int;
    oPrivSmoke: Tdble;
    oPrivNormal: T3Dd;
    oPrivCollpos: T3Dd; // Collision position, useful for sound
    oPrivDammage: Int;
    oPrivDebug: Int;
    oPrivCollision_state: TCollisionState; // collision state
//<<<
    // Der Rest muss über den Zeiger gehen, da es sich ab hier um
    // Information an TORCS handelt
    oTORCSCtrl: TCarCtrl;
    oTORCSPitCmd: TCarPitCmd;

    // Noch Instanzlokaler Datenbereich:
    oRobot: TRobotItf;
    // <<< Ende Instanzlokaler Datenbereich!


Um schnell zu sein wird der von TORCS gelieferte Speicherbereich des Records TCarElt als Block in das Objekt kopiert. deshalb müssen die instanzlokalen Variablen so angeordnet sein, dass die Zuordnung stimmt.

Bei Turbo Delphi 2006 passt das so wie es war.
Bei D5 und D7 ist das Alignment in den Record-Definitionen um 4 Bytes anders als im Objekt! Aber wenn der AlignmentDummy im Objekt entfernt wird, verschiebt sich das um 8 Byte statt um 4, obwohl der AlignmentDummy nur 4 Bytes lang ist!

Siehe Kontrollausgabe (Erste Spalte der Werte ist das Objekt, zweite die Record-Definition):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
Turbo Delphi 2006:
TOCRS Alignment Check: (Ohne Änderungen)

Offset(oIndex) : 0000 0000
Offset(oInfo)  : 0004 0004
Offset(oPub)   : 0328 0328
Offset(oRace)  : 0664 0664
Offset(Priv)   : 0792 0792
Offset(oCtrl)  : 1444 1444
Offset(oPitCmd): 1616 1616
Offset(oRobot) : 1628 1628
SizeOf(Index)       : 0004
SizeOf(TInitCar)    : 0324
SizeOf(TPublicCar)  : 0332
SizeOf(TCarRaceInfo): 0128
SizeOf(TPrivCar)    : 0652
SizeOf(TCarCtrl)    : 0172
SizeOf(TCarPitCmd)  : 0012
SizeOf(TRobotItf)   : 0028
SizeOf(TCarElt)     : 1640

Delphi 5:
TOCRS Alignment Check: (Ohne Änderungen an den Recorddefinitionen in UnitTorcsTypes)

Offset(oIndex) : 0000 0000
Offset(oInfo)  : 0004 0004
Offset(oPub)   : 0328 0328
Offset(oRace)  : 0668 0664 < Fehler im Objekt TIPCCarData (UnitTorcsData)
Offset(Priv)   : 0796 0792
Offset(oCtrl)  : 1448 1444
Offset(oPitCmd): 1620 1616
Offset(oRobot) : 1632 1628
SizeOf(Index)       : 0004
SizeOf(TInitCar)    : 0324
SizeOf(TPublicCar)  : 0332
SizeOf(TCarRaceInfo): 0128
SizeOf(TPrivCar)    : 0652
SizeOf(TCarCtrl)    : 0172
SizeOf(TCarPitCmd)  : 0012
SizeOf(TRobotItf)   : 0028
SizeOf(TCarElt)     : 1640


Abhilfe sollte die folgende Änderung in der Klasse TIPCCarData bringen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type 
  TIPCCarData = class
  private
//>>>+++ Änderung für D5 und D7?:
    // Achtung: 
    // Um die Ausrichtung der Daten im Speicher für die Delphi-Versionen
    // 5 und 7? TORCS-Kompatibel zu erreichen ist hier der AlignmentOffset
    // nötig! 
    oAlignmentOffset: Int;                       // Für D5 und D7?
//<<<+++
    // >>> Instanzlokaler Datenbereich:
    oTORCSIndex: Int;                            // Index des Wagens
    ...



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Delphi 5: mit AlignmentOffset!
TOCRS Alignment Check: (Ohne Änderungen an den Recorddefinitionen in UnitTorcsTypes)

Offset(oIndex) : 0000 0000
Offset(oInfo)  : 0004 0004
Offset(oPub)   : 0328 0328
Offset(oRace)  : 0664 0664
Offset(Priv)   : 0792 0792
Offset(oCtrl)  : 1444 1444
Offset(oPitCmd): 1616 1616
Offset(oRobot) : 1628 1628
SizeOf(Index)       : 0004
SizeOf(TInitCar)    : 0324
SizeOf(TPublicCar)  : 0332
SizeOf(TCarRaceInfo): 0128
SizeOf(TPrivCar)    : 0652
SizeOf(TCarCtrl)    : 0172
SizeOf(TCarPitCmd)  : 0012
SizeOf(TRobotItf)   : 0028
SizeOf(TCarElt)     : 1640


GTA-Place - Do 11.01.07 14:11

Das Auto tritt jetzt das Gas voll durch, aber im Gang N. Danach geht Drezahl auf 2 runter und nichts passiert. Außerdem wird schon beim Laden mehrmals angezeigt: "GfParamNum: bad handle".

Offset soweit richtig, bis auf:

SizeOf(CarRaceInfo): 124 statts 128
SifeOf(TCarElt): 1632 statts 1640


wdbee - Do 11.01.07 16:36

Hast du die Record-Definitionen im Originalzustand?


GTA-Place - Do 11.01.07 18:07

Wunderbar, jetzt funktioniert alles! Danke.

Ich hab mal für alle mit Delphi 5 und Delphi 7, die "bearbeitete Version" angehängt, in der ich außerdem noch folgendes eingefügt habe:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
{$IFDEF TORCS_V1.3.0}
  FuellBytes := oAlignmentDummy;                 // dito
  oAlignmentDummy := FuellBytes;                 // dito
  oAlignmentOffset := 0;                         // dito
{$ELSE}
  FuellBytes := oAlignmentDummy;                 // dito
  oAlignmentDummy := FuellBytes;                 // dito
  oAlignmentOffset := 0;                         // dito
{$ENDIF}

um die Compiler-Warnung wegzubekommen. Die Bedingungen und Ausgabeverzeichnise sind auch richtig eingestellt.


PS: Warum ist hier eigentlich {$ifdef} nötig? Sind doch die selben Zuweisungen.


wdbee - Do 11.01.07 19:01

Da hast du natürlich recht. Der Grund ist, dass ich alle Stellen, an denen ich etwas abweichend von den C++-Quellen definieren musste auf diese Weise markiert hatte.
Die ursprüngliche Version war für TORCS_1.2.4, das ist nun überall im ELSE-Zweig gelandet.
Wenn kein ELSE-Zweig da ist, war in 1.2.4 nichts erforderlich.
Statt nun "optimale" Bedingungen für jeden Fall zu definieren, verwende ich überall das Schema "If TORCS-Version" und kopiere die Blöcke, weil das schneller geht, mir besser in Erinnerung bleibt, zur Laufzeit nicht stört, ohne Überschneidungen immer machbar ist und nur einen "Define" an zentraler Stelle erfordert.

Dank deines Problems habe ich noch eine Nachlässigkeit gefunden:

Die Property InfoTeamName gibt es erst ab V1.3.0, da gehört also auch noch eine Bedingung drum, so wie dort, wo oInfoTeamName definiert wird.

Wenn du nun etwas mit dem Roboter experimentierst, solltest du wissen, das er sein "Schicksal" speichert. Das sind die *.KARMA-Dateien im Verzeichnis ..\drivers\delphin\X\qualifying, wobei X für die Roboter-Nr. steht. Die *.txt-Versionen enthalten die selben Werte, aber als Delphi-Code-Zeile. Ich habe das anfangs benutzt um Abschnitte von Rennstrecken direkt im Roboter zu beeinflussen.
Da das "Schicksal" aber mit den Einstellungen in den *.XML-Dateien der Rennstrecke zusammenhängt, sollte man das "Schicksal" löschen, wenn man mit anderen Einstellungen fährt.

Gedacht ist das so:
Du trainierst im Practice-Mode, bis du gute Einstellungen hast. Der Roboter speichert jedesmal sein "Schicksal", wenn es dir nicht gefällt, löscht du es.
Wenn du zufrieden bist, lässt du die Dateien stehen. Dann verwendet der Roboter die gelernten Werte im Qualifying und im Rennen.
Hatte er eine Datei eingelesen, gibt er keine neue aus. Das ist beim Delphin anders als beim aktuellen bt ab V1.3.0, der speichert immer wieder, lernt also ständig weiter.
Das steht allerdings im Widerspruch zur Forderung, dass Rennen wiederholbar sein sollen, also z.B. keine Zufallszahlen verwendet werden dürfen (Regeln der TORCS-Meisterschaft).
Dafür lernt der Delphin viel schneller. Meist schafft er es so, im Rennen vor den bts zu starten.

Außerdem tauschen sich Delphine während eines Rennen untereinander aus, was das Lernen angeht! Kann einer vorne starten und hat freie Bahn, dann lernt er schon, während andere noch durch Rivalen gestört werden. Nach einer Runde sieht jeder Delphin nach, was bisher die beste Rundenzeit ergeben hat. War er besser, speichert er seine Werte, ansonsten übernimmt er die Erfahrung eines anderen.

Das mit dem Lernen ist nicht ganz unproblematisch, weil das Gewicht des Fahrzeugs vom Tankinhalt abhängt, und deshalb im Laufe der Runden abnimmt. Werte die gegen Ende des Trainings passen, können bei voll betanktem Wagen (am Anfang des Rennens oder nach einen Boxenstopp) dazu führen, das du aus der Kurve fliegst!

Ich habe deshalb versucht, da eine gewisse Kompensation zu finden. Details kannst du dir im Quellcode ansehen.

Viel Spass!


GTA-Place - Do 11.01.07 19:48

Die lernen auch noch untereinander? Das ist interessant. Ich muss mir mal Zeit nehmen, den ganzen Source zu studieren, um denn Rennwagen zu verbessern.


wdbee - So 14.01.07 23:20

Auf der TORCS-Homepage ist nun auch ein Link hierher zu finden. Damit sollten sich auch Interessenten für eine Windows/Delphi-TORCS-Meisterschaft hier einfinden, die die TORCS-Site besuchen.

Wer Interesse hat, kann ja mal posten, auch wenn ein eigener bzw. modifizierter Roboter natürlich etwas Zeit braucht. Aber es wäre da auch einiges vorzubereiten und der nächste Teil des Tutoriums fehlt ja auch noch.

Auf meiner TORCS-Homepage [http://wdbee.gotdns.org:8080] kann man sich registrieren lassen. Nach Aktivierung des Kontos durch mich bekommt man dann Zugriff auf weitere Infos für Teilnehmer und Zuschauer.

Viel Spaß

wdbee


GTA-Place - Mo 15.01.07 16:33

Auch wenn das ganze meine mathematischen und physikalischen Kenntnisse übersteigt, würd ich gern mein Glück bei nem Wettbewerb probieren.


Saubäär - Mo 15.01.07 17:12

Hi Leute,

ich hab mal zwei Screenshots von meinem CLK DTM hochgeladen. Habt ihr das Aussehen euer Wagen auch modifiziert?

Gruß

Saubäär


GTA-Place - Mo 15.01.07 17:33

Ich hab ja noch nicht mal am Source was geändert. Das Design kommt am ende, sobald mein Porsche GT1 die Spur nicht mehr verliert.


wdbee - Mo 15.01.07 18:13

Aber du denkst daran, dass für die erste Meisterschaft alle mit dem CLK DTM fahren?
Später können wir uns auf andere Wagen einigen.


GTA-Place - Mo 15.01.07 18:15

Achso, OK ^^.


GTA-Place - Mo 15.01.07 20:23

Wo finde ich die DLL von BT 2004, bzw. dem neuen BT? Weil ich es grad geschaft hab, dass mein Auto schneller E-Track 3 schafft.


wdbee - Mo 15.01.07 20:41

Alle Roboter, die mit TORCS mitgeliefert werden, sind in eigenen Verzeichnissen unter dem TORCS-Verzeichnis (z.B. C:\Programme\TORCS)\Drivers und die Verzeichnisse heißen immer so wie der Roboter.


GTA-Place - Mo 15.01.07 21:03

Schon, aber ich brauch ja einen anspruchsvollen Gegner und die sind ja alle (mit Mercedes) langsam.


wdbee - Mo 15.01.07 21:35

Welche Rundenzeiten sollte ein würdiger Gegner denn etwa haben?


GTA-Place - Mo 15.01.07 21:43

So 1:20:00 für E-Track 3 sollte er können. Bin knapp hinter der Zeit.


wdbee - Mo 15.01.07 22:55

Da weiß ich im Moment nur den berniw two 9 und 10. Die fahren den McLaren F1, was natürlich unfair ist, aber damit hast du einen etwas schnelleren Gegner.


wdbee - Mi 17.01.07 13:54

Um die eigenen Zeiten etwas besser einordnen zu können, hier mal ein paar Zahlen aus der letzten Linux/C++-TORCS-Meisterschaft.

Ergebnisse der Qualifikation auf E-Track 3 (Schnellste Runde):

1:15.538 (Team CTD Racing)
1:15.489 (Team Control)
1:17.113 (Team The Rat Race)
1:21.334 (Team SpeedyBots)
1:21.798 (Team Berniw Racing)
1:32.103 (Team TORCSPlayer Racing)

gefahren mit Mercedes CLK DTM oder Viper GTS-R.

Der Sieger beendete das Rennen (105 Runden) nach 2:17:57.43 (h:m:s) mit nur zwei Boxenstopps. Das entspricht einer durchschnittlichen Rundenzeit von etwa 1:19!
Mit einer mittleren Rundenzeit von 1:24 liegt man im Mittelfeld und mit 1:30 wäre man nicht der Letzte!


Horst_H - Mi 17.01.07 14:58

Hallo,

dann habt Ihr ja gute Chancen wdbee und Gta-Place.
Wieviel Speicher darf man eigentlich zum lernen belegen?
Ich kann mir vorstellen, dass man die Strecke komplett einliest oder während der ersten Runde und dann alle interessanten Sachen in records zusmmenfaßt, um schneller rechnen zu können.
Wenn die Bremswegberechnung anschaue, fehlt mir die Änderung des Pedaldruckes in den verschiedenen Abschnitten, es wird einfach der kleinste Wert der Haftreibung in den maximal zu betrachteden Abschnitten genommen.
Bei einem Zeitschritt von 0,02 Sekunden kommt man ja nur 1.76 m weit bei 88 m/s (Vmax), da kann man sicher von Abschnitt zu Abschnitt die Bremskraft modulieren.
Ich versuche überhaupt die Bremsberechnung zu verstehen. Wird diese nur einmal pro Abschnitt berechnet?

Gruß Horst


wdbee - Mi 17.01.07 16:31

Hallo Horst,

bezüglich des Speichers habe ich noch keine Festlegung gelesen bzw. getroffen. Grundsätzlich sollte jeder davon ausgehen, dass er maximal 5% (1/20tel) der Resourcen (Speicher, Rechenleistung usw.) pro Fahrzeug verwenden kann, denn es sollen bis zu 20 Fahrzeuge (10 Teams a zwei oder 2 Teams a zehn als Matchrace jedes Team gegen jedes andere) gegeneinander antreten können. Sollten es wirklich einmal mehr werden, dann wird in Gruppen gefahren.
Im Tutorial von Berhand Wymann gibt es Hinweise bezüglich der Rechenleistung. Der verfügbare Speicher hängt aber vom PC ab.

Eine TORCS-Meisterschaft wird folgendermaßen ausgetragen:

1. Alle laden ihre Roboter (Quelltexte, keine binären Dateien) und Steuerdateien auf den Server
2. Wenn alle da sind, wird der Download für die Teilnehmer freigegeben. Jeder von ihnen kann dann alle Roboter herunterladen und das Rennen bei sich austragen.
3. Jeder, der ein Rennen durchgeführt hat, kann die Ergebnisse auf den Server hochladen. Dafür gibt es zusätzliche Punkte, denn es ist Arbeit!
4. Wenn der festgelegte Termin erreicht ist, werden alle Ergebnisse zusammengefasst. Da Rennen auf einer Strecke von verschiedenen Teilnehmern durchgeführt werden, ist eine Kontrolle gegen Manipulation möglich!

Wegen dieses Prinzips lässt sich schwer sagen, wieviel MB jeder bekommt.

Aber es sollte kein Problem sein, die Strecke vorab auszuwerten und aufbereitet im RAM zu speichern. Dateizugriffe (während eines Rennens) sollten nicht vorgesehen werden. Alles was zum Einlesen und zur Vorauswertung dient kann im NewRace/NewTrack-Teil untergebracht werden, alles was zum Speichern gehört in ShutDown. Ein Beispiel für einen Roboter, der das macht ist der berniw two. Er berechnet eine "optimale" Fahrspur (Trajektorie, Ideallinie) und speichert die für das Rennen im RAM. Während des Rennens korrigiert es diese Ideallinie abschnittweise, um ausweichen und überholen zu können oder in die Box zu fahren.

Zum Bremsen muss ich folgendes sagen. Im Tutorial ist die Gleichung angegeben, die mit gewissen Vereinfachungen beschreibt, wie lang der Bremsweg ist, um vom von einer Anfangsgeschwindigkeit auf die Endgeschwindigkeit abzubremsen. Der Delphin berechnet vor dem Start für jeden Abschnitt, wie schnell gefahren werden darf. Dabei wird der Kurvenradius des Abschnitts aus benachbarten Abschnitten berechnet.

Dadurch ist die maxmimal zulässige Geschwindigkeit für jeden Abschnitt bekannt. Bei diesen vorberechneten Werten wird aber jeder Abschnitt nur für sich betrachtet, eine folgende Kurve nach einer Geraden (Radius unendlich) beeinflusst nur den letzten Abschnitt vor der Kurve (durch die Schätzung des Kurvenradius). Abschnitte (des Delphins) sind etwa 1m lang und entstehen durch Zerlegung der längeren Segmente mit variabler Länge von TORCS.

Vor einer Kurve nach einer langen Geraden muss aber viel früher gebremst werden. Deshalb wird in jedem Zeitschritt (50 mal pro Sek.) geprüft, ob gebremst werden muss.

Dazu wird zunächst der aktuelle Abschnitt betrachtet. Ist der Wagen schneller als zulässig wird sofort gebremst.
Wenn nicht werden alle vorausliegenden Abschnitte bis zum Ende des Anhaltewegs betrachtet. Wird ein Abschnitt gefunden, dessen zulässige Geschwindigkeit unter der aktuellen liegt, wird berechnet, wie weit der Bremsweg einer Vollbremsung wäre, um den Geschwindigkeitsunterschied auszugleichen. Ist der Weg bis zum maßgebenden Abschnitt länger als der Bremsweg, wird weitergesucht, maximal bis zum Ende des Anhaltewegs (Geschwindigkeitsunterschied = aktueller Geschwindigkeit). Tatsächlich gebremst wird erst, wenn der Bremsweg länger wird als der Weg bis zum maßgebenden Abschnitt, dann aber mit maximalem Bremsdruck.

Soweit der Algorithmus. Eine Vereinfachung ist, dass angenommen wird, das die Haftreibung auf dem ganzen Bremsweg gleich (dem Minimum) ist. Außerdem werden Kuppen und Neigungen nicht berücksichtigt! Eine verbesserte Berechnung könnte das abschnittsweise betrachten und lokale Besonderheiten wie Neigung, anderer Belag usw. berücksichtigen. Außerdem könnte dabei der sich mit der abnehmenden Geschwindigkeit ändernde Einfluß des aerodynamischen Abtriebs und des Luftwiderstands besser erfasst werden.

Dabei ist aber zu bedenken, dass die Berechnung in jedem Zeitschritt vollständig durchgeführt werden muss, da sich die aktuelle Geschwindigkeit ständig ändert!

Der Reiz der Formel von Bernhard Wymann ist eben die Schnelligkeit der Abschätzung.


GTA-Place - Mi 17.01.07 16:57

Wie kann ich prüfen, ob gelenkt wird? Weil BetterSteering ja scheinbar immer einen Wert <> 0 ausgibt.


wdbee - Mi 17.01.07 17:03

Ich verstehe deine Frage nicht ganz, denn es wird ja auch immer gelenkt. Notfalls geradeaus.


GTA-Place - Mi 17.01.07 17:29

Ich mein jetzt allgemein, ob das Auto zur Seite lenkt. Links und rechts, das ist für mich lenken ;-).


wdbee - Mi 17.01.07 17:34

Du meinst also so was wie:

Delphi-Quelltext
1:
 if SteerCmd = 0.0 then                    

Das ist eine Unsitte, denn außer bei einigen wenigen Gleitkommazahlen funktioniert das wegen der Rundungsfehler nicht.
Nimm da

Delphi-Quelltext
1:
 if Abs(SteerCmd) < Epsilon then                    

wobei du den Wert von Epsilon an das Problem anpassen kannst.


GTA-Place - Mi 17.01.07 18:39

Aber SteerCmd hat den Wert ~ -5, wenn er bei E-Track 3 am Anfang geradeaus fährt. Wie macht das denn der Graph, der die Kräfte angibt?


wdbee - Mi 17.01.07 19:08

Also bei mir liegen die Werte (die BetterSteering zurückgibt) alle brav zwischen -1 und +1!

Kontrollier mal die Größen die in die Berechnung eingehen (z.B. oLookAhead usw.).


GTA-Place - Mi 17.01.07 19:28

Nach der 1. Kurve stimmt es, aber beim Anfahren... mh...


wdbee - Mi 17.01.07 19:34

Kann es sein, dass da Zustandswerte noch nie gesetzt wurden, aber in die Berechnung eingehen?


GTA-Place - Mi 17.01.07 19:53

Ach sch...orry, wenn man natürlich das E übersieht, kommen so Mutmaßungen zustande :oops: -5,...E... Danke, mit dem Epsilon geht es. Mal gucken ob das, was ich machen will, nun klappt.


JDKDelphi - Mi 17.01.07 21:15
Titel: "Delphin"
Hallo,

das ist ja ein äusserst interessantes Projekt !!!


Super


Horst_H - Do 18.01.07 17:44

Hallo,

ich habe mal die mue Berechnung für die Reifen endeckt und etwas geändert:
[edit]UnitTorcsData.pas[/edit]

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
]
//==========================================================================*
// Reifenreibungskoeffizient
//--------------------------------------------------------------------------*
procedure TIPCCarData.InitTireMu;
var
  WheelSect: array [0..3of PChar;
  Tm: Tdble;
  I: Int;
begin
  WheelSect[0] := SECT_FRNTRGTWHEEL;
  WheelSect[1] := SECT_FRNTLFTWHEEL;
  WheelSect[2] := SECT_REARRGTWHEEL;
  WheelSect[3] := SECT_REARLFTWHEEL;
  //Tendenz aufsteigendes Ergebnis
  {
  //Wähle kleinstes mue war bisher 
  TireMu := FLT_MAX;
  for I := 0 to 3 do
    TireMu := Min(TireMu, GfParmGetNum(GetCarHandle, WheelSect[I], PRM_MU, nil, 1.0));
  }

  {
  //Wähle harmonisches Mittel //mue  =0 gibt es hier nicht wegen 1/x
  Tm := 0;
  for I := 0 to 3 do
    Tm := Tm+1/GfParmGetNum(GetCarHandle, WheelSect[I], PRM_MU, nil, 1.0);
  TireMu := 4/Tm;
  }

  {
  //Wähle geometrisches Mittel
  Tm := 1;
  for I := 0 to 3 do
    Tm := Tm*GfParmGetNum(GetCarHandle, WheelSect[I], PRM_MU, nil, 1.0);
  TireMu := exp(ln(tm)/4);
  }


  //Wähle aritmetisches Mittel
  TireMu := 0;
  for I := 0 to 3 do
    TireMu := TireMu+GfParmGetNum(GetCarHandle, WheelSect[I], PRM_MU, nil1.0);
  TireMu := TireMu/4;

  {//Ist fast immer das schnellste erzeugt schlechte erste Runde ;-)
  //Wähle größtes mue
  TireMu := 0;
  for I := 0 to 3 do
    TireMu := Max(TireMu, GfParmGetNum(GetCarHandle, WheelSect[I], PRM_MU, nil, 1.0));
  }


end;


Das bringt etwas, besonders auf extrem hubbeligen Strecken wie Olethros Road 1

Gruß Horst


wdbee - Mo 22.01.07 21:25

Hallo Horst,

ich habe das mal auf anderen Strecken probiert. Es sieht so aus, als ob das von Strecke zu Strecke (und Setup zu Setup) unterschiedlich ist. Deshalb sollten die interessanten Varianten (Min, Mean, Max) wahlweise möglich sein. Dazu wäre dann ein neuer Parameter im Abschnitt "delphin private" vorzusehen.

Ich schlage vor ihn "tireinit" zu nennen und als Werte eben Min, Mean oder Max zur Auswahl zu stellen. Analog zum Parameter "... Differential" in der Setup-Datei


Delphi-Quelltext
1:
    <attstr name="type" in="SPOOL,FREE,LIMITED SLIP" val="FREE"/>                    


sähe das dann so aus:


Delphi-Quelltext
1:
    <attnum name="tireinit" in="MIN,MEAN,MAX" val="MEAN"/>                    


Als Standardwert sollte der Delphin MIN verwenden (wenn nichts anderes angegeben wurde).

Im Programm in der UnitDriver.pas so ...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  ...
  BOTNAME_ATT_TIREINIT = 'tireinit';             // Art der Mittelung
  ...
  TireInit := GfParmGetStr(CarSettings
    , BOTNAME_PRIV, BOTNAME_ATT_TIREINIT, 'MIN');
  WriteLn(Format('oTireInit: %s',[TireInit]));
  ...


... und in der UnitTorcsData.pas so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
//==========================================================================*
// Reifenreibungskoeffizient
//--------------------------------------------------------------------------*
procedure TIPCCarData.InitTireMu;
var
  WheelSect: array [0..3of PChar;
  Tm: Tdble;
  I: Int;
begin
  WheelSect[0] := SECT_FRNTRGTWHEEL;
  WheelSect[1] := SECT_FRNTLFTWHEEL;
  WheelSect[2] := SECT_REARRGTWHEEL;
  WheelSect[3] := SECT_REARLFTWHEEL;

  if oTireInitType = 2 then
  begin
    Tm := 0.0;
    for I := 0 to 3 do
      Tm := Max(Tm, GfParmGetNum(GetCarHandle
        , WheelSect[I], PRM_MU, nil1.0));

    TireMu := Tm;
  end
  else if oTireInitType = 1 then
  begin
    Tm := 0.0;
    for I := 0 to 3 do
      Tm := Tm + GfParmGetNum(GetCarHandle
        , WheelSect[I], PRM_MU, nil1.0);

    TireMu := Tm / 4;
  end
  else
  begin
    Tm := FLT_MAX;
    for I := 0 to 3 do
      Tm := Min(Tm, GfParmGetNum(GetCarHandle
        , WheelSect[I], PRM_MU, nil1.0));

    TireMu := Tm;
  end
end;
//==========================================================================*

//==========================================================================*
// Art der Mittelung ausgeben
//--------------------------------------------------------------------------*
function TIPCCarData.GetTireInit: string;
begin
  if oTireInitType = 1 then
    Result := 'MEAN'
  else if oTireInitType = 2 then
    Result := 'MAX'
  else
    Result := 'MIN';
end;
//==========================================================================*

//==========================================================================*
// Art der Mittelung einstellen
//--------------------------------------------------------------------------*
procedure TIPCCarData.SetTireInit(Value: string);
begin
  if UpperCase(Value) = 'MEAN' then
    oTireInitType := 1
  else if UpperCase(Value) = 'MAX' then
    oTireInitType := 2
  else
    oTireInitType := 0;
end;
//==========================================================================*


Damit sind alle Möglichkeiten gegeben, den Delphin an die Strecke anzupassen.


wdbee - Do 25.01.07 19:29
Titel: HHR-SETUP-WETTBEWERB
!!! HHR-SETUP-WETTBEWERB !!! Der Wettbewerb läuft noch !!!

Aktuelle Tabelle: (Stand 23. Mrz 2007)

Gruppe 1: (Eigene Roboter)
01:23:45 - wdbee_2007_hhr: wdbee (Custom-Setup, trainiert)
01:24:72 - MeinerEiner: horst_h (Custom-Setup, 20 Runden Training)

Gruppe 2: (Delphin Roboter)
01:22:96 - delphin V1.00.X: horst (Custom-Setup, korr. Strecke) <<< Neuer Wert
01:24:57 - delphin V1.00.X: wdbee (Custom-Setup, 20 Runden Training, korr. Strecke)
01:26:86 - delphin V1.00.X: wdbee (Custom-Setup, Qualifying wiederholt)
01:27:97 - delphin V1.00.X: wdbee (Custom-Setup, untrainiert)
01:28:12 - PacMan V1.00.X: GTA-Place (Custom-Setup, 200 Runden Training)
01:28:85 - delphin V1.00.X: wdbee (Default-Setup, 20 Runden Training)
01:30:79 - delphin V1.00.X: wdbee (Default-Setup, Qualifying wiederholt)
01:32:80 - delphin V1.00.X: wdbee (Default-Setup, untrainiert)

Gruppe 3: (TORCS Roboter)
01:21:31 - berniw two: horst_h (Custom-Setup)
01:23:02 - berniw two: berniw (Default-Setup)
01:23:71 - bt: berniw (Default-Setup, bestes beobachtetes Qualifying)
01:24:81 - bt: berniw (Default-Setup, 4. Qualifying)
01:25:57 - bt: berniw (Default-Setup, 3. Qualifying)
01:27:10 - bt: berniw (Default-Setup, Qualifying wiederholt)
01:29:58 - bt: berniw (Default-Setup, untrainiert)

Gesamtwertung: (jeweils nur bestes Ergebnis)
01:21:31 - berniw two: horst_h (Custom-Setup)
01:22:96 - delphin V1.00.X: horst (Custom-Setup, korr. Strecke) <<< Neuer Wert
01:23:02 - berniw two: berniw (Default-Setup)
01:23:45 - delphin_2007_hhr: wdbee (Custom-Setup, trainiert)
01:23:71 - bt: berniw (Default-Setup, bestes beobachtetes Qualifying)
01:24:57 - delphin V1.00.X: wdbee (Custom-Setup, 20 Runden Training, korr. Strecke)
01:24:72 - MeinerEiner: horst_h (Custom-Setup, 20 Runden Training)
01:26:15 - delphin V1.00.X: wdbee (Custom-Setup, 20 Runden Training)
01:28:12 - PacMan V1.00.X: GTA-Place (Custom-Setup, 200 Runden Training)


Hallo Delphin Drivers!

Hier mal eine erste Rennstrecke für einen Wettbewerb!

Das Zip-File enthält den Ordner "hhr-track". Der muss ins TORCS-Verzeichnis für Rennstrecken vom Typ road kopiert werden (z.B. "C:\Programme\TORCS\tracks\road\hhr-track").

Die XML-Datei hhr-track.xml darin beschreibt nur die Rennstrecke, keine Landschaft. Um daraus einen TORCS-Track zu erzeugen, müsst ihr den TORCS-Track-Generator im TORCS-Verzeichnis (z.B. "C:\Programme\TORCS") anwerfen. Dazu gebt ihr in einem DOS-Fenster im o.g. Verzeichnis den Befehl "trackgen -c road -n hhr-track" ein. Damit werden die XML-Anweisungen ausgewertet und die Dateien für die Darstellung erzeugt.

Wenn nur die Rennstrecke dargestellt wird, geht alle etwas schneller, was bei häufigen Tests von Vorteil ist. Wer etwas mehr Umgebung haben will, kann mit der Option -a die Standard-Landschaft aktivieren.
("trackgen -c road -n hhr-track -a").

Wer noch mehr selbst anpassen will, kann im Track-Build-Tutorial nachlesen, wie das geht. Auf der TORCS-Homepage [http://torcs.sourceforge.net] findet ihr unter "Some news and looking for Babis" einen Link zu der "documentation" von Vicente Marti. Die könnt ihr als PDF herunterladen.

Die Rennstrecke "hhr" hat es in sich. Gerade das Richtige, für einen Wettbewerb. Auf den mitgelieferten Rennstrecken kommt der Delphin in der Regel sehr gut zurecht, ohne dass viel am Setup geschraubt werden muss. Auf dieser Strecke muss einiges getüftelt werden! Dabei handelt es sich keineswegs um eine Gemeinheit, die Strecke gibt es in ähnlicher Form tatsächlich.

Was wird bewertet?

Ziel ist es, die Qualifikation mit möglichst guter Zeit zu absolvieren (Modus Endurance Race, erster Teil). Das Rennen selbst, bleibt erstmal außen vor.
Euer Rennwagen ist also allein auf der Strecke und ihr könnt das Setup bis an die Grenzen ausreizen!

Ausgewertet wird in drei Gruppen:

1. Gruppe ("Konstrukteursmeisterschaft"): Eigener Roboter oder modifizierter Roboter, der den Mercedes CLK DTM fährt (Code muss mit Turbo Delphi 2006 übersetzt werden können).

2. Gruppe ("Delphin-Setup-Meisterschaft"): Eigenes Setup für den Delphin V1.00.X (Roboter, so wie er hier heruntergeladen werden kann) mit dem CLK DTM.

3. Gruppe ("Open-Setup-Meisterschaft"): Eigenes Setup für einen mit TORCS mitgelieferten Roboter, der den CLK DTM fährt (z. B. bt oder berniw)

Außerdem machen wir eine Gesamtwertung aus allen drei Gruppen, der Gewinner bekommt den Ehrentitel "Chef-Mechaniker 2007" verliehen (Auszusprechen als Old Mech)!

Was darf ich im Setup einstellen?

Erlaubt sind Änderungen an den Einstellungen des Fahrzeugs, die in den Setup-Dateien im TORCS-Drivers-Verzeichnis (z.B. des Delphins) aufgeführt sind (also Anstellwinkel der Spoiler, Getriebe-Untersetzungen, Differenzial, Bremsen, Stabilisatoren, Reifen, Federung und Stoßdämpfer). Auch die Parameter des "Fahrers" (der Abschnitt "xyz_privat") dürfen verwendet werden.

Nicht erlaubt sind Änderungen an den Einstellungen, die in den Fahrzeugtyp-Dateien im Cars-Verzeichnis festgelegt sind (z. B. Größe der Spoiler, Anzahl der Gänge, Motorleistung usw.).

Wie kann ich mitmachen?

Wer ein für sich "optimales" Setup gefunden hat, postet hier seine Zeit, die Gruppe für die Wertung und den Roboter (delphin, ...). Daraus mache ich dann eine Tabelle.
Findet er/sie während des Wettkampfs eine bessere Lösung, darf er sie erneut posten!

Zum Abschluss (Termin wird hier vorher rechtzeitig angekündigt!) muss jeder seine Setup-Datei (und die Lern-Datei, mit der die Qualifikation gestartet wurde!!!) offen legen, damit die Angaben geprüft werden können. Also beides gut aufheben, sonst glaubt es nachher keiner! Kann ein Ergebnis nicht verifiziert werden, wird der Eintrag in der Tabelle gelöscht.

Wer einen eigenen Roboter oder einen modifizierten Roboter ins Rennen schickt, muss den Code an zwei Vertrauensleute schicken, die dann das Ergebnis bestätigen (Hierfür werden Freiwillige gesucht, die nicht am Wettbewerb teilnehmen wollen, aber Lust und Zeit haben, sich zu beteiligen). Das soll verhindern, das alle nur den "besten" Roboter kopieren. Es sollen bald möglichst viele verschiedene Roboter existieren, erst dann werden die späteren Wettkämpfe interessant.

Fragen hier im Forum, damit alle etwas davon haben.

Viel Spaß.

wdbee


GTA-Place - Do 25.01.07 22:46

Cool! Hier erstmal meine Zeit nach 200 Runden Traning: 01:31:12


wdbee - Do 25.01.07 23:10

@GTA-Place:
Also den ersten Preis für die schnellste Teilnahme hast du schon mal gewonnen!
Damit du auch als leuchtendes Beispiel voran gehst, solltest du mir noch sagen, in welcher Gruppe ich diese Zeit notieren darf und welcher phänomenale Roboter diese Fabelzeit erziehlt hat?

Edit:
Zur Orientierung mal noch folgende Zeit:
Der originale Delphin V1.00.X (s.o.) benötigt ohne vorheriges Training und mit den Standard-Einstellungen des Setups (default.xml) nur 01:32:80.
Das wäre also ein Fahren auf unbekannter Strecke!


Horst_H - Fr 26.01.07 09:12

Hallo,

wie kommst Du auf diese Zeiten mit dem delphin 1.00??
Mit practice und 111 Runden für die 111.te Runde:

Quelltext
1:
2:
3:
4:
5:
6:
7:
        <section name="111">
          <attnum name="time" val="122.272"/>
          <attnum name="best lap time" val="122.272"/>
          <attnum name="top speed" val="76.3769"/>
          <attnum name="bottom speed" val="1.88825"/>
          <attnum name="dammages" val="0"/>
        </section>

Die letzte Runde ist wie so oft die Schnellste.Aber 122 Sekunden sind 2min02Sekunden.
Im Qualifiing sind es 1:53,

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE params SYSTEM "C:/Programme/torcs/config/params.dtd">
<?xml-stylesheet type="text/xsl" href="file:///C:/Programme/torcs/config/style.xsl"?>

<params name="Results">
  <section name="Header">
    <attnum name="date" val="1.1698e+009"/>
  </section>

  <section name="Current">
    <attnum name="current track" val="1"/>
    <attnum name="current race" val="2"/>
    <attnum name="current driver" val="1"/>
  </section>

  <section name="hhr-track">
    <section name="Drivers">
      <section name="1">
        <attstr name="dll name" val="delphin"/>
        <attnum name="index" val="1"/>
      </section>

      <section name="2">
        <attstr name="dll name" val="berniw2"/>
        <attnum name="index" val="8"/>
      </section>

      <section name="3">
        <attstr name="dll name" val="bt"/>
        <attnum name="index" val="6"/>
      </section>

      <section name="4">
        <attstr name="dll name" val="bt"/>
        <attnum name="index" val="7"/>
      </section>

      <section name="5">
        <attstr name="dll name" val="inferno"/>
        <attnum name="index" val="4"/>
      </section>

    </section>

    <section name="Results">
      <section name="Qualifications">
        <section name="Rank">
          <section name="1">
            <attstr name="name" val="berniw two 8"/>
            <attstr name="car" val="Mercedes CLK DTM"/>
            <attnum name="best lap time" val="83.022"/>
            <attstr name="module" val="berniw2"/>
            <attnum name="idx" val="8"/>
            <attnum name="points" val="3"/>
          </section>

          <section name="2">
            <attstr name="name" val="bt 7"/>
            <attstr name="car" val="Mercedes CLK DTM"/>
            <attnum name="best lap time" val="84.292"/>
            <attstr name="module" val="bt"/>
            <attnum name="idx" val="6"/>
            <attnum name="points" val="2"/>
          </section>

          <section name="3">
            <attstr name="name" val="bt 8"/>
            <attstr name="car" val="Mercedes CLK DTM"/>
            <attnum name="best lap time" val="84.338"/>
            <attstr name="module" val="bt"/>
            <attnum name="idx" val="7"/>
            <attnum name="points" val="1"/>
          </section>

          <section name="4">
            <attstr name="name" val="delphin 1"/>
            <attstr name="car" val="Mercedes CLK DTM"/>
            <attnum name="best lap time" val="113.348"/>
            <attstr name="module" val="delphin"/>
            <attnum name="idx" val="1"/>
            <attnum name="points" val="0"/>
          </section>

          <section name="5">
            <attstr name="name" val="Inferno 4"/>
            <attstr name="car" val="Mercedes CLK DTM"/>
            <attnum name="best lap time" val="0"/>
            <attstr name="module" val="inferno"/>
            <attnum name="idx" val="4"/>
            <attnum name="points" val="0"/>
          </section>

        </section>

      </section>

    </section>

  </section>

  <section name="Standings">
    <section name="1">
      <attstr name="name" val="berniw two 8"/>
      <attstr name="module" val="berniw2"/>
      <attnum name="idx" val="8"/>
      <attnum name="points" val="3"/>
    </section>

    <section name="2">
      <attstr name="name" val="bt 7"/>
      <attstr name="module" val="bt"/>
      <attnum name="idx" val="6"/>
      <attnum name="points" val="2"/>
    </section>

    <section name="3">
      <attstr name="name" val="bt 8"/>
      <attstr name="module" val="bt"/>
      <attnum name="idx" val="7"/>
      <attnum name="points" val="1"/>
    </section>

    <section name="4">
      <attstr name="name" val="delphin 1"/>
      <attstr name="module" val="delphin"/>
      <attnum name="idx" val="1"/>
      <attnum name="points" val="0"/>
    </section>

    <section name="5">
      <attstr name="name" val="Inferno 4"/>
      <attstr name="module" val="inferno"/>
      <attnum name="idx" val="4"/>
      <attnum name="points" val="0"/>
    </section>

  </section>

</params>

also weit weg von 1:32. oder den 1:23 von BernieW Two 8

Gruss Horst


wdbee - Fr 26.01.07 11:14

Hallo Horst,

das Qualifing wird nicht im Practice Mode gestartet, sondern im Endurance Mode.
Als erstes habe ich im Qualifying-Verzeichnis des delphin 0 ("C:\Programme\TORCS\drivers\delphin\0\qualifying") die alte Datei hhr-track.karma (und falls vorhanden auch hhr-track.txt) gelöscht.

Dann habe ich den Endurance Mode gestartet, im dessen Konfiguration den hhr-Track ausgewählt und als einzigen Teilnehmer den delphin 0 selektiert.

Dann wird das Qualifying gestartet. Es geht bei TORCS über 4 Runden und als Ergebnis wird die Zeit angezeigt. Da ich keine Steuerdatei "C:\Programme\TORCS\drivers\delphin\0\qualifying\hhr-track.xml" angelegt habe, verwendet der Roboter die Standard-Datei "C:\Programme\TORCS\drivers\delphin\default.xml". Das lässt sich auch an den Ausgaben von TORCS in das Konsolenfenster nachvollziehen. Tipp: Wenn die eigentlich gewünschte Steuerdatei mal durch einen Eingabefehler keine gültige XML-Datei mehr ist, passiert das auch!

Was ist nun anders, wenn man das Qualifying so startet?

TORCS fragt den Roboter, wieviel er vor dem Start tanken will. Der ermittelt die voraussichtliche Menge an Treibstoff, die für die 4 Runden benötigt werden, aus den Angaben der Steuerdatei (Parameter "fuelperlap" in kg/Runde).

Wenn ich eine lange Strecke trainiere, dann startet der Roboter mit vollem Tank. Das führt auf einigen Strecken aber zu ganz anderem Verhalten! Deshalb ist eine wichtige Einstellung der richtige Wert für den angenommenen Verbrauch.

Außerdem ist es etwas anderes, ob ich die Lernparameter für 500 km oder 4 Runden wähle. Bei kurzen Strecken kann ich agressiver vorgehen und die Lernkurve steiler machen (größere Werte für die Steigungsparameter mplus/mminus).

Wie kann ich meine Tests vereinfachen?

Ich kann nur die Qualfikation laufen lassen und das eigentliche Rennen (über immerhin ca. 500 km) abbrechen bzw. garnicht erst starten.

Wenn ich nicht nur einen Delphin antreten lasse, kann ich gleichzeitig verschiedene Parametersätze testen. Dazu muss ich in der Datei "delphin.xml" weitere Abschnitte (max. 10 insgesamt) für weitere Fahrer anlegen.

Außerdem kopiere ich das Verzeichnis "delphin\1" in "delphin\2" ... "delphin\9". In diesen Verzeiohnissen liegen die Steuerdateien, getrennt für "practice", "qualifying" und "race". So kann ich jedem Roboter eigene Anweisungen geben und schneller testen.

Dabei muss ich aber daran denken, dass die Roboter im "qualifying"-Verzeichnis den gelernten Stand speichern ("Karma"-Datei) und den löschen, wenn ich den Test mit neuen Parametern starten will. Dehalb bekomme ich auch andere Werte, wenn ich eine Qualifikation wiederhole (1. Lauf ohne Karma-Dartei, 2. mit). Bei meinem Test lagen die Werte bei der Wiederholung schon unter 1:31!
Beim Delphin bleibt es ab dem 3. Lauf bei den Werten, denn wenn er eine Karma-Datei eingelesen hatte, überschreibt er sie nicht. Der bt macht das anders, weshalb hier die Datei vor dem Lauf gesichert werden muss!

Das Lernen kann ich auch im "Practice" Mode machen. Dabei wird die Karma-Datei auch ins "qualifying"-Verzeichnis gespeichert.

Woran erkenne ich ein "gutes" Setup?

Wenn ich einen Test im Practice Mode mache, bei dem ich die Anzahl der Runden so wähle, dass mit fast vollem Tank gestartet werden muss, aber nicht getankt wird, sehe ich an den angezeigten Rundenzeiten den Lernzuwachs und ggf. auch Rückschläge. Bei einem guten Setup (für das Rennen) sind relativ stetige Verbesserungen und nur wenige kleine Rückschläge zu sehen. Beim ersten Lauf (zur Erzeugung der Karma-Datei) kann das anders sein, hier zählt nur der letztendlich erreichte Stand!

Versuch mal das Ergebnis nachzuvollziehen. Wenn es nicht geht, werde ich noch mal die "default.xml" kontrollieren, die ich verwendet habe.

Viel Spaß

wdbee


Horst_H - Fr 26.01.07 14:47

Hallo,

ich bin in den Projeecten durcheinander geraten und habe mit meinem modifiziertem Roboter getests, der mit anderen Werten im Privat-Teil arbeitet, (centerdiv und width zum Beispiel, die sehr starken Einfluss haben und deshalb neu kompilieren ..näh ), und natuerlich ein ABS,TCL ,das den relativen Schlupf bestimmt und ein wenig das Schleudern vermindert und besser vom Gras runterkommt (CG-3).
Das bedeutet dass die Setup's sich etwas in der Gewichtung verändert haben.
In der Originalversion kommen so 1:30 heraus, wie Du gepostest hast, mit meinem default 1:54
Mit meiner delphin-Version sind es 1:36 nach 10 Runden und wird nicht besser, aber ich überlege ja noch.
Zum Beispiel die Faltung der ssq-Werte macht ja nicht viel Sinn.
Du teilst die Strecke in >1< m Stücke und nun >7< m vorher statt 500 m/s auf 29 m/s abzusenken ist nicht besonders sinnhaft.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
Y ist die Fahrrichtung in der X-Y -Ebene 
SecId    RadiusYZ   RadiusXY   Wurzel(ssq(SecId))
   91    0.000000 3.400E+0038  500.000000
   92    0.000000 3.400E+0038  467.824737
   93    0.000000 3.400E+0038  433.266625
   94    0.000000 3.400E+0038  395.701849
   95    0.000000 3.400E+0038  354.175010
   96    0.000000 3.400E+0038  307.082923
   97    0.000000 3.400E+0038  251.316394
   98    0.000000 3.400E+0038  178.941102
   99    0.000000   50.000000   29.663121
  100    0.000000   50.000000   29.663121
  101    0.000000   50.000000   29.663121
  102    0.000000   50.000000   29.663121
  103    0.000000   50.000000   29.663121
karma dort
1.633906
1.639396
1.652586
1.660683
1.671946
1.683223
1.692166
1.693305
1.701718
1.708459
1.713396
1.719500
1.720444
1.726402
1.732276
1.735018

Meine Brechnung von ssq-Werte mit Maximum von 120 m/s ohne Faltung
   91    0.000000 3.400E+0038  120.000000
   92    0.000000 3.400E+0038  120.000000
   93    0.000000 3.400E+0038  120.000000
   94    0.000000 3.400E+0038  120.000000
   95    0.000000 3.400E+0038  120.000000
   96    0.000000 3.400E+0038  120.000000
   97    0.000000 3.400E+0038  120.000000
   98    0.000000 3.400E+0038  120.000000
   99    0.000000   50.000000   35.592155  //ca 20% mehr
  100    0.000000   50.000000   35.592155
  101    0.000000   50.000000   35.592155
  102    0.000000   50.000000   35.592155
  103    0.000000   50.000000   35.592155
  104    0.000000   50.000000   35.592155
  105    0.000000   50.000000   35.592155
  106    0.000000   50.000000   35.592155
  107    0.000000   50.000000   35.592155
  108    0.000000   50.000000   35.592155

Aber beim Test, ob man bremsen muss, klappert man die Strecke voraus ab, und vergleicht, ob man bis dorthin hätte bremsen können, sobald dies nicht der fall ist bremst man.(UnitDriver.pas --> TDriver.Braking)
Dies Braking habe ich auch verändert, aber das bremst zu spät, deshalb verlasse ich zu oft die Fahrbahn ;-)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
V12 := Sqr(SpeedX);
 {
  Factor := 0.5 / (LocalMu * G);
  //Bremsweg nur aus der Bremskraft des Eigengewichtes ohne Aerodynamik
  MaxLookAheadDistance := V12 * Factor;
 }

 MaxLookAheadDistance:= Brakedist(V12,LocalMu);
 // Der Gag bei kleinen Geschwindigkeiten ist BrakeDist > V12*Faktor ???????


Die ssq Werte haben ja großen Einfluß, deshalb überlege ich eine Umkehrrechnung.
Wieviel Geschwindigkeit bekomme ich auf dem jeweiligen Abschnitt vernichtet.
Bei 1m Stücken ist dies wohl einfach linear machbar
E= F*s; F= übertragbare Bremskraft auf den Boden+ Luftwiderstand.
F=f(localmue, Masse,Ca,Cw,RadiusXY(Fliehkraft),RadiusXZ(looping),RollReibung(minimal ausser im Kies),ReibungFahrbahn,Seitenneigung(in der Kurve relevant),Steigung(bergauf bremst es sich gut, eine Wand(90 Grad) optimal))

Was zum Glück eigentlich fehlt, ist dann die Fahrbahnlinie eines BernieW Two 8, auch wenn der schlecht überholen kann.

Genug gefaselt. oSSq bestimmen optimieren.

Gruß Horst


GTA-Place - Fr 26.01.07 15:22

user profile iconwdbee hat folgendes geschrieben:
@GTA-Place:
Also den ersten Preis für die schnellste Teilnahme hast du schon mal gewonnen!

Danke, danke :-P.
user profile iconwdbee hat folgendes geschrieben:
Damit du auch als leuchtendes Beispiel voran gehst, solltest du mir noch sagen, in welcher Gruppe ich diese Zeit notieren darf und welcher phänomenale Roboter diese Fabelzeit erziehlt hat?

Da es eine ganz ganz leicht veränderte Version des delphin ist, natürlich in der delphin-Gruppe.

Achja, der Roboter trägt den Namen PacMan (mein neuer Nick, außerhalb dieses Forums ;-)).


wdbee - Sa 27.01.07 10:23

Hallo Horst,

da dich das Bremsen sehr beschäftigt, hier noch ein kleiner Hinweis. Ich habe bei der Bestimmung des erforderlichen Bremsweges einen konstanten Sicherheitsabstand eingebaut (FRONTCOLL_MARGIN). Der ist theoretisch völlig unbegründet, half mir damals aber, häufiges Auffahren eines Delphins auf den anderen zu vermeiden, wenn ich ein Team von 10 Delphinen um den Kurs gejagt habe.
Ohne die im Delphin inzwischen integrierten Funkionen für das "Teambewustsein" hatte ich zwar bald schnelle Delphine im Rennen, auf langen Strecken kollidierten die untereinander aber so häufig, dass am Ende langsamere Roboter vorne lagen. Es war ein hartes Stück Arbeit, ihnen diesen "Kanibalismus" abzugewöhnen ohne ihnen die Bissigkeit zu nehmen, die gegen andere Roboter bisweilen nötig ist, um zu gewinnen.
Eigentlich arbeite ich an der Entwicklung eines Roboters, der analog zu den berniw tow's mit einer vorausgeplanten "Ideallinie" arbeitet. Genau wie du fand ich aber, dass die Lösung von Bernhard nur dann sehr gut ist, wenn der Roboter alleine ist.
Wenn du dir den Quellcode dazu ansiehst, wirst du feststellen, das Bernhard zwei Verfahren hat. Eines, dass offensichtlich mal von Remi Coulon für seinen K1999 (ein RARS-Roboter, RARS = Vorläufer von TORCS) entwickelt wurde und mit einer Ausgleichsrechnung der Krümmungen arbeitet, und ein eigenes Verfahren, dass auf der abschnittsweisen Anpassung von Trassenelementen (Klothoiden = Kurve mit konstanter Änderung der Radius entlang des Weges analog zur konstanten Drehgeschwindigkeit am Lenkrad) beruht. Welches der beiden Verfahren in der DLL aktiv ist weiß ich nicht.
Ich habe ein Verfahren entwickelt, dass auf der Berechnung von Kreisen aus drei Punkten beruht. Nach einer Weile musste ich dann feststellen, dass es dem Verfahren K1999 sehr ähnlich ist (Radius statt Krümmung, aber Krümmung = 1/Radius). Deshalb habe ich dann einige Schritte des K1999 übernommen, die schneller berechnet wurden, als mein Code.
Das Ergebnis war der Delphin 2006. Der fährt eine sehr schön anzusehende Linie und ist auch recht schnell unterwegs. Mit einen angepassten Setup schaffte ich auf Alpin-1 eine Qualifikation in der Zeit von 2:01:76.
Der berniw berechnet bei Abweichungen vom geplanten Kurs für den vorausliegenden Abschnitt eine neue Route mit einer Spline-Funktion (die, die auch in der Box verwendet wird). Das ist der Teil der nicht so toll funktioniert. Meine Versuche waren zwar besser, aber auch nicht berauschend.
Deshalb war ich einen anderen Weg gegangen. Ich habe im Delphin 2006 zwei Zustände verwendet. Einer war das Fahren nach der Planung, der andere das Taktieren nach der aktuellen Situation, so wie es der Delphin V1.00.X macht.
Das funktioniert sehr gut, aber es bleibt das Problem, der Umschaltung zwischen den beiden Zuständen. Hier muss ich noch eine bessere Lösung finden, damit die Leistung nicht nur in der Qualifikation gut ist.
Während der Tests habe ich dann aber festgestellt, das der neue bt unglaubliche Ergebnisse bringt, wenn er lange genug lernt. Das Neue ist dabei die Fähigkeit, das Gelernte zu speichern (Karma-Datei). Ich hatte beim Delphin die Dateien ursprünglich als *.dat abgelegt, habe mich da aber angeglichen.
Auf der Strecke "hhr" fährt der berniw anfangs mit Abstand als Bester. Wiederholt man die Qualifikation aber oft genug, wird der bt immer besser und liegt schließlich vorn.
Es gibt aber andere Strecken, die dem bt garnicht liegen. Etwa, wenn auf einer langen Geraden ein kleiner Knick eingebaut wird (Kurze Kurve mit engem Radius aber sehr kleinem Bogen). Da bleibt er fast stehen. Die Faltung, die du kritisierst, verhilft dem Delphin in dieser Situation zu wesentlich besseren Leistungen, da sie das "Hindernis" ausbügelt. Der Reiz ist hier, dass das Verfahren sehr "billg" ist, denn ich benutze die Klasse, die ich schon für die Positionsüberwachung brauche. Mit der Abstimmung der Länge der Systemfunktion und deren Verschiebung habe ich auch zwei Parameter, die eine sehr gute Anpassung an unterschiedliche Strecken ermöglichen. Der berniw oder der Delphin 2006 haben da natürlich keine Probleme, weil sie die Trasse optimieren und dann erst die möglichen Geschwindigkeiten berechnen.
Die zentrale Frage die sich hier aber stellt ist: Bringt eine realistischere Berechnung mehr als ein geschicktes Lernen?

Ich denke, dass ich bald noch besser Zeiten für den Wettbewerb von euch erwarten kann!

wdbee


Horst_H - Sa 27.01.07 12:31

Hallo,


den Kanabalismus habe ich auch schon bemerkt. Ich dachte, ich seh nicht recht, wie Delphin 1 Delphin 0 so oft auffuhr bis Delphin 1 die magischen 10000 überschritt, da Frontschäden häher bewertet werden.

Nun zum Bremsen und meinem Rückwärtsrechnen der maximalen ssq-werte, was zum Gück eine Vorabarbeit und keine Echtzeitrechnung ist.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Falls Sec[i].ssq>Sec[i+1].ssq dann
  begin
  aktssq := Sec[i+1].ssq;
  j :=i;
  deltaV2 := sqr(F(Car,Sec(j)));
  aktssq := Sec[i+1].ssq+DeltaV2;
  Solange Sec[j].ssq>aktssq 
    Sec[j].ssq:=aktssq; 
    deltaV2 := sqr(F(Car,Sec(j)));
    aktssq := aktssq+deltaV2
    dec(j)
  end;

Dabei habe ich nun ein kleines Problem, wieder mal mit Kuppen und daraus resultierenden Sprüngen.
Beim Rückrechnen fahre ich die übersprungene Kuppe hinauf und springe eventuell über die andere Seite, wo dann nur der Luftwiderstand bremst (Auf Olethros Road 1 sieht man die Flugeigenschaften sehr gut ;-) )
Ich muss dann doch von weiter in der Vergangenheit losrechnen und dann doch öfter einschachteln.
Das werde ich mal am lebenden Objekt testen und nicht nur mit einer fiktiven Strecke.

Der Sinn dieser Rechnug ist eben nur möglichst gute ersten Runden hinzulegen und mit kleineren Lernfaktoren auszukommen.

Gruß Horst
P.S.
Die eingebauten Sachen für E-track 6 und CG3 ,alpine-1 im Quelltext habe ich auskommentiert.
Ich finde, die haben dort nichts zu suchen und gehören in die Konfiguration.
Ich möchte erst einen guten Allrounder (Championship, kann man den auch nur rechnen lassen ohne die Anzeige??)

Gruß Horst


wdbee - Sa 27.01.07 14:15

Sorry Horst,

aber für die Blechschäden bin ich verantwortlich:

In der UnitOpponents, procedure TOpponent.Update, steht die Zeile


Delphi-Quelltext
1:
    else if (Distance > 0and (Speed < 0.9 * MyCarData.Speed) then                    


, was natürlich falsch ist. Exakt wäre


Delphi-Quelltext
1:
    else if (Distance > 0and (Speed < MyCarData.Speed) then                    


aber gemeint war


Delphi-Quelltext
1:
    else if (Distance > 0and (Speed < 1.1 * MyCarData.Speed) then                    


, um kurze Änderungen im Vorzeichen der Relativgeschwindigkeit nicht sofort in eine andere Klassifikation umzusetzen.

Die Nachhilfe-Funktionen CalcETrack3, CalcETrack6 und CalcGTrack3 sollten zeigen, wie man Sonderfälle in Strecken ohne generelle Änderungen im Robot umschiffen kann. Das ist mit Blick auf den Modus einer TORCS-Meisterschaft eine durchaus sinnvolle Lösung. Bei der Meisterschaft wird für jede Strecke ein "neuer" Roboter hochgeladen. Also lauter Spezialfälle, keine Allrounder.
Das gleiche gilt für die Prozedur TSection.InitSSf. Die wird bei der Vorbereitung ausgeführt, es ist also Zeit für die vielen "if then else"s. Die Nachhilfe-Funktionen dagegen zeigen, wie eine Lösung während des Rennens aussehen kann.

Unabhängig davon gebe ich dir Recht. Auch mein Ziel ist es, einen guten Allrounder als Ausgangsbasis zu schaffen. Aber der Delphin hat da noch so einige kleine Probleme (früher Ausweichen usw.).

Bernhard Wymann hat mir per Mail vorgeschlagen, auf Sourceforge.net im TORCS-Projekt im CVS einen Bereich für den Delphin einzurichten. Auch wenn ich das nicht sofort nutzen werde, halte ich das für sinnvoll, wenn die ersten Kinderkrankheiten mal ausgestanden sind.

Denkt man das konsequent zu Ende, führt das dazu, den Delphin mal als Bestandteil der (Windows-)TORCS-Distribution bereitzustellen. Dafür wären aber noch einige Dinge zu erledigen.

Neben dem CLK DTM sollten auch andere Typen bereitgestellt werden. Ich denke da vorallem an die Typen, die schon mit deutlich besserem Design daherkommen (Porsche GT3 RS, Ferrari 360 Modena und mein Liebling, der McLaren F1 in der kommenden Version).

Außerdem brauchen die dann gute Default-Setups, so dass sie auf allen Strecken eine gute Figur machen, auch auf neuen oder selbst erstellten wie dem "hhr-track" oder meinem gerade entstehenden "Wolf's-Burg-Ring", einer High-Speed-Strecke (CLK DTM Vmax > 340), gespickt mit allerlei Gemeinheiten (Knicke, wechslende Beläge usw.), halt allem was ein guter Roboter so schlucken sollte. Auch die Spitzkehre in "hhr" ist ja ein Sonderfall. Nur der berniw two da kommt bisher mit Anstand um die Ecke.

Wenn der Kreis der Interessenten hier mal etwas größer ist, wäre das in meinen Augen ein schönes Gemeinschafts-Projekt ("Delphin-Default-Setup"). Da könnten viele mitmachen, denen noch das Rüstzeug oder die Zeit für eine eigene Roboter-Entwicklung fehlt. Wer sich dafür interessiert, kann sich ja mal melden.

Nebenbei entsteht auch der nächste Teil des Tutoriums, weshalb ich froh bin, wenn mir eure Fragen Defizite aufzeigen. Wenn hier Ideen oder Probleme anstehen, sofort her damit, damit das ganze nicht so lange dauert.

Bis bald

wdbee


wdbee - So 28.01.07 11:47

Hallo Delphin Drivers,

oben im Thread bei der Ankündigung des Wettbewerbs habe ich mal den mir bisher mitgeteilten Stand als Tabelle zusammengestellt.

Alle Roboter sind mit dem CLK DTM unterwegs. Der bt und der berniw two sind die mit TORCS ausgelieferten Versionen (C++-Quellcode bei TORCS dabei!). Der Delphin V1.00.X ist der hier schon vorgestellte Roboter mit Delphi-Quellcode (s.o.). Der PacMan entspricht dem Delphin, ist aber mit den für D7 nötigen Änderungen kompiliert.
Beim wdbee_2007_hhr handelt es sich um eine Parallelentwicklung zum Delphin (auch mit Delphi-Quellcode), der speziell für diesen Track "hhr" angepasst wurde. Er enthält eine Korrektur der Trajektorie für die Spitzkehre, deren Parameter von Hand eingestellt wurden, schafft die Spitzenzeit des berniw two aber dennoch nicht!

Auf eine Meldung von Horst warte ich noch mit Spannung!

Bis bald

wdbee


Horst_H - Mo 29.01.07 11:21

Hallo,

ich habe noch keinen Bremsoptimierer eingebaut (falls es überhaupt dank des Lernens bringt).
Meine beste Zeit mit geändertem Delpin (20 Runden practice) 1:24:72 und hhr setup.

Ich habe karma einlesen abgeschaltet. Ich hatte vergessen es immer wieder zu löschen (ich werde senil-..) und wunderte mich bei CG-Track2 über einen Zeitsprung von 0:50:34 auf 1:23:?? (kannste in die Tonne treten.) nach einer Änderung der Einstellungen.
Meine kleinen Modifikationen: ABS,TCL und Winkelabweichung vom gewünschten Verlauf(das ist ähnlich wie driften), ab 9 Grad wird quadratisch das Gas zurückgenommen.
Mir fiel auch die ruhige Fahrweise der BT und BernieW auf, insbesondere unter den widrigen Bedingungen des Rutschens.

Es fehlt also ein Filter für das beim Gasgeben ,Bremsen,Lenken für einen gleitenden Anstieg, durch gleitenden Durchschnitt.
Dadurch wird das Fahren sicher runder und unnötige Zusatzkräfte durch die Hektik an den Pedalen gemildert.
TCL und ABS sind ja nur eine Hilfe in großer Not und müssten die gleitenden Werte noch überschreiben können , also als letzte in der Reihe kommen.

Anbei hoffentlich alle kleinen Veränderungen,wie in TorcsTypes (mit EinEintel,Einhalb, Eps4 und solche wichtigen Dinge ;-) )
Ein paar Zusätze im Abschnitt privat etc.. Aber die Hauptsache ist in Filter und Driver
Den Reibbeiwertbestimmung habe ich nicht geändert, da hier die Strecke nur einen kennt.

Gruß Horst
Achtung : schreibt auf Laufwerk C eine Datei SSQ.txt


wdbee - Mo 29.01.07 18:02

Hey Horst,

habe erst überlegt, ob ich dein Ergebnis in der Gruppe 2 notieren soll, immerhin wärst du da der Erste! Aber nach einem Überflug deiner Verbesserungen habe ich entschieden, dass es sich um einen "eigenen" Roboter handelt, denn die Qualität der Änderungen ist doch zu hoch, als dass man die ignorieren könnte.

Hat das Kind denn schon einen Namen? Ich habe es erstmal als horst bezeichnet, damit es sich von den Standard-Delphinen abhebt.

Gruß

wdbee


Horst_H - Mo 29.01.07 20:11

Hallo,

ich habe jetzt ein merkwürdiges Problem.
Meine delphin Version, nenne Sie mal MeinerEiner, kann nicht am Berg anfahren, Aalborg,Olethros.
Der Wagen gibt nicht mal Gas, sondern rollt nach lösen der Bremse zurück und bewegt sich orientierungslos auf der Strecke umher, um hoffentlich irgendwann mal doch den Pfad der Tugend zu finden, manchmal 20 Sekunden, zum Teil nie.
Das Ding ist also nicht alltagstauglich.(E-Tarck 5 braucht einen mue-Factor oder ssqinit-Wert von 3.0)

Ich denke mal lieber an die Anbringung von Peilpunkten eben Spitzkehren, damit die Kurve endlich aussen angefahren wird.
Was mich nebenbei verwundert ist die Kompaktheit der anderen Roboter. Ist Delphi so verschwenderisch auch bei Dll's ? Mit Upx gepackt sind es immer noch 186 kB.

Gruß Horst


wdbee - Mo 29.01.07 21:04

Hallo Horst,

wenn ich dich richtig verstanden habe, hast du im Wesentlichen an den Filtern gearbeitet. Also würde ich mal deren Registrierung auskommentieren und das Anfahren am Berg testen. Der Original-Delphin ist definitiv schon auf allen Road-Strecken gefahren, ohne dass mir da etwas aufgefallen wäre. Ausnahme: Die Probleme, die GTA-Place mit seinem D7 hatte sahen teilweise auch so aus.

Zur Größe der DLL: Ich habe da nie besonders drauf geachtet. Bei meinem wdbee_2007 476 KB, mit WriteLn statt ShowMessage ist die DLL nur noch 145 KB groß.

Spitzkehre: Ich teste gerade meinen Roboter gegen den berniw two (beide mit McLaren F1). Der berniw two schafft auf "hhr" die Qualifikation in 75.304 sec mit dem Default-Setup. Mit meinem Roboter bin ich mit allen bisherigen Tricks und Custom-Setup nur bei 75.672 sec. Die Sonderfunktion für die Spitzkehre bringt dabei nur etwa eine Sekunde. Mit der Nachhilfefunktion allein schafft er es schon in 76.686 sec.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
//==========================================================================*
// HHR-Track: Korrekturen für Quadrat der maximal möglichen Geschwindigkeit
//--------------------------------------------------------------------------*
function TDriver.CalcHHRTrack(Sec: TSection; Value: Tdble): Tdble;
begin
  Result := Value;
  if (Sec.ID > 430and (Sec.ID < 550then // In beiden Fällen aktiviert
    Result := 1250 * Sec.SpeedSqrFactor
  else if (Sec.ID > 1500and (Sec.ID < 1550then //<<< Spitzkehre
    Result := 400 * Sec.SpeedSqrFactor;  // nur ohne Fkt. unten aktiviert!
end;
//==========================================================================*


Verglichen mit der Funktion für die Spitzkehre ist der Gewinn riesig, bei minimalem Aufwand.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
//==========================================================================*
// Spitzkehre nach der Parabolika
//--------------------------------------------------------------------------*
procedure Spitzkehre
  (TD: TTrackDescription; SecS1, SecS2, SecE1, SecE2: TSection);
var
  ...
begin
  // Tangente Anfahrtsgerade mit Offset von 7 m nach außen bestimmen
  P1 := Add(SecS1.Mid2D,Mult(-7,SecS1.Tor2D));
  P2 := Add(SecS2.Mid2D,Mult(-7,SecS2.Tor2D));
  TS := TStraight.Create                         // Tangente aus zwei Punkten
    (P1.X,P1.Y                                   // der Anfahrtsgeraden
    ,P2.X-P1.X                                   // berechnen
    ,P2.Y-P1.Y);

  // Tangente Abfahrtsgerade mit Offset von 7 m nach außen bestimmen
  P1 := Add(SecE1.Mid2D,Mult(-7,SecE1.Tor2D));
  P2 := Add(SecE2.Mid2D,Mult(-7,SecE2.Tor2D));
  TE := TStraight.Create                         // Tangente aus zwei Punkten
    (P1.X,P1.Y                                   // der Abfahrtsgeraden
    ,P2.X-P1.X                                   // berechnen
    ,P2.Y-P1.Y);

  // Tangenten-Schnittpunkt bestimmen
  T := TS.Intersect(TE);

  // Tangenten-Schnittwinkel bestimmen
  Beta := ArcCos(TS.Angle(TE));

  // Zwangspunkt bestimmen (Scheitel der Kurve)
  Q := MinDist(TD,T,SecS2,SecE1,Ind);

  // Abstand des Zwangspunkts vom Tangentenschnittpunkt bestimmen
  TQ := Dist(T,Q);

  // Abstand des Zwangspunkts von Anfahrtstangente bestimmen
  Y := TS.Dist(Q);

  // Station des Zwangspunkts auf Anfahrtstangente bestimmen
  TAs := Sqrt(TQ * TQ - Y * Y);

  // Abstand des Punktes A auf der Anfahrtstangente von T bestimmen
  // Bei A beginnt der Kreisbogen
  Tgbh := tan(Beta / 2.0);
  YTgbh := Y * Tgbh;
  X := YTgbh + Sqrt(YTgbh*YTgbh +  2 * TAs * YTgbh - Y*Y);
  TA := TAs + X;

  // Radius bestimmen
  R := TA * tgbh;

  // Kontrolle:
  X2 := R*R - (R-Y)*(R-Y);
  if Abs(X2 - (X*X)) > 0.01 then
    WriteLn(Format('?: %.3f² = %.3f <> %.3f',[X, X*X, X2]));

  // Kreismittelpunkt schätzen
  DTQ := Normalize(Sub(Q,T));
  M := Add(T,Mult(R+TQ,DTQ));

  // Offsets der Sections bestimmen
  // 1. Kreisbogen vom Scheitel zurück bis etwa zum Punkt A
  Offset := FLT_MAX;
  Sec := TD[Ind];                                // Segment d. Zwangspunktes
  repeat
    LastOffset := Sec.Offset;
    Sec := TD[TD.Loop(Sec.ID - 1)];              // Vorangegangenes Segment
    Sec.Offset := NewOffset(Sec,M,R);
    if Offset > Sec.Offset then
      Offset := Sec.Offset;
  until (Sec = SecS2) or (Offset < Sec.Offset);
  Offset := Sec.Offset;

  // 2. Übergang zurück
  oP[0].X := 0.0;
  oP[0].Y := SecS1.Offset;
  oP[0].S := 0.0;
  oP[1].X := 60.0;
  oP[1].Y := -7;
  oP[1].S := 0.0;
  oP[2].X := 70.0;
  oP[2].Y := Offset;
  oP[2].S := 0.0;
  oP[3].X := 71.0;
  oP[3].Y := LastOffset;
  oP[3].S := 0.0;

  oOrdinate := TSplineOrdinate.Create;
  oOrdinate.Count := 4;
  oOrdinate.Points := Addr(oP);

  Delta := 70;
  repeat
    Sec := TD[TD.Loop(Sec.ID - 1)];              // Vorangegangenes Segment
    Delta := Delta - 1.0;
    Sec.Offset := oOrdinate.Evaluate(Delta);
  until Delta <= 0.0;
  oOrdinate.Free;

  // 3. Kreisbogen vom Scheitel vorwärts
  Offset := FLT_MAX;
  Sec := TD[Ind];                                // Segment d. Zwangspunktes
  repeat
    Sec := TD[TD.Loop(Sec.ID + 1)];              // Folgendes Segment
    Sec.Offset := NewOffset(Sec,M,R);
    if Offset > Sec.Offset then
      Offset := Sec.Offset;
  until (Sec = SecE1) or (Offset < Sec.Offset);
end;
//==========================================================================*


GTA-Place sollte etwas mehr Respekt vor diesen Robotern (berniw two und bt) haben, auch wenn es Strecken gibt, auf denen der Delphin sie leicht schlagen kann.


Horst_H - Mo 29.01.07 23:00

Hallo,

ich bin wieder bei Delphi 7 gelandet, da es meine Festplatte geschmissen hat und bei 10000 Dateien hat er aufgehört zu reparieren...
Das Anfahren war ein Fehler von mir.
Bei Beschleunigen whatte ich als erste Zeilen (If SPeedX <=0.0 then EXIT;), aber denkste Puppe, Anfahren am Berg lässt den Wagen zurückrollen.Deshalb hat er kein Gas gegeben und rollte zurück.
Dieses herumeineiern liergt bestimmt an einer falsch implementierten Winkelfunktion, vielleicht typisch Delphi 7.
Heute nicht mehr..

Gruss Horst
P.S.:
Die Parabelberechnung hättet man doch für jede Kurve vorab nutzen können.
Es fehlt dazu nur eine Liste mit Hilfspunkten.


Horst_H - Di 30.01.07 09:55

Hallo,

Anbei eine Version für den Originalen delphin.(1:25:71)(Kein ABS, Kein TCL )
Apropos, darf man im Originalem Delphin CENTERDIV und WIDTHDIV ändern oder in die Konfiguration bringen, das bringt schon viel.Mein Roboter hat nur dadurch nur einen Vorteil.


@wdbee: Wie schaffst Du es, mit deinem Roboter 10 Sekunden (1:15 )schneller zu sein, gute Güte, alle Achtung!

Gruß Horst
P.S:
Der original Roboter säuft :-) Bei 20 Runden:
2.85 kg pro Runde( muss in XML angpasst werden)
Meiner 2.67


wdbee - Di 30.01.07 14:23

Hallo Horst,

schön wärs ja, aber der Zeitunterschied liegt im Wesentlichen am anderen Wagen (McLaren F1 statt CLK DTM). Ich verwende da aber einen modifizierten McLaren F1, der zum einen schon das neue Design mit durchsichtigen Scheiben hat und ein tolles Bild bietet, zum anderen aber Änderungen in der Type-Datei TORCS\CARS\mclaren-f1.xml benötigt. Die Werte habe ich von der TORCS-Seite auf Sourceforge, aus einem Post von Christos (Der vom Olethros). Er arbeitet an einer verbesserten Simulation V3, wir haben V2. Korrigiert werden die Werte für die Aerodynamik. Bei Gelegenheit lasse ich dir das mal zukommen.

Ich verwende den berniw two und den wdbee_2007 mit McLaren F1, um bei Test-Rennen der Original-Delphine schnellere Gegner zu haben, damit ich die Ausweichfunktionen weiter testen kann.

Spritverbrauch: Einfluß haben die Anstellwinkel der Spoiler und die Getriebeabstufungen bzw. die Gesamtuntersetzung.
Hier denke ich daran, die Angabe umzustellen von kg/Runde auf kg/100 km. Dann kann eine default.xml-Datei besser abgestimmt werden und arbeitet auch bei Rennstrecken mit sehr unterschiedlichen Längen besser.

Erlaubte Änderungen: Alle Parameter in der XML-Steuerdatei UND alle Werte die als Konstante im Delphin definiert werden, denn das die nicht in der Datei festgelegt werden liegt nur daran, dass ich das bisher nicht für nötig befunden habe. Außerdem alle Fälle, in denen Fehler behoben werden, denn die stellen wir hier da, so dass es jeder nachvollziehen kann.

Wenn du davon einen Vorteil hast, dann definier sie als Parameter. Bitte achte aber darauf, dass die Namen einigermaßen sinnvoll sind und denk daran, das unter Linux (bei Dateinamen) die Klein/Großschreibung einen Unterschied macht.
Ich habe deshalb bisher alles klein geschrieben (so wie in den mitgelieferten Robotern).

Dann können wir das mal zusammenführen und als Ausgangsbasis für einen späteren Wettbewerb nehmen.

Viel Spaß

wdbee


Horst_H - Di 30.01.07 18:01

Hallo,

das Saufen bleibt bestehen.Es ist die selbe hhr-track.xml mit den Werten für centdiv und widthdiv wie originalem delphin. Es liegt wohl an accellerate:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Original:
begin
  AllowedSpeed := GetAllowedSpeed(oCurrSec);
  //Gib Vollgas bis 1 m/s Unterschied
  if AllowedSpeed > SpeedX + 1.0 then
    Result := 1.0
  else
und Fälschung
  //Gib Vollgas bis 10% vom maximal erlaubten m/s Unterschied
  if AllowedSpeed/SpeedX >1.10 then
    Result := 1.0
  else
aber das Erlaubte liegt meist jenseits von Gut und Böse (Im karma ist auf Geraden der Faktor fast immer 3).
Damit jagt man weniger beherzt in der roten Geschwindigkeitsbereich, aber ist auch nicht langsamer.
Ich kann mir nicht vorstellen das dieser eingebaute Driftwinkel Sprit spart, er sollte in erster Linie die Schleuderneigung dämpfen.Jetzt mit (0.5*Cos(Faktor*pi)+0.5) Faktor von 0..1 (Abweichung/Driftwinkel nur aus 0..4 sonst result = 0) weil cos um 0 Grad so schön wenig abbremst(1-x°1^2/2) aber zm Ende weich ausklingt.(cos ist maximal so teuer wie zwei Divisionen)

Gruss Horst
P.S.:
Jetzt habe ich auch bei Turbo-Delphi das Problem der Orientierunglosigkeit gesehen. Ich werde mal die Bremsen schwach stellen und den Pitstop Schritt für Schritt mitverfolgen.(Ein paar writelns) Besser gesagt in einer Rennkonstallation kam zu einem Unfall wo der delphin rückwärts stand. Eiert dann langsam rückwärts nach links,rechts wechselnd voll lenkend. Legt den ersten Gang ein und jagt mit Vollgas an die linke Wand setzt wieder zurück, immer noch falsch herum, und wieder gegen die Wand bis >10000 erreicht sind.
Kann es daran liegen das die Strasse schmaler als der Wendekreis ist, und der Wagen selbst an der Wand noch minimimal rückwärts steht.?
Schaun mer mal.


wdbee - Di 30.01.07 18:18

Hallo Horst,

ich habe da noch ein Problem festgestellt, wenn der Delphin in die Boxengasse wechseln soll. Wenn die Funktion PlanOffset genau dann 0 liefert, wenn der Weg in die Boxengasse abzweigt, dann hat der Delphin ein Orientierungsproblem!
Wenn er allein ist, liefert die Funktion aber relativ häufig 0, denn das wäre die Fahrbahnmitte, auf die er sich zurückziehen soll.
Mit dieser Version klappt es besser:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
//==========================================================================*
// Ansteuerung eines Zielpunktes
//--------------------------------------------------------------------------*
function TDriver.GetTargetPoint(LookAheadDistance: Tdble): TV2D;
var
  ...
  Plan: Tdble;
begin
  if oPit.InPit then
  begin
    ...
  end
  else
  begin
    ...
  end;

  Plan := oMyOffset;                         // Aktuelle Querabeichung merken
  Offset := PlanOffset;                      // Querabweichung planen
  if Abs(Offset) > 0.01  then                // Wenn Planung nicht 0 ist
    Plan := Offset;                          //   die verwenden
  if oPit.InPit then                         // Weg in Boxengasse nehmen?
    Offset := Sign(Plan) * Dist(S,P);        //   Querabweichung berechnen
  Result := Add(S,Mult(-Offset,N));          // Zielpunkt berechnen
end;
//==========================================================================*


Ist das so ein Fall wie du ihn beobachtet hast?

Gruß

wdbee


wdbee - Di 30.01.07 19:19

Zum Thema Spritverbrauch mal der Vergleich der Setup-Einstellungen für die Getriebe des Original-Delphins und der Custom-Setups von Horst und wdbee:
(Mit eff ist die effektive Untersetzung des Ganges angegeben, berechnet aus dem Untersetzungsverhältnis des Gangs und des Differentials)
Ich bevorzuge die Normierung auf 1.0 für den letzten Gang, dann ist aus dem Untersetzungsverhältnis des Differentials sehr einfach die erreichbare Topspeed abzuschätzen. Die dafür einzugebenden Werte für die einzelnen Gänge sind ebenfalls mal angegeben:

Getriebe Delphin (Default-Setup):
Ratio Differential: min=0 max=10 val=4.5
Gears:
r min=-3 max=0 val=-2 eff=-9
1 min=0 max=5 val=3.2 eff=14.4
2 min=0 max=5 val=2.4 eff=10.8
3 min=0 max=5 val=1.7 eff=7.65
4 min=0 max=5 val=1.2 eff=5.4
5 min=0 max=5 val=0.83 eff=3.735
6 min=0 max=5 val=0.7 eff=3.15

Ratio Differential: val=3.15
r val=-2.85714285714286
1 val=4.57142857142857
2 val=3.42857142857143
3 val=2.42857142857143
4 val=1.71428571428571
5 val=1.18571428571429
6 val=1

Getriebe Delphin (Horst Custom-Setup):
Ratio Differential: min=0 max=10 val=5
Gears:
r min=-3 max=0 val=-2 eff=-10
1 min=0 max=5 val=3.2 eff=16
2 min=0 max=5 val=1.73 eff=8.65
3 min=0 max=5 val=1.35 eff=6.75
4 min=0 max=5 val=1.1 eff=5.5
5 min=0 max=5 val=0.83 eff=4.15
6 min=0 max=5 val=0.67 eff=3.35

Ratio Differential: val=3.35
r val=-2.98507462686567
1 val=4.77611940298507
2 val=2.58208955223881
3 val=2.01492537313433
4 val=1.64179104477612
5 val=1.23880597014925
6 val=1

Getriebe Delphin (wdbee Custom-Setup):
Ratio Differential: min=0 max=10 val=3.42
Gears:
r min=-3 max=0 val=-2 eff=-6.84
1 min=0 max=5 val=4 eff=13.68
2 min=0 max=5 val=2.9 eff=9.918
3 min=0 max=5 val=2.133 eff=7.29486
4 min=0 max=5 val=1.5 eff=5.13
5 min=0 max=5 val=1.24 eff=4.2408
6 min=0 max=5 val=1 eff=3.42

Ratio Differential: val=3.42
r val=-2
1 val=4
2 val=2.9
3 val=2.133
4 val=1.5
5 val=1.24
6 val=1

Das Getriebe von mir ist also am stärksten untersetzt, was höheren Spritverbrauch aber auch höhere Beschleunigung bedeutet.

Außerdem mal noch ein Vergleich der Anstellwinkel und der daraus resultierenden aerodynamischen Balance und der Luftwiderstände der Spoiler. Der Original-Delphin hat relativ große Anstellwinkel im Default-Setup, um auf entsprechenden Strecken die nötig Haftung zu halten. Das Custum-Setup von Horst liegt deutlich darunter, erzeugt aber einen höheren Druckanteil auf die Vorderachse. Mein Custom-Setup liegt ebenfalls deutlich darunter, erhält aber in etwa die aerodynamische Balance (Werte siehe Dateianhang).

ToRaCaSeEx steht für Torcs Racing Car Setup Expert.

Die Funktion zur Berechnung der Balance:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
//==========================================================================*
// Aerodynamische Balance
//--------------------------------------------------------------------------*
procedure TFormMain.EditAngleChange(Sender: TObject);
var
  I: Integer;
  Hm: Double;            // ride height
  BodyLiftFront: Double; // Downforce at front
  BodyLiftRear: Double;  // Downforce at rear
  WingLiftFront: Double; // Downforce at front
  WingLiftRear: Double;  // Downforce at rear
  WingDragFront: Double; // Drag force at front
  WingDragRear: Double;  // Drag force at rear
  Ratio: Double;         // Ratio (Aerodynamische Balance)
  Line: string;
begin
  try
    MemoSpoiler.Lines.Clear;
    oCar.WingAngle[TEdit(Sender).Tag] := TEdit(Sender).Text;
    Hm := 0.0;
    // Mean weighted ride height at all wheels [m]
    for I := 0 to 3 do
      Hm := Hm + oCar.RideHeightVal[I];
    Hm := 1.5 * Hm;
    Hm := Hm * Hm;
    Hm := Hm * Hm;
    Hm := 2 * exp(-3.0 * Hm);

    BodyLiftFront := oCarType.Clift[FRONT] * HM;   // Down force at front
    BodyLiftRear := oCarType.Clift[REAR] * HM;     // Down force at rear

    WingLiftFront := 4.0 * 1.23                    // Down force at front
      * oCarType.WingArea[FRONT] * sin(oCar.WingAngleVal[FRONT]);
    WingLiftRear := 4.0 * 1.23                     // Down force at rear
      * oCarType.WingArea[REAR] * sin(oCar.WingAngleVal[REAR]);
    Ratio := (BodyLiftFront + WingLiftFront) /
      (BodyLiftFront + WingLiftFront + BodyLiftRear + WingLiftRear);

    Line := 'Resultierende aerodynamische Balance: ' + FloatToStr(Ratio);
      MemoSpoiler.Lines.Add(Line);

    WingDragFront := 1.23                          // Drag force at front
      * oCarType.WingArea[FRONT] * sin(oCar.WingAngleVal[FRONT]);
    WingDragRear := 1.23                           // Drag force at rear
      * oCarType.WingArea[REAR] * sin(oCar.WingAngleVal[REAR]);

    Line := 'Resultierender Luftwiderstandsbeiwert vorne: '
      + FloatToStr(WingDragFront);
    MemoSpoiler.Lines.Add(Line);
    Line := 'Resultierender Luftwiderstandsbeiwert hinten: '
      + FloatToStr(WingDragRear);
    MemoSpoiler.Lines.Add(Line);
  except
    Line := 'Ungültige Eingabe';
    MemoSpoiler.Lines.Add(Line);
  end;
end;
//==========================================================================*


PS: @GTA-Place: Wo liegt denn dein Getriebe etwa und welche Werte hast du für die Spoiler gewählt?


Horst_H - Di 30.01.07 19:55

Hallo,

Was soll uns das mit der Ausgewogenheit bringen?
Ich wollte nur, das die Kiste lieber übersteuert als untersteuert.
Hast Du mal die hhr-track Einstellungen gestestet und kommst auch auf die Werte nach 20 Runden?
Was ist denn jetzt schneller?

Das Problem mit dem Suizidverhalten hat sich noch nicht erledigt.Aalborg ist wohl besonders übel, selbst die BT'blieben zeitweise einfach stehen und zerlegen sich gegenseitig.
Ich nehme mal den anderen Rechner ;-)

Gruß Horst


wdbee - Di 30.01.07 20:42

Also mit deiner hhr-track.xml und ohne ABS und TCL erreicht der Original-Delphin in 20 Runden (untrainert) eine Bestzeit von 1:25:46 (Topspeed 289, Minspeed 64). Bei einer Wiederholung (trainiert) liegt die letzte Runde bei 1:25:38 (Topspeed 289, Minspeed 63). Mit dem Training ergibt die Qualifikation eine Zeit von 1:25.05 (Also muss ich die Tabelle nochmal anpassen!). Das ist bisher die beste Zeit in dieser Gruppe!

Aber mit ABS und TCL liegt die beste Runde (20., untrainiert) bei nur noch 1:25:31 (Topspeed 289, Minspeed 64), bei der Wiederholung steigt die Zeit allerdings auf 1:25:47 (18. Runde Topspeed 288, Minspeed 62, danach wird es wieder etwas schlechter). Mit dem Training ergibt die Qualifikation eine Zeit von 1:25.09.

Zur Balance: Ich verwende diese Zahl, um mit verschiedenen Andruckwerten zu testen, wobei ich den Wert für den Frontspoiler so einstelle, dass mit dem gegebenen Wert für den Heckspoiler sich wieder der Wert für die Balance ergibt, auf den ich alle anderen Einstellungen (z.B. Bremskraftverteilung) abgestimmt habe. Also keine Wertung sondern nur eine Testhilfe.

Zum Stillstand der bt's: Das habe ich auch schon gehabt, wenn die übertrainiert sind [auf CG-Track3]. Dort war die erste Linkskurve der Punkt, an dem sie standen, weil in der ersten Runde dort ein Stau durch die hohe Zahl der nebeneinander anstürmenden Wagen entstand. Das merken sie sich und deshalb stehen sie später an der Stelle. Wenn du die entsprechende KARMA-Datei löscht, ist das sofort weg. Das war auch ein Grund, warum der Delphin nicht endlos lernt.


wdbee - So 04.02.07 23:30

Hallo,

für alle die mal sehen wollen, wie so ein Rennen aussieht, hier ein Video [http://www.wdbee.gotdns.org:8080/Data/hhr-track-video.zip] der Startrunde (ca. 1,5 min, 320x200 Pixel, 25 Frames/s, 16 MB) auf der Strecke "hhr-track". Die im Video gezeigte Version der Strecke unterscheidet sich etwas von der oben bereitgetellten Version, denn die hatte Probleme mit den Boxen, weshalb die Start-/Zielgerade anders eingeteilt werden musste. Außerdem wurden die Bereiche neben der Fahrbahn geändert, um für die Fernsehaufnahmen ein besseres Blickfeld und interessantere Standpunkte für die Kameras zu bieten.

Viele Spaß

wdbee


Horst_H - Mo 05.02.07 19:53

Hallo,

ich habe ein kleines Problem.Der Offset oActOffset von der Fahrbahnmitte wird wohl nicht korrekt berechnet.
Selbst links neben der Fahrbahn ergeben sich Werte > 0.0.
Deshalb sollte die Berechnung der neuen Lernfaktoren mittels oMyOffset bestimmt werden, da dieser die Abweichung von der Strassenmitte als Bezug hat.
Innerhalb von UnitDriver.pas in Driver.Update:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
    OldFactor := oCurrSec.SpeedSqrFactor;        // Aktueller Lernfaktor
    W := (Segment.Width * oWidthDiv - oBorder-CarWidth);
    Factor :=Abs(oActOffset)/W/oToleranz;
    {//Ausserhalb der Fahrbahn
    if Factor >EinEintel then
      begin
      Delta := (Factor-EinEintel)*oMMinus*OldFactor;
      N := 10;
      end
    else
    }

      begin
      if Factor < EinHalb then    // Je kleiner die Abweichung
        begin                     // umso größer die Erhöhung
        Delta := (Factor-EinHalb)*OldFactor *oMPlus;
        Writeln(oCurrSecID:5,'Schneller ',-delta:10:7,ABS(oActOffset):13:7,oActOffset:13:7,W:13:7);
        N := 6;
        end
      else //if oActOffset > oToleranz then          // bzw. die Erniedrigung
        begin                                        // Grenze ist 1,25 m
        Delta := (Factor-EinHalb)*OldFactor *oMminus;
        Writeln(oCurrSecID:5,'langsamer ',-delta:10:7,ABS(oActOffset):13:7,oActOffset:13:7,W:13:7);
        N := 12;
        end;
     end;
//...

Das Bild ist von E-track 1.Im Konsolen Fenster steht in einer Zeile eben das aus Writeln.Der Wagen ist neben der Fahrbahn und oActOffset liegt innerhalb der Fahrbahn.
Vielleicht hilft es auch Dir wdbee.

Gruß Horst


wdbee - Di 06.02.07 09:38

Hallo Horst,

das ist offensichtlich ein Punkt, den ich im nächsten Band des Tutoriums noch beschreiben muss:

In deinem Bild sehe ich, dass der Wagen nach einer Hundekurve neben der folgenden Geraden steht.
Was passiert in diesem Fall?

Für das Lernen benötige ich zwei Informationen:
1. Bin ich außen oder innen in der Kurve?
2. Wie weit bin ich von der geplanten Linie weg?

Die Funktion oCurrSec.GetOffset(Pos) liefert den Querabstand mit einem "Kurven"-Vorzeichen, so dass beide Informationen in einer Zahl enthalten sind. Dadurch kann ich in Kurven sehr einfach entscheiden, ob es schneller gehen könnte (Lernfaktor erhöhen) oder zu schnell war (Lernfaktor vermindern). Der Nachteil ist aber, dass ich auf Geraden blind bin, denn welches Vorzeichen sollte ich da nehmen, die Funktion liefert 0?

Deshalb arbeite ich auf Geraden mit dem Wert der letzten Kurve.

Ausschnitt aus TDriver.Update:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  // Quer-Abweichung vom geplanten Verlauf feststellen
  oActOffset := oCurrSec.GetOffset(Pos); // Aktueller Wert, nur in Kurven <> 0!!!
  if oActOffset = 0.0 then               // Wenn ich auf einer Geraden bin, 
  begin                                  //   Dann nehme ich den Wert der letzten
    oActOffset := oLastOffset;           //   Kurve und lasse den langsam ausklingen
    oLastOffset := oLastOffset * 0.98;   //   um zu wissen ob ich nach außen
  end                                    //   abweiche oder nach innen
  else                                   // ansonsten
  begin                                  //   merke ich mir den aktuellen Wert
    oLastOffset := oActOffset;           //   der Kurve für die folgende Gerade
  end;


Horst_H - Di 06.02.07 11:23

Hallo,

ich habe einfach mit f=ABS(oMyOffset)/nutzbare Fahrbahnbreite gearbeitet und in Bereiche gepackt.
Falls der Wagen innerhalb von 50% der nutzbaren Fahrbahnbreite ist dann mach schneller.
Falls der Wagen innerhalb von 70%..100% der nutzbaren Fahrbahnbreite ist dann mach langsamer.
Falls der Wagen ausserhalb der nutzbaren Fahrbahnbreite ist dann mach viel langsamer.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
  Factor :=2.0*Abs(oMyOffset)/(Segment.Width*oWidthDiv{0.0..1.0}-CarWidth-oBorder)/oToleranz;
 //Sind sehr nah an der Mitte dann rauf
  Delta :=0;
  if Factor < EinHalb then    // Je kleiner die Abweichung
    begin                                        // umso größer die Erhöhung
    Delta := (Factor-Einhalb)*oMPlus;
    N := 3;
    end
  else
     begin
     if Factor > 1 then
        Delta := 2.0*oMMinus
     else 
       if Factor > 0.7 then
         //Nur Kurvenaußenseite wird gedrosselt 
         IF oMyOffset*oCurrSec.Rad<0.0 then
              Delta := (Factor-Einhalb)*oMMinus;
          //Writeln(oCurrSecID,' ',Factor:4:2,' zu weit: ',Delta:10:7);
          N := 4;
          end;
  IF Delta <> 0.0 then
    begin
    Delta := OldFactor*Delta/LookAhead;// *1/N weggelassen
    for I := 0 to Round(N * LookAhead) do        // Lernfaktor auf den letzen
      begin                                      // X m anpassen
      Sec := oTrackDesc[oTrackDesc.Loop(oCurrSecID - I)]; 
      tm := (Sec.SpeedSqrFactor - Delta);
      if (tm < 0.3then
        tm := 0.3
      else
        If (tm>3.0then
          tm := 3.0;
      Sec.SpeedSqrFactor := tm;
      end;
  end;
end;


Damit funktoniert es aber nicht sonderlich gut.hhr-track mit 1:28:50 ist ja übel.Zudem ist die Stetigkeit des Lernens schlecht.

Da ich die ssq Berechnung procedure TTrackDescription.CalcAllowedSpeedSqr in UnitTrack.pas verändert habe

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
  Fm  := mass*g;// Gewichtskraft

  for I := 0 to oCount - 1 do
  begin
    Sec := Section[I];
    Mu := Sec.oSeg.Surface.KFriction * TireMu * MuFactor;
    R := ABS(Sec.Rad);

    sinA :=sin(sec.okAlpha);
    cosA :=cos(sec.okAlpha);
    sinG :=sin(sec.okGamma);
    cosG :=cos(sec.okGamma);

    //Für kleine Winkel
    Fmq := -sinA*Fm; //Hangabtrieb quer
    Fml := sinG*Fm; //Hangabtrieb längs
    Fms := sqrt(sqr(Fm)-sqr(Fmq)-sqr(Fml)); //Der Rest senkrecht
    {
    Ff  := V*V*Abs(mass/R);   //Fliehkraft Krümmungskreis in Querrichtung
    Ffs := sinA*Ff;      //senkrecht zur Fahrbahn
    Ffq := cosA*Ff;      //quer zur Fahrbahn die eigentliche Wirkrichtung
    Ffl := 0.0;          //in Längsrichtung

    Fas := CA*V*V;         //Aerodynamische Anpressung genau senkrecht zur Fahrbahn

    Fs := Fms+Ffs+Fas;
    Fq := Fmq+FFq;
    //Fq==mue*Fs-> Grenzbedinung fürs Rutschen
    //mu*Fms-Fmq=Ffq-mu*Ffs
    //mu*...=V2*Abs(mass/R)*(cos(Sec.okAlpha)-mu*sin(Sec.okAlpha))
    //V2=oSSq=
    }

     
    IF R > 2000 then    //Sehr grosser Radius hat keinen Einfluß
      Sec.oSSq := MAX_SSq
    else
      begin
      //Neigung Strasse passend zur Kurve
      If Sec.Rad<=0.0 then
        V0 :=(cosA/mu+sinA)*mass/R-CA
      else
        V0 :=(cosA/mu-sinA)*mass/R-CA;

      IF V0 < 0 then //In überhöhten Kurven kann das passieren
        Sec.oSSQ := MAX_SSq
      else
        Sec.oSSq:= Fs/V0;
      end;
  end;

erhalte ich recht große mögliche Geschwindigkeiten, die ein Einlenken, was ja Zusatzkräfte bedeutet, fast unmöglich macht, das heißt die Kiste fliegt ständig aus der Kurve. Speziell Hundekurven oder diese Spitzkehre am Berg, da ich die Auswirkung der Kuppe (ZR ) noch nicht berücksichtigt habe.
Ich werde wohl die Lernfaktoren feintunen.

Gruß Horst


wdbee - Di 06.02.07 14:50

Uff,

da hast du dir einen dicken Brocken ausgesucht. Auch ich bin mit den Lernen noch nicht zufrieden, aber bedenke bitte folgendes, wenn du daran arbeitest:

Der Ort und die Zeit, an dem/der du feststellst, dass du zu schnell bist, ist nicht der Ort/die Zeit, an der die Ursache liegt! An deinem Beispiel sah man das ganz deutlich. Der Wagen stand neben der Geraden, weil er in der Kurve davor zu schnell war. In der Kurve war er noch im grünen Bereich (innerhalb des Fahrbahnbereichs der als gut bewertet wird), aber die Richtung stimmte nicht mehr, weshalb er auf der Geraden die Fahrbahn verlässt.

Das eine Problem ist, festzulegen ob man gut war (so lassen oder schneller probieren) oder nicht (langsamer probieren), das andere festzulegen, wo man etwas ändern muss.

Das wo ist besonders schwierig, weil du hier daran denken musst, dass du beim Ansteuern ja nicht dort nachschaust, wo du bist, sondern dort, wo du hin willst. Die Voraussichtweite (LookAhead) wird aber zum Teil dynamisch festgelegt! Beim Delphin gehen die aktuelle Geschwindigkeit und die Bogenlänge in die Berechnung ein, so dass Kurven mit gleichem Radius aber unterschiedlichen Längen zu einer anderen Ansteuerung führen können. Das mögliche Ergebnis sieht man an deinem hhr-track-Setup für den Original-Delphin. Dessen Linie ist um einiges besser als die des Default-Setups.

Ich habe da lange probiert einen einfachen Weg zu finden, das Ergebnis hast du in der Methode des Delphins (nicht wirklich einfach und auch nicht exakt aber das Resultat ist brauchbar).

Det bt lernt auf der Basis der Segmente von TORCS. Die sind viel länger, deshalb tritt das Problem da nicht so deutlich auf. Außerdem definiert er einen sehr schmalen Bereich, innerhalb dessen er lernt. Eine Unterscheidung in zu weit innen oder außen verwendet er nicht.

Der Delphin verwendet die einstellbare Lernkurve als Funktion der Abweichung mit einem neutralen Zwischenstück (Siehe Diagramm im Tutorium). Das führt bei kleinen Abweichungen zu kleinen und bei großen zu großen Änderungen. Selbst die Länge der Strecke, auf der korrigiert wird, ist unterschiedlich. Je wichtiger umso länger.

Also ein weites Feld für Verbesserungen.

Viel Erfolg!

wdbee


Horst_H - Di 06.02.07 16:48

Hallo,

den Einfluß hast Du ja mit Delta:= Delta/(N*Lookahead) gerechnet.
Ich habe 1/N weggelassen, um den Einfluß so stark zu lassen.
Wie schnell ist denn mittlerweile Dein Delphin auf hhr-track? Da muss sich doch noch etwas getan haben.

Ich versuche den Bremspunkt hiermit besser zu bestimmen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
program OptBremsWeg;
uses
  debug;
type
  Tdble = extended;
const
  g : tDble = 9.81;
  s_max = 10000.0;
var
  A,
  mue,
  alpha,
  sinA,
  cosA,
  gamma,
  sinG,
  cosG,
  yR,
  zR,

  mass,

  mueFahrbahn,
  mueRoll,
  mueSumm ,
  Luftdichte,
  Cw,
  ca,
  V0,
  V,
  V2,
  Ve,
  Vw,
  E,
  dE,


  F,
  Fl,
  Fq,
  Fs,
  Fb,
  Fmax,
  Flges,

  Ff,
  Ffq,
  Ffl,
  Ffs,

  Fm,
  Fmq,
  Fml,
  Fms,

  Fa,
  Faq,
  Fal,
  Fas,

  Fk,
  Fkq,
  Fkl,
  Fks,

  h,
  s,ds :Tdble;

function DeltaE(V2,ds:Tdble):Tdble;
begin
  //sekrechte Kräfte auf die geneigte Fläche umrechnen
  sinA := sin(Alpha);
  cosA := cos(Alpha);
  sinG := sin(Gamma);
  cosG := cos(Gamma);

  Fm  := mass*g;
  Fmq := cosA*sinG*Fm; //Hangabtrieb quer
  Fml := sinA*cosG*Fm; //Hangabtrieb längs
  Fms := sqrt(sqr(Fm)-sqr(Fmq)-sqr(Fml)); //Der Rest senkrecht

  Ff  := mass*V2/yR;   //Fliehkraft Krümmungskreis in Querrichtung
  Ffs := sinA*Ff;      //senkrecht zur Fahrbahn
  Ffq := cosA*Ff;      //quer zur Fahrbahn die eigentliche Wirkrichtung
  Ffl := 0.0;          //in Längsrichtung

  Fk  := mass*V2/zR;   //Kuppen und Täler,Krümmumgkreis in Längsrichtung

  Fks := cosG*Fk;      //senkrecht zur Fahrbahn die eigentliche Wirkrichtung
  Fkq := sinG*Fk;      //quer zur Fahrbahn
  Fkl := 0.0;          //in Längsrichtung

  Fas := ca*V2; //Aerodynamisches anpressen;// Wirkt genau senkrecht auf die Fahrbahn
  //Faq         //Aerodynamische Querkraft Seitenwind
  Fal := cw*V2; //Aerodynamisches Bremsen Luftwiderstand

  Fs := Ffs+Fms+Fks+Fas;  //Kraft senkrecht auf Fahrbahn
  Fq := Ffq+Fmq+Fkq;      //Kraft quer zur Fahrbahn
  Fl := Ffl+Fml+    Fal;  //Kraft in Fahrrichtung

  //Auf Fahrbahn durch die Reifen übertragbare Gesamtkraft
  IF Fs< 0.0 then
    Begin
    writeln(S,' Wir heben ab ',V);
    halt(-1);
    end;

  Fb := mueSumm*Fs;
  //Bremskraft des Wagens in Wagenrichtung ,Die Querkraft muss auch durch
  //die Reifen übertragen werden.
  Fmax := sqr(Fb)-sqr(Fq);
  //Rutschen wir schon, dann war es das
  IF Fmax > 0 then
    Fmax := sqrt(Fmax)
  else
    Begin
    Fmax := 0.0;
    writeln(S,' Wir rutschen ',V);//Aber Längskräfte bremsen oder beschleunigen noch
    halt(-1);
    end;

  Flges  := Fmax+Fl;
  {
  writeln('rel Beschleunigung : ',Flges/(mass*g));
  Writeln('Fg      : ',Fm);
  Writeln('Fflieh  : ',Ff);
  Writeln('FLoop   : ',Fk);
  Writeln('FAeroCa : ',Fas);
  Writeln('FAeroCw : ',Fal);
  }

  DeltaE := -Flges*ds;
end;

function Heun(V,h,ds:tdble):tdble;
//ausreichend genau, wenn sich nicht sich zu viele Parameter gleichzeitig
//während eines Schrittes aendern
var
  E0,dE1,dE2,
  h1,V2: tDble;
Begin
  V2 := sqr(v);
  E0 := (g*h +0.5*sqr(V))*mass;
  h := h+ds*sinA;//neue geodätische Höhe man kann auch Startziel als 0 nehmen
  dE1 := DeltaE(V2,ds);
  V2 := ((E0+dE1)/mass-g*h)*2.0;
  dE2 := DeltaE(V2,ds);
  V2 := ((E0+0.5*(dE1+dE2))/mass-g*h)*2.0;
  If V2 > 0 then
    V := sqrt(V2)
  else
    V:= 0;//Rollt eigentlich rückwärts, kann auch ein überschiessen sein
//  Writeln(s:8:4,E0:15:6,dE1:15:6,dE2:15:6,V:15:6);
  Heun := V;
end;

begin
  V0 := 30;
  A := 2.0;
  alpha :=-10.0*pi/180;   //Längsneigung
  gamma := 0*pi/180;   //Querneigung
  sinA := sin(Alpha);
  cosA := cos(Alpha);
  sinG := sin(Gamma);
  cosG := cos(Gamma);
  yR := 100;//Enge Kurve
  zR:= 1e38//+Innenlooping(bergab->bergauf),bergauf -> bergab
  mueFahrbahn := 1.0;
  mueRoll:= 0.00;
  Luftdichte := 1.2;
  Cw := 0.5*Luftdichte*0.41*A;
  ca := 0.5*Luftdichte*2.3*A;
  mass := 1050.0;

  mueSumm := mueFahrbahn+mueRoll;


  ds := 8.0;
repeat;
  s := 0.0;
  h := 1000;
  V := V0;
  v2:=sqr(v);
  E := (0.5*V2+g*h)*mass;
  repeat
    h := h+ds*sinA;
    E := E+DeltaE(V2,ds);
    V2 := (E/mass-g*h)*2.0;
    If V2 < 0 then
      break;
    V := sqrt(V2);
    s := s+ds;
    If Abs(s-48) < ds then
      writeln(s:6:3,V:10:6,ds:10:6);
  until s>s_max;//Notbremse
  ds := ds*0.5;
until ds <1/8;
  writeln;


  ds := 8.0;
repeat
  s := 0.0;
  h := 1000;
  V := V0;
  E := (0.5*sqr(V)+g*h)*mass;

  repeat
    V:=Heun(V,h,ds);
    s := s+ ds;
    If Abs(s-48) < ds then
      writeln(s:6:3,V:10:6,ds:10:6);
  until (V <= 0.0or (s>s_max);
  writeln(s:10:6,v:15:6,Heun(V,h,ds):15:6);
  ds := ds*0.5;
until ds <1/8;

end.

Mit dem Ergebnis:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
(Euler-Cauchy)
S      V          ds
48.000 22.980188  8.000000
48.000 22.610156  4.000000
48.000 22.416512  2.000000
48.000 22.317575  1.000000
48.000 22.267585  0.500000
48.000 22.242462  0.250000
48.000 22.229868  0.125000

(Heun)
48.000 22.273808  8.000000
48.000 22.232475  4.000000
48.000 22.221205  2.000000
48.000 22.218260  1.000000
48.000 22.217507  0.500000
48.000 22.217316  0.250000
48.000 22.217269  0.125000

Mit Heun kommt man mit einer Schrittweite von einem Meter gut hin.
Also bräuchte man für jeden Abschnitt cosA,cosG,sinA,sinG um zügig rechnen zu können.
Ich versuche das mal einzubauen, um Brakedist genauer hinzubekommen. Damit rempelt man zumindest theoretisch nicht mehr an.
Vielleicht fehlt auch ein Lernstopp für den Fall eines Unfalls.
Falls Unfall dann Lernstopp(Die nächsten s[m]=Funktion(Geschwindigkeit allein)).Wer will denn an solchen Stellen später im Rennen eine Gedenkminute einlegen.Dies ist besonders auffällig bei Massenstarts mit Karambolagen.

Gruß Horst


wdbee - Di 06.02.07 17:42

Hallo Horst,

an meinem Setup für den Original-Delphin habe ich nicht mehr gearbeitet. Dafür schraube ich an meinem wdbee_2007(_hhr). In der Qualifikation läuft der ja fast immer im "DriveMode High", benutzt also außer auf den ersten Metern eine vorausberechnete "Ideallinie" zur Ansteuerung. Das klappt auch schon sehr gut (besonders mit der Nachhilfe für die Spitzkehre und für die erste rechts-links-Kombination).
Wenn ich die Parameter extrem anpasse, kann ich den berniw two sogar um 0,0X sec schlagen und von der Poleposition starten. Mit der dafür nötigen KARMA-Datei läuft der Wagen aber im Rennen noch nicht so toll. Das Problem sind die beiden getrennten DriveModes. Wenn andere in der Nähe sind schaltet er in den Modus, den du vom delphin V1.00.X kennst. Bisher habe ich aber nur einen Satz Lernfaktoren, was dann nicht funktioniert, wenn mehrfach hin und her gewechselt wird.
Ich hatte sogar mal ein Rennen, bei dem ein Original-Delphin mit deinem Setup nach 110 Runden auf Platz 1 durchs Ziel ging, gefolgt von zweimal berniw two und anderen. Da war es nach dem Start zum Massencrash gekommen, wodurch die berniw ihren Startvorteil eingebüßt haben und überholen ist ja nicht ihr Ding (außer beim Überrunden).
Da ist also noch einiges zu tun.
Wie in dem Video [http://www.wdbee.gotdns.org:8080/Data/hhr-track-video.zip] zu sehen, habe ich mal versucht eine Landschaft für den hhr-track zu erzeugen. Aber die Schritte zur Nacharbeit klappen bei mir nicht so wie im Tutorium von Vincente beschrieben. Das Programm Blender hängt sich dabei ohne eine Fehlermeldung so komplett auf, dass ich den Rechner neu starten muss!
Die nächste Strecke wird übrigens verschiedene Beläge (mit unterschiedlicher Reibung) haben, bau das also schon mal ein. Auch bietet die Strecke Änderungen der Quer- und Längsneigungen in beiden Richtungen, unterstützend und hemmend!

So wie es aussieht, werden am ersten Rennen nur wir teilnehmen. Deshalb schlage ich vor, dass wir ein Team von bt's und eines von berniw twos mit antreten lassen. Die berniw twos in einer "Wertungsgruppe" gegen meinen wdbee_2007, beides Roboter die vorausberechnete Trajektorien einsetzten. Je ein Team von Original-Delphinen mit einem Setup von mir, einem von dir und dem Default-Setup gegen deinen "MeinerEiner" und einen von mir modifizierten
Roboter, alle in der Gruppe ohne global optimierte Trajektorie.

Das wären 7 Teams (14 Fahrzeuge) und sollte ein interessantes Rennen ermöglichen.

Damit das auch optisch klar erkennbar bleibt, brauchen wir getrennte Team-Logos und Fahrzeug-Designs. Hast du da schon was in der Pipeline?

Ach ja, wir müssen uns dann noch auf die Strecken einigen, auf denen wir starten wollen. Ein Testrennen auf hhr-track zum Warmboxen und klären offener Fragen wäre sicher nicht schlecht, aber die Strecke ist mit der Spitzkehre doch zu speziell um in die gewerteten Rennen einzugehen. Überleg dir mal, welche Strecken dir passen würden, sie sollten aber mindestens 15 m Breite und 20 Boxen haben, damit Überholen nicht nur durch Rammen erfolgreich möglich ist.

Wenn wir die gemischten Rennen haben, können wir auch mal ein Matchrace machen, also je zwei Teams mit 10 Fahrzeugen in der Startfolge 12 21 12 .. 21.
Dann zeigt sich, wie gut die Teams zwischen Freund und Feind unterscheiden und was noch an Kanibalismus in ihnen steckt. Wertung: 8 Fahrzeuge je Team, das beste und das schlechteste Ergebnis werden gestrichen.

Wenn du noch Ideen hast, lass sie raus!

wdbee


wdbee - Sa 10.02.07 17:12

Band 2 des Tutoriums (Thema Taktik) ist fertig und kann am Beginn des Threads heruntergeladen werden.


wdbee - Do 15.02.07 16:06

Hallo Delphin Drivers,

da gab es noch ein Problem mit der Ansteuerung der Boxengasse. Der Grund ist, dass es Boxengassen links oder rechts neben der Rennstrecke geben kann. Deshalb wird nicht nur der Abstand von der Mitte der Rennstrecke (= Dist(S,P)) benötigt, sondern auch das Vorzeichen (sprich die Richtung links oder rechts). Nun ist das eine Sache der Rennstrecke und nicht des Fahrzeugs, weshalb die alte Lösung da mal Probleme bereitete. Um die Richtung korrekt zu bestimmen, ist es nötig den Differenzvektor vom Punkt S (Mitte der Fahrbahn am aktuellen Ort) zum Punkt P (auf der Anfahrt zur Boxengasse querab von S) mit der normierten (d.h. Länge = 1.0) Richtung nach Rechts (Tor2D = ToRight nur X und Y) zu multiplizieren.

Am Ende der function TDriver.GetTargetPoint muss es also heißen:


Delphi-Quelltext
1:
2:
3:
4:
5:
  if oPit.InPit then                             // In der Boxengasse den
    Offset := Mult(oCurrSec.Tor2D,Sub(S,P))      // Offset aus Rennstrecke
  else                                           // statt Fahrzeug ermitteln
    Offset := PlanOffset;                        // ansonsten je nach
  Result := Add(S,Mult(-Offset,N));              // Situation steuern


Diese Lösung arbeitet bei der Ein- und Ausfahrt aus der Boxengasse richtig.

Viel Spaß

wdbee


wdbee - Mo 26.02.07 18:27

Noch ein Fehler:

In UnitFilter in der function TFilterBrakeColl.Filter muss der Faktor 0.9 sein und nicht 1.1!


Delphi-Quelltext
1:
  if Distance > 0.9 * Driver.Opponents[I].Distance then                    


Sorry

wdbee


Horst_H - Mo 26.02.07 19:42

Hallo,

dann will ich mal hoffen, das dies Auffahrunfälle aufhören :-) , bei denen sich Delphin und MeinerEiner selbst krankenhausreif(PitStop) fahren.
Ich habe es endlich geschafft auf dem Oval-track E-track 5 ein Endurance-Rennen (500 km) bis zum Ende zu überleben, obwohl kein Pit-Stop vorhanden ist(Nur Alleinfahrt.In einem normalen Rennen, fahren einen die anderen kaputt)
Dabei muss der Verbrauch auf 20kg/ 100 km ~ 24l /100 km gesenkt werden. Üblicherweise werden so 70 l/100 km dort verbraucht (BernieW2 8 die 1,6 km in 24:03 mue auf 3, denn ist kein Abflug möglich ), sodass die Wagen nach 100 Runden aus dem Rennen sind (wobei der Delphin mit 111 Runden als letzter stehenblieb, obwohl auf die ausrollenden BT's auffuhr, soweit schaut der nicht voraus, bzw lenkt dran vorbei).

Bei Delphin und Abkömmlingen kann man die Drehzahlschwelle shift und shiftmargin einstellen
statt soetwas:

Quelltext
1:
2:
3:
4:
<attnum name="max pressure" unit="kPa" min="100" max="150000" val="43000"/>
..
<attnum name="shift" unit="1" min="0" max="1.0" val="0.91"/>
<attnum name="shiftmargin" unit="1" min="0" max="10" val="4.0"/>

eben soetwas:

Quelltext
1:
2:
3:
4:
<attnum name="max pressure" unit="kPa" min="100" max="150000" val="100"/>
..
<attnum name="shift" unit="1" min="0" max="1.0" val="0.2"/>
<attnum name="shiftmargin" unit="1" min="0" max="10" val="10.0"/>

das bedeutet,dass man den Bremsdruck soweit reduziert das Bremsen minimal schleifen.
Mit shift stellt man ein, dass beim Erreichem einer Drehzahl von 0.2* Maximale Drehzahl (redline) im höherem Gang, wird hochgeschaltet und erst sehr spät (shiftmargin) wieder runter (hier eben nie).
Dann fährt MeinerEiner mit 2000 Upm und 174 min und delphin mit 2500 Upm in 176 min und wdbee_2007 in 171 min und bei fast 3000 Upm, wobei die Differentialübersetzungen angepasst sind.
Der Wirkungsgrad ist nun mal in der Nähe des höchsten Drehmomentes (Autodaten sind in C:\Programme\torcs\cars\clkdtm\clkdtm.xml speziell section engine abgelegt ) eben höher Siehe Verbrauchskennfelder z.B hier http://www.uni-magdeburg.de/MWJ/MWJ2001/tschoeke.pdf schöne Datei mit Fahrwiderständen etc. wobei in der Rollreibung cr die Abtriebswerte unberücksichtigt sind, weil es nicht um Rennautos geht sondern um das 1-Liter Auto )
Ein TempoMat könnte die Verbrauchswerte noch senken, denn Konstantfahrt ist ja sparsamer.

Ich habe zu spät gesehen , das der Wirkungsgrad für den 4.ten Gang mit über 98% der Beste ist, während der 6.te nur 94% hat.


Ein anderes Problem hat sich nun ergeben:
Aeromagicwerte (Verstärkung des Unterbodeneffektes?) größer als 2 steigern den Abtrieb nicht mehr!.
Ich bestimme die Grenzgeschwindigkeiten mit den Werten cw und ca....
Übertragbare Kraft = mue*Senkrechte Kraft auf die Strasse.(f(masse,cr,cw,ca,v2,RadiusXY(Kurve),RadiusXZ(Kuppe) ))
Wenn die Querkraft(Zentrifugalkkraft) gleich der übertragbaren Kraft ist die Grenzgeschwindigkeit erreicht.
Nun fliegt MeinerEiner gnadenlos aus der Kurve und bremst zu spät, kommt also nicht über die Runden, wenn aeromagic die 2.0 überschreitet.

Diese 2.0 sind wohl der Grenzwert für eine topfebene Strecke wie hhr-track oder die e-track's

Gruß Horst


GTA-Place - Mo 26.02.07 20:45

Aktuelle Zeit auf HHR-Track: 1:28:12


Horst_H - Mo 26.02.07 22:28

Hallo,

ich habe doch schon mal mein setup für den Original delphin hier angegeben
http://www.delphi-forum.de/download.php?id=5329 das laut wdbee die 1:25.07 im qualifying geschafft haben soll.
Ich benutze auch wieder Delphi7 (Dank Deiner umarbeiung) auf dem Desktop-Rechner und Turbo-Delphi auf dem notebooki.
Das lässt sich sicher noch verbessern.
MeinerEiner bremst z.B mit 26000 als Bremsdruck am besten (Kein Zwischengas beim bremsen vor der Spitzkehre) aeromagic bis 2.0 macht die Kiste schneller und den Winkel des Heckflügels auf 4 Grad müsste den Anpressdruck an der Hinterachse erhöhen und die Kurvengeschwinbdigkeit positiv beeinflussen, ohne die Kiste langsamer werden zu lassen.

Das Problem vom delphin und meinereiner sind die ersten beiden Kurven nach Start und Ziel.
Die anderen Wagen fahren diese rund an und meinereiner fährt diese Kurve sehr eckig an, obwohl nur einen kleine Winkel hat, weil sich der Roboter bisher nur für den Radius aber nicht für die Bogenlänge interessiert.(oder habe ich das selbst bei mir ausgbaut?? )
Ich teste mal ob das wirklich etwas bringt.
Anbei ein Schnappschuß wo die BT's in Aalborg die Straße blockieren.


wdbee - Mo 26.02.07 23:05

Hallo GTA-Place, hallo Horst,

ich habe da noch etwas gefunden, was geändert werden sollte. Bisher wird der Sicherheitsabstand (FRONTCOLL_MARGIN) bei der Berechnung des Bremsweges immer eingerechnet. Bei der Ansteuerung der Box musste er deshalb berücksichtigt werden. Das ist so sehr ungeschickt. Wirklich benötigt wird er nur, wenn es darum geht, hinter einem Konkurrenten zu bremsen. Deshalb ist es sinnvoller, ihn dort zu addieren und ihn überall sonst wegzulassen.

In UnitDriver ändern:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
//==========================================================================*
// Bremsweg schätzen
//--------------------------------------------------------------------------*
function TDriver.BrakeDist(TargetSpeedSqr, Mu: Tdble): Tdble;
var
  C, D: Tdble;
begin
  C := Mu * G;
  D := (Ca * Mu + Cw) / Mass;
  Result := -ln((C + TargetSpeedSqr*D) / (C + CurrSpeedSqr*D)) / (2.0 * D);
end;
//==========================================================================*

//==========================================================================*
// Bremsweg schätzen
//--------------------------------------------------------------------------*
function TDriver.BrakeDist(ActSpeedSqr,TargetSpeedSqr, Mu: Tdble): Tdble;
var
  C, D: Tdble;
begin
  C := Mu * G;
  D := (Ca * Mu + Cw) / Mass;
  Result := -ln((C + TargetSpeedSqr*D) / (C + ActSpeedSqr*D)) / (2.0 * D);
end;
//==========================================================================*

//==========================================================================*
// Bremsweg schätzen
//--------------------------------------------------------------------------*
class function TDriver.BrakeDist(ActSpeedSqr,TargetSpeedSqr
  ,Mu,Ca,Cw,Mass: Tdble): Tdble;
var
  C, D: Tdble;
begin
  C := Mu * G;
  D := (Ca * Mu + Cw) / Mass;
  Result := -ln((C + TargetSpeedSqr*D) / (C + ActSpeedSqr*D)) / (2.0 * D);
end;
//==========================================================================*

In UnitFilter ändern:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
//==========================================================================*
// Geschwindigkeitsregelung zur Einhaltung des Tempolimits in der Boxengasse
//--------------------------------------------------------------------------*
function TFilterBrakePit.Filter(Signal: Tdble):Tdble;
const
  PIT_BRAKE_AHEAD = 200.0// [m] Workaround for "broken" pitentries
var
  DL, Dw: Tdble;
  S: Tdble;
  Dist: Tdble;
begin
  Result := Signal;

  if oDriver.Pit.PitStop                         // Anfahrt zum Eingang
    and (not oDriver.Pit.InPit) then             // der Boxengasse?
  begin                                          // Falls Einfahrt zur Box
    RtDistToPit                                  // sehr kurz ist, Abstand
      (oDriver.Car^,oDriver.Track^,DL,Dw);       // Box bestimmen
    if DL < PIT_BRAKE_AHEAD then                 // und Bremspunkt
    begin                                        // überwachen, ggf.
      if Driver.BrakeDist(0.0,oDriver.PitMu) > DL then
      begin                                      //   Sofort
        Result := 1.0;                           //   eine Vollbremsung
        Exit;                                    //   hinlegen
      end;
    end;
  end;

  if oDriver.Pit.InPit then                      // Sind wir in Boxengasse?
  begin                                          // Wenn ja
    S := oDriver.Pit.Station(oDriver.DistFromStartLine);
    if oDriver.Pit.PitStop then                  //   noch auf der Anfahrt?
    begin
      Dist := oDriver.Pit.NPitStart - S;         // Abstand vom Beginn Temol.
                                                 // Bremspunkt bezogen auf
                                                 // Beginn des Tempolimits
      if ((S < oDriver.Pit.NPitStart)            // oder Tempolimit selbst
        and (oDriver.BrakeDist(oDriver.Pit.SpeedLimit,Driver.PitMu) > Dist))
        or ((S > oDriver.Pit.NPitStart)
        and (oDriver.CurrSpeedSqr > oDriver.Pit.SpeedLimitSqr)) then
        Result := oDriver.Pit.GetPitSpeedLimitBrake(Driver.CurrSpeedSqr);

      Dist := oDriver.Pit.NPitLoc - S;           // Abstand von der Box
      if oDriver.Pit.IsTimeout(Dist) then        // Abbruch wenn kein Service
      begin
        oDriver.Pit.PitStop := False;
        Result := 0.0;
      end
      else // Zusätzlich überwachen: Bremspunkt für Stillstand in Box
      begin
        if (S <= oDriver.Pit.NPitLoc)            // Wir sind noch vor der Box
          and (oDriver.BrakeDistPit > Dist) then // haben aber Bremspunkt für
          Result := 1.0                          //   Box schon erreicht
        else if S > oDriver.Pit.NPitLoc then     // Wir sind angekommen
        begin                                    // Beim Stehen in der Box
          oDriver.GearCmd := 0;                  //   Gang raus
          oDriver.AccelCmd := 0.0;               //   Gas weg
          oDriver.Standing := True;              //   Flag für Unstuck-Pause
          oDriver.ClutchCmd := 1.0;              //   Kupplung treten
          Result := 1.0;                         //   Bremsen
        end;
      end;
    end
    else // Wir sind schon auf der Ausfahrt
    begin
      if S < oDriver.Pit.NPitEnd then
      begin // Noch gilt Tempolimit
        if oDriver.CurrSpeedSqr > oDriver.Pit.SpeedLimitSqr then
          Result := oDriver.Pit.GetPitSpeedLimitBrake(Driver.CurrSpeedSqr);
      end;
    end;
  end;
end;
//==========================================================================*

//==========================================================================*
// Abbremsen wegen eines Rivalen oder eines Teammitgliedes
//--------------------------------------------------------------------------*
function TFilterBrakeColl.Filter(Signal: Tdble): Tdble;
var
  I: Int;
  Mu: Tdble;
  Distance: Tdble;
begin
  Result := Signal;

  Mu := Driver.Mu;
  for I := 0 to Driver.Opponents.Count - 1 do
  begin
    if (Driver.Opponents[I].State and OPP_TEAMBRAKE) <> 0 then
      Result := Max(0.5,Result);

    if (Driver.Opponents[I].State and OPP_COLL) <> 0 then
    begin
      Distance := FRONTCOLL_MARGIN + Driver.BrakeDist    // Hier wird er gebraucht
        (Driver.SpeedX,Driver.Opponents[I].Speed,Mu);
      if Distance > 0.9 * Driver.Opponents[I].Distance then
      begin
        Result := 1.0;
        Exit;
      end;
    end;
  end;
end;
//==========================================================================*


Dadurch sollte sich das Anbremsen der Kurven verbessern lassen.


Horst_H - Di 27.02.07 00:32

Hallo,

ich habe noch ein wenig am Delphin herungeschraubt:
1:24.64 im Qualifying nach 20 Runden practice

Gruß Horst


Horst_H - Di 27.02.07 07:27

Hallo,

der Schnappschuss von den BT's fehlte oben.
Nach vielen Runden sind diese falsch trainiert oder zu ähnlich angelernt das sie sich selbst im Wege stehen.
Auf dem Bild ist die 2.te Runde des Rennesns und die BT's stehen an der Stelle dort schon seit der ersten Runde also schon über einer Minute, links unten noch keine Rundenzeit, und werden später durch wdbee so oft geschubst bis es weitergeht. BernieW schafft es fast immer passend zu bremsen, zögert aber bei der Vorbeifahrt , er steht schon 0.7 Sekunden bis wdbee eben nicht mehr passend bremst und die beiden ausreichend weit verschiebt.

Gruß Horst


wdbee - Di 27.02.07 17:56

Hallo,

mit den oben beschriebenen Maßnahmen habe ich den delphin V1.0.X etwas verbessert. Zusätzlich habe ich die Angabe des Schätzwertes für den Treibstoffverbrauch von kg/Runde auf kg/100km umgestellt. Außerdem arbeite ich noch an den Erweiterungen für das "Pit Sharing", also das gemeinsame Nutzen einer Box durch mehrere Teammitglieder. Dies ist ein neue Funktion von TORCS ab V1.3.0, die aber per default abgeschaltet ist. Wenn ich das mal getestet habe, werde ich ein Update bereitstellen.

Die Probe für die Maßnahmen war ein neuer Lauf und daher eine neue Zeit für den laufenden Wettkampf: 1:24:57 für die Qualifikation auf hhr-track (Verbesserte Version mit 20 gleichlangen Boxen, deshalb aber leicht verschobenem Startpunkt). Die Zeit wurde nach einem 20-Runden-Training erreicht.

Für die Strecke habe ich mal versucht etwas Landschaft bereitzustellen. Die Dateien im Zip-Archiv müssen in das hhr-tack-Verzeichnis kopiert werden (z.B. "C:\Programme\TORCS\tracks\road\hhr-track").

Im Setup-Archiv sind das Setup und die Karma-Datei (="Lernfaktoren") dazu. Bitte denkt daran, dass vorhandene Karmadateien auf der neuen Strecke nicht mehr passen, da der Startpunkt verschoben ist!

Sorry, aber sonst wären die Boxen nicht nutzbar gewesen!


Horst_H - Mi 28.02.07 13:45

Hallo,

die Änderungen bewirken eine Verlangsamung meiner Einstellungen auf 1:24.96 also 0.3 Sekunden.
Aber ich bekomme deine Fahrzeit nicht hin. Ändere doch die Quelldateien zu Beginn dieses Threads, damit wir alle die gleiche Basis nutzen.
Ich schlage vor, die Konstante WidthDiv in privaten Einstellungen einzufügen:
UnitDriver.pas

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
const
BOTNAME_ATT_WIDTHDIV = 'useable road width';   // Anteil Fahrbahn
dann:
TDriver = class(TDriverBaseClass)
  private
    oActOffset: Tdble;                           // Kursabweichung
    oAeroMagic: Tdble;                           // Ca-Tuningfaktor
    oAlone: Integer;                             // Indikator für Umfeld
    oBorder: Tdble;                              // Randabstand
    oBrakeDistPit: Tdble;                        // Bremsabstand für Box

    oWidthDiv : tDble;                           // Nutzbare Strassenbreite
.....
  property WidthDiv : tDble
      read oWidthDiv;
  
//==========================================================================*
// Experte für die Einstellung des Rennwagens
//--------------------------------------------------------------------------*
procedure TDriver.GetParamExpert(var CarSettings: PCarSettings);
var
  Fuel: Tdble;
begin
....
 oWidthDiv := GfParmGetNum(CarSettings
    , BOTNAME_PRIV, BOTNAME_ATT_WIDTHDIV
    ,nil,3.0);
  WriteLn(Format('WidthDiv: %0.2f',[oWidthDiv]));
....

und WidthDiv eben mit oWidthDiv zu ersetzen in
UnitFilter.pas die letzten Zeilen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
    begin
      Tm := Abs(Driver.ToMiddle);
      W := Seg.Width / Driver.WidthDiv;
      if Tm > W then
        Result := 0;
    end;
  end;
end;
//==========================================================================*
end.
//--------------------------------------------------------------------------*
// end of file UnitFilter.pas
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*


Bei MeinerEiner nutze ich fast immer die volle Fahrbahnbreite. Nur auf Oletheros Road nehme ich ein schmales Band um die Mitte, aber das rettet mich auch nicht, ist aber etwas schneller am PitStopp :-)

Gruß Horst
Edit:
in der %trackname%.xml -Datei in der section private fehlt dann soetwas.
2 als minimum heisst die volle Breite (Nutzbreite = 2/oWidthDiv ) 100 eben nur 2% der Fahrbahnbreite, vielleicht sollt man es leserlicher gestalten, indem man % Angaben nimmt und im Programm umrechnet.

Quelltext
1:
    <attnum name="useable road width" unit="1" min="2" max="100" val="2"/>                    


Edit:Edit:
mit dieser Einstellung von WidthDiv = 2 komme ich wieder auf 1:24.75.


wdbee - Mi 28.02.07 20:35

Hallo Horst,

natürlich werde ich die geänderte Version dort bereitstellen. Ich kämpfe aber gerade noch mit einigen Punkten im Zusammenhang mit den bezüglich TORCS V1.3.0 offenen Punkten, wie eben dem Pit Sharing. Da werde ich noch etwas Zeit brauchen. Dann werde ich auch deinen Vorschlag (für WidthDiv) noch berücksichtigen.

Hattest du meine neuen Zeiten auf der alten oder der neuen Version der Strecke geprüft? Welche Frameraten schafft denn Deine Grafikkarte mit der neuen Landschaft? Die Bäume brauchen offensichtlich einges am Leistung.

Bis bald

wdbee


Horst_H - Mi 28.02.07 23:00

Hallo,

ich habe mal die delphin.dll von Dir jetzt benutzt.
Zuerst habe ich alle *.karma Dateien gelöscht und dann alle Wagen, die dies nutzen, 20 Runden pratice auf hhr-track fahren lassen.
Deinen Delphin habe ich als Delphin 2 rennen lassen und dieser kommt nur auf 1:25.362
Der Wagen fährt er mit zuwenig Sprit und muss in der letzten Runde tanken und so auch im Rennen wen auch nur extrem kurz.
MeinerEiner wird in jedem Rennen von den Delphinen ausgeknockt, ok da muss der Roboter verändert werden.
Aber wenn sich viele streiten und wegschleudern,kann auch BernieW2 gut vorbei.

Die Bildrate bei 4-facher Ablaufgeschwindigkeit geht nach der Spitzkehre auf der Geraden bis auf 23 fps runter, obwohl kaum Bäume da sind, in der Spitzkehre sind es immer noch 71 fps, auf Start und Ziel 99.? fps.
Und das auf einer UrAlt Radeon 7000 mit 64 Mb und AGP 4x . AMD64 3000 (von 1800 auf 2100 Mhz übertaktet(maximal 45 Grad CnQ 31 Grad)).

Also störend ist das nicht.

Ich harre der Dinge, die da kommen

Gruß Horst


wdbee - Do 01.03.07 09:13

Hallo Horst,

die Zeit, die ich angegeben habe, wurde mit der Karma-Datei erreicht, die ich oben angegeben habe. Wenn die gelöscht wurde kommt etwas anderes bei raus, weil ich das Training nicht mit der Setup-Datei gemacht habe, die für die Qualifikation und für das Rennen verwendet wird!

Die Bäume helfen einem beim Abschätzen des Abstands, wenn man mal versucht selbst zu fahren.
Das eigentliche Problem ist, dass die unwichtige Landschaft aus zu vielen Dreiecken gebildet wird. Besonders der flache Innenbereich ist da unnötig aufwendig abgebildet, und rechts unten die Ecke sieht man im Rennen ja nie. Leider stürzt mein Blender ab, wenn ich versuche das nachzuberarbeiten.

Gruß

wdbee


Horst_H - Fr 23.03.07 14:03

Hallo,

ich habe mal Dein Getriebe benutzt, um den Delphin schneller zu machen.
Die 1 min 23 werden unterschritten!
Anbei die Resultate eine Non-Championship Rennens und die "Mechaniker"-Datei.

Gruss Horst


wdbee - Fr 23.03.07 18:36

Hallo Horst,

ich habe deine neue Zeit in die Tabelle eingetragen. Bitte prüf mal, ob ich die Angaben richtig interpretiert habe.

Auf der TORCS-Site von Andrew Sumner [http://www2.webng.com/locus/cars.html] ist ein neues Paket zum Download zu finden. Was er dazu schreibt, klingt recht interessant:

Zitat:

Supercars
A set of six sports cars in their "production" state - ie. not specifically modified for racing. I've taken quite a lot of time & trouble to ensure they're well balanced versus each other, though they do have their own characteristics and some cars may have the edge on some tracks. The download includes a Championship setup and 14 high-quality computer drivers to compete against.


In den nächsten 4 Wochen werde ich kaum Zeit finden, mich mit TORCS zu beschäftigen. Also etwas Geduld bitte!

Gruß


wdbee


wdbee - So 25.03.07 10:37

Kleiner Tipp für alle, die das neue Supercars-Paket von Andrew Sumner ausprobieren wollen:

Nachdem ich das Paket in das TORCS-Verzeichnis kopiert hatte, stürzte TORCS gleich beim Start komplett ab. Der Grund war offensichtlich der Ordner ..\categories\Supercars (mit dem Makefile). Nach dem ich den gelöscht hatte, lief das Paket!


Horst_H - Mo 26.03.07 07:37

Hallo,

ich war auch erstaunt, woran es lag, denn die .xml schienen nichts abstürzendes zu enthalten.
Das werde ich mal testen

Gruß Horst


Horst_H - Mo 26.03.07 22:31

Hallo,

es funktioniert ja sehr gut. Die Wagen fahren wirklich sehr schöne Kurven, etwas agresssiver wie BernieW2 8, und von Beginnn an sehr schnelle Rundenzeiten.
Ich habe mal BT3 zu einem Porsche 996 (sc_p996) gemacht und o Wunder, nach 200 Runden Training auf E-track4 war dieser minimal schneller.
Spasseshalber habe ich mal den Delphin mit Freepascal (2.0.4) compiliert und es funktioniert nach minimalen Änderungen (showmesssage diurch writeln ersetzt(kein dialogs im uses),
$define Torcs_1.3.0 eingebaut, aber dann Torcs_1.3.0 durch Torcs_1_3_0 ersetzt, in den units, die dies verlangten).
Tempomässig kann ich keinen Unterschied feststellen, aber ist auch komplett ohne Optimierungen und für 8x486 compiliert.
Zuvor musste ich fp.ini;.cfg löschen, weil es sonst merkwürdige Fehler gab, die eingelesenen Daten aus der xml Datei wurden angezeigt ,aber wtorcs blieb dann hängen, irgendein getLongwindowA?? wurde nicht gefunden und der delphin tauchte nicht mehr auf.
Vielleicht etwas für wdbee' Internetpräsenz

Gruß Horst


wdbee - Di 27.03.07 00:02

Hallo Horst,

ich sage ja immer wieder, den bt sollte man nicht unterschätzen!
Hast du denn den "skill" des Hymie-Roboters eingestellt?
Der steht auf "Handicap 10", wenn du nichts geändert hast. Wenn du mal einen richtig schnellen Lauf sehen willst, musst du den auf 0 setzen: In Datei ..\torcs\config\raceman\extra\skill.xml.

Ich fahre gerade mit meinem wdbee auf einem sc-996 gegen die Hymie (mit Handicap 10) um die Fehler beim Überholen und Ausweichen auszumerzen. Da stimmt noch einiges nicht so ganz. Mit Handicap 0 ist der Hymie auf E-Track 4 mehr als 4 Sekunden pro Runde schneller als mein wdbee.

Dein Erfolg mit Freepascal ist höchst interessant. Ich hatte das probiert, aber TORCS konnte mit der DLL nichts anfangen. Wenn das unter Windows klappt, könnte es ja auch unter Linux gehen! Das wäre dann natürlich ein Riesenschritt weiter, zu allgemeinen Verwendbarkeit.

Nach Ostern werde ich mich deswegen mal bei dir melden.

wdbee


Horst_H - Do 29.03.07 22:16

Hallo,

nur mal als kleiner Schock hymie_sc1 auf Mercedes CLK umgemünzt (Manche Dinge haben keine Wirkung)
Das erste Mal das bei mir 1min 19 auf hhr-track unterschritten wurde.

Gruss Horst


wdbee - Fr 30.03.07 01:07

Hehe,

gut dass ich gerade ein anderes Erfolgserlebnis hatte:

Der wdbee_2007 mit dem SC-996 auf E-Road gegen alle SCs.
Leider sieht das zweite Rennen mit umgedrehter Startreihenfolge nicht so toll aus. An den Hymies, die wie Perlen an der Kette hintereinander herfahren, ist kaum ein Vorbeikommen.
Selbst wenn der wdbee in der Kurve schon die Nase vor dem letzten hat, wird er im Ausgang der Kurve weggerempelt. Es scheint dem Hymie nicht so oft zu passieren, dass mal versucht wird, ihn zu überholen. Aber er macht auch Fahrfehler, so dass die Platzierung des zweiten Rennens noch für Platz 1 und 3 reicht.


wdbee - So 01.04.07 11:38

Nachdem ich auf der Strecke "E-Road" mit meinem wdbee gegen die hymie_scXs so gut abgeschnitten hatte, wollte ich sehen, was mit einem delphin V1.X drin ist. Der wdbee kennt zwei Fahrzustände. Im ersten verhält er sich so wie ein delphin V1.X, im zweiten nutzt er zusätzliche vorausberechnete Informationen. Da ich zur Optimierung und Fehlerbereinigung am ersten Modus einiges verbessert hatte und im Moment nicht so viel Zeit habe, das in den delphin zu übertragen, habe ich einfach den zweiten Modus des wdbee abgeschaltet und ihn dann gegen die beiden hymie_scXs mit allen ihren Wagen antreten lassen.

Das Ergebnis kann sich durchaus sehen lassen! In der Qualifiaktion belegen die beiden sc-996 des wdbee (im delphin-Modus) den 8. und 9. Platz, liegen bei 16 Teilnehmern also genau in der Mitte. Im Rennen verlieren sie dann einiges an Boden, u.a. auch durch Rempler und querstehende Hyimes. Was nach dem ersten Rennen schlecht aussieht, entpuppt sich im zweiten als Vorteil. Da der eine wdbee im ersten Rennen als letzter ankam, durfte er im zweiten aus der Poleposition starten und schafft einen glatten Start-Ziel-Sieg mit einem unglaublichen Vorsprung von weit mehr als 20 Sekunden in 10 Runden. Das bringt ihm 15 Punkte und er liegt damit auf Platz zwei der Gesamtwertung, hinter dem ersten (Arne Fischer) mit 17 Punkten, auch einem sc-996!

Der Grund liegt im Zweitplatzierten, den die folgenden nie überholen können. Er hat eine andere Fahrzeug-Charakteristik und ist überall dort schneller, wo die anderen überholen könnten. Ansonsten ist er aber recht langsam (auf dieser Strecke).

Zur Ehrenrettung für die hymies muss ich aber hinzufügen, dass der wdbee mit einem speziellen Setup für E-Road antritt, bei dem auch die Hinterachsübersetzung optimiert ist, damit ihn die anderen Fahrzeugtypen mit den deutlich stärkeren Motoren am Ende der langen Geraden nicht eingeholt haben und dann in typischer hymie-Manier einfach abgedrängen. Die hymies selbst verwenden aber eine feste Einstellung dieser Hinterachsübersetzung für alle Rennen der SC-Meisterschaft. Da wäre also sicher noch etwas herauszuholen.

Demnächst, wenn ich wieder mehr Zeit habe, werde ich den delphin in der überarbeiteten Fassung hier vorstellen.


wdbee - Fr 25.05.07 19:48

Hallo Delphin Drivers,

es gibt einige Neuigkeiten:

Die TORCS Endurance World Championship 2007 [http://www.berniw.org/trb/events/event_view.php?vieweventid=10] wurde eröffnet. Bis jetzt haben sich sieben Teams angemeldet, mit dem wdbee_2007 habe ich einen Roboter gemeldet, der eine Untermenge des delphin_2007 in c++ realisert. Die Untermenge umfasst nur den Teil, der für das Rennen selbst notwendig ist, das Training mache ich mit der Delphi-Version und speichere die Daten für die c++-Version.

Der wdbee_2007 schafft zwar nicht die Qualifikationszeit der besten des letzten Jahres, aber er schlägt sogar einen berniw two mit McLarenF1 (in der Version der Aerodynamik von olethros), der die Qualifikation mit 1:18:01 schafft! Mit der Teilnahme will ich vor allem sehen, ob die mit dem Delphin geschaffenen Versionen den Regeln entsprechen und in einer parallelen Windows-Meisterschaft einsetzbar sind.

Da sich dieses Jahr die Regeln geändert haben (Gemeinsame Nutzung der Box durch die beiden Roboter des Teams) und ich nur wenig Zeit hatte, habe ich die Neuerungen direkt in der c++-Version realisiert. Deshalb muss ich das noch in die Delphi-Version übernehmen. Außerdem habe ich noch ein paar Fehler gefunden.

Das erste Rennen wird auf E-Track-3 ausgetragen, dann folgt Ruudskogen als nächstes. Dafür muss ich noch die Rennabstimmung finden, weshalb der Delphin noch etwas warten muss.

Nachdem einige Probleme mit dem Supercar-Set bekannt geworden sind, hat Andrew Sumner ein Update [http://files.filefront.com/supercarsv2.zip/;7589372;/fileinfo.html] bereitgestellt.

Das gleiche gilt für die tolle neue Rennstrecke Brondehatch [http://files.filefront.com/brondehachv2.zip/;7597736;/fileinfo.html] von ihm.

Demnächst werde ich die korrigierte Version des Delphins V1.XX hier bereitstellen und mich dann daran machen die Quellen des Delphin_2007 so aufzubereiten, dass ich sie ebenfalls bereitstellen kann.

Bis bald

wdbee


wdbee - Mi 13.06.07 16:01

Hallo Delphin Racers!

Die Nachricht Tages:

Das "wdbee racing team" mit seinen beiden clkdtm (Lobo Malo 31 und Lupo Bianco 32) hat beim ersten Rennen der diesjährigen Meisterschaft einen überraschenden (und leider völlig unverdienten) zweiten Platz erreicht! Stahlender Sieger war wieder das Team "The Rat Race" (clkdtm, mouse_2006_X). Pech hatten dagegen die beiden Mitfavoriten "USR" und "Dummy Drivers". Hier schlug der Fehlerteufel zu. Während das Team USR unter Windows entwickelt und beim Rennen unter Linux Probleme bekam, war ist es beim Team "Dummy Drivers" genau umgekehrt. Vermutliche Ursache: Die beiden unter Linux verwendeten Datenverzeichnisse fallen unter Windows zusammen, wodurch die beiden Teams nicht mit den beabsichtigten Daten starteten.
Leider wurde dieses Problem zu spät erkannt, so dass einige Ergebnismeldungen den Stand mit dem Problem, andere schon den mit dem korrigierten Code zeigen, was die großen Differenzen in den Plazierungen erklärt. Das "wdbee racing team" profitierte zusätzlich von der nach den Regeln vorgesehenen Art der Mittelung: Der am häufigsten genannte Werte wird genommen, nicht der Mittelwert, was unter normalen Umständen besser, hier wegen der Probleme aber sehr ungerecht ist.
Ob das Rennen deshalb wiederholt wird, ist noch offen, falls nicht: USR und Dummy, ihr wart eindeutig besser!

Die offizielle Ergebnisseite des TORCS Racing Boards liefert folgende Tabelle:

Race Result of TORCS Endurance World Championship 2007, E-Track 3
This page shows the result of the race on E-Track 3 of the TORCS Endurance World Championship 2007. Keep in mind that the data is computed according the rules, so it is perfectly possible that you find funny things like a driver with 2.5 pit stops.

Drivers E-Track 3 Race Result
Race Standings Race Qualifying

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Driver         R   P    R   TS    Best Lap Laps Pit    D     Time     R   Best Lap 
Mouse 2006 1    1  20   1  290.6  1:15.104  105  2   813  2:19:06.10   1  1:15.364  
Mouse 2006 2    2  18   2  289.7  1:15.102  105  2  1021  2:19:54.89   2  1:15.364  
dummy_2006 1    3  16   4  287.3  1:16.896   99  2  2900  2:19:44.78   5  1:16.026  
Lobo Malo       4  15   5  291.1  1:19.440   98  3  1288  2:21:01.26   6  1:17.606  
Lupo Bianco     4  15   5  293.0  1:19.454   97  3  2780  2:20:49.09   5  1:17.606  
R Daneel        6  14   6  287.0  1:18.532   97  3  4061  2:20:49.87   7  1:18.078  
stanley_2007 2  7  13   7  283.0  1:26.566   93  3   476  2:20:59.79  12  1:27.390  
berniw 2004 1   8  11   9  280.0  1:24.996   93  2   910  2:20:22.51   9  1:21.822  
dummy_2006 2    8  11   9  288.6  1:16.886   93  2  3485  2:19:44.68   6  1:19.368  
stanley_2007 1  8  11   9  282.7  1:25.700   93  3  5919  2:20:27.45  11  1:26.666  
tp 1_2006      11  10  10  279.3  1:27.334   92  2  1282  2:20:41.74  13  1:31.502  
berniw 2004 2  12   9  11  278.7  1:24.614   87  2  2498  2:19:45.32  10  1:21.822  
tp 2_2006      12   9  11  278.5  1:28.740   89  2   975  2:21:02.84  14  1:32.244  
polimi_2007 1  14   7  13  278.3  1:30.838   84  2  1861  2:20:22.56  16  1:35.620  
polimi_2007 2  14   7  13  278.1  1:31.910   83  2  2362  2:20:29.04  15  1:35.202  
R Giskard      14   7  13  287.3  1:18.810   85  1  6229  2:19:39.04   5  1:17.402


Teams E-Track 3 Race Result
Race Standings

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Team                Rang  Punkte   
The Rat Race          1    40     
wdbee                 2    32     
dummy drivers         3    29     
Stanley               4    26     
USR                   5    23     
Berniw Racing         6    22     
TORCSPlayer Racing    7    19     
PoliMi Racing Team    8    16


Immerhin, bei der maximalen Geschwindigkeit (TS für top speed) hatte das Team wdbee die Nase eindeutig vorn, weil es zum Ausgleich seiner noch nicht ganz ausgereiften Fahrweise mit flacher angestellten Spoilern startete als die arrivierte Konkurrenz.

Bis bald

wdbee


Horst_H - Mi 13.06.07 16:10

Hallo,

was für ein toller Erfolg!! Du wärst auch ohne dieses Pech der anderen weit vorne.

Gruß Horst


Horst_H - Mi 13.06.07 16:30

Hallo,

apropos, Du hast ja den delphin nach C++ convertiert.

Quelltext
1:
   Translation (parts of the Delphin-Robot, from Delphi to c++) to be able to sign in to the championship 2007                    


Wäre freepascal(jetzt Version 2.2 beta) nicht die Alternative gewesen, oder habe ich da was übersehen??

Gruß Horst


wdbee - Mi 13.06.07 16:39

Hallo Horst,

1. Danke für die Blumen.
2. Ja, es könnte eine Alternative werden, da brauche ich aber noch deine Unterstützung!
3. Eine Frage: Wenn du gerade eine Mail bekommen hast, weil ich die Tabelle gepostet habe, welche Nummer war das denn? Ich weiß im Moment nicht, wie ich die herausbekommen kann, denn ich will Dummy per Mail einen Link schicken.

Gruß

wdbee


Horst_H - So 17.06.07 16:12

Hallo,

Mein Desktoprechner leidet seid dem Stromausfall durch Blitzeinschlag an merkwürdiger Vergesslichkeit.
Torcs funtioniert auch nach Neuinstallation nicht mehr. Und nur dort lief die mit Freepascal kompilierte dll.

Auf Notebook tut's die dll noch nicht.
Es werden die Daten z.B von default.xml eingelesen und ausgegeben aber dann stürzt torcs ab.

Compiler Einstellungen:
Delphi-kompatibel
Linker:
Target default(static library funktionierte auch und war sehr viel kleiner, aber der Absturz blieb)
call linker after.

In UnitTorcsData, UnitTorcsTypes
TorcsV_1.3.0 in TorcsV_1_3_0 geändert und dort
{$Define TorcsV_1_3_0} vorne im Quelltext eingefügt.

Gruß Horst


wdbee - Mi 17.12.08 15:23

Hallo Alle!

Lange war es ruhig um das Projekt. Nun gibt es aber einiges nachzutragen:

Ab etwa Mitte der letzten Saison der "TORCS Endurance World Championships 2007" wurde auf der Basis des Methoden des Delphins und einiger anderer älterer Roboter ein neuer TORCS Roboter entwickelt. Diesmal in C++ um den Aufwand für die Teilnahme an den Championships 2008 zu reduzieren.

Dieser neue Roboter überzeugte von Anfang an und führte lange Zeit die Tabelle an.
Anders als 2007 waren aber nicht nur "CLKDTMs" im Einsatz. Insgesamt standen 7 neue Fahrzeuge zur Auswahl.

Deshalb habe ich die Möglichkeit genutzt mehrere Teams starten zu dürfen. Zu Beginn der Saison startete das Team "wdbee" mit dem car6, einem guten aber nicht ganz einfach zu fahrenden Wagen, den leider der hohe Luftwiderstand gelegentlich ausbremst. Da war es wichtig das Fahren im Windschatten zu perfektionieren.

Als zweites Team startete in der ersten Hälfte der Saison das "Red Simplix Team" (Simplix = SIMPLy mIXed best practice: Motto bei der Entwicklung des neuen Roboters) mit dem car1 (f360 like), einem Wagen mit sehr hoher Spitzengeschwindigkeit, also eher das Gegenteil des car6.

Nach der Hälfte der Rennen habe ich dann das zweite Team ausgetauscht, damit nicht beide Teams um die Meisterschaft streiten. Als Ersatz kam das "Blue Simplix Team" mit dem car2 (P996 like), einem staken, wendigen Wagen.

Eine Frage war zu Beginn der Renen offen: Sind die Wagen etwa gleichwertig?

Aus dem Ergebnis der Rennen kann man wohl sagen, dass zumindest die Wagen, die von einem Team ausgewählt wurden, vergleichbar waren. Der car3 überzeugte keinen Racer und blieb den Beweis damit schuldig.

Die beiden Simplix Teams errangen zusammen 308 Punkte (je Fahrer 76,77,77,78 ohne die Extrapunkte für die Übermittlung der Rennergebnisse). Das Team "wdbee" schaffte es 333 Punkte zusammenzutragen (Natürlich mit einigen Tricks um das Top Team vorne zu behalten)! Dieses Ergebnis mit drei sehr unterschiedlich zu fahrenden Wagen zeigt die Qualität des Roboter deutlicher als ein einzelnes Teamergebnis.

Das beste fremde Team (USR aus Australien, car 7) kam zusammen auf 305,5 Punkte. In der offiziellen Wertung für die Teams kommen dann noch die Extrapunkte für die Übermittlung der Rennergebnisse (also Fleißpunkte) hinzu. Die erhält man aber nur einmal pro Rennen, wobei die beiden Punkte immer an das schlechtere Team gehen, wenn man mehrer Teams startet.

Damit ergeben sich dann
337 Punkte für das Team "wdbee" (1.Platz)
323,5 Punkte für das Team "USR" (2.Platz)

und
163 Punkte für das Team "Blue Simplix" (6. Platz)
161 Punkte für das Team "Red Simplix" (7. Platz)

Rechnet man die beiden Simplix Teams zusammen (denn sie waren ja nur abwechselnd am Start) reicht es für einen Doppelsieg (324 statt 323,5 Punkte!)

Die Entscheidung fiel im letzten Rennen. Nachdem das Team "USR" im zweiten Drittel der Saison aufgeholt und die Führung übernommen hatte, konnte das Team "wdbee" im vorletzten Rennen zwar die Führung übernehmen, aber die Punktedifferenz war so knapp, dass das letzte Rennen gewonnen werden musste, um die Teamwertung sicher zu haben.

Wer mehr wissen will:

TORCS Endurance World Championships 2008 [http://www.berniw.org/trb/events/event_view.php?vieweventid=11]

Auf der Basis des Roboters aus dem Rennen habe ich ein Paket geschnürt, das Roboter für das gesamte neue Carset enthält:
Download Simplix [http://www.wdbee.gotdns.org:8086]

Es sind sowohl der Quellcode (C++ für Windows und Linux) als auch fertige DLLs und Datensätze für die Setups verfügbar. Die Texturen der Wagen stammen von Haruna Say und peppen die Modelle deutlich auf.

Zur Frage, ob die Roboter auch mal als Delphi-Projekte bereitstehen, muss ich sagen, dass das auch eine Frage der Nachfrage ist. Da ich den C++-Code komplett neu geschrieben haben (auch wenn ich dazu z.T. auf ältere Robots zurückgegriffen habe) ist der Code sehr einfach nach Delphi zu übertragen.

Leider wird sich aber das TORCS-Interface ändern, so daß die nach Pascal übertragenen Header-Dateien neu angepasst werden müssten. Mal sehen was sich da aus dem TORCS-Fork TORCS-NG (NG=Next Generation) ergibt. Hier sollen Neuerungen eher verfügbar sein, auch wenn das Ganze dadurch nicht ganz so stabil sein wird wie TORCS selbst.

Gruß

wdbee


Webo - Do 18.12.08 22:05

Ich hab gestern das Projekt nur durch Zufall entdeckt und musste nach der Installation feststellen: wow ! Auch wenn das Heck meines Wagens ein wenig eckig war, mich hat überrascht, wie gut das Spiel doch ist. Besonders den 3D-Sound fand ich cool (jedenfalls kam aus allen 4 Boxen was anderes, hörte sich schön realistisch an).

Das Projekt werd ich in Zukunft wohl weiter verfolgen, ihr habt meinen größten Respekt ;)

Grüße

Webo


wdbee - Sa 27.03.10 20:50

Hallo,

nach dem es im ursprünglichen Projekt TORCS sehr langsam vorangeht hatte sich eine neue Gruppe gebildet, die versucht das etwas zu beschleunigen.
Aus dem wdbee_2007 (Delphi-)Robot wurde der (C++)Robot simplix entwickelt. Bei den TORCS Endurance World Championships konnte ich in den Jahren 2008 und 2009 damit jeweils den Gesamtsieg holen. Die Entwickler des neuen Projektes (ursprünglich TORCS_NG für Next Generation genannt) luden mich ein, an dem Projekt mitzuarbeiten. So ist ein weiterentwickelter simplix roboter nun Bestandteil des ersten Release des neuen Projektes, das inzwischen unter dem Namen Speed-Dreams bereitgestellt wird.

Informationen gibt es unter http://speed-dreams.sourceforge.net
und den Download unter http://sourceforge.net/projects/speed-dreams/files

Das ursprüngliche Robot Interface von TORCS wird weiterhin unterstützt, es wurde aber ein erweiteretes Interface realisiert, mit dem es möglich ist, Robot-DLLs unter beliebigen Namen zu verwenden, so dass Spieler sich da eigene "Rennställe" kreieren können.

Viel Spaß

wdbee


Horst_H - So 28.03.10 20:37

Hallo,

simuV3 ist wohl noch neu ;-)
Die Wagen durchdringen sich und es gibt enorm viele, die auf der Strecke bleiben.

Gruß Horst


wdbee - Do 01.04.10 08:21

Hallo Horst,

wie bei TORCS ist simuV3 eine Experimental-Version.
Hier sind einige Dinge noch nicht fertig/gelöst.
Dazu gehört auch das Kollisions-Problem.

Da die Fahrphysik sich mit simuV3 ändern wird, müssen die Robot-Setups und ggf. auch die Robots selbst angepasst werden.

Damit wir daran arbeiten können, musste simuV3 auch mit verteilt werden.
Die Robots und deren Setups sind aber alle auf simuV2 eingestellt.

Gruß

Wolf-Dieter