Bewegungsmessung und Positionserkennung mit "Sharp-Rada
Zunächst eine kurze Einführung:
Ich habe einen SHARP - Sensor der mir Entferungen ab 15 cm bis etwa 80 cm auf 1 cm genau und bis 180 cm auf ca. 3 cm genau mißt. Möglicherweise lässt sich die Genauigkeit steigern. Ist das Hindernis weiter als 180 cm entfernt, erkennt der Sensor dies als "zu weit".
Der Sensor ist auf einen Schrittmotor montiert der 200 Schritte à 1,8° ausführen kann. Noch habe ich keine Nullpositionserkennung eingebaut, aber die kommt noch. (Magnet + Reed-Schalter)
Nun kann ich also den Sensor irgendwohin stellen und einen Rundumscan machen.
Dann trage ich ihn eine kleine Strecke weiter und drehe ihn ein wenig und mache noch einen Scan.
Das soll, wie leicht zu erraten ist, die Bewegung eines Roboters simulieren.
Nun will ich aus den beiden Scans die Bewegungsrichtung und die Drehung um die Hochachse errechnen. Dabei dachte ich an eine Art Korrelationsrechnung der beiden Datensätze.
Ich habe dazu folgende Arbeit gefunden: http://www.medialab.ch/archiv/pdf_st...navigation.pdf
Nun ist meine Frage an euch: Hat sich bereits einer von euch darüber Gedanken gemacht, wie soetwas zu realisieren ist?
In ferner Zukunft kommt zu diesem Problem noch dazu, dass nicht nur die momentane Bewegung ermittelt werden soll sondern auch die Absolutposition in einer Karte, die durch wiederholtes Messen gelernt werden soll. Aber zunächst wäre ich schon zufrieden, wenn ich überhaupt meine Bewegung ermitteln könnte.
Liste der Anhänge anzeigen (Anzahl: 1)
So! jetzt hab ich erstmal ein paar Demo-Scans gemacht.
In der Grafik oben sieht man die grafische Auswertung davon.
Blau sind die Punkte der ersten Messung
Rot sind die Punkte der zweiten Messung (um ca. 90° gedreht und ca. 5 cm verschoben)
Grün sind die roten Punkte, gedreht um die 268,2° also die "drehkompensierten" Punkte
Die Balkengrafiken stellen die Messwerte, "so wie sie im Speicher liegen" dar, also langer Balken = große Entfernung, der Reihe nach, bei "0°" beginnend.
Ganz unten sieht man das "Korrelationsergebnis" Der Algorithmus meint, das das Bild um 268,2° = 360-(90° + 1 Schritt) gedreht wurde, also ist das Ergebnis "verkehrt herum" gemessen...
Egal. Was mich aber sehr freut ist, dass die Verschiebung um 5cm praktisch keine Auswirkungen auf die Messung hat, die 1,8° Abweichung kann ich auch beim Verschieben verzittert haben...
Die Auswertung dauert auf dem ATmega8 etwa eine Sekunde, ohne jede Optimierung. Wenn man die zulässige Drehung auf +-45° beschränken würde und die Rechnung optimieren würde (Assembler statt C ...)
müsste das locker in 200 ms erledigt sein.
Da dauert ja das Scannen doch wesentlich länger :D
Liste der Anhänge anzeigen (Anzahl: 1)
So: Neuester Stand.
Nachdem mir gerade aufgefallen ist, dass ich Trottel in meinem Auswertungsprogramm ein "(1/2)" vergessen hab, und deswegen die ganze Korrelation nicht viel bringen konnte (alle Winkel falsch...)
... hab ich das ausgebügelt und nun ein paar Messungen gemacht.
Wie genau das ganze wirklich ist, ist ein bisschen schlecht abzuschätzen, aber so wie es aussieht scheint sich die Messungenauigkeit doch wieder im cm-Bereich abzuspielen.
Blöd ist noch, dass schon mein Notebook ein, zwei Minuten an der Korrelation rechnet. Aber noch ist auch nichts optimiert. Jetzt wo das Prinzip funktioniert werde ich mich an die Optimierungen wagen.
Jedenfalls ein nettes Bild:
Blau sind wieder die Punkte der 1. Messung
Rot die der 2. Messung
Schwarz die Roten Punkte um die ermittelte Verschiebung verschoben, also die "korrigierten" Punkte
1 Kasten entspricht etwa 1 cm,
das Programm behauptet die Verschiebung wären -4 Kästen in Y-Richtung
Könnte etwa hinkommen, ich hab das ganze um ca. 5 cm (Augemaß) in diese Richtung verschoben.
Die türkisen Linien sind die Objekte, deren Punkte ich zuordnen konnte...
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich hab auch sowas programmiert. Ich habe einen Sharp GP2D12 auf einem Servo sitzen und messe nach jedem schritt (insgesamt 180 grad, da sind bei mir 230 schritte). Dabei brauche ich insgesamt ca. 16 Sekunden, viel schneller dürfte es laut Datenblatt des Sensors auch nicht gehen, habe aber noch Optimierungsideen, die es etwa auf 14 Sek. drücken könnten.
In der ersten Version die jetzt läuft speichere ich die Punkte als Vektoren ab und es können immer mehr werden, da der Scanner dauernd läuft (s. Ansicht links). Im der rechten Ansicht habe ich ein Raster aufgesetzt und jedem feld eine Wertigkeit anhand der enthaltenen Punkte gegeben (schwarz=viele punkt im feld). So kann ich jetzt schon sehr gut Wände etc. erkennen, die Einstellung der Wertigkeit ist dabei Variabel. Der Vorteil ist, das ich mit den weiteren Sensoren am Roboter, die auch Ihre Daten mit einbringen, ab z.B. 3 Punkten im Feld, sicher von einem Objekt ausgehen kann. Die Rastergröße ist auch variabel einstellbar und die Ansichten können mit dem Schieber in der Mitte auch gezoomt werden. Sollte die Ansicht größer werden, erscheinen auch Scrollbalken.
Da ich dieses Semester an der Uni auch an dem dortigen Roboter mit festen GP2D12 Sensoren (glaub es waren 17) ein Ähnliches Projekt entwickelt habe, ist eine grobe Navigation zwar mit den Vektoren möglich (addition der Vektoren->Hinderniswertigkeit in einer Richtung), aber um Objekte, wie Wände zu erkennen und on-the-fly Durchgänge zu finden, eignet sich das Raster sehr gut.
Im Moment (diese Nacht *g*) arbeite ich daran, das ich nicht nur die Vektorpunkte beachte sondern auch den Vektor vom Roboter zum Punkt, denn dort ist ja frei. Es wird dann also bei jedem Rasterfeld eine Anzahl Punkte (=belegt) + eine Anzahl schneidender Vektoren (=frei) geben, welches mehr hat, wird recht bekommen, so kann ich hoffentlich ein noch genaueres Bild der Umgebung erzeugen, bzw. besonders "unsaubere" Messungen rausfiltern.
P.S. Startpunkt des Roboters ist (0|0), alle Sensor Vektoren werden von der aktuellen Position des Roboters gespeichert, es ist also ein Scannen während dem Fahren möglich (noch nicht umgesetzt). Meine Position will ich dabei durch die Fahrdaten (fahre mit Schrittmotoren) + 2 Laserscannern (aus der Laserfunkmaus) gewinnen. Erste Tests lassen mich da zuversichtlich stimmen, eine gute Genauigkeit auf flachem Untergund zu bekommen.
Liste der Anhänge anzeigen (Anzahl: 1)
Hatte ich doch richtig gesehn zu erst, es liegt schon an den Sharps diese Pause. Viel schneller wird man also leider mit einem Sharp nicht kommen pro 180 Grad (ca. 16 Sek.). Ich werde noch zwei weitere Sharp Heute montieren jeweils nach rechts und links (90 Grad), damit muss ich nur noch 90 Grad gesamt drehen und decke dann insgesamt 270 Grad ab (4 wäre natürlich dann noch schöner, gibt meine Kontruktion leider grade nicht her). Da die Pausen gleich bleiben hätte ich dann eine Scanzeit von: 115 * (16+52) = 7,82 Sek. (Ist denke ich noch auf um die 5 zu drücken)
Die selbe Zeit natürlich auch mit 4 Sensoren und dann 360 Grad abdeckung. Finde ich schon relativ gut, hat jemand von euch so einen Scanner schonmal auf einem Roboter während der Fahrt verwendet?
Aufrund der Tatsache, das wenn ich alle Vektoren speichere und behalte, mir der speicher sehr schnell ausgeht, hab ich nun die linke Ansicht als reine Scanansicht (um den roboter) gemacht. es werden also nach jedem Durchgang die vektoren wieder gelöscht. das raster rechts ist nun quasi eine Karte (gerastert halt) der Punkte aus der Scanmessung in gewertete Rasterfelder darstellt.
Ein Rasterfeld steht bei mir auf 0 (Initialwert) für unbekannt, < 0 ist frei und > 0 ist belegt (Gegenstand). Wie gesagt, jeder Sensorpunkt in dem Rasterfeld erhöht die Wertigkeit um eins, jeder schneidende Vektor erniedrigt die Wertigkeit um eins.
Leider habe ich die Berechnung für die schneidenden Vektoren noch nicht ganz geschafft, hat da jemand eine Idee? Ich könnte natürlich alle Rasterfelder als Ebenen in dem Vektorraum betrachten und prüfen ob der Vektor die Ebene schneidet, dafür müsste ich aber alle Rasterfelder abarbeiten (sind bei mir im Moment 200*200=40000 Felder a 5*5cm, decke damit 10x10m ab -> nicht grade so viel und schon ganz schön mächtig!). Ich könnte aber auch nur die Rasterfelder bis zum Vektorpunkt nehmen, das sind schonmal sehr sehr viel weniger, gibt es eine andere möglichkeit?
Liste der Anhänge anzeigen (Anzahl: 1)
Aber nun hätte ich noch eine weitere Frage an euch: Wenn ich nun also einen Rundumscan mache, erhalte ich Entfernungen.
Dazu Bild 1. (erklaer1.png)
Rot sind die Punkte der 1. Messung
Blau die der zweiten, zwischen den Messungen wurde der Roboter bewegt.
Das Grüne sollen Wände o.Ä. sein.
Liste der Anhänge anzeigen (Anzahl: 1)
Nun sollen die Messungen so verglichen werden, dass der Roboter erkennen kann, wie er bewegt wurde.
Dazu Bild 3 (erklaer3.png)
Liste der Anhänge anzeigen (Anzahl: 1)
Nun sind die Ursprünge übereinander gelegt, man kann schon das Messergebnis erahnen. Blöd ist nur dass hier Äpfel mit Birnen verglichen werden. Denn wenn die Entfernungen so verglichen werden, wären die Punkte der zweiten Messung so wie in Bild 2 (erklaer2.png) angeordnet.
Liste der Anhänge anzeigen (Anzahl: 1)
Um diesen Fehler zu vermeiden würde ich gerne die Punktwolken in kontinuierliche Kurven interpolieren, (am besten so, dass dabei massiv RAM frei wird...)
Und dann diese Kurven miteinander vergleichen. (Bild 4, erklaer4.png)
Liste der Anhänge anzeigen (Anzahl: 1)
@Manf Ah okay, da lässt sich wirklich vllt noch was rausholen! Werde das Morgen mal ausprobieren, für Heute ist die Zeit leider aus =(. Im angehängten Bild mein aktueller Status beim scannen (wohlgemerkt hat sich der Ort des Scans geändert). Habe also nun durch den Bresenham-Algorithmus auch die freien Felder mit ermittelt. Einziges wichtiges, das ich noch hab ist, das ich bisher einen ganz freien Scan nicht beachte also wenn meine Messung > 60cm ist (hab z.Zt. 60cm als Obergrenze eingestellt), werden z.Zt. keine freien Felder gesetzt.
@sep dein Ansatz die Position anhand der Umgebung zu bestimmen bzw. die Bewegung finde ich auch sehr interessant, das könnte als weitere Komponente in meine Odometrie einfliessen. Hab jetzt nicht mehr die Zeit leider, werde mir das am we mal genau anschauen. Wenn du da eine Lösung hast nur her damit, vllt ist die auch mit solchen Rasterfeldern wie ich sie nutze möglich.