Suche Algorithmus für die Abtastung von Räumen

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo,

es geht um folgendes Szenario:
ich möchte einen "Roboter" bauen, der die gesamte Bodenfläche eines Raumes abfährt. Dabei lasse ich zunächst die Hadware weg und beschäftige mich mit der Software: wie kann man es ermöglichen, dass der Roboter in jedem Raum alle Flächen abfährt und dann irgendwann erkennt, dass er fertig ist?

Ich finde einfache keinen Ansatzpunkt, um diesen Algorithmus zu entwickeln. Vielleicht habt Ihr einige gute Ideen - so Brainstormmäßig ... :):)

Gruß,
CPU
 
Behandele doch den ganzen Raum als Labyrinth und versuche immer rechts zu gehen
 
Schau dir mal Flood-Fill Algorithmen an, womit man in Malprogrammen Flächen füllt.
 
hmm, erstmal die maße des raumes , dann die scanbreite z.B. 20 cm, die breite muss dann halt unterteilt werden, z.B. ein flur mit breite 60cm ( nur als beispiel ) dann muss er halt 3 bahnen fahren.

die tiefe eines raumes spielt bei diesem problem glaube keine rolle oder ?

sonst wüsste ich auch nicht weiter jetzt....
 
soll es ein staubsauger robotter werden da er alle flächen abfahren soll ???
mach es so wie die robotter die den Rasen mähen die haben doch so eine zufallsfunktion

dahartehartl
 
Das ging ja schnell ... also noch ein Wort zum Szenario: Ihr kennt doch sicher diese Staubsaugerroboter, oder? Sowas soll's werden. Nur halt ohne Sauger ... und möglichst mit wenig technischem Aufwand (d.h. keine Bildverarbeitung eher: Drucksensoren etc.) :D:D

Das Problem ist ja (auch zum Floodfill):
* es gibt keine eindeutige Datenstruktur, die man abfragen kann, ob das Feld noch belegt ist oder so ... der Roboter ist nach dem Download des Programms auf sich selbst gestellt und muss das Terrain abfahren ... es können auch u.U. Gegenstände im Weg stehen, um die man manövrieren muss.
* um alle Ecken fahren ist nicht so einfach; bei abgerundeten Wänden?

Also generell glaube ich, dass man sich von Niki (wer TP noch kennt) oder JavaKara lösen muss ...
 
Nimm ein Drucksensor.
Bei Berührung fährt er ca 10cm nach hinten, dreht um XYZ Grad und fährt vorwärts.

Stichwort:
Für Soft- und Hardware:

lego mindsostorms
Damit kann man viel machen :)
 
Zuletzt bearbeitet:
Stichwort NXT 2.0: Habe ich bereits zu Hause.

Gut, ich kann den Rober ja rumlaufen lassen und bei Kollision um x Grad drehen. Aber: wann weiß der Roboter, dass er fertig ist und alle Flächen abgearbeitet hat?
 
Kennt der Roboter den Grundriss des Raumes?
Quasi kannst du die Form in das Prog integrieren?

Roboter fährt los, stößt auf Widerstand, wendet um 180° fährt los stößt auf Widerstand: X achse
Ändert Richtung,gleiches Verfahren: y achse
Evtl. Raumänderungen werden gespeichert und ein Profil erstellt
Er kann ja dann immer um belibige cm nach rechts oder links rutschen.
Startpunkt und zurückgelegte Strecke auch speichern.
Auf diese Weise erstellt er ein Profil des Raumes und weis dann selbst wann er fertig ist.
Wie als wenn du blind bist und dich in einem fremden Raum zurechtfinden musst
 
Zuletzt bearbeitet: (Verdammte Interpunktion)
würde die umwelt des staubsaugers in genügend kleine quadrate aufteilen, zb 10x10cm und reinforcement-learning drauflassen. immer wenn der roboter eine neue fläche betritt, bekommt er eine belohnung (eine variable wird um einen bestimmten wert erhöht), wenn er auf einen bereits befahrenen quadrat drauftritt oder gegen eine wand stößt, bekommt er eine bestrafung in bestimmter höhe. der RL-algo wird startend aus einer unbekannten umwelt aus 10x10cm kacheln und nur mit den operationen fahre links/rechts/geradeaus/rückwärts nach und nach einen optimalen pfad über alle quadrate bestimmen.
 
Zuletzt bearbeitet:
"reinforcement-learning" funktioniert hier nicht, da es sich ja um eine "reale Welt" handelt. das bedeutet, dass man ja nicht den gesamten Raum einteilen kann, wenn man ihn nicht kennt. Ich habe selbst den A*-Algorithmus implementiert. Aber soetwas geht ja nur, wenn man das "(Spiel-)Feld" in einer Datenstruktur verwaltet.

Also ich würde es zunächst gerne probieren, ob es ohne jegliche Informationen geht. Denn ein so'n Staubsauger, den ich bei meiner Suche gefunden habe, der hat sofort losgelegt. Irgendwie muss das doch gehen.

Und Du meinst, dass es theoretisch möglich wäre, wenn man sich die Entfernungen und so merkt?
 
Hättest du oben gesagt, dass du tiefer einsteigen willst, oben hast du nach einem Ansatzpunkt gefragt. ;)
Wie stellst du dir das Orientierungs-System, die Sensorik vor? Davon hängt die Algorithmik wohl ziemlich stark ab.
Herauszufinden welcher Teil abgearbeitet wurde, sollte den trivialsten Teil darstellen. :)
 
Zuletzt bearbeitet:
Theoretisch, wenn die zurückgelegte Strecke und die Winkel um die sich das Gerät dreht gespeichert und verarbeitet werden können.
Wie geschrieben ich denk grad wie ein Blinder.
 
Also das mit dem Vorstellen ist so eine Sache ... :freak: im Moment ist noch Leere bezüglich dieses Themas in meinem Kopf ...

Normalerweise läuft das bei mir so (wenn ich so einen Algorithmus entwickeln will): ich suche ein bissen bei Google. Wenn ich ein Ergebniss finde :D:D *toll*
Wenn ich dann verzeifelt bin schreib ich ins Forum und dann postet irgendjemand einen Link, der zu einer genialen Seite führt, auf der ein ähnliches Problem behandelt wird und ich kann daraus schon eine Menge ableiten für mein Problem (nebenbei; mein Motto: man sollte das Rad nicht zweimal erfinden) ...
 
was wäre, wenn dein bot einen laserdistanzmesser mit rs232 hätte? somit könnte er doch mit einer 360° umdrehung alle sichtpunktabhängigen hindernissse einlesen und sich daraus eine map erstellen. ausgehend von dieser map, könnte er auch leicht herausfinden wo er sich grad befindet und wo sich noch die unbekannten flächen befinden. ist das erstmal im kasten, kann man den staubsauger-algo anwerfen.

seinen winkel könnte er mit einem kompass mit rs232 bestimmen. :) jedenfalls braucht der bot paar klasse geber wenn er halbwegs effizient auf einer unbekannten map arbeiten soll.

wenn garnichts mehr gehen sollte, mach ein den hier :D
 
Zuletzt bearbeitet:
Hi,
ich melde mich normalerweise in diesem Forum nicht zu Wort, aber da ich genau über dieses Thema meine Diplomarbeit schreibe hab ich mich doch mal angemeldet.

Ohne dir Angst machen zu wollen - das ganze ist komplizierter als man Denkt.

Die Kern-Problematik besteht darin, dass die Sensordaten die du erhälst immer RELATIV zur Position sind. Dh um ein Objekt "10 m vor dem Sensor" in deine Karte einzutragen müssen die ABSOLUTEN Koordinaten des Objekts bekannt sein. Dies geht nur, wenn die eigene Position exakt bekannt ist.
Und genau da beginnt das Dilemma: Wie bestimmt man in einer unbekannten Umgebung seine eigenen Position präzise, wenn die Karte dieser Umgebung noch nicht fertig ist? GPS ist zu ungenau und indoor kaum verfügbar ;)
Das ganze nennt sich aus dem Englischen kommend Simultaneous Localization and Mapping.

Mit einem einfachen Drucksensor wirst du da kaum Erfolg haben - aber ein teurer http://de.wikipedia.org/wiki/Laserscanner ist auch nicht nötig. Eine einfache Webcam genügt (obwohl diese keine Tiefeninformation generiert).

Wenn du ernsthaft einsteigen willst, solltest du dir als Buch in einer Bib mal
Probabilistic Robotics (Intelligent Robotics and Autonomous Agents) von Sebastian Thrun, Wolfram Burgard, und Dieter Fox
ansehen. Auch googlen nach diesen 3 Namen ist sehr gut, da die alle sehr offen mit ihren Forschungsergebnissen umgehen.

Fertig implementierte SLAM-Algorithmen findest du unter anderem auf openslam.org/

Einen relativ guten Überblick über verschiedene Algorithmen bietet Robotic Mapping: A Survey von Sebastian Thrun, dem Autor des Buchs. Er hat 2 mal hintereinander mit seinem Stanley und SLAM mithilfe von FastSLAM 2.0 sehr erfolgreich an den Wettbewerben der http://de.wikipedia.org/wiki/DARPA teilgenommen: 2005, 2007.

Der von seiner Uni entwickelte FastSLAM Algorithmus gilt als einfach zu implemtieren und gleichzeitig schnell (wie der Name schon sagt ;-)). Deswegen hab ich den damals auch gewählt...

Was bei dir noch hinzukommt ist ein komplett anderes Thema: Die automatisch Routenplanung. Du stellst dir ja schließlich vor, dass dein Roboter die Erkundung (engl: Exploration) selbstständig durchführt. In dem Gebiet hab ich mich nicht viel umgelesen - aber es gibt eine sehr aktuelle und gute Doktorarbeit zu beiden Themen gemeinsam:
Contributions to Localization, Mapping and
Navigation in Mobile Robotics
.

Solltest du immernoch Lust haben das ganze auszuprobieren und dich auch für FastSLAM entscheiden, kann ich dir als Einstieg in die Implementation FastSLAM 1.0 in Python mit unknown data association empfehlen.
Wenn du statt Python lieber Matlab hast, dann ist Homepage von Tim Bailey sicher hilfreich. Er hat auch das als qualitative Referenz geltende EKF SLAM dort als Matlab-implementation im Angebot.


Hoffe ich konnte dir etwas helfen...
 
[GP] mino schrieb:
somit könnte er doch mit einer 360° umdrehung alle sichtpunktabhängigen hindernissse einlesen und sich daraus eine map erstellen. ausgehend von dieser map, könnte er auch leicht herausfinden wo er sich grad befindet und wo sich noch die unbekannten flächen befinden.

Also quasi:
Code:
1. Position bei x=0, y=0, winkel=0 initialisieren
2. Sensordaten zu Karte verarbeiten
3. Fahrzeug bewegen
4. Neue Position mit neuen Sensordaten und der bisherigen Karte bestimmen
GOTO 2

Die Idee ist natürlich schon sehr richtig. So arbeitet zu einem Teil jeder SLAM-Algorithmus. Man nutzt seine unvollständige Karte zur Positionsbestimmung.
Das Problem hierbei ist nur, dass dieses Verfahren nur in einem Robotersimulator funktionieren würde, wo man fehlerfrei messende Sensoren simulieren kann.

In der Realität arbeitet man immer mit Messfehlern.
Zum einen beim ersten einlernen des sichtbaren Teilbereichs und im nächsten Schritt dann bei der nächsten Messung zur Positionsbestimmung werden Messfehler einen unbekannten Fehler in die Positionsbestimmung bringen.

Die gleiche Idee könnte auch lauten:
"Lass dir durch ein Odometriesystem immer die aktuelle Position geben und nutz diese um die Sensordaten in absolute Koordinaten umzurechnen".
Wenn du deinem Fahrzeug sagst es soll 10m gerade aus fahren, wird es allerdings immer einen leichten Drift haben und somit intern eine andere Position annehmen ("Ich bin doch nur gerade aus gefahren?") als es tatsächlich hat.

Dieser Fehler mag auf den ersten Blick lächerlich klein wirken, wenn man mit guten Sensoren arbeitet - aber er schaukelt sich innerhalb von Sekunden zu unbrauchbaren Ergebnissen hoch. Macht man aufgrund von Messfehlern nur einen Fehler von 0,1° bei der Fahrzeug-Blickrichtungs-Bestimmung bedeutet das für eine Landmarke die auf 20m Entfernung gesehen wird einen absoluten Positionsfehler von ~3,5 cm. Dieser Fehler setzt sich nun aber fort! Denn mit dieser falsch eingespeicherten Landmarke wird ja auch die nächste Position bestimmt.

Solange man bei der Positionsbestimmung nur auf ein einziges System setzt werden die Messfehler zwangsläufig einen Fehler erzeugen, der nicht kompensiert wird.
Der Roboter hat quasi keine Möglichkeit zu merken, dass er einen Fehler macht.

Wie in echt auch: Wenn man sich ausschließlich mit einer politisch einseitigen Zeitung bildet und keine anderen Informationen bekommt um die Artikel kritisch zu hinterfragen nimmt mal sie automatisch als wahr an. Man kann ja ohne andere Zeitungen / Menschen / Fernsehen etc. garnicht merken, dass die einzige Info-Quelle die man nutzt nicht neutral ist.

Oder ein anderes Beispiel: In Geiserbahnen gibts manchmal so kleine Brücken die durch eine drehende Röhre führen. Das Auge sagt dir, dass deine Welt umkippt und du möchtest da gegen steuern. Dein Schwerkraftsensor im Ohr vermittelt dir allerdings, dass alles in Ordnung ist. Diese beiden sich widersprechenden Infos machen einen "Seekrank". Eine einfache Möglichkeit da durch zu kommen ist hier natürlich einfach die einzige fehlerhafte Informationsquelle zu ignorieren, indem man die Augen schließt.

Die Idee ist daher immer auf mindestens 2 Systeme zur Positionsbestimmung zu setzen und diese zB mittels Extended Kalman filter zu fusionieren

Wenn du neben einem wahrnehmenden Sensor noch Odometrie hast wäre das:
Code:
1. Position bei x=0, y=0, winkel=0 initialisieren
2. Sensordaten zu Karte verarbeiten

3. Fahrzeug bewegen
3a. Ersten Positionsvorschlag Pos1 durch Odometriesystem generieren
3b. Zweiten Positionsvorschlag Pos2 durch bisherige Karte und Sensordaten generieren
4. Angenommene Position entsprechend der Odometrie setzen
5. Aktuelle Sensordaten nutzen um die Karte zu erweitern.
6. Einen Kompromiss aus Pos1 und Pos2 bilden (EKF) und als aktuelle Position setzen
GOTO 3

Das entspricht dann FastSLAM 2.0 wo der Partikelfilter fehlt, weswegen es "einfach" zu implementieren ist.
Für unter anderem gaussches Sensorrauschen (Fehler mit Mittelwert = 0, StdDev bekannt) kann man hier sogar konvergenz gegen Realität beweisen für unendlich lange fahrten. Das ganze hat O(1) und ist daher auf jeden Fall echtzeitfähig implementierbar bei Datenraten weit über 100Hz. Also muss das Fahrzeug auch nich stockend fahren, weil der Rechner zu langsam ist ;-) Es wird eher so sein, dass der Algorithmus sich langweilt und darauf wartet, dass der Sensor endlich mal wieder gesehene Landmarken liefert.

Die Schwierigkeit steckt noch in Schritt 5: Wie legt man 2 leicht zueinander unterschiedliche Karten übereinander und bildet einen Kompromiss? Das ganze wird ausführlich hier erklärt.

In Kurzform: Für jede gesehene Landmarke wird überlegt, ob sie bereits bekannt ist. Man berechnet quasi die Wahrscheinlichkeit zu jeder bekannten Landmarke. Wenn diese Wahrscheinlichkeit für keine bekannte Landmarke einen gewissen Schwellwert überschreitet, wird die gesehene Landmarke als "neu" der Karte hinzugefügt. Diese Identifikation hat dann leider O(N) - geht aber in realen Szenarien immernoch schnell genug.
 
Zuletzt bearbeitet:
vermute stark, CPU möchte schnell und einfach ergebnisse sehen und aha-effekte erleben :) ein selbststudium über so viele dissen würde sogar bei vorhandenen grundkompetenzen schnell die luft aus den segeln nehmen - auch wenn die theorien die ultimative lösung offenbaren würden. mir würds zumindest so gehen :D

was wäre, wenn man an der deckenlampe eine wii-remote befestigt und ein den hier macht? winkel und absolute position wäre doch auch damit ermittelbar. solang der bot nicht unter einen tisch fährt
 
Jo sowas in der Art würde jederzeit ne globale Position liefern und keinen Fehler aufschaukeln. Hier und da mal nen Messfehler ist zwar immernoch da aber nicht schlimm, weil die Karten dann nicht zur Positionsbestimmung benutzt werden.

Deine Idee ist interessanterweise genau das gleiche, was hier neulich auf computerbase.de vorgestellt wurde:
Audi TTS soll selbstständig auf die Rennstrecke. Dieses stanford-racing-team is ja auch das Team was bei diesen DARPA Wettbewerben so gut abgeschniten hat, die ich oben verlinkt hatte.
Die nutzen halt keine LEDs zur orientierung sondern dGPS was natürlich genauer ist aber das gleiche leistet wie bei deiner Idee mit der WII-Remote.

Die 2 LEDs sind wahrscheinlich nicht unterscheidbar?
Könnte sein, dass man dann 2 Sensorbars braucht, damit das ganze un-symetrisch wird. (Montiert in T-Form oder so). Ansonsten sieht es ja für die WII-Remote identisch aus, ob das Fahrzeug nach Norden oder Süden guckt. Bei mehr als einer Sensorbar wird aber die WII-Remote wieder nicht funktionieren. ka..
Ansonsten evtl eine Sensorbar oben drauf und eine seitlich montieren? Dann eine WII-Remote an die Zimmerdecke und eine an ner Wand. So weiß man auch eindeutig wohin das Fahrzeug guckt.

Wenn er auf seinem Fahrzeug die Sensorbar montiert könnte es sogar mit dem Drucksensor was werden so grob Hindernisse zu finden. Dann ist auch die Idee von dir mit der Unterteilung in feste Quadrate sehr sinnvoll. Es reicht ja dann zu vermerken, ob ein Quadrat befahren werden kann oder nicht. Das ganze nennt sich dann profesionell Occupancy grid mapping und is sicher auch leicht umsetzbar.

Einige Staubsaugroboter machen das übrigens auch so. Denen stellt man einige wenige infrarot-Licht generierende plastikdinger in der Wohnung die sie dann zur Orientierung verwenden können.
 
Zuletzt bearbeitet:
Zurück
Oben