ฉันจะแนะนำวิธีการเลือก: สำรวจอย่างรวดเร็วต้นไม้สุ่ม (RRT) สิ่งหนึ่งที่ยอดเยี่ยมเกี่ยวกับมันคือคุณสามารถทำให้มันหมุนไปรอบ ๆ มุมหรือระเบิดได้ทุกทิศทาง
อัลกอริทึมเป็นพื้นฐานจริง ๆ :
// 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;
}
ด้วยการแก้ไขRandomSample
และExtendToward
ฟังก์ชั่นคุณจะได้รับต้นไม้ที่แตกต่างกันมาก หากRandomSample
ตัวอย่างที่สม่ำเสมอทุกที่ต้นไม้จะเติบโตอย่างสม่ำเสมอในทุกทิศทาง หากลำเอียงไปสู่เป้าหมายต้นไม้จะมีแนวโน้มที่จะเติบโตไปสู่เป้าหมาย หากเป็นตัวอย่างเป้าหมายเสมอต้นไม้จะเป็นเส้นตรงตั้งแต่เริ่มต้นจนถึงเป้าหมาย
ExtendToward
ช่วยให้คุณสามารถทำสิ่งที่น่าสนใจให้กับต้นไม้ได้เช่นกัน สำหรับสิ่งหนึ่งถ้าคุณมีสิ่งกีดขวาง (เช่นกำแพง) คุณสามารถทำให้ต้นไม้เติบโตรอบตัวพวกเขาได้ง่ายๆโดยการปฏิเสธส่วนขยายที่ชนกับกำแพง
นี่คือสิ่งที่ดูเหมือนว่าเมื่อคุณไม่เอนเอียงไปที่เป้าหมาย:
(ที่มา: uiuc.edu )
และนี่คือสิ่งที่ดูเหมือนกับกำแพง
คุณสมบัติเจ๋ง ๆ ของ RRT เมื่อเสร็จแล้ว:
- RRT จะไม่มีวันข้ามตัวเอง
- ในที่สุด RRT จะครอบคลุมพื้นที่ทั้งหมดด้วยสาขาที่เล็กกว่าและเล็กกว่า
- เส้นทางจากจุดเริ่มต้นไปยังเป้าหมายสามารถสุ่มและแปลกอย่างสมบูรณ์