Files
PathPlanning/Sampling_based_Planning/rrt_3D/extend_rrt3D.py
T

102 lines
3.3 KiB
Python
Raw Normal View History

2020-08-03 19:59:23 -07:00
# 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
2020-08-03 20:04:07 -07:00
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../Sampling_based_Planning/")
2020-08-03 19:59:23 -07:00
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
2020-11-11 23:53:26 -08:00
self.Path, _ = path(self)
2020-08-03 19:59:23 -07:00
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)