Welchen Algorithmus sollte ich implementieren, um einen Raumreinigungsroboter zu programmieren?


25

Für diese Frage wird angenommen, dass die folgenden Dinge unbekannt sind:

  • Die Größe und Form des Raumes
  • Der Standort des Roboters
  • Das Vorhandensein von Hindernissen

Nehmen Sie außerdem an, dass die folgenden Dinge konstant sind:

  • Die Größe und Form des Raumes
  • Die Anzahl, Form und Position aller (eventuellen) Hindernisse

Und nehmen Sie an, dass der Roboter die folgenden Eigenschaften hat:

  • Es kann nur in Schritten von absoluten Einheiten vorwärts und in Grad gedreht werden. Auch die Operation, die verschoben wird, gibt true zurück, wenn sie erfolgreich war, oder false, wenn sie aufgrund eines Hindernisses nicht verschoben werden konnte
  • Eine einigermaßen unbegrenzte Energiequelle (sagen wir, es handelt sich um einen solarbetriebenen Roboter, der auf einer Raumstation platziert ist, die der Sonne jederzeit ohne Decke zugewandt ist)
  • Jede Bewegung und Drehung wird jedes Mal mit absoluter Präzision ausgeführt (keine Sorge um unzuverlässige Daten)

Zum Schluss berücksichtigen Sie bitte die folgenden Eigenschaften der Roboterumgebung:

  • Da sich der Raum auf einer Raumstation ohne Decke befindet, befindet er sich in sicherer, aber frustrierender Nähe zu vorbeiziehenden Kometen, sodass der Staub (und das Eis) ständig die Umwelt verschmutzen.

Mir wurde eine viel einfachere Version dieser Frage gestellt (Raum ist ein Rechteck und es gibt keine Hindernisse, wie würden Sie sich darüber bewegen, um zu gewährleisten, dass Sie jeden Teil mindestens einmal überqueren können) und nachdem ich mich gefragt hatte, wie Sie sich dem nähern würden, wenn Sie dies nicht könnten Keine Garantie für die Form oder das Vorhandensein von Hindernissen. Ich habe angefangen, mir das mit dem Dijkstra-Algorithmus anzuschauen , aber ich bin fasziniert zu hören, wie andere sich dem nähern (oder ob es eine akzeptierte Antwort darauf gibt? (Wie macht Roomba das?)


Tags wie + algorithm und + theory würden eine solche Frage beantworten, aber ich habe noch nicht den Ruf, sie hinzuzufügen
Jason Sperske

definitiv etwas besseres als Roomba
Octopus

Interessant. Ich habe Bobfahren und es ist einfach perfekt programmiert . Schöne Grüße!

1
Ist das eine Werbung? Wenn nicht, möchten Sie möglicherweise Informationen veröffentlichen und nicht nur den Link, um zu erklären, wie sich der Roboter verhält und warum er einfach perfekt ist.
Shahbaz

Antworten:


18

Soweit ich weiß, wurde dieses Problem nicht "gelöst".

Formal handelt es sich hierbei um ein Problem bei der Online-Berichterstattung. Abdeckung, weil wir jeden Punkt auf dem Boden abdecken müssen, und online, weil wir keinen Offline-Zugriff auf die Karte haben. Wenn Sie an den neuesten Ergebnissen interessiert sind, schlagen wir vor, dass Sie in Google Scholar nach " Roboter-Online-Erfassungsalgorithmen " suchen (es gibt viele, viele gute Ergebnisse). Zusätzlich zu @ embedded.kyles sehr farbenfrohem (Re-) Post werde ich einige Details hinzufügen (ich werde auch versuchen, schnell ein paar einfache Ergebnisse zu finden):

  • Mit Dijkstra erhalten Sie einen Pfad, aber nicht unbedingt eine Berichterstattung. Wie legen Sie beispielsweise für Dijkstra fest, dass Sie jeden Punkt in der Grafik besuchen müssen , anstatt so schnell wie möglich einen Punkt zu besuchen ? Sie können die kürzesten Wege für alle Paare laufen, aber worauf kommt es an? Sie haben keine Karte.

  • Online-Algorithmen wie diese werden oft als "Bug" -Algorithmen bezeichnet, da sie dazu neigen, wie ein Bug auszusehen, der durch einen Bereich wandert, gegen etwas stößt und dann ein wenig herumläuft.

  • Ohne Hindernisse und mit einem rechteckigen Raum ist ein Boustrophedon-Pfad (Weg des Ochsen) optimal , vorausgesetzt, Sie beginnen an der Grenze . Bildbeschreibung hier eingeben

Komisch, dass die Bauern das schon immer gemacht haben, oder? http://en.wikipedia.org/wiki/Boustrophedon . Dies kann auf Räume mit Hindernissen ausgeweitet werden, indem ein etwa rechteckiger Bereich gefunden wird, der frei von Hindernissen ist. Howie Choset hat ein bisschen daran gearbeitet .

  • πd2d
  • Dies ist eine riesige, faszinierende Gegend. Es tut mir leid, dass ich keine bessere Zusammenfassung liefern kann!

Das größte Problem ist, dass Sie keine Karte haben. Ohne Karte können Sie nur einfache Aktionen ausführen, z. B. dem Umkreis folgen und sich entlang eines Pfades bewegen (wie die erwähnte Spirale). Es gibt also einige Roboter, die die Karte während der Reinigung erstellen, den zugeordneten Bereich in Formen zerlegen und dann jede Form abdecken, um die Abdeckung zu gewährleisten. Siehe: http://mintcleaner.com/


9

Roomba beginnt in einer Spirale, bis es auf etwas trifft, und führt dann einen Perimeter-Sweep durch. Dann springt es einfach herum. Roomba ist der De-facto-Standard für Haushalts-Roboter-Staubsauger. Aber aus eigener Erfahrung (ich besitze zwei) gibt es definitiv Raum für Verbesserungen.

Von How Stuff Works :

Algorithmus

Aus einem Interview mit Nancy Dussault Smith, Vice President Marketing Communications bei iRobot:

Wenn es anfängt, werden Sie ein spiralförmiges Muster bemerken, das sich über einen immer größeren Bereich erstreckt, bis es auf ein Objekt trifft. Wenn es ein Objekt findet, folgt es für eine gewisse Zeit dem Rand des Objekts und beginnt dann, sich zu kreuzen. Dabei wird versucht, die größte Entfernung zu ermitteln, die es zurücklegen kann, ohne ein anderes Objekt zu treffen Wenn der Raum zu groß ist, aber zu lange dauert, ohne gegen eine Wand zu stoßen, wird er wieder spiralförmig, weil er sich in einem weiten, offenen Raum befindet und dies ständig berechnet und herausfindet.

Ähnlich verhält es sich mit den Schmutzsensoren darunter. Wenn einer dieser Sensoren ausgelöst wird, ändert sich sein Verhalten, um diesen Bereich abzudecken. Es wird dann auf der Suche nach einem anderen schmutzigen Bereich auf einem geraden Weg losgehen. Die Art und Weise, wie sich diese verschiedenen Muster aufeinander stapeln, zeigt, dass dies der effektivste Weg ist, einen Raum abzudecken.

Die von uns gewählten Muster und die Art und Weise, wie der Algorithmus ursprünglich entwickelt wurde, beruhten auf verhaltensbasierten Algorithmen, die vom MIT entwickelt wurden, um Tiere zu untersuchen und wie sie Bereiche nach Nahrung absuchen. Wenn man sich ansieht, wie Ameisen und Bienen ausgehen und Gebiete durchsuchen, kommt diese Art der Berichterstattung und das Herausfinden all dessen aus dieser Forschung. Es ist offensichtlich nicht genau, ich sage nicht, dass wir Honigbienen sind, aber es ist das Verständnis dafür, wie man ein Gebiet in der Natur ausfindig macht, das die Grundlage für die Entwicklung unserer adaptiven Technologie bildet.

Einige Langzeitbelichtungen von Roombas mit LEDs zeigen, wie es in der Praxis funktioniert:

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben


Handelt es sich um einen Inhalt zum Kopieren und Einfügen aus dem Link?
Josh Vander Hook

@Josh Das relevante Material zur Beantwortung der Frage wurde von den verlinkten Seiten kopiert und in ein Blockquote gesetzt, um ein Verrotten des Links zu verhindern.
embedded.kyle

7

Neato verfolgt einen organisierten Ansatz. Unter Verwendung von SLAM und Stoßfängern wird zunächst der 'aktuelle' Raumumfang abgebildet und anschließend ein Algorithmus angewendet, um die Reinigung so effizient wie möglich zu gestalten. Ich habe noch nie einen Roomba besessen, aber angesichts dessen, was ich über den Algorithmus gelesen habe, würde ich nie von einem Neato wechseln.

Der Laser-Entfernungsmesser im neato ist häufig für die Robotik nicht geeignet , da er ein kostengünstiger Sensor für SLAM-Algorithmen ist.

Wenn mir Ihre Aufgabe übertragen würde, würde ich zuerst eine geeignete SLAM-Implementierung finden , die auf der Hardware basiert, die ich hatte.

Dann würde ich einen CNC ISLAND Motion Planungsalgorithmus verwenden. Ich habe die Erfahrung gemacht, dass sie in der Regel sehr effizient sind, um einen beliebigen Bereich mit dem geringsten Maß an Bewegung abzudecken.


SLAM ist für dieses Problem nicht geeignet, da es sich um eine Simulation handelt, bei der keine Unsicherheit bei der Positionierung besteht. Für einen echten Roboter sind Sie jedoch absolut richtig.
Ian

Ich habe das verpasst (wenn es da ist). Tatsächlich heißt es, dass Folgendes unbekannt ist; der Standort des Roboters.
Spiked3

Ich dachte, dass der Ort als unbekannt begann, aber als eine Topologie des Raums erstellt wurde, könnte es bekannt werden.
Jason Sperske

Dies ist eines dieser seltsamen akademischen Probleme, bei denen Vereinfachungen seltsame Auswirkungen haben. Da Sie keine Karte, keinen Startort, keine perfekte Positionierung und keine externen Elemente zum Koordinieren haben, ist die absolute Position irrelevant. Sie entscheiden willkürlich, dass (0,0) Ihr Startpunkt ist, und erstellen dann Ihre Karte relativ zu diesem Punkt. Dies ist in der realen Welt nicht wirklich praktikabel, vermittelt Ihnen jedoch ein wenig Übung in Bezug auf Erfassungsalgorithmen.
Ian

Ihre Antwort ist aus Systemsicht gut. Ich glaube jedoch, dass diese Frage eine bessere Theorie / Algorithmus-Frage ist.
Josh Vander Hook

6

Das erste, was Sie feststellen müssen, ist das Ziel des Roboters - nicht ganz klar aus Ihrer Frage. Es gibt zwei Hauptaufgaben, die Ihr Roboter erfüllen muss: Ermitteln der Form des zu reinigenden Bereichs und anschließendes Reinigen.

Aber ist die Schmutzmenge konstant? Wird ständig Schmutz hinzugefügt? Ist es Ihr Ziel, die durchschnittliche Zeit, die Schmutz auf dem Boden verbleibt, oder die mittlere Zeit zu minimieren? Ist das Ziel, den Boden gleichermaßen sauber zu halten? Oder ist es nur einmal zu reinigen, so schnell wie möglich? Gibt es Muster in der Ansammlung von Schmutz, die Sie messen und zu Ihrem Vorteil nutzen können, um Ihr Ziel zu erreichen?

Die Antwort auf diese Fragen hilft Ihnen dabei, den von Ihnen gewählten Algorithmus zu bestimmen. Im Fall des Roomba-Roboters macht es möglicherweise keinen Sinn, die genaue Raumaufteilung zu lernen, da sich Möbel (wie Stühle um einen Tisch), Menschen und andere Hindernisse sehr oft bewegen. In Ihrem Fall ist es jedoch möglicherweise besser, den Raum zu erkunden, um eine vollständige Karte zu erstellen (eine Kombination aus einem Rasenmähermuster und Kantenerkennung), und dann mit dieser Karte den kürzesten Weg durch den Raum zu berechnen (der Begriff lautet "Abdeckung"). und es gibt verschiedene Möglichkeiten, dies zu tun (zB Spanning Tree Algorithmus ).

Sie müssen sich auch Gedanken darüber machen, wie Sie den Bereich, in dem Sie sich befinden, diskretisieren können. Da Sie sich in jede Richtung bewegen können - auch bei ganzzahligen Gradbeträgen und ganzzahligen Abstandseinheiten -, können Ihre X- und Y-Positionen Brüche aufweisen Werte. Sie müssen entscheiden, wie Hindernisse auf dieser Karte dargestellt werden sollen, ohne dass sie auf eine unendliche Anzahl von Datenpunkten anwächst.


Nun, da ich es mir sadistisch mache, mir eine Interviewfrage zu erschweren, könnte ich mir wahrscheinlich ein paar weitere Informationen einfallen lassen. Ich mag die Punkte, die Sie anheben :)
Jason Sperske

2

Ich bin mir nicht sicher, ob Sie es noch brauchen, aber für diejenigen, die zufällig nach diesem Thread googeln, habe ich eine einfache Version des Algorithmus erstellt.

Grundsätzlich wird versucht, während der Bereinigung eine Karte des Bereichs zu erstellen, und anhand der Karte wird der nächste nicht vorhandene Knoten (Teil des Raums) gesucht. Wenn es keine findet, bedeutet dies, dass der Raum gereinigt ist (oder die nicht gereinigten Teile für den Roboter nicht zugänglich sind).

Es ist möglicherweise langsamer als andere Algorithmen, kann jedoch die Abdeckung unabhängig von Startposition, Richtung und Hindernissen gewährleisten.

https://github.com/dungba88/cleaner_robot

UPDATE: Ich habe hier eine Demo gemacht und diese mit einem DFS mit Backtracking verglichen. Obwohl mein Algorithmus O (N ^ 2) ist, ist er in Bezug auf die Anzahl der Züge und Umdrehungen viel optimierter.

http://jenova.dungba.org/cleaner/showdown


Interessant, sodass der Raum in ein 2D-Raster zerlegt wird. Ich lese immer noch Ihren Code. Welchen Wegfindungsansatz verwenden Sie, um Ihre ungereinigten Regionen zu erreichen? Dijkstra?
Jason Sperske

Ich habe BFS verwendet, um die nächste ungereinigte Position zu finden.
Anh Dũng Bùi

-1

Betrachten Sie das einfachere Problem, das Sie gefragt wurden - einen rechteckigen Raum ohne Hindernisse und reinigen Sie jeden Teil mindestens einmal.

Die Lösung besteht darin, eine Ecke des Raums zu finden, und eine Ecke zu finden, ist kein großes Problem. Sobald dies erreicht ist, folgen Sie einfach einem spiralförmigen Pfad in die Mitte des Raums.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.