rrt3D.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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 rrt_3D.env3D import env
  8. from collections import defaultdict
  9. import pyrr as pyrr
  10. from rrt_3D.utils3D import getDist, sampleFree, nearest, steer, isCollide, near, visualization, cost, path, edgeset
  11. import time
  12. class rrtstar():
  13. def __init__(self):
  14. self.env = env()
  15. self.Parent = defaultdict(lambda: defaultdict(dict))
  16. self.V = []
  17. self.E = edgeset()
  18. self.i = 0
  19. self.maxiter = 10000
  20. self.stepsize = 0.5
  21. self.Path = []
  22. def wireup(self,x,y):
  23. self.E.add_edge([x,y]) # add edge
  24. self.Parent[str(x[0])][str(x[1])][str(x[2])] = y
  25. def run(self):
  26. self.V.append(self.env.start)
  27. ind = 0
  28. xnew = self.env.start
  29. while ind < self.maxiter and getDist(xnew,self.env.goal) > 1:
  30. xrand = sampleFree(self)
  31. xnearest = nearest(self,xrand)
  32. xnew = steer(self,xnearest,xrand)
  33. if not isCollide(self,xnearest,xnew):
  34. self.V.append(xnew) # add point
  35. self.wireup(xnew,xnearest)
  36. #visualization(self)
  37. self.i += 1
  38. ind += 1
  39. if getDist(xnew,self.env.goal) <= 1:
  40. self.wireup(self.env.goal,xnew)
  41. self.Path,D = path(self)
  42. print('Total distance = '+str(D))
  43. visualization(self)
  44. if __name__ == '__main__':
  45. p = rrtstar()
  46. starttime = time.time()
  47. p.run()
  48. print('time used = ' + str(time.time()-starttime))