Hallo,
also es geht um die Berechnung einer Strecke aus der Beschleunigung...
ich bin mir nicht sicher ob das die richtige Rubrik ist aber ich hab es
ja auch programmiert :P
Ich habe dafür 2 Ansätze.
der Erste, den ich auch implementiert habe sieht so aus:
1
private void V() {
2
double dv = 0;
3
for (int i = 0; i < a.Count; i++) {
4
dv = a[i] * 0.01;
5
if (i <= 0)
6
v.Add(0);
7
else
8
v.Add(v[i-1] + dv);
9
}
10
}
11
12
private void S() {
13
double ds = 0;
14
for (int i = 0; i < v.Count; i++) {
15
ds = v[i] * 0.01;
16
if (i <= 0)
17
s.Add(0);
18
else
19
s.Add(s[i - 1] + ds);
20
}
21
}
vereinfacht gesagt
v = 0;
s = 0
dv = a * dt;
vi = dv + vi-1;
ds = v * dt;
si = ds * si-1;
nunja wenn ich mir das ausgeben lass sieht es auf den ersten Blick gut
aus. Hab hier mal die Excelgraphen im Anhang die das Ergebnis zeigen.
Ein Problem ist, dass die Zahlenwerte der Strecke die ich bekommen (wie
man in den Graphen ja sehen kann) nicht mal annähernd 40cm oder 0,4m
oder ähnlichem entsprechen....
die Bewegung die ich da gemacht hab ist nur über die X Achse ca. 40cm
eintlang meiner Tastatur.
Zweite Variante währe (für die Strecke) s = (a/2)*t²+vi-1*t+si-1;
das soll eigendlich die Strecke zeigen, allerdings sieht die Kurve
genauso aus wie die Geschwindigkeits kurve der 1. Formel.
Meine Mathe/Physik Fähigkeiten sind leider sehr begrenzt und ich weiß
jetzt nicht genau was ich falsch mache bzw was ich anders machen könnte
ps.: das bild hab ich versehendlich 2 mal eingefügt und die test werte
die ich hinzufügen wollte werden garnicht angezeigt...
deshalb ein bisschen unschön hier die werte (achtung in g nicht in m/s²)
>vereinfacht gesagt>v = 0;>s = 0>dv = a * dt;>vi = dv + vi-1;>ds = v * dt;>si = ds * si-1;
Du meinst sicherlich:
dv = a * dt;
v(i) = dv + v(i-1);
ds = v * dt;
s(i) = ds * s(i-1);
Wobei i deine Laufvariable für die Zeit ist.
Was mich an deiner Rechnung (Code) wundert:
Wie gross ist dt? Wo geht das ein?
Wenn die Werte für a in g sind, wo rechnest du das in m/s2 um?
Jan L. schrieb:> Meine Mathe/Physik Fähigkeiten sind leider sehr begrenzt und ich weiß> jetzt nicht genau was ich falsch mache bzw was ich anders machen könnte
Kurz gesagt:
Du hast soeben den Unterschied zwischen theoretischer Physik und den
Unbillen der Realität gesehen.
Das wird so nichts. Die Messfehler bzw. Ungenauigkeiten bzw.
Sensorrauschen versauen dir das Messergebnis durch die doppelte
Integration.
In der Theorie funktioniert das wunderbar. Aber auch nur in der Theorie.
Selbst dann, wenn du den Fehler in der Aufsummierung des Weges über die
Geschwindigkeit behebst.
si = ds + si-1;
Jan L. schrieb:> for (int i = 0; i < a.Count; i++) {>> dv = a[i] * 0.01;>> if (i <= 0)>> v.Add(0);>> else>> v.Add(v[i-1] + dv);
Zum einen solltest Du i nicht bei "0" loslaufen lassen, denn was ist
v[i-1] bei i=0 ?
Zum Anderen: Nach Deinem Grafen fährst Du zuerst rückwärts und dann erst
vorwärts. Da passt doch etwas nicht ganz ?
für i = 0 sind da ja die if anweißungen die v[0] = 0 setzten
und weil die graphen laufen wahrscheinlich "rückwärts" weil ich den
sensor verkerherum gehalten hab xD
wie wär es denn wenn wir so tun würde es gäbe keine Fehler beim
integrieren...
wie wäre die rechnung dann?
Die Beschleunigungsdaten sind stark verrauscht und/oder unterabgetastet.
Das alleine erklärt aber noch nicht, dass das Ergebnis um den Faktor 30
zu niedrig ist.
Bist du sicher, dass das wirklich die Daten vom Sensor sind? Wenn du den
Sensor ruckartig bewegst, sollten die Werte deutlich größer werden.
Welchen Messbereich hat der Sensor? Fall er bspw. bis 100g geht, kannst
du nicht erwarten, dass er solche niedrigen Beschleunigungen mit akzep-
tabler Genauigkeit misst.
Bist du sicher, dass die Abtastzeit (10ms) stimmt? Da sie quadratisch
ins Ergebnis eingeht, sollte sie schon halbwegs genau sein.
Hast du die Beschleunigungswerte richtig umgerechnet? Das kannst du
überprüfen, indem du den Sensor so hinstellst, dass der die Erdbeschleu-
nigung misst. Die Umrechnung müsste dann 1 buw. 9,81m/s liefern.
Erstelle mal zwei Messreihen bei ruhendem Sensor, einmal in horizontaler
und einmal in vertikaler Richtung. Im ersten Fall sollte im Mittel 0
herauskommen, im zweiten Fall 1g. Der Rauschpegel sollte in beiden
Fällen sehr, sehr viel kleiner als 1g sein, sonst ist der Sensor oder
der Messaufbau untauglich.
Die angehängte Zahlenliste stimmt übrigens nicht mit den Excel-Plots
überein.
Also, ich messe immoment mit einer genauigkeit von 4g das ist glaub ich
auch erstmal ausreichend.
Die werte im ruhezustand auf der X Achse liegen schwankend bei
-0.013672
bzw 0.95... allerdings hat das board was ich benutze ne firmware dabei
die mir die erdbeschleunigung rausrechnet wo der ruhezustand bei etwa
0,000202 bis 0,000500 liegt das benutz ich auch.
Und ich bin mir eigendlcih recht sicher, dass das die richtigen daten
sind, da ich vor der Aufzeichnung immer einen Test mit liveansicht mache
um zu prüfen ob die achsen stimmen usw.
Jan L. schrieb:> für i = 0 sind da ja die if anweißungen die v[0] = 0 setzten>> und weil die graphen laufen wahrscheinlich "rückwärts" weil ich den> sensor verkerherum gehalten hab xD>> wie wär es denn wenn wir so tun würde es gäbe keine Fehler beim> integrieren...>> wie wäre die rechnung dann?
brauchst du denn die vergangenen Wegstrecken?
Warum nicht einfach
while( 1 )
{
a = ... momentane Beschleunigung
v = v + a * dt;
s = s + v * dt;
s ausgeben
}
naja das was du geschrieben hast is ja genau das was ich mach.
v = v + a * dt;
s = s + v * dt;
zb das 2. v in der ersten gleichung is ja das die alte geschwindigkeit
und das 2. s in der 2. gleichung ist die alte strecke...
und ich bekomm auch um die 20 raus wenn ich es ausrechne nun is die
frage kommt das durch die fehler beim integrieren? oder stimmt da was
nicht mit der art wie ich rechne
> kommt das durch die fehler beim integrieren?
Ich würde sagen, das kommt aus den Werten für a.
Der Sensor liefert ein kontinuierliches Signal für a. Du tastest das
jetzt alle 10ms ab und speicherst dir sozusagen die aktuelle
Beschleunigung zum Zeitpunkt t = N * 10ms (mit N = 0,1,2,..). Die
Information, wie die Beschleunigung zwischen den Abtastzeitpunkten
aussieht, geht dadurch verloren.
Bei der Integration, oder besser: Bei der Aufsummierung mit
v(n) = v(n-1) + a(n) * delta_t
geht die Gleichung aber davon aus, dass das a(n) der Mittelwert der
Beschleunigung zwischen den letzten beiden Abtastzeitpunkten war....
Beispiel:
10 ¦\
9 ¦ o => a(1) = 9
8 ¦ \
7 ¦ \
6 ¦ \
5 ¦ \
4 ¦ \
3 ¦ o => a(2) = 3
2 ¦ \
1 ¦ \
---+-¦-----¦---------
1 2 =>t
<10ms>
für die Integration sollte a(2) aber etwa 6 sein...
also ich hab jetzt noch mal neu aufgezeichnet... diesmal eine strecke
von 24,5 cm (ein buch was hier grade rumliegt) und entweder die werte
vorher waren falsch aufgezeichnet oder sonst was.... aber jetzt komme
ich auf 25 + -, hmm an sich is das gut jetzt muss ich nur mal rausfinden
ob es zufall ist oder nicht XD
ich vermute die messung oben war möglicherweiße ungenau, weil ich meinen
sensor nicht "nullen" kann und somit die axen genau ausrichten muss und
das hab ich vielleicht zu ungenau gemacht
Matthias Lipinsky schrieb:> Wenn ich das mit Excel zusammen rechne, komme ich auf einen Weg> s=10,8cm. Aber in Minus-Richtung
Nicht Millimeter? Dann hätten nämlich wir das gleiche Ergebnis :)
Die Daten in den Excel-Plots von Jan haben aber damit nichts zu tun. Das
scheint eine andere Messung gewesen zu sein.