Hi,
Ich möchte in meinem Zimmer ein Ortungssystem auf Ultraschallbasis
realisieren um einem Roboter so das genaue Navigieren zu ermöglichen. Da
ich momentan einfacher Zivi bin, scheiden für mich Ideen wie
Differential GPS-Beitrag "Ortung und Genauigkeit" aus
Kostengründen aus. Ich möchte wie im
Beitrag "relative Ortung" beschrieben, meine Roboter
per Ultraschall orten lassen.
(Für diejenigen, die den referenzierten beitrag nicht lesen: )
Das bedeutet, dass der Roboter zu einem Zeitpunkt einen
Ultraschallimpuls aussendet und dieser dann von 3 Empfängern im Raum
empfangen wird. Über die Laufzeit des Ultraschallimpulses kann man dann
die Position bestimmen.
Da mein Roboter jedoch möglichst eigenständig operieren soll, möchte ich
nicht nur bei festgelegten Zeitpunkten einen US-Impuls senden (schon
allein wegen der nötigen Syncronisation), sondern zu beliebigen
Zeitpunkten die aktuelle Position erfragen können.
Da das Ortungssystem somit den Sendezeitpunkt nicht kennt, erfährt es
nur die Differenzen der drei Laufzeiten ( Signal 2 braucht soviel länger
als Signal 1, Signal 3 braucht soundsoviel länger als Signal 1).
Da die Laufzeit des Ultraschallsignals zur Wegstrecke analog ist, werde
ich im Weiteren nur noch von der Strecke sprechen.
Wenn ich nun um den Empfänger der zuerst das Signal empfangen habe einen
!!kleinen!! Kreis ziehe, und dann um den zweiten Empfänger einen Kreis
ziehe, dessen Radius um die Differenz der Ultraschalllaufzeit größer
ist, und so auch beim dritten Empfänger verfahre, so treffen sich die
drei Kreise in einem Punkt, wenn ich die drei Radien gleichmäßig
vergrößere (siehe Kreise.png).
Aufgrund dieser Überlegung habe ich ein Gleichungssystem aufgestellt,
welches den Schnittpunkt der drei Kreise beschreibt, welcher ja die
Position des Robots ist.
Dabei sei xa die x-Koordinate des ersten Empfängers und ya die
y-Koordinate. xb und yb, sowie xc und yc gelten respektive für für den
zweiten und dritten Empfänger.
x und y sind die Koordinaten des Schnittpunktes.
dA, dB und dC sind die Laufzeitdifferenzen, diejenige des Empfängers,
der zuerst etwas empfangen hat ist immer Null.
r ist der Radius des kleinsten Kreises.
Ich habe dieses Gleichungssystem in wxMaxima getestet (Datei im Anhang)
und solange nur ganze Zahlen verwendet werden, liefert es die richtigen
Ergebnisse. Wenn gebrochene Zahlen vorkommen, liefert Maxima kein
Ergebniss, ich gehe davon aus, dass dies daran liegt, dass dann kein
exaktes Ergebniss vorliegt.
Ich habe auch schon zwei mögliche Platinen erstellt, doch die werde ich
erst ätzen lassen, wenn ich davon ausgehen kann, dass das ganze dann
auch funktionieren wird.
Für mich verbleiben nun noch zwei Probleme für deren Lösung ich das
Forum um Hilfe anrufe:
1:) Ich habe keine Ahnung, wie ich die Gleichung ohne ein CAS lösen
würde. (Beziehungweise meine Ansätze führen [im CAS] zu falschen
Ergebnissen).
2:) Ich habe noch weniger Ahnung, wie ich das ganze dann wirklich in
brauchbaren, schnellen Code für einen AVR umwandeln würde. Damit meine
ich, dass ich das Problem sehe, den Rechenteil dann auch in meine
Firmware zu übernehmen, bis jetzt waren meine Projekte noch ein
Stückchen einfacher. Aber wahrscheinlich wird sich das zweite Problem
klären, wenn sich das erste klärt.
Was haltet Ihr von der Idee/dem Projekt? Denkt Ihr, dass es
funktionieren wird/kann? Seht Ihr (schon) Fehler?
mit freundlichen Grüßen,
mox-mox
Anhang:
Koordinatensystem.geo: 'Zeichnung' zu öffnen mit Euklid Dyna Geo
http://www.dynageo.de/
Kreise.png: Bildschirmabbild von Koordinatensystem.geo für diejenigen,
die Dynageo nicht 'runterladen wollen
US_Ortung.wxm: wxMaxima-Dokument
http://maxima.sourceforge.net/
ANTI-GPS-Platine.zip: Platinen und Schaltpläne für Eagle
Von den Zeiten her sollte es gehen.
Schall: 300m/s --> 3,3Millisekunden pro Meter. Dann die Differenzen
bestimmen und berechnen. Die Kreise sollten durch Rechtecke angenähert
werden. Die Kreisformel wird sonst zu lang.
Hi, sorry falls die Frage jetzt blöd klingt, aber wie genau kann ich die
Kreise durch Rechtecke annähern? Ich mein, wenn ich den zu bestimmenden
Punkt nicht kenne, wie wird dann das Rechteck festgelegt? Könntest du da
etwas genauer werden? Weil so kann ich mir da irgendwie wenig drunter
vorstellen. :(
Danke für die Antworten bis jetzt.
mox-mox
Im Grunde müsste es so gehen:
(x − xM)2 + (y − yM)2 = r2
Gefragt sind ja nicht nur die Mittelpunkte. R ist der Abstandszeitwert
der mit den Sensoren gemessen wird. Xm und Ym sind die Mittelpunke des
Kreises. x und y die Laufwerte. Diese Laufzeitwerte werden für zwei
Kreise zwei Lösungen liefern (beim Gleichsetzen). Daraus lassen sich
dann zwei Werte für Ym und Xm bestimmen.
Das mit einem uP in Echtzeit zu berechnen, wird happig am Limit liegen.
Zumal hier mehrere verschachtelte Gleichungen vorliegen werden, die alle
für sich gelöst werden müssen. Die Lösungen dafür kann man schnell mit
einem CAS bestimmen. Per Hand wird es ab zwei Kreisen dann doch
fehleranfällig. Ich empfehle Dir eine Version von Mathcad (V 6.0). Damit
lassen sich diese Fragestellungen in geschlossene Ausdrücke umschreiben.
Bei einer Annäherung des Kreises an ein Rechteck (Geradengleichungen),
in Form von Polygonzügen, könnte man mit einfacher Vektorrechnung den
gemeinsamen Punkt bestimmen.
Viel Erfolg
Hi,
Erstens: Sollen die 2er Quadrate sein?
-> Wenn sie Quadrate sind, dann hast du da die Gleichung für nen Kreis
da stehen und kein Rechteck.
-> Wenn sie wirklich einfache 2er sind, dann kann man sie auch weglassen
(Distributivgesetz)
Zweitens: Wenns so einfach wäre, dann hätte ich das ja schon, mein
Problem liegt doch darin, dass ich eben keinen absoluten Wert für r
kenne, weil ich die absolute Laufzeit nicht kenne:
Mein bot soll zu einem beliebigen Zeitpunkt (=> Ortungsgerät kennt
diesen Zeitpunkt nicht) einen Ultraschallimpuls senden. Wenn der erste
von drei Empfängern etwas "hört", startet er einen Timer, und an diesem
werden dann die Zeitpunkte an denen der Zweite und der Dritte Empfänger
etwas "hören" gemessen. Somit kann ich nur sagen, dass die Strecke zum
Zweiten Empfänger um einen bestimmten&bekannten Betrag länger ist, als
die Strecke zum Ersten, und dass die Strecke zum Dritten Empfänger um
einen anderen auch bestimmten&bekannten Betrag länger ist.
Wenn du Du Dir mein Gleichungssystem im Ausgangspot anguckst, wirst du
feststellen, dass es fast identisch ist zu deiner Gleichung, mit der
Ausnahme, dass ich den Kreisradius eben in den bekannten und den
unbekannten Teil aufgeteilt habe.
Gruß,
mox-mox
p.S.: Danke für den Tipp mit MathCAD, das werde ich ausprobieren.
edit: Rechtschreibung (schwer die deutsche Sprache seien...)
Ich sage Dir das wirklich nur ungerne, aber: Das Projekt ist vermutlich
zu aufwendig. Über das Thema wurden bereits mehrere Doktorarbeiten
angefertigt - es hat es wirklich in sich.
Falls Du Dich trotzdem nicht davon beirren lässt, zwei kleine Tipps:
Variante 1:
Bau ein zweites Referenzsystem ein. Ich würde eine IR-Diode nehmen.
Diese steht in Sichtkontakt zu einer Deiner Ultraschallstationen. Sendet
Dein Fahrzeug die Position per Ultraschall, so leuchtet die Diode. Damit
timest Du Deine Messung.
Variante 2:
Lass die Stationen das Ultraschallsignal emitieren. Nicht gleichzeitig,
sondern kurz nacheinander. Dadurch errechnet das Fahrzeug seine Position
anhand der Schnittpunkte der einzelnen Laufzeiten und (!!!) dem Versatz
der Signalanfänge.
Und ja, es sind Quadrate ^2. (auch ich musste irgendwann den LK Mathe
absolvieren...)
>-> Wenn sie Quadrate sind, dann hast du da die Gleichung für nen Kreis>da stehen und kein Rechteck.
Seit wann breiten sich Wellen einer annähernd punktförmigen Quelle
rechteckig aus?
Weil niemals exakt lohnt es sich nur die jeweils (beiden) Schnittpunkte
der Standkreise zu berechnen. Gibt bei drei Kreisen am Ende 6 Punkte und
deren Mittelwert ist dann mit entsprechender Genauigkeit Deine Position.
Und die beiden Schnittpunkte von zwei Kreisen sollte man auch noch mit
Bleistift und Papier lösen können. U.U. lohnt sich die Verwendung eines
anderen Koordinatensystems als dem Rechtwinkligen. (Denn dort lassen
sich Kreise nicht als geschlossene Funktion y=f(x) darstellen was dann
immer die Fallunterscheidung obere Hälfte/untere Hälfte mit sich
bringt.)
Ansonsten - es muss nicht immer zwei Schnittpunkte geben wenn die Kreise
sich nicht überlappen - dann bietet es sich dann die beiden Punkte
welche am nächsten zueinander liegen als Wertepaare zu verwenden.
Viele Grüße,
Martin L.
PS: Ich denke das Projekt ist nicht besonders anspruchsvoll und gut
nebenher machbar. Ne Doktorarbeit wird es jedenfalls nicht - dafür
müsste man schon noch die Reflektionen mit einbeziehen.
Hallo
Ich würde den Roboter einen Ultraschall-Impuls aussenden lassen, auf den
die 3 Stationen dann quasi antworten. Das ganze noch ein bißchen
zeitversetzt. Soll heißen Station 1 antwortet sofort, Station 2 nach
genau einer halben Sekunde, 3 nach einer Sekunde (bei größeren Räumen
evtl. anpassen damit es nicht zu Überschneidungen kommt).
Der Rob enpfängt diese Signale wieder. Er kann somit klar die jeweilige
Station idendifizieren und kann nach dem Prinzip die absolute Entfernung
zu jeder Station ausrechnen. Die 3 Absoluten Entfernungen sollten sich
dann recht einfach zu den Koordinaten verrechnen lassen...
Wozu eigentlich 3 Empfänger?
In der Ebene würde auch 2 (erstmal) reichen.
Hast du schon mal einen Test gemacht?
Ich würde zwei Empfänger an ein Osziloskop hängen und mir den zeitlichen
Versatz zwischen den Signalen angucken.
Interessant wären auch die Echos.
Gibt es eigentlich omnidirektionale Luft-Ultraschall-Wandler?
Oder zumindest welche mit einem großen Öffnungswinkel?
> Wozu eigentlich 3 Empfänger?> In der Ebene würde auch 2 (erstmal) reichen.
Aber nur wenn die Empfänger geschickt platziert werden. Sonst sind
nämlich mit nur 2 Empfängern 2 Lösungen möglich.
Das ganze Problem ist sehr ähnlich zur Positionsbestimmung mit
Satellitennavigationssystemen. Dabei wird das Gleichungssystem immer
stückweise linearisiert und dann iterativ gelöst. Das sollte auch in
diesem Fall die einfachste Möglichkeit sein. Am besten einfach mal im
Quellcode von einem Open-Source GNSS Empfänger nachvollziehen.
>Aber nur wenn die Empfänger geschickt platziert werden. Sonst sind>nämlich mit nur 2 Empfängern 2 Lösungen möglich.
Darauf sollte man schon achten.
Drei Sensoren machen schon Sinn, wenn sich die Sensoren nicht direkt auf
der gleichen Ebene wie der Sender befinden (unterschiedliche Höhen).
Zum Ausprobieren reichen aber zwei und ein Oszilloskop.
>Das ganze Problem ist sehr ähnlich zur Positionsbestimmung mit>Satellitennavigationssystemen. Dabei wird das Gleichungssystem immer>stückweise linearisiert und dann iterativ gelöst. Das sollte auch in>diesem Fall die einfachste Möglichkeit sein. Am besten einfach mal im>Quellcode von einem Open-Source GNSS Empfänger nachvollziehen.
Triangulation im Bereich des Wasserschalls ist schon etwas älter, sollte
also auch nicht einfacheren Mitteln als Satellitennavigation
funktionieren.
Du hast die Hyperbelnavigation neu erfunden, die Standlinien konstanter
Laufzeitdifferenz sind Hyperbeln, Loran arbeitet (arbeitete?) z.B. so.
Deswegen wird es für die Lösung der obengenannten Gleichung sicher
Standards geben, die sich bestimmt finden lassen.
Ich habe allerdings mal Mathematica nach der Lösung oben aufgestellten
Gleichungssystems gefragt.
Das geht so:
CForm[Solve[{(x - xa)^2 + (y - ya)^2 == (r)^2,
(x - xb)^2 + (y - yb)^2 == (r + dB)^2,
(x - xc)^2 + (y - yc)^2 == (r + dC)^2}, {x, y, r}]]
Es gibt zwei Lösungen, die enthalten Quadratwurzeln, eine wird ein
komplexes Ergebnis liefern. Die Lösung ist allerdings in der source
länger als 1/2Megabyte ;-))) , das frißt nicht jeder C-Compiler.
Ausprobiert hab ichs nicht.
Math rulez!
Cheers
Detlef
PS: Ich bin auch der Meinung, dass die Ortung mit Ultraschall nicht
gehen wird, weil dir Mehrwegausbreitung und Reflexionen das versauen.
Hi,
danke für die vielen Antworten, sorry, dass ich erst jetzt antworte, war
ziemlich viel los die Woche, und ich hab die eMailbenachrichtigung
übersehen.
Also, der Reihe nach durch:
@ Niels Keller (niels-k):
1.) Ich wollte nicht Deine Mathekenntnisse in Frage stellen, das war
nicht böse gemeint. Ich habe mich nur gefragt, in welchem Zusammenhang
das zu dem Rechteck stehen sollte, das Du davor erwähnt hattest. Ich war
schon davon ausgegangen, dass Du das als Quadrate meintest.
2.) Das mit den Doktorarbeiten wusste ich nicht, ich hätte nciht
gedacht, dass das so kompklex ist. Aber Deine beiden Ansätze klingen
eigentlich ganz gut :-)
@ STK500-Besitzer:
1.) Falls die Frage, seit wann sich die Wellen einer nahezu
Punktförmigen Quelle Reckteckförmig ausbreiten an mich gerichtet ist, so
möchte ich auf jenen Satz von Niels Keller (niels-k) verweisen:
> ...Die Kreise sollten durch Rechtecke angenähert> werden. Die Kreisformel wird sonst zu lang.
2.) Drei Empfänger deshalb, weil 2 nicht reiche, wenn man den
Sendezeitpunkt nicht kennt ;-)
3.) Ich hätte wegen den Öffnungswinkeln zuerst einfach mal drauf
vertraut, dass ich einfach was empfange. Wen das nicht geht, dann hätte
ich versucht, mit einer art Kegel den Schall abzulenken. Quasi so:
________
\ /
\ /
((( \ / )))
\ /
_______
\ /
\ /
| |
|__|
@ Martin Laabs (mla):
Aus reiner Neugier: Welches Koordinatensystem schwebt Dir da vor?
@ Matthias Becher (matthias882):
Kligt auch gut.
@ Richard W. (ronw):
Super Tip mit dem Quellcode. Muss ja nicht das Rad neu erfinden.
@ Detlef _a (detlef_a):
Irgendwie war Deine Antwort ernüchternd. Danke, dass Du mir deutlich
gemacht hast, dass meine Idee definitiv nicht so einfach wird, wie ich
es mir vorgestellt habe.
------------------------------------------------------------------------
---
=> Mein Favorit ist wohl die Idee mit einer zusätzlichen Leutdiode. Das
vereinfacht das das Problem entscheidend, und wenn ich für jeden
Empfänger nur einen Empfang zulasse, dann sollte ich damit eventuell
Refektion in den Griff bekommen oder zumindest mildern.
Danke für eure Anregungen!!!
> @ Martin Laabs (mla):> Aus reiner Neugier: Welches Koordinatensystem schwebt Dir da vor?
Na ein polares Koordinatensyste.
Da ist jedenfalls der Kreis im Ursprung sehr einfach und nur vom Winkel
abhängig. Verschobene Kreise sind dann zwar wieder von zwei Variablen
abhängig aber wenigstens ist es noch eine Funktion.
Viele Grüße,
Martin L.
PS: Wobei ich mir ziemlich sicher bin, dass man das Problem auch mit der
Schulvektorarithmetik (evt. LK) lösen kann.
Sorry wenn ich mich einmische.
1. Die Schallgeschwindigkeit ist von der Temperatur abhängig und liegt
bei Luft bei ca. 331,5m/s + 0,6 v/°C, oder bei ca. 343m/s bei 20°C.
Luftströmungen (offenes Fenster) beeinflussen die Messung nicht
unerheblich.
2. Bei einer Ultraschall-Sender-Empfänger Kombi ist das Signal am
Empfänger nicht exakt. Will sagen Du gibst 20 Rechteck-Impulse auf den
Sender und hast beim Empfänger ein Sinusförmiges Signal das sich langsam
aufbaut (fast Fischförmig sieht das aus). D.H. Du must die
Schaltschwelle für Deinen Empfänger knapp über das Rauschen, aber tief
genug setzen um die erste Welle zu erwischen. Nimmst Du erst die 2te
oder 3te Welle war, verschieb sich Deine Messung um ca. 9mm bzw. 18mm.
Ich habe das mal versucht und konnte einen Punkt im Raum mit +- 10mm
(kugelförmig) Genauigkeit Orten. Das ganze mit 4 Sendern und 1
Empfänger.
Also: Temperatur einkalkulieren, und mehrfach Messen und dadurch
Ungenauigkeiten rausrechnen bzw. ausfiltern.
>2.) Drei Empfänger deshalb, weil 2 nicht reiche, wenn man den>Sendezeitpunkt nicht kennt ;-)
Hast du auch drei Ohren?
Natürlich reichen 2 Empfänger für eine Ebene (2D-Messung).
Wenn man den Abstand zwischen den beiden Empfänger weiß (und konstant
hält) und die Schallgeschwindigkeit kennt (Das Klima im Zimmer sollte
möglichst konstant sein...), dann sollte man aufgrund des
Laufzeitunterschieds zwischen den beiden Empfänger seh einfach auf die
Position des Senders schliessen können. Da gibt es dann höchstens das
Problem, dass sich der Sender "vor" oder "hinter" den Sensoren befindet.
Das sollte man aber durch den räumlichen Aufbau in den Griff bekommen
(z.B. dadurch, dass der Roboter sich nur auf einer Seite des Messaufbaus
befinden kann).
Bei nur 2 Empfängern muß der Sender und der Empfänger irgend wie
synchronisiert werden. Die Messung der Laufzeitdifferenz allein genügt
nicht.
Bsp:4m zum 1. und 3m zum 2. -> Diff 1m == 10m zum 1. und 9m zum 2.
Empfänger auch 1m Diff.
Aber das Ganze ist machbar. Ich habe die Berechnung für einen Atmega8 in
C geschrieben und im AVR Studio simuliert.
Meine Variante:
Ein Sender und drei Empfänger. Der Sender sendet einen Impuls der bei
einem Empfänger zuerst ankommt (t1) dann am Zweiten (t2) und am Dritten
(t3).
Bei t1 ist Strecke s1=0 bei t2 ist s2=(t2-t1)*vSchall und bei t3 ist
s3=(t3-t1)*vSchall. Die Koordinaten x1,y1,x2,y2,x3,y3 und die dazu
gehörigen Strecken s1,s2,s3 werden der Funktion übergeben. Es spielt
dabei auch keine Rolle welche Strecke 0 ist.
Die Auswertung braucht 4,8kB Programmspeicher und ist in etwa 10ms bei
16MHz abgearbeitet.
...
hp-freund
>Bei nur 2 Empfängern muß der Sender und der Empfänger irgend wie>synchronisiert werden. Die Messung der Laufzeitdifferenz allein genügt>nicht.>Bsp:4m zum 1. und 3m zum 2. -> Diff 1m == 10m zum 1. und 9m zum 2.>Empfänger auch 1m Diff.
Gute Begründung.