Forum: PC-Programmierung C# - Beschleunigung von Accelerometer in Strecke für Unity - wie umsetzten?


von Rudi L. (rudi235)


Angehängte Dateien:

Lesenswert?

Stehe gerade etwas auf dem Schlauch, wie die Beschleunigungsdaten eines 
Accelerometers in eine Strecke umzurechnen sind.

Mathematisch sieht es wohl so aus (siehe Bild).
http://www.maschinenbau-wissen.de/skript3/mechanik/kinematik/324-gleichmaessig-beschleunigt

Nur wie führe ich eine doppelte Integration in Echtzeit in C# 
aus(Unity)?

Hat jemand ein Codebeispiel für sowas?

Möchte die gewonnenen "Weg"-Daten aus der Beschleunigung als Translation 
auf einen Körper in Unity anwenden.

Speziell die Zeit bereitet mir Probleme, die ist in der Formel in 
Sekunden angegeben, aber einfach zur Laufzeit hochzählen funktioniert 
schonmal nicht. Also was für "t" nehmen?

: Bearbeitet durch User
von KS (Gast)


Lesenswert?

Die Seite erklärt eigentlich alles was du brauchst: 
https://docs.unity3d.com/ScriptReference/Time-deltaTime.html

von Wolfgang (Gast)


Lesenswert?

Rudi L. schrieb:
> Speziell die Zeit bereitet mir Probleme, die ist in der Formel in
> Sekunden angegeben, aber einfach zur Laufzeit hochzählen funktioniert
> schonmal nicht.

Was meinst du mit Laufzeit?

Für die Auswertung von Daten eines Abtastsystemes musst du erstmal die 
zeitdiskrete Form deiner Integration hinschreiben. Dann wird daraus eine 
Summation. Und der Abstand zwischen zwei Abtastungen ist dann dein 
Zeitschritt.

von Rudi L. (rudi235)


Lesenswert?

Wolfgang schrieb:
> Was meinst du mit Laufzeit?

Habe zuerst mit jeder Berechnung die Sekunden hochgezählt, was natürlich 
Quatsch ist.. Meinte damit im Laufenden Betrieb (Ist ja in einer 
Gameengine).


> Für die Auswertung von Daten eines Abtastsystemes musst du erstmal die
> zeitdiskrete Form deiner Integration hinschreiben. Dann wird daraus eine
> Summation. Und der Abstand zwischen zwei Abtastungen ist dann dein
> Zeitschritt.

Und da hab ich das Problem. Wie muss ich die oben genannte Formel 
umstellen, dass ich die Rechnung in Code umsetzen kann.

von c-hater (Gast)


Lesenswert?

Rudi L. schrieb:

> Mathematisch sieht es wohl so aus (siehe Bild).
> 
http://www.maschinenbau-wissen.de/skript3/mechanik/kinematik/324-gleichmaessig-beschleunigt

Schon im Link steht, dass die Formel den Sonderfall der konstanten 
Beschleunigung behandelt.

> Nur wie führe ich eine doppelte Integration in Echtzeit in C#
> aus(Unity)?

Was für eine Integration? Die Formel enthält keine und braucht auch 
keine, da die Beschleunigung in ihrem Geltungsbereich halt konstant ist.

> Hat jemand ein Codebeispiel für sowas?

Lerne selber denken! Hier geht es im wesentlichen darum, sich die 
Bedeutung der drei Teilterme wirklich klar zu machen und sie dann 
sinnvoll zu benutzen.

> Speziell die Zeit bereitet mir Probleme, die ist in der Formel in
> Sekunden angegeben, aber einfach zur Laufzeit hochzählen funktioniert
> schonmal nicht.

Doch, na klar funktioniert das (wobei natürlich für deine praktische 
Anwendung ein Intervall von 1s deutlich zu groß sein wird). Der Trick 
ist, die Beschleunigung über das Meßintervall als konstant zu 
betrachten.  Dann gilt die Formel nämlich. Und zwar für jedes 
Meßintervall wieder. Wobei für alle außer dem ersten ein Teilterm 
entfällt und für alle außer dem ersten ein weiterer Teilterm genau dem 
entspicht, was im vorigen Intervall berechnet wurde.

Erkennst du jetzt, was du tun musst?

von Rudi L. (rudi235)


Lesenswert?

c-hater schrieb:
> Rudi L. schrieb:
>
>> Mathematisch sieht es wohl so aus (siehe Bild).
>>
> 
http://www.maschinenbau-wissen.de/skript3/mechanik/kinematik/324-gleichmaessig-beschleunigt
>
> Schon im Link steht, dass die Formel den Sonderfall der konstanten
> Beschleunigung behandelt.

Genau. Wird der Zeitabschnitt für jede Berechnung extrem klein gewählt 
sollte das ja gelten. Da die Änderung der Beschleunigung dann als 
konstant angesehen werden kann.

>> Nur wie führe ich eine doppelte Integration in Echtzeit in C#
>> aus(Unity)?
>
> Was für eine Integration? Die Formel enthält keine und braucht auch
> keine, da die Beschleunigung in ihrem Geltungsbereich halt konstant ist.

Ja, stimmt, da das Ergebnis in der Formel schon die Strecke ist und 
bereits zweimal integriert wurde. Das muss mit dem "a" aus den 
Sensordaten aber erst passieren.


>> Hat jemand ein Codebeispiel für sowas?
>
> Lerne selber denken! Hier geht es im wesentlichen darum, sich die
> Bedeutung der drei Teilterme wirklich klar zu machen und sie dann
> sinnvoll zu benutzen.
>
>> Speziell die Zeit bereitet mir Probleme, die ist in der Formel in
>> Sekunden angegeben, aber einfach zur Laufzeit hochzählen funktioniert
>> schonmal nicht.
>
> Doch, na klar funktioniert das (wobei natürlich für deine praktische
> Anwendung ein Intervall von 1s deutlich zu groß sein wird). Der Trick
> ist, die Beschleunigung über das Meßintervall als konstant zu
> betrachten.  Dann gilt die Formel nämlich. Und zwar für jedes
> Meßintervall wieder. Wobei für alle außer dem ersten ein Teilterm
> entfällt und für alle außer dem ersten ein weiterer Teilterm genau dem
> entspicht, was im vorigen Intervall berechnet wurde.
>
> Erkennst du jetzt, was du tun musst?

Ich schlaf nochmal drüber. Wie gesagt in der Theorie ist es klar, aber 
Codetechnisch komme ich zu keinen sinnvoll verwertbaren Ergebnissen.


KS schrieb:
> Die Seite erklärt eigentlich alles was du brauchst:
> https://docs.unity3d.com/ScriptReference/Time-deltaTime.html

Danke, das sieht vielversprechend aus.

von Pandur S. (jetztnicht)


Lesenswert?

Dem Poster fehlt das wissen der Mathematik. Er denkt mit ein paar 
Codezeilen copy/pasten sei das alles machbar. Ja. Das Integral schon, 
eine Game Engine aber eben nicht. Da braucht's noch etwas Physik und 
Mathematik.

von Rudi L. (rudi235)


Lesenswert?

Joggel E. schrieb:
> Dem Poster fehlt das wissen der Mathematik. Er denkt mit ein paar
> Codezeilen copy/pasten sei das alles machbar. Ja. Das Integral schon,
> eine Game Engine aber eben nicht. Da braucht's noch etwas Physik und
> Mathematik.

Naja, in Unity an sich sieht man recht schnell Erfolge.
Die Bewegung per Tastatur funktioniert gut. Bin jetzt erstmal dabei den 
Einfluss der Erdbeschleunigung mit Hilfe der Rotationsmatrix zu 
entfernen, dass der Beschleunigungsvektor in jeder Drehrichtung "0,0,0" 
ergibt.
Die Werte vom Gyroskop sind schon implementiert. Drehungen gehen, nur 
eben noch keine Translation.

Hast du trotzdem was sinnvolles beizutragen Joggel E.?
Vielleicht ein kleines Codefragment ;)

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.