This commit is contained in:
yue qi
2020-07-24 15:43:42 -07:00
parent 07b303c797
commit f3e43eed4f
5 changed files with 26 additions and 7 deletions
@@ -51,6 +51,7 @@ class Anytime_Dstar(object):
# epsilon in the key caculation
self.epsilon = 1
self.increment = 0.1
def getcost(self, xi, xj):
# use a LUT for getting the costd
@@ -120,7 +121,7 @@ class Anytime_Dstar(object):
if s not in self.CLOSED:
# TODO if s is not visited before
self.g[s] = np.inf
if getDist(s, self.xt) <= self.env.resolution:
if s != self.xt:
self.rhs[s] = min([self.getcost(s, s_p) + self.getg(s_p) for s_p in self.getchildren(s)])
self.OPEN.check_remove(s)
if self.getg(s) != self.getrhs(s):
@@ -130,11 +131,13 @@ class Anytime_Dstar(object):
self.INCONS.add(s)
def ComputeorImprovePath(self):
while self.key(self.OPEN.top_key()) < self.key(self.x0) or self.rhs[self.x0] != self.g[self.x0]:
while self.OPEN.top_key() < self.key(self.x0) or self.rhs[self.x0] != self.g[self.x0]:
s = self.OPEN.get()
visualization(self)
if self.g[s] > self.rhs[s]:
self.g[s] = self.rhs[s]
self.CLOSED.add(s)
self.V.add(s)
for s_p in self.getchildren(s):
self.UpdateState(s_p)
else:
@@ -142,17 +145,22 @@ class Anytime_Dstar(object):
self.UpdateState(s)
for s_p in self.getchildren(s):
self.UpdateState(s_p)
self.ind += 1
def Main(self):
epsilon = self.epsilon
increment = self.increment
ischanged = False
islargelychanged = False
self.ComputeorImprovePath()
#TODO publish current epsilon sub-optimal solution
while True:
# change environment
new2,old2 = self.env.move_block(theta = [0,0,0.1*t], mode='rotation')
ischanged = True
# islargelychanged = True
self.Path = []
# update cost with changed environment
if ischanged:
CHANGED = self.updatecost(True, new2, old2, mode='obb')
@@ -161,13 +169,24 @@ class Anytime_Dstar(object):
self.ComputeorImprovePath()
ischanged = False
# if the environment is largely changed
# epsilon += increment or replan from scratch
# else if
# epsilon -= increment
if islargelychanged:
epsilon += increment # or replan from scratch
elif epsilon > 1:
epsilon -= increment
# move states from the INCONS to OPEN
# update priorities in OPEN
Allnodes = self.INCONS.union(set(self.OPEN.enumerate()))
for node in Allnodes:
self.OPEN.put(node, self.key(node, epsilon))
self.INCONS = set()
self.CLOSED = set()
self.ComputeorImprovePath()
# publish current epsilon sub optimal solution
# if epsilon == 1:
# wait for change to occur
pass
if __name__ == '__main__':
AD = Anytime_Dstar(resolution = 1)
AD = Anytime_Dstar(resolution = 0.5)
AD.Main()