dynamic_rrt3D.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. """
  2. This is dynamic rrt 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, isinbound
  15. from rrt_3D.rrt3D import rrt
  16. class dynamic_rrt_3D(rrt):
  17. def __init__(self):
  18. # variables in rrt
  19. self.env = env()
  20. self.Parent = {}
  21. self.E = edgeset() # edgeset
  22. self.V = [] # nodeset
  23. self.i = 0
  24. self.maxiter = 10000 # at least 2000 in this env
  25. self.stepsize = 0.5
  26. self.gamma = 500
  27. self.eta = 2*self.stepsize
  28. self.Path = []
  29. self.done = False
  30. self.x0 = tuple(self.env.goal)
  31. self.xt = tuple(self.env.start)
  32. # additional variables
  33. self.Flag = {}
  34. self.xrobot = tuple(self.env.start)
  35. self.V.append(self.x0)
  36. self.ind = 0
  37. self.fig = plt.figure(figsize=(10, 8))
  38. def RegrowRRT(self, xrobot):
  39. self.TrimRRT()
  40. self.GrowRRT(xrobot = xrobot)
  41. def TrimRRT(self):
  42. S = []
  43. i = 1
  44. for qi in self.V:
  45. if qi == self.x0:
  46. continue
  47. qp = self.Parent[qi]
  48. if qp == self.x0:
  49. continue
  50. if self.Flag[qp] == 'Invalid':
  51. self.Flag[qi] = 'Invalid'
  52. self.E.remove_edge([qi,qp]) # REMOVE edge that parent is invalid
  53. if self.Flag[qi] != 'Invalid':
  54. S.append(qi)
  55. i += 1
  56. self.V, self.E = self.CreateTreeFromNodes(S)
  57. def InvalidateNodes(self, obstacle, mode):
  58. E = self.FindAffectedEdges(obstacle, mode)
  59. for e in E:
  60. qe = self.ChildEndpointNode(e)
  61. self.Flag[qe] = 'Invalid'
  62. def Main(self):
  63. qgoal = tuple(self.env.start)
  64. qstart = tuple(self.env.goal)
  65. self.GrowRRT()
  66. self.done = True
  67. # visualization(self)
  68. self.done = False
  69. # change the enviroment
  70. new0,old0 = self.env.move_block(a=[0, 0, -2], s=0.5, block_to_move=1, mode='translation')
  71. while qgoal != qstart:
  72. qgoal = self.Parent[qgoal]
  73. # TODO move to qgoal and check for new obs
  74. xrobot = qstart
  75. # TODO if any new obstacle are observed
  76. self.InvalidateNodes(new0, mode = 'translation')
  77. for xi in self.Path:
  78. if self.Flag[tuple(xi[0])] == 'Invalid':
  79. self.RegrowRRT(tuple(self.env.start))
  80. self.done = True
  81. self.Path, D = path(self)
  82. visualization(self)
  83. plt.show()
  84. def GrowRRT(self, Reversed = True, xrobot = None):
  85. # rrt.run()
  86. self.run(Reversed = Reversed, xrobot = xrobot)
  87. def CreateTreeFromNodes(self, S):
  88. return S, self.E
  89. def FindAffectedEdges(self, obstacle, mode):
  90. # if the nodes appears inside of the new range an obstacle moved,
  91. # find the edges associated with this node. (the node is the parent)
  92. nodes = np.array(self.V)
  93. if mode == 'translation':
  94. affected_nodes = nodes[isinbound(obstacle, nodes, isarray = True)]
  95. elif mode == 'rotation':
  96. affected_nodes = nodes[isinbound(obstacle, nodes, mode = 'obb', isarray = True)]
  97. if len(affected_nodes) == 0:
  98. return []
  99. return self.E.get_edge(affected_nodes)
  100. def ChildEndpointNode(self, e):
  101. # if self.E.isEndNode(e[1]):
  102. return e[1]
  103. #else:
  104. # return self.ChildEndpointNode(e[1])
  105. if __name__ == '__main__':
  106. rrt = dynamic_rrt_3D()
  107. rrt.Main()