rrt3D.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """
  2. This is rrt star code for 3D
  3. @author: yue qi
  4. """
  5. import numpy as np
  6. from numpy.matlib import repmat
  7. from collections import defaultdict
  8. import time
  9. import matplotlib.pyplot as plt
  10. import os
  11. import sys
  12. sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../Sampling-based Planning/")
  13. from rrt_3D.env3D import env
  14. from rrt_3D.utils3D import getDist, sampleFree, nearest, steer, isCollide, near, visualization, cost, path, edgeset, hash3D, dehash
  15. class rrtstar():
  16. def __init__(self):
  17. self.env = env()
  18. self.Parent = defaultdict(lambda: defaultdict(dict))
  19. self.V = []
  20. self.E = edgeset()
  21. self.i = 0
  22. self.maxiter = 10000
  23. self.stepsize = 0.5
  24. self.Path = []
  25. self.done = False
  26. def wireup(self, x, y):
  27. self.E.add_edge([x,y]) # add edge
  28. self.Parent[hash3D(x)] = y
  29. def run(self):
  30. self.V.append(self.env.start)
  31. self.ind = 0
  32. self.fig = plt.figure(figsize = (10,8))
  33. xnew = self.env.start
  34. while self.ind < self.maxiter and getDist(xnew, self.env.goal) > 1:
  35. xrand = sampleFree(self)
  36. xnearest = nearest(self, xrand)
  37. xnew = steer(self, xnearest, xrand)
  38. if not isCollide(self, xnearest, xnew):
  39. self.V.append(xnew) # add point
  40. self.wireup(xnew, xnearest)
  41. # visualization(self)
  42. self.i += 1
  43. self.ind += 1
  44. if getDist(xnew, self.env.goal) <= 1:
  45. self.wireup(self.env.goal, xnew)
  46. self.Path, D = path(self)
  47. print('Total distance = ' + str(D))
  48. self.done = True
  49. visualization(self)
  50. plt.show()
  51. if __name__ == '__main__':
  52. p = rrtstar()
  53. starttime = time.time()
  54. p.run()
  55. print('time used = ' + str(time.time() - starttime))