| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- # Real-Time Randomized Path Planning for Robot Navigation∗
- """
- This is rrt extend code for 3D
- @author: yue qi
- """
- import numpy as np
- from numpy.matlib import repmat
- from collections import defaultdict
- import time
- import matplotlib.pyplot as plt
- import os
- import sys
- sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../Sampling-based Planning/")
- from rrt_3D.env3D import env
- from rrt_3D.utils3D import getDist, sampleFree, nearest, steer, isCollide, near, visualization, cost, path
- # here attempt to use a KD tree for the data structure implementation
- import scipy.spatial.kdtree as KDtree
- class extend_rrt(object):
- def __init__(self):
- self.env = env()
- self.x0, self.xt = tuple(self.env.start), tuple(self.env.goal)
- self.current = tuple(self.env.start)
- self.stepsize = 0.5
- self.maxiter = 10000
- self.GoalProb = 0.05 # probability biased to the goal
- self.WayPointProb = 0.05 # probability falls back on to the way points
- self.done = False
- self.V = [] # vertices
- self.Parent = {}
- self.Path = []
- self.ind = 0
- self.i = 0
- #--------- basic rrt algorithm----------
- def RRTplan(self, env, initial, goal):
- threshold = self.stepsize
- nearest = initial # state structure
- self.V.append(initial)
- rrt_tree = initial # TODO KDtree structure
- while self.ind <= self.maxiter:
- target = self.ChooseTarget(goal)
- nearest = self.Nearest(rrt_tree, target)
- extended, collide = self.Extend(env, nearest, target)
- if not collide:
- self.AddNode(rrt_tree, nearest, extended)
- if getDist(nearest, goal) <= threshold:
- self.AddNode(rrt_tree, nearest, self.xt)
- break
- self.i += 1
- self.ind += 1
- visualization(self)
-
- # return rrt_tree
- self.done = True
- self.Path, D = path(self)
- visualization(self)
- plt.show()
-
- def Nearest(self, tree, target):
- # TODO use kdTree to speed up search
- return nearest(self, target, isset=True)
- def Extend(self, env, nearest, target):
- extended, dist = steer(self, nearest, target, DIST = True)
- collide, _ = isCollide(self, nearest, target, dist)
- return extended, collide
- def AddNode(self, tree, nearest, extended):
- # TODO use a kdtree
- self.V.append(extended)
- self.Parent[extended] = nearest
- def RandomState(self):
- # generate a random, obstacle free state
- xrand = sampleFree(self, bias=0)
- return xrand
- #--------- insight to the rrt_extend
- def ChooseTarget(self, state):
- # return the goal, or randomly choose a state in the waypoints based on probs
- p = np.random.uniform()
- if len(self.V) == 1:
- i = 0
- else:
- i = np.random.randint(0, high = len(self.V) - 1)
- if 0 < p < self.GoalProb:
- return self.xt
- elif self.GoalProb < p < self.GoalProb + self.WayPointProb:
- return self.V[i]
- elif self.GoalProb + self.WayPointProb < p < 1:
- return tuple(self.RandomState())
-
- if __name__ == '__main__':
- t = extend_rrt()
- _ = t.RRTplan(t.env, t.x0, t.xt)
|