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.


  • Mod

    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^2

    sei m die Masse des Wagens so ist nach Newton
    F = m * a
    und
    a = dv/dt
    also
    dv/dt = F / m

    d.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 * dt

    Wenn 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 sein

    Das 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


Anmelden zum Antworten