Autor |
Beitrag |
Horst_H
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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
Einloggen, um Attachments anzusehen!
|
|
wdbee
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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:
| function TDriver.CalcHHRTrack(Sec: TSection; Value: Tdble): Tdble; begin Result := Value; if (Sec.ID > 430) and (Sec.ID < 550) then Result := 1250 * Sec.SpeedSqrFactor else if (Sec.ID > 1500) and (Sec.ID < 1550) then Result := 400 * Sec.SpeedSqrFactor; end; |
Verglichen mit der Funktion für die Spitzkehre ist der Gewinn riesig, bei minimalem Aufwand.
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:
| procedure Spitzkehre (TD: TTrackDescription; SecS1, SecS2, SecE1, SecE2: TSection); var ... begin P1 := Add(SecS1.Mid2D,Mult(-7,SecS1.Tor2D)); P2 := Add(SecS2.Mid2D,Mult(-7,SecS2.Tor2D)); TS := TStraight.Create (P1.X,P1.Y ,P2.X-P1.X ,P2.Y-P1.Y);
P1 := Add(SecE1.Mid2D,Mult(-7,SecE1.Tor2D)); P2 := Add(SecE2.Mid2D,Mult(-7,SecE2.Tor2D)); TE := TStraight.Create (P1.X,P1.Y ,P2.X-P1.X ,P2.Y-P1.Y);
T := TS.Intersect(TE);
Beta := ArcCos(TS.Angle(TE));
Q := MinDist(TD,T,SecS2,SecE1,Ind);
TQ := Dist(T,Q);
Y := TS.Dist(Q);
TAs := Sqrt(TQ * TQ - Y * Y);
Tgbh := tan(Beta / 2.0); YTgbh := Y * Tgbh; X := YTgbh + Sqrt(YTgbh*YTgbh + 2 * TAs * YTgbh - Y*Y); TA := TAs + X;
R := TA * tgbh;
X2 := R*R - (R-Y)*(R-Y); if Abs(X2 - (X*X)) > 0.01 then WriteLn(Format('?: %.3f² = %.3f <> %.3f',[X, X*X, X2]));
DTQ := Normalize(Sub(Q,T)); M := Add(T,Mult(R+TQ,DTQ));
Offset := FLT_MAX; Sec := TD[Ind]; repeat LastOffset := Sec.Offset; Sec := TD[TD.Loop(Sec.ID - 1)]; Sec.Offset := NewOffset(Sec,M,R); if Offset > Sec.Offset then Offset := Sec.Offset; until (Sec = SecS2) or (Offset < Sec.Offset); Offset := Sec.Offset;
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)]; Delta := Delta - 1.0; Sec.Offset := oOrdinate.Evaluate(Delta); until Delta <= 0.0; oOrdinate.Free;
Offset := FLT_MAX; Sec := TD[Ind]; repeat Sec := TD[TD.Loop(Sec.ID + 1)]; 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
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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
Einloggen, um Attachments anzusehen!
|
|
wdbee
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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
Zuletzt bearbeitet von wdbee am Di 30.01.07 19:21, insgesamt 1-mal bearbeitet
|
|
Horst_H
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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); if AllowedSpeed > SpeedX + 1.0 then Result := 1.0 else und Fälschung 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
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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:
| function TDriver.GetTargetPoint(LookAheadDistance: Tdble): TV2D; var ... Plan: Tdble; begin if oPit.InPit then begin ... end else begin ... end;
Plan := oMyOffset; Offset := PlanOffset; if Abs(Offset) > 0.01 then Plan := Offset; if oPit.InPit then Offset := Sign(Plan) * Dist(S,P); Result := Add(S,Mult(-Offset,N)); end; |
Ist das so ein Fall wie du ihn beobachtet hast?
Gruß
wdbee
|
|
wdbee
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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:
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:
| procedure TFormMain.EditAngleChange(Sender: TObject); var I: Integer; Hm: Double; BodyLiftFront: Double; BodyLiftRear: Double; WingLiftFront: Double; WingLiftRear: Double; WingDragFront: Double; WingDragRear: Double; Ratio: Double; Line: string; begin try MemoSpoiler.Lines.Clear; oCar.WingAngle[TEdit(Sender).Tag] := TEdit(Sender).Text; Hm := 0.0; 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; BodyLiftRear := oCarType.Clift[REAR] * HM; WingLiftFront := 4.0 * 1.23 * oCarType.WingArea[FRONT] * sin(oCar.WingAngleVal[FRONT]); WingLiftRear := 4.0 * 1.23 * 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 * oCarType.WingArea[FRONT] * sin(oCar.WingAngleVal[FRONT]); WingDragRear := 1.23 * 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?
Einloggen, um Attachments anzusehen!
|
|
Horst_H
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: So 04.02.07 23:30
Hallo,
für alle die mal sehen wollen, wie so ein Rennen aussieht, hier ein Video 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
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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; W := (Segment.Width * oWidthDiv - oBorder-CarWidth); Factor :=Abs(oActOffset)/W/oToleranz; begin if Factor < EinHalb then begin 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 begin 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
Einloggen, um Attachments anzusehen!
|
|
wdbee
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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:
| oActOffset := oCurrSec.GetOffset(Pos); if oActOffset = 0.0 then begin oActOffset := oLastOffset; oLastOffset := oLastOffset * 0.98; end else begin oLastOffset := oActOffset; end; |
|
|
Horst_H
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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.
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-CarWidth-oBorder)/oToleranz; Delta :=0; if Factor < EinHalb then begin Delta := (Factor-Einhalb)*oMPlus; N := 3; end else begin if Factor > 1 then Delta := 2.0*oMMinus else if Factor > 0.7 then IF oMyOffset*oCurrSec.Rad<0.0 then Delta := (Factor-Einhalb)*oMMinus; N := 4; end; IF Delta <> 0.0 then begin Delta := OldFactor*Delta/LookAhead; for I := 0 to Round(N * LookAhead) do begin Sec := oTrackDesc[oTrackDesc.Loop(oCurrSecID - I)]; tm := (Sec.SpeedSqrFactor - Delta); if (tm < 0.3) then tm := 0.3 else If (tm>3.0) then 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
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; 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);
Fmq := -sinA*Fm; Fml := sinG*Fm; Fms := sqrt(sqr(Fm)-sqr(Fmq)-sqr(Fml)); IF R > 2000 then Sec.oSSq := MAX_SSq else begin 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 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
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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:
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 sinA := sin(Alpha); cosA := cos(Alpha); sinG := sin(Gamma); cosG := cos(Gamma);
Fm := mass*g; Fmq := cosA*sinG*Fm; Fml := sinA*cosG*Fm; Fms := sqrt(sqr(Fm)-sqr(Fmq)-sqr(Fml)); Ff := mass*V2/yR; Ffs := sinA*Ff; Ffq := cosA*Ff; Ffl := 0.0; Fk := mass*V2/zR; Fks := cosG*Fk; Fkq := sinG*Fk; Fkl := 0.0; Fas := ca*V2; Fal := cw*V2; Fs := Ffs+Fms+Fks+Fas; Fq := Ffq+Fmq+Fkq; Fl := Ffl+Fml+ Fal; IF Fs< 0.0 then Begin writeln(S,' Wir heben ab ',V); halt(-1); end;
Fb := mueSumm*Fs; Fmax := sqr(Fb)-sqr(Fq); IF Fmax > 0 then Fmax := sqrt(Fmax) else Begin Fmax := 0.0; writeln(S,' Wir rutschen ',V); halt(-1); end;
Flges := Fmax+Fl; DeltaE := -Flges*ds; end;
function Heun(V,h,ds:tdble):tdble; var E0,dE1,dE2, h1,V2: tDble; Begin V2 := sqr(v); E0 := (g*h +0.5*sqr(V))*mass; h := h+ds*sinA; 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; Heun := V; end;
begin V0 := 30; A := 2.0; alpha :=-10.0*pi/180; gamma := 0*pi/180; sinA := sin(Alpha); cosA := cos(Alpha); sinG := sin(Gamma); cosG := cos(Gamma); yR := 100; zR:= 1e38; 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; 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.0) or (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
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: 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 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
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Sa 10.02.07 17:12
Band 2 des Tutoriums (Thema Taktik) ist fertig und kann am Beginn des Threads heruntergeladen werden.
|
|
|