|
|
@@ -13,58 +13,109 @@ import sys
|
|
|
|
|
|
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../Sampling-based Planning/")
|
|
|
from rrt_3D.env3D import env
|
|
|
-from rrt_3D.utils3D import getDist, sampleFree, nearest, steer, isCollide, near, visualization, cost, path, edgeset
|
|
|
+from rrt_3D.utils3D import getDist, sampleFree, nearest, steer, isCollide, near, visualization, cost, path, edgeset, isinbound
|
|
|
+from rrt_3D.rrt3D import rrt
|
|
|
|
|
|
-class dynamic_rrt_3D:
|
|
|
+class dynamic_rrt_3D(rrt):
|
|
|
|
|
|
def __init__(self):
|
|
|
+ # variables in rrt
|
|
|
self.env = env()
|
|
|
self.Parent = {}
|
|
|
self.E = edgeset() # edgeset
|
|
|
self.V = [] # nodeset
|
|
|
self.i = 0
|
|
|
- self.maxiter = 2000 # at least 2000 in this env
|
|
|
+ self.maxiter = 10000 # at least 2000 in this env
|
|
|
self.stepsize = 0.5
|
|
|
self.gamma = 500
|
|
|
self.eta = 2*self.stepsize
|
|
|
self.Path = []
|
|
|
self.done = False
|
|
|
+ self.x0 = tuple(self.env.goal)
|
|
|
+ self.xt = tuple(self.env.start)
|
|
|
+ # additional variables
|
|
|
+ self.Flag = {}
|
|
|
+ self.xrobot = tuple(self.env.start)
|
|
|
+
|
|
|
+ self.V.append(self.x0)
|
|
|
+ self.ind = 0
|
|
|
+ self.fig = plt.figure(figsize=(10, 8))
|
|
|
|
|
|
- def RegrowRRT(self):
|
|
|
+ def RegrowRRT(self, xrobot):
|
|
|
self.TrimRRT()
|
|
|
- self.GrowRRT()
|
|
|
+ self.GrowRRT(xrobot = xrobot)
|
|
|
|
|
|
def TrimRRT(self):
|
|
|
- S = set()
|
|
|
+ S = []
|
|
|
i = 1
|
|
|
for qi in self.V:
|
|
|
- qp = self.Parent(qi)
|
|
|
- if qp.flag == 'Invalid':
|
|
|
- qi.flag = 'Invalid'
|
|
|
- if qi.flag != 'Invalid':
|
|
|
- S.add(qi)
|
|
|
+ if qi == self.x0:
|
|
|
+ continue
|
|
|
+ qp = self.Parent[qi]
|
|
|
+ if qp == self.x0:
|
|
|
+ continue
|
|
|
+ if self.Flag[qp] == 'Invalid':
|
|
|
+ self.Flag[qi] = 'Invalid'
|
|
|
+ self.E.remove_edge([qi,qp]) # REMOVE edge that parent is invalid
|
|
|
+ if self.Flag[qi] != 'Invalid':
|
|
|
+ S.append(qi)
|
|
|
i += 1
|
|
|
self.V, self.E = self.CreateTreeFromNodes(S)
|
|
|
|
|
|
- def InvalidateNodes(self, obstacle):
|
|
|
- E = self.FindAffectedEdges(obstacle)
|
|
|
+ def InvalidateNodes(self, obstacle, mode):
|
|
|
+ E = self.FindAffectedEdges(obstacle, mode)
|
|
|
for e in E:
|
|
|
qe = self.ChildEndpointNode(e)
|
|
|
- qe.flag = 'Invalid'
|
|
|
+ self.Flag[qe] = 'Invalid'
|
|
|
|
|
|
+ def Main(self):
|
|
|
+ qgoal = tuple(self.env.start)
|
|
|
+ qstart = tuple(self.env.goal)
|
|
|
+ self.GrowRRT()
|
|
|
+ self.done = True
|
|
|
+ # visualization(self)
|
|
|
+ self.done = False
|
|
|
+ # change the enviroment
|
|
|
+ new0,old0 = self.env.move_block(a=[0, 0, -2], s=0.5, block_to_move=1, mode='translation')
|
|
|
+ while qgoal != qstart:
|
|
|
+ qgoal = self.Parent[qgoal]
|
|
|
+ # TODO move to qgoal and check for new obs
|
|
|
+ xrobot = qstart
|
|
|
+ # TODO if any new obstacle are observed
|
|
|
+ self.InvalidateNodes(new0, mode = 'translation')
|
|
|
+ for xi in self.Path:
|
|
|
+ if self.Flag[tuple(xi[0])] == 'Invalid':
|
|
|
+ self.RegrowRRT(tuple(self.env.start))
|
|
|
+ self.done = True
|
|
|
+ self.Path, D = path(self)
|
|
|
+ visualization(self)
|
|
|
+ plt.show()
|
|
|
|
|
|
- def GrowRRT(self):
|
|
|
- # TODO
|
|
|
- pass
|
|
|
-
|
|
|
+ def GrowRRT(self, Reversed = True, xrobot = None):
|
|
|
+ # rrt.run()
|
|
|
+ self.run(Reversed = Reversed, xrobot = xrobot)
|
|
|
+
|
|
|
def CreateTreeFromNodes(self, S):
|
|
|
- #TODO
|
|
|
- pass
|
|
|
+ return S, self.E
|
|
|
+
|
|
|
+ def FindAffectedEdges(self, obstacle, mode):
|
|
|
+ # if the nodes appears inside of the new range an obstacle moved,
|
|
|
+ # find the edges associated with this node. (the node is the parent)
|
|
|
+ nodes = np.array(self.V)
|
|
|
+ if mode == 'translation':
|
|
|
+ affected_nodes = nodes[isinbound(obstacle, nodes, isarray = True)]
|
|
|
+ elif mode == 'rotation':
|
|
|
+ affected_nodes = nodes[isinbound(obstacle, nodes, mode = 'obb', isarray = True)]
|
|
|
+ if len(affected_nodes) == 0:
|
|
|
+ return []
|
|
|
+ return self.E.get_edge(affected_nodes)
|
|
|
|
|
|
- def FindAffectedEdges(self, obstacle):
|
|
|
- #TODO
|
|
|
- pass
|
|
|
+ def ChildEndpointNode(self, e):
|
|
|
+ # if self.E.isEndNode(e[1]):
|
|
|
+ return e[1]
|
|
|
+ #else:
|
|
|
+ # return self.ChildEndpointNode(e[1])
|
|
|
|
|
|
- def ChildEndpointNode(self):
|
|
|
- #TODO
|
|
|
- pass
|
|
|
+if __name__ == '__main__':
|
|
|
+ rrt = dynamic_rrt_3D()
|
|
|
+ rrt.Main()
|