Eu recomendaria uma abordagem alternativa: a árvore aleatória de exploração rápida (TRR) . Uma coisa legal sobre isso é que você pode fazê-lo girar nas esquinas ou explodir em todas as direções.
O algoritmo é 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;
}
Modificando as funções RandomSample
e ExtendToward
, você pode obter árvores muito diferentes. Se RandomSample
apenas amostrar uniformemente em todos os lugares, a árvore crescerá uniformemente em todas as direções. Se for enviesado em direção ao objetivo, a árvore tenderá a crescer em direção ao objetivo. Se sempre amostrar a meta, a árvore será uma linha reta desde o início até a meta.
ExtendToward
pode permitir que você faça coisas interessantes para a árvore também. Por um lado, se você tiver obstáculos (como paredes), poderá fazer com que a árvore cresça ao redor deles simplesmente rejeitando extensões que colidem com paredes.
É assim que você parece quando você não influencia a amostra em direção à meta:
(fonte: uiuc.edu )
E aqui está o que parece com paredes
Algumas propriedades legais do RRT quando terminar:
- O RRT nunca se cruzará
- O RRT eventualmente cobrirá todo o espaço com filiais cada vez menores
- O caminho desde o início até a meta pode ser completamente aleatório e estranho.