Ich würde einen alternativen Ansatz empfehlen: den Rapid Exploring Random Tree (RRT) . Eine coole Sache dabei ist, dass Sie es dazu bringen können, um Ecken zu fahren oder in alle Richtungen zu explodieren.
Der Algorithmus ist wirklich grundlegend:
// Returns a random tree containing the start and the goal.
// Grows the tree for a maximum number of iterations.
Tree RRT(Node start, Node goal, int maxIters)
{
// Initialize a tree with a root as the start node.
Tree t = new Tree();
t.Root = start;
bool reachedGoal = false;
int iter = 0;
// Keep growing the tree until it contains the goal and we've
// grown for the required number of iterations.
while (!reachedGoal || iter < maxIters)
{
// Get a random node somewhere near the goal
Node random = RandomSample(goal);
// Get the closest node in the tree to the sample.
Node closest = t.GetClosestNode(random);
// Create a new node between the closest node and the sample.
Node extension = ExtendToward(closest, random);
// If we managed to create a new node, add it to the tree.
if (extension)
{
closest.AddChild(extension);
// If we haven't yet reached the goal, and the new node
// is very near the goal, add the goal to the tree.
if(!reachedGoal && extension.IsNear(goal))
{
extension.AddChild(goal);
reachedGoal = true;
}
}
iter++;
}
return t;
}
Durch Ändern der RandomSample
undExtendToward
Funktionen können Sie sehr unterschiedliche Bäume erhalten. ObRandomSample
überall nur gleichmäßige Proben entnommen werden, wächst der Baum gleichmäßig in alle Richtungen. Wenn der Baum auf das Ziel ausgerichtet ist, wächst er tendenziell auf das Ziel zu. Wenn das Ziel immer abgetastet wird, ist der Baum vom Start bis zum Ziel eine gerade Linie.
ExtendToward
Sie können dem Baum auch interessante Dinge antun. Zum einen können Sie bei Hindernissen (wie Mauern) den Baum zum Wachsen bringen um sie einfach durch Erweiterungen , dass kollidieren mit Wänden Ablehnung.
So sieht es aus, wenn Sie die Stichprobe nicht auf das Ziel ausrichten:
(Quelle: uiuc.edu )
Und so sieht es mit Wänden aus
Einige coole Eigenschaften des RRT, sobald es fertig ist:
- Das RRT wird sich niemals bekreuzen
- Die RRT wird schließlich den gesamten Raum mit immer kleineren Zweigen abdecken
- Der Weg vom Start zum Ziel kann völlig zufällig und seltsam sein.