| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- """
- This is dynamic rrt code for 3D
- @author: yue qi
- """
- import numpy as np
- from numpy.matlib import repmat
- from collections import defaultdict
- import time
- import matplotlib.pyplot as plt
- import os
- 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, isinbound
- from rrt_3D.rrt3D import rrt
- 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 = 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, xrobot):
- self.TrimRRT()
- self.GrowRRT(xrobot = xrobot)
- def TrimRRT(self):
- S = []
- i = 1
- for qi in self.V:
- 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, mode):
- E = self.FindAffectedEdges(obstacle, mode)
- for e in E:
- qe = self.ChildEndpointNode(e)
- 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, Reversed = True, xrobot = None):
- # rrt.run()
- self.run(Reversed = Reversed, xrobot = xrobot)
- def CreateTreeFromNodes(self, S):
- 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 ChildEndpointNode(self, e):
- # if self.E.isEndNode(e[1]):
- return e[1]
- #else:
- # return self.ChildEndpointNode(e[1])
- if __name__ == '__main__':
- rrt = dynamic_rrt_3D()
- rrt.Main()
|