2010-06-18 6 views
6

Ich arbeite an einem Projekt mit einem Roboter, der seinen Weg zu einem Objekt finden muss und einige Hindernisse vermeiden muss, wenn er zu dem Objekt geht, das er aufnehmen muss.A * Pathfinder Hindernis Kollision Problem

Das Problem liegt darin, dass der Roboter und das Objekt, das der Roboter aufnehmen muss, beide ein Pixel breit im Pfadfinder sind. In Wirklichkeit sind sie viel größer. Oft wählt der A * -Pfadfinder die Route entlang der Kanten der Hindernisse, manchmal kollidiert er mit ihnen, was wir nicht tun möchten.

Ich habe versucht, den Hindernissen einige nicht begehbare Felder hinzuzufügen, aber es funktioniert nicht immer sehr gut. Es kollidiert immer noch mit den Hindernissen und fügt auch zu viele Punkte hinzu, an denen es nicht laufen darf, was dazu führt, dass es keinen Pfad gibt, auf dem es laufen kann.

Haben Sie Vorschläge, was Sie bei diesem Problem unternehmen können?

Edit:

Also habe ich als Justin L durch Zugabe einer Menge Kosten rund um die Hindernisse vorgeschlagen, die in der Folling Ergebnisse: Grid with no path http://sogaard.us/uploades/1_grid_no_path.png

Hier können Sie die Kosten rund um die Hindernisse sehen, zunächst die Mitte zwei Hindernisse sollen wie die, die in den Ecken aussehen, aber nach unseren pathfinder laufen scheint es, wie die Kosten außer Kraft gesetzt:

Grid with path http://sogaard.us/uploades/1_map_grid.png

Picture that shows things found on the picture http://sogaard.us/uploades/2_complete_map.png

Bild oben zeigt, was auf dem Bild zu finden ist.

Path found http://sogaard.us/uploades/3_path.png

Dies ist der Weg auch vor dem Hindernis umarmt wurde, die als unser Problem gefunden.

The grid from before with the path on http://sogaard.us/uploades/4_mg_path.png

Und noch ein Bild mit den Kosten der Karte mit dem Weg auf.

Also was ich seltsam finde ist, warum der A * Pathfinder diese Feldkosten, die sehr hoch sind, überschreibt.

Wäre es, wenn es die Knoten innerhalb der offenen Liste mit dem aktuellen Feld evaluiert, um zu sehen, ob der aktuelle Feldpfad kürzer als der in der offenen Liste ist?

Und hier ist der Code, den ich für den Pathfinder bin mit:

Pathfinder.cs: http://pastebin.org/343774

Field.cs und Grid.cs: http://pastebin.org/343775

+0

Nur um zu klären, ist das ein physikalischer Roboter? Und Sie haben eine Karte des physikalischen Feldes, in der sich der Roboter befindet, und Sie möchten A * durch die Software-Karte auf eine Weise führen, die es Ihrem physischen Roboter auch erlaubt, sich durch die physische Karte mit denselben Richtungen zu bewegen? –

+0

Ja, das ist richtig, wir haben eine Webcam über dem Roboter, wir fügen dann das Bild, das das Bild auf eine Karte von weckbar und nicht weckbar übersetzen, dann füttern wir diese Karte zu unserem A * zusammen mit einem Anfang und Ende kordinieren. Derzeit fügen wir ekstra keine begehbaren Felder um die Hindernisse hinzu, aber das ist sehr langsam. – Androme

+0

Ja, wie DoomStone sagte, wir haben eine Webcam auf einem Stativ über dem Kurs, wo die Hindernisse, Objekte und Roboter sind. Wir machen Fotos von diesem Kurs, parsen ihn, damit wir die Objekte und Hindernisse und den Roboter finden und dann versuchen, einen Weg vom Roboter zum Objekt zu machen, das er aufnehmen muss. Also gibt der A * -Algorithmus jedes Pixel zurück, auf dem wir laufen können, was, wie gesagt, oft die Hindernisse umarmt, wenn sich das Objekt zum Beispiel auf der gegenüberliegenden Seite des Roboters befindet. – Cheesebaron

Antwort

3

Haben Sie darüber nachgedacht, Pixel in der Nähe von Objekten Farbverlaufskosten hinzuzufügen?

Vielleicht ein so einfach wie ein linearer Gradient:

C = -mx + b 

wobei x der Abstand zum nächsten Objekt ist, b ist die Kosten direkt vor der Grenze, und m ist die Rate, mit der die Kosten abstirbt . Natürlich, wenn C negativ ist, sollte es auf 0

Vielleicht einen einfachen hyperbolischen Zerfall

C = b/x 

wo b die gewünscht Kosten rechts, wieder außerhalb der Grenze ist gesetzt werden. Sobald ein bestimmter Tiefpunkt erreicht ist, wird ein Cutoff auf 0 gesetzt.

Alternativ könnten Sie exponentiellen Abfall

C = k e^(-hx) 

verwenden, wobei k eine Skalierungskonstante ist, und h ist die Rate des Zerfalls. Wiederum ist es klug, einen Cut-Off zu haben.


Zweiter Vorschlag

Ich habe noch nie A * zu einem Pixel-mapped Karte angewendet wird; fast immer, Fliesen.

Sie könnten versuchen, die "Auflösung" Ihrer Kacheln massiv zu verringern? Vielleicht eine Kachel pro zehn mal zehn oder zwanzig mal zwanzig Pixeln; Die Kosten der Kachel sind die höchsten Kosten eines Pixels in der Kachel.

Sie können auch versuchen, die Hearistik für die kürzeste Entfernung, die Sie für A * verwenden, zu deaktivieren.

+0

Versucht, was du vorgeschlagen hast, habe ich den ursprünglichen Post bearbeitet. – Cheesebaron

+0

Hinzugefügt einen zweiten Vorschlag; ich hoffe es hilft!:) –

+0

Wir fanden ein Problem in unserem Pfadfinder, der die Bewegungskosten jedes Mal rekrutierte, wenn es ein neues Feld traf, aber Ihr Vorschlag funktionierte, indem er die Felder um die Hindernisse sehr hoch bewertete, scheint es nun sehr gut zu funktionieren. – Cheesebaron

2

ich einen solchen physischen Roboter getan haben . Meine Lösung war, einen Schritt zurück zu gehen, wenn es eine Links- und Rechtskurve gibt.

alt text http://www.freeimagehosting.net/uploads/bb41eb3ba5.png

Die rote Linie ist, wie ich das Problem verstehen. Die schwarze Linie ist, was ich getan habe, um das Problem zu lösen. Der Roboter kann für einen Schritt geradeaus zurückgehen und dann nach rechts abbiegen.

+0

Können Sie bitte, vielleicht mit einer Zeichnung, ausarbeiten? Die Art, wie ich es verstehe, würde dies in Ecken schneiden, was nicht gut wäre. – Cheesebaron

+0

hat ein Bild hinzugefügt. – VOX

+0

Wir haben das Problem mit Raytracing behoben, es gibt uns einen viel glatteren und sauberen Pfad! – Androme

3

Sie könnten versuchen, die Hindernisse unter Berücksichtigung der Größe des Roboters zu vergrößern. Sie könnten die Ecken der Hindernisse abrunden, um das Blockierungsproblem zu lösen. Dann sind die Lücken, die gefüllt werden, zu klein, als dass sich der Roboter irgendwie hindurchquetschen könnte.

+0

das klingt wie die einfachste und beste Lösung für mich, besser als eine glatte zusätzliche Kosten wie in der derzeit akzeptierten Antwort. – mafu

+0

diese Antwort ist besser als meins. –