extend_rrt3D.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. # Real-Time Randomized Path Planning for Robot Navigation∗
  2. """
  3. This is rrt extend code for 3D
  4. @author: yue qi
  5. """
  6. import numpy as np
  7. from numpy.matlib import repmat
  8. from collections import defaultdict
  9. import time
  10. import matplotlib.pyplot as plt
  11. import os
  12. import sys
  13. sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../Sampling-based Planning/")
  14. from rrt_3D.env3D import env
  15. from rrt_3D.utils3D import getDist, sampleFree, nearest, steer, isCollide, near, visualization, cost, path
  16. # here attempt to use a KD tree for the data structure implementation
  17. import scipy.spatial.kdtree as KDtree
  18. class extend_rrt(object):
  19. def __init__(self):
  20. self.env = env()
  21. self.x0, self.xt = tuple(self.env.start), tuple(self.env.goal)
  22. self.current = tuple(self.env.start)
  23. self.stepsize = 0.5
  24. self.maxiter = 10000
  25. self.GoalProb = 0.05 # probability biased to the goal
  26. self.WayPointProb = 0.05 # probability falls back on to the way points
  27. self.done = False
  28. self.V = [] # vertices
  29. self.Parent = {}
  30. self.Path = []
  31. self.ind = 0
  32. self.i = 0
  33. #--------- basic rrt algorithm----------
  34. def RRTplan(self, env, initial, goal):
  35. threshold = self.stepsize
  36. nearest = initial # state structure
  37. self.V.append(initial)
  38. rrt_tree = initial # TODO KDtree structure
  39. while self.ind <= self.maxiter:
  40. target = self.ChooseTarget(goal)
  41. nearest = self.Nearest(rrt_tree, target)
  42. extended, collide = self.Extend(env, nearest, target)
  43. if not collide:
  44. self.AddNode(rrt_tree, nearest, extended)
  45. if getDist(nearest, goal) <= threshold:
  46. self.AddNode(rrt_tree, nearest, self.xt)
  47. break
  48. self.i += 1
  49. self.ind += 1
  50. visualization(self)
  51. # return rrt_tree
  52. self.done = True
  53. self.Path, D = path(self)
  54. visualization(self)
  55. plt.show()
  56. def Nearest(self, tree, target):
  57. # TODO use kdTree to speed up search
  58. return nearest(self, target, isset=True)
  59. def Extend(self, env, nearest, target):
  60. extended, dist = steer(self, nearest, target, DIST = True)
  61. collide, _ = isCollide(self, nearest, target, dist)
  62. return extended, collide
  63. def AddNode(self, tree, nearest, extended):
  64. # TODO use a kdtree
  65. self.V.append(extended)
  66. self.Parent[extended] = nearest
  67. def RandomState(self):
  68. # generate a random, obstacle free state
  69. xrand = sampleFree(self, bias=0)
  70. return xrand
  71. #--------- insight to the rrt_extend
  72. def ChooseTarget(self, state):
  73. # return the goal, or randomly choose a state in the waypoints based on probs
  74. p = np.random.uniform()
  75. if len(self.V) == 1:
  76. i = 0
  77. else:
  78. i = np.random.randint(0, high = len(self.V) - 1)
  79. if 0 < p < self.GoalProb:
  80. return self.xt
  81. elif self.GoalProb < p < self.GoalProb + self.WayPointProb:
  82. return self.V[i]
  83. elif self.GoalProb + self.WayPointProb < p < 1:
  84. return tuple(self.RandomState())
  85. if __name__ == '__main__':
  86. t = extend_rrt()
  87. _ = t.RRTplan(t.env, t.x0, t.xt)