Autor Beitrag
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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.

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

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden volle Höhe 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?
Einloggen, um Attachments anzusehen!
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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:
ausblenden 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
Einloggen, um Attachments anzusehen!
wdbee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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.
ausblenden volle Höhe 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
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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:
ausblenden volle Höhe 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Sa 10.02.07 17:12 
Band 2 des Tutoriums (Thema Taktik) ist fertig und kann am Beginn des Threads heruntergeladen werden.