www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bewegungsbestimmung anhand Beschleunigungssensoren


Autor: V. F. (farnsworth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem:
An einem Starrkörper sind einige Beschleunigungssensoren befestigt. Im 
Grunde soll es offen bleiben ob das 1,2 oder 3-Achssensoren sind, aber 
der Einfachheits halber können wir zunächst 3-Achs annehmen. Nun möchte 
ich anhand der Messdaten die Position so gut wie möglich schätzen.

Zunächst habe ich die Daten doppelintegriert und Tiefpass gefiltert.
Die translatorische Verschiebung wirkt ja auf jeden Punkt gleichermaßen. 
Als Nährung hierfür nehme ich daher die kleinste Verschiebung in alle 3 
Raumrichtungen.
Nun muß es doch irgendwie möglich sein anhand der Differenz der 
Verschiebungen eine Nährung für die Orientierung zu bestimmen?

Kann mir jemand helfen? Ich komm einfach nicht weiter!

Gruß

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
V. F. schrieb:
> Nun muß es doch irgendwie möglich sein anhand der Differenz der
> Verschiebungen eine Nährung für die Orientierung zu bestimmen?

Das kommt darauf an welche Freiheitsgrade das Objekt hat.
Drehungen um Achsen, die genau durch den Sensor gehen, kriegst Du halt 
nicht mit.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
V. F. schrieb:

> Nun muß es doch irgendwie möglich sein anhand der Differenz der
> Verschiebungen eine Nährung für die Orientierung zu bestimmen?

Sicher.
Definiere zuerst einmal, wie du die 'Orientierung' darstellen willst.

Einen Sensor definierst du als 0 Punkt des Objektes. Seine Position ist 
die Position des Objektes.
Einen anderen Sensor definierst du als die X-Achse des Objektes und 
einen weiteren als die Y-Achse. (Die Z-Achse ergibt sich theoretisch aus 
den beiden anderen, aber in deinem Fall würde ich der Sache nicht 
wirklich trauen und einen eigenen Sensor dafür abstellen).

Die 3 Sensoren müssen 3 Ebenen aufspannen, die senkrecht zueinander 
stehen.
Ich habs mir jetzt nur kurz überlegt und eigentlich müsste das möglich 
sein, dass die Sensoren nicht exakt auf den Achsen sitzen, sondern eine 
Differenz dazu haben. Es reicht also, wenn du nur von einem Sensor 
definierst: Er legt die X-Achse des Objektes fest.
Jetzt kennst du die Ausgangsorientierung des Objektes, zb ausgedrückt in 
einer Matrix. Des weiteren hast du rausintegriert, wo sich jeder Sensor 
hinbewegt hat. Aus diesen neuen Positionen kann man wieder eine Matrix 
bilden und hat so die Orientierung an der Endposition. Aus den beiden 
Matrizen kann man dann auch die angewandte Operation in Form einer 
Matrix ausdrücken.

Allerdings solltest du tunlichst diese Ergebnismatrix nach Leibeskräften 
wieder orthonormalisiern, ansonsten hast du nur Hausnummern.

Mit der Matrix kannst du dann weiterarbeiten, zb eine Zerlegung in 
Eulerwinkel, oder eine Umrechnung in ein Quaternion oder was auch immer.

Autor: V. F. (farnsworth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Starrkörper handelt es sich um ein Auto. Also sollte die Rotation 
im Prinzip schon 3 Freiheitsgrade haben.
Es sind ja mehere Sensoren an dem Körper befestigt. Jede Drehung sollte 
doch von einen der Sensoren erfasst werden können.

Autor: V. F. (farnsworth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger

Danke erstmal für deine Antwort. Ich habe meine Frage ungeschickt 
formuliert. Den Fall den du beschrieben hast habe ich eigentlich schon 
gelöst. Ich habe dazu eine least-square Ebene zwischen den Punkten 
gelegt und diese mit meinem Starrkörper identifiziert.

Mir gehts jetzt mehr um den Fall, dass ich mehrere Sensoren haben, die 
nicht allte 3 Raumrichtungen messen. Also zb. 3 2-Achs Sensoren. 
Theoretisch kann ich hierraus die Position bestimmen indem ich ein GLS 
der Form: |x_i-x_j| = d_ij aufstelle. Dieses GLS ist aber nichtlinear 
und nicht eindeutig. Nummerische Solver bringen mir dabei nichts 
brauchbares.

Nun Frage ich mich also, ob das nicht anderes eventuell nummerisch zu 
lösen geht. Für die Translation ist, denke ich, die kleinste 
Verschiebung eine gute Nährung. Für die Rotation fällt mir nichts ein.

Autor: Stefan Heindel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, mit Beschleunigungssensoren eine Position zu bestimmen ist sehr 
hakelig. Durch die Doppelintegrierei hast du einen Fehler, der 
quadratisch mit der Zeit zunimmt! Du wirst also nach einer Minute freien 
Integrierens deines Sensors schon Fehler im Bereich von mehreren Metern 
haben, obwohl der Sensor in Ruhe ist. Eine Stützung der Daten mit einer 
Referenz ist unumgänglich.
Natürlich kann man das ganze ins 3 dimensionale übertragen, allerdings 
potenzierst du damit deinen Fehler.
Vielleicht können wir dir weiterhelfen wenn wir die genauere Anwendung 
wissen.

Wie gesagt, Position aus Beschleunigung ist nich, selbst wenn du alle 
mathematischen Register ziehst. Du brauchst eine Referenz zur Stützung.

Stefan

Autor: V. F. (farnsworth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Stefan Heindel

Da hast du natürlich recht. Da ich an der Situation leider nichts 
ändern, es sind nunmal nur diese Daten vorhanden, möchte ich einfach nur 
eine Beschreibung, die so gut wie möglich die Realität beschreibt. 
Außerdem habe ich Messdaten die mit einer Abtastrate von ca 10^-4 max 
eine Minute lang messen. In einem konkreten Bsp sind es sogar nur 20s.

Ich versuche auch grade die Daten mit einem Kalman- statt einem 
Tiefpass-Filter zu bereinigen.

Autor: Stefan Heindel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay,

also grundätzlich ist es unmöglich, nur mit 3 Beschleunigungssensoren 
sowohl Translationen als auch Rotationen zu bestimmen.
Wenn es um ein Fahrzeug geht, würde ich in erster Näherung die Fahrbahn 
als Ebene modellieren, das heißt z würde ich bis auf weiteres erst 
einmal komplett herauslassen.
Die Beschleunigungssensoren sind ja wahrscheinlich im Auto befestigt, 
also im körperfesten Koordinatensytem. Deine Position wird aber im 
erdfesten Koordinatensystem gemessen. Also du hast x_auto, y_auto und 
x_erde und y_erde (vereinfacht). Jetzt musst du wissen, um  welchen 
Winkel die beiden zueinander verdreht sind (Fahrtrichtung!), sonst 
kannst du einfach nichts sagen. Man kann diese Informationen 
grundsätzlich nicht aus den Beschleunigungsdaten bekommen.

Du könntest jetzt irgendwelche fiesen Annahmen treffen, aber 
wahrscheinlich liegst du damit mehr falsch als richtig.

Also mein Vorschlag wäre du besorgst dir ein GPS und wiederholst damit 
deine Messung. Dann kann man aus der Position und den Beschleunigungen 
schon einiges mehr sagen.

Stefan

Autor: V. F. (farnsworth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Heindel schrieb:
> Okay,
>
> also grundätzlich ist es unmöglich, nur mit 3 Beschleunigungssensoren
> sowohl Translationen als auch Rotationen zu bestimmen.

Grundsätzlich doch schon, sofern ich 3Achs Sensoren nehme. Wie das geht 
hat ja zb Karl Heinz Buchegger oben geschildert. Natürlich entsteht 
dabei ein Fehler, der quadratisch mit der Zeit steigt.

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Heindel schrieb:

> also grundätzlich ist es unmöglich, nur mit 3 Beschleunigungssensoren
> sowohl Translationen als auch Rotationen zu bestimmen.

Lassen wir mal das Problem der Aufintegrierung der Beschleunigung weg 
und gehen davon aus, dass wir 3 Punkte haben, deren Position im Raum 
sowohl vor als auch nach einer Operation exakt bekannt ist.
Als weitere Annahme nehme ich dazu, dass die relative Orientierung der 3 
Punkte dergestalt ist, dass sie zumindest nicht kollinear sind, sich 
also aus den 3 Punkten ein 3D-Koordinatensystem konstruieren lässt.

Dann ist es schon möglich eine Matrix anzugeben, die die 3 
Ursprungspunkte in die 3 Punkte nach der Operation transformiert. Das 
ist sogar noch nicht einmal weiter schwierig.

Punkt A   wird als Ursprung des Korrdinatensystems genommen
Punkt B   als ein Punkt auf der X-Achse
Punkt C   gibt dann an in welcher Richtung die Y-Achse zu finden ist.

X  = |( B - A )|
Y' = |( C - A )|
Z  = X kreuz Y
Y  = Z kreuz X

Zusammen mit der Translation T = A haben wir damit die Ursprungsmatrix M
Dasselbe mit den Punkten und den Koordinaten in der Endlage und man 
kriegt die neue Lage im Raum Mneu und wenn man das braucht rechnet man 
sich die Transformationsmatrix auch noch aus, die M in Meneu überführt
  Mtrafo = inverse(M) * Mneu

Die getroffene Annahme lautet allerdings:
Die Position von A und zumindest B muss genau stimmen. C hat ein klein 
wenig Freiheitsgrad, als er sich in der lokalen X/Y Ebene bewegen darf.

interessant ist jetzt die Fragestellung: Wenn ich mehr als nur 3 
Sensoren habe, wie kann ich die benutzen um die (möglicherweise 
fiktiven) Punkte A, B und C möglichst exakt zu fixieren.

Problematisch ist natürlich an der ganzen Sache, wie gut denn die 
Positionen in der Endlage sind. Doppeltes aufintegrieren ist nicht 
unproblematisch.

Autor: V. F. (farnsworth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das mal an simulierte Daten getestet. Wenn ich lange genug an 
den Parametern des Tiefpassfilters rumspiele, kommt das schon so 
einigermaße hin. Jedenfalls die ersten 20 sec. Hier würde ich auch gerne 
mal den Kalmanfilter als Vergleich nehmen. Wie gesagt, versuche gerade 
einen zu basteln.

Meine Frage ist aber eigentlich eine andere. Angenommen der Fehler der 
Doppelintegration sein vernachlässbar. Kann ich die Position auch 
bestimmen, wenn ich die Verschiebung pro Sensor nicht in alle 
Raumrichtung habe. Also z.b. wenn Sensor1->(x,y), Sensor2->(x,z), 
Sensor3->(y,z) mißt. An dem Problem sitze ich jetzt schon ne ganze Weile 
und komme nicht voran.

Karl heinz Buchegger schrieb:
> interessant ist jetzt die Fragestellung: Wenn ich mehr als nur 3
> Sensoren habe, wie kann ich die benutzen um die (möglicherweise
> fiktiven) Punkte A, B und C möglichst exakt zu fixieren.

Hierzu habe ich eine Lösung gefunden (eigentlich nur Alternative alle 
Punkte mit einfließen zulassen). Undzwar gibt es einen Algorithmus der 
eine Ebene findet, das den kleinsten quadr. Abstand zu bel. viele 
Punkten besitzt. Hieraus kann man ausgehend von der Anfangsposition die 
Position der Punkte rückrechen.
Hier der Link zum Algorithmus: 
http://mathforum.org/library/drmath/view/63765.html

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
V. F. schrieb:

> Meine Frage ist aber eigentlich eine andere. Angenommen der Fehler der
> Doppelintegration sein vernachlässbar. Kann ich die Position auch
> bestimmen, wenn ich die Verschiebung pro Sensor nicht in alle
> Raumrichtung habe. Also z.b. wenn Sensor1->(x,y), Sensor2->(x,z),
> Sensor3->(y,z) mißt. An dem Problem sitze ich jetzt schon ne ganze Weile
> und komme nicht voran.

IMHO: nein
mathematisch begründen kann ich das jetzt nicht, ist mehr ein 
Bauchgefühl.

(vielleicht so:
Um die Matrix dingfest zu machen, benötigst du 9 Bestimmungsstücke. 
Deine 3 Sensoren liefern aber nur 6)

> Punkte mit einfließen zulassen). Undzwar gibt es einen Algorithmus der
> eine Ebene findet, das den kleinsten quadr. Abstand zu bel. viele
> Punkten besitzt. Hieraus kann man ausgehend von der Anfangsposition die
> Position der Punkte rückrechen.
> Hier der Link zum Algorithmus:
> http://mathforum.org/library/drmath/view/63765.html

Ist auch eine Idee: Man betrachtet nicht wie sich die Achsen 
transformieren, sondern wie sich die im Koordinatensystem enthaltenen 
Ebenen transformieren. Die SChnittgerade der X/Y Ebene und der X/Z Ebene 
ergibt dann die X-Achse

Autor: V. F. (farnsworth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> IMHO: nein
> mathematisch begründen kann ich das jetzt nicht, ist mehr ein
> Bauchgefühl.

Analytisch geht das theoretisch schon. Man kennt ja den Abstand der 
Sensoren untereinander. Hieraus kann man drei Gleichungen der Form: 
dij^2=|xi-x_j|^2 bilden. Da uns ja nur noch 3 Unbekannte fehlen, kann 
man so die fehlenden Koordinaten bestimmen. Jedoch muss hierbei ein 
nichtlineares GLS gelöst. Das wird richtig hässlich und langwierig wenn 
man das zb 100000mal hintereinader macht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.