Forum: PC-Programmierung Strecke durch Beschleunigung


von Jan L. (jan_l)


Angehängte Dateien:

Lesenswert?

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²)
1
0
2
-0,00039
3
0,000509
4
-0,001431
5
0,000862
6
0,000862
7
0,000862
8
-0,043747
9
-0,043747
10
-0,043747
11
-0,011678
12
-0,026482
13
-0,026482
14
-0,026482
15
-0,006639
16
-0,006639
17
-0,042754
18
-0,030046
19
-0,027134
20
-0,020262
21
0,002405
22
0,002405
23
-0,010337
24
-0,025921
25
-0,007328
26
-0,007328
27
-0,01227
28
-0,018634
29
-0,018634
30
-0,029464
31
-0,014225
32
0,001131
33
0,001131
34
0,019007
35
0,011783
36
-0,000139
37
-0,027242
38
0,011072
39
0,011072
40
0,011379
41
0,010476
42
0,017496
43
0,017496
44
0,025333
45
0,025333
46
0,025333
47
0,031037
48
0,015884
49
0,028204
50
0,026609
51
0,013285
52
0,017141
53
0,017141
54
0,010527
55
0,020332
56
0,020332
57
-0,005591
58
-0,005591
59
-0,005591
60
0,015988
61
0,004096
62
0,007364
63
0,007364
64
0,007364
65
0,007364
66
0,008173
67
0,010885
68
-0,001184
69
0,006158
70
-0,009055
71
0,021382
72
0,021382
73
0,014088
74
0,014088
75
0,005701
76
0,015023
77
0,018775
78
0,015252
79
0,012355
80
0,012355
81
0,012355
82
0,012355
83
-0,001119
84
0,003803
85
0,003803
86
0,009974
87
0,009974
88
0,013702
89
0,023116
90
0,023116
91
0,025818
92
0,025818
93
0,037635
94
0,037635
95
0,006936
96
-0,004987
97
-0,003044
98
-0,004237
99
-0,004237
100
-0,002786
101
-0,002786
102
-0,001765
103
-0,001995
104
-0,001995
105
-0,001021
106
-0,001293
107
-0,000742
108
-0,000649
109
-0,000649

von Matthias L. (Gast)


Lesenswert?

>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?

von Jan L. (jan_l)


Lesenswert?

dt is bei mir immer 0,01

und

ich multiplizier es einfach mi 9,81

von Karl H. (kbuchegg)


Lesenswert?

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;

von Jan L. (jan_l)


Lesenswert?

oh ja das * ist eigendlich auch ein + xD.

Ach verdammt ich hatte gehofft, dass der Fehler bei kleinen Strecken 
noch hinnehmbar währe ...

von Besserwisser (Gast)


Lesenswert?

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 ?

von Jan L. (jan_l)


Lesenswert?

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?

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

>dass das Ergebnis um den Faktor 30 zu niedrig ist.


Wenn ich das mit Excel zusammen rechne, komme ich auf einen Weg 
s=10,8cm. Aber in Minus-Richtung

von Jan L. (jan_l)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
   }

von Jan L. (jan_l)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

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

von Jan L. (jan_l)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.