Geschwindigkeit eines Autos berechnen
-
Hi
ich bin gerade dabei mit CAN einen Tacho zu simulieren.
Um nun eine glaubwürdige Tachonadelbewegung zu bekommen, muss ich jetzt die
entsprechende Geschwindigkeit ausrechnen.
Allerdings hackts da gerade ein wenig.Also, wenn man Gas gibt, beschleunigt der Waagen solange, bis die Widerstandskräfte zu groß werden und seine Endgeschwindigkeit erreicht ist.
Wie stark man Gas gibt beeinflusst diese Endgeschwingigkeit ebenso wie die Größe der Beschleunigung.
Allerdings ist das keine lineare Beschleunigung.Könnt ihr mir auf die Sprünge helfen, wie ich das berechnen muss. Muss jetzt nichts aufwendiges sein, sollte halt das Verhalten in etwas beschreiben.
Mfg
-
Wenn du die Beschleunigung a in Abhaengigkeit von der Zeit t kennst, dann gilt fuer die Geschwindigkeit v:
v=∫a dt.
-
Was hast du denn als Ausgangspunkt? Die Stärke mit der das Gaspedal gedrückt wird?
-
die endgeschwindigkeit haengt davon ab, wie doll man beschleunigt? komisch.
-
Der Einfachheit halber gehe ich mal davon aus, dass die Leistung des Motors P_motor in etwa proportional der Stellung des Gaspedals x ist (Moderner Automatikwagen). Wenn x von 0 (Leerlauf) bis 1 (Vollgas) geht ist dann
P_motor = P_motor_maximum * x
In Abhängigkeit der Geschwindigkeit v berechnet sich der Vortrieb V aus
V = P_motor / v.
Davon gehen der Rollwiderstand R und der Luftwiderstand L ab.
Wobei man grob sagen kann, dass der Rollwiderstand vom Gewicht G und einem konstanten Faktor mue_roll abhängt.
R = mue_roll * G
Der Luftwiderstand ist proportional zum Quadrat der Geschwindigkeit
L = A * cw * rho/2 * v^2
mit A als der (Stirn-)Fläche des Wagens, cw der Lufwiderstandsbeiwert (ca. 0,3-0,5), rho der Lufdichte (ca 1,2kg/m^3)Dann lässt sich die Kraft F, die den Wagen beschleunigt, berechnen:
F = V - R - L = P_motor_maximum * x / v - mue_roll * G - A * cw * rho/2 * v^2sei m die Masse des Wagens so ist nach Newton
F = m * a
und
a = dv/dt
also
dv/dt = F / md.h. die Ableitung der Geschwindigkeit dv/dt lässt sich als Funktion von v und der Stellung des Gaspedals x berechnen.
Dann kann man zu jedem Zeitpunkt auf die Geschwindigkeit schließen, die sich nach einer Zeitspanne dt einstellt.
v(t+dt) = v(t) + dv/dt * dtWenn es nicht so genau sein soll, reicht hier 1s für dt aus. Alles in eine Tabelle gepackt mit ein paar Beispielwerten versehen ergibt sich folgendes Bild
Masse 1200 kg mue_roll 1,50% Fläche 2,88 (1,6m x 1,8m) cw 0,4 Leistung 60000 60kW := 81,5PS dt 1 Zeit [s] x v[m/s] V[N] L[N] F[N] a[m/s^2] v[km/h] 0 0,6 14,00 2571,4 225,8 2169,1 1,8075 50,4 1 0,6 15,81 2277,4 287,9 1813,0 1,5108 56,9 2 0,6 17,32 2078,7 345,5 1556,6 1,2972 62,3 3 0,6 18,62 1933,9 399,2 1358,1 1,1317 67,0 4 0,6 19,75 1823,0 449,2 1197,2 0,9977 71,1 5 0,6 20,74 1735,4 495,8 1063,0 0,8858 74,7 6 0,6 21,63 1664,3 539,0 948,7 0,7906 77,9 7 0,6 22,42 1605,6 579,1 849,9 0,7082 80,7 8 0,3 23,13 778,2 616,3 -14,7 -0,0122 83,3 9 0,3 23,12 778,6 615,6 -13,6 -0,0113 83,2 10 0,3 23,11 779,0 615,0 -12,6 -0,0105 83,2
Hier habe ich den Wagen mit 14m/s (ca 50km/h) fahren lassen, für 7 Sekunden 60%Gas gegeben, das lässt ihn auf 80km/h beschleunigen und dann nehme ich das Gas auf 30% zurück, wobei die Geschwindigkeit knapp gehalten wird.
Die Höchstgeschwindigkeit bei diesem Werten liegt etwa bei 130km/h - vielleicht ist der Rollkoeffizient und die Stirnfläche etwas zu groß ...Gruß
Werner
-
Vielen Dank Werner!!!
Danke für die Erklärung. Es funktioniert.
Man muss nur aufpassen, falls das Auto steht. Da muss man den Fall v = 0 extra behandeln. Ist aber auch kein Problem.
Ich habs mit C programmiert und alles läuft wunderbar.
Aber in CAPL (die Programmiersprache von CANoe) gibt es völlig verrückte Ergebnisse.Ein Beispiel : wenn ich als Test 9*9 durch write ausgeben lasse, wird das Ergebnis richtig berechnet. Mache ich dann aber 9.0*9.0 ist das Ergebnis 0. Auch wenn ich eine Doublevariable erstelle mit z.B 8.2 als Wert spuckt er mir da völlig verrückte Werte aus.
Ich hab jetzt schon eine Weile nicht mehr in CAPL programmiert, aber ich kann mich nicht erinnern, jemals solche Effekte gehabt zu haben.
Könnt ich mir helfen?
-
Firewall schrieb:
Man muss nur aufpassen, falls das Auto steht. Da muss man den Fall v = 0 extra behandeln. Ist aber auch kein Problem.
Das hatte ich vergessen. Der Vortrieb ist natürlich nicht beliebig zu erhöhen. Spätestens bei der Reifenhaftung ist in der Praxis Schluss.
Ich würde Dir empfehlen eine Minimal-Geschwindigkeit zu wählen, ab der der Vortrieb nicht mehr zu steigern ist. Das ist z.B. die Geschwindigkeit, die der Wagen im 1.Gang bei der Motordrehzahl mit der größten Leistung erreicht. Ich schätze mal so 5m/s liegt nicht völlig daneben.Dann errechnet sich der Vortrieb V
V( v >= 5m/s ) = P_motor / v
V( v < 5m/s ) = P_motor / (5m/s) // Bem.: gilt auch für v<0 solange ein Vorwärtsgang drin ist.Falls Du den Wagen auch wieder abbremst, solltest Du beim Rollwiderstand genau so verfahren. Wobei hier die minimale Geschwindigkeit deutlich kleiner sein darf. Vielleicht v_min_roll = 1m/s.
R( |v| >= v_min_roll ) = mue_roll * G * sgn(v) // sgn(v)=1 für v>0 und sgn(v)=-1 für v < 0
R( |v| < v_min_roll ) = mue_roll * G * v/v_min_roll // Bem.: Falls v zu 0 wird sollte auch R 0 seinDas ist notwendig, damit Du bei dem von mir vorgeschlagenen numerischen Verfahren (Euler-Verfahren) keine Schwingungen in der Nähe von v=0 bekommst. Eventuell hilft es auch, das 'dt' etwas zu verkleinern.
Abbremsen geht wenn man zum mue_roll noch einen Wert mue_brems zwischen 0 und 1 hinzuzählst.
mue = mue_roll + mue_brems
1 als Maximum ist schon ziemlich viel; wahrscheinlich ist ein Maximalwert von 0,6 oder 0,8 realistischer.Firewall schrieb:
Ich habs mit C programmiert und alles läuft wunderbar.
Aber in CAPL (die Programmiersprache von CANoe) gibt es völlig verrückte Ergebnisse.Ein Beispiel : wenn ich als Test 9*9 durch write ausgeben lasse, wird das Ergebnis richtig berechnet. Mache ich dann aber 9.0*9.0 ist das Ergebnis 0. Auch wenn ich eine Doublevariable erstelle mit z.B 8.2 als Wert spuckt er mir da völlig verrückte Werte aus.
Ich kenne CAPL nicht, aber das scheint so ein C-Derivat zu sein. Dann prüfe doch mal in dem 'write' ob Du wirklich Doublevariablen ausgibst und keine Integer.
Gruß
Werner