W
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