Recomendaría un enfoque alternativo: el árbol aleatorio de exploración rápida (RRT) . Una cosa genial es que puedes hacer que gire en las esquinas o explote en todas las direcciones.
El algoritmo es realmente básico:
// 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;
}
Al modificar las funciones RandomSample
y ExtendToward
, puede obtener árboles muy diferentes. Si RandomSample
solo muestras de manera uniforme en todas partes, el árbol crecerá de manera uniforme en todas las direcciones. Si está sesgado hacia la meta, el árbol tenderá a crecer hacia la meta. Si siempre muestra el objetivo, el árbol será una línea recta desde el principio hasta el objetivo.
ExtendToward
también puede permitirte hacer cosas interesantes al árbol. Por un lado, si tiene obstáculos (como paredes), puede hacer que el árbol crezca a su alrededor simplemente rechazando las extensiones que colisionan con las paredes.
Esto es lo que parece cuando no sesgas el muestreo hacia la meta:
(fuente: uiuc.edu )
Y así es como se ve con las paredes
Algunas propiedades interesantes del RRT una vez que está terminado:
- El RRT nunca se cruzará
- El RRT eventualmente cubrirá todo el espacio con ramas cada vez más pequeñas.
- El camino desde el comienzo hasta la meta puede ser completamente aleatorio y extraño.