| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- # this is the three dimensional Real-time Adaptive LRTA* algo
- # !/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- @author: yue qi
- """
- import numpy as np
- import matplotlib.pyplot as plt
- import os
- import sys
- sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../Search-based Planning/")
- from Search_3D.env3D import env
- from Search_3D import Astar3D
- from Search_3D.utils3D import getAABB, getDist, getRay, StateSpace, Heuristic, getNearest, isCollide, hash3D, dehash, \
- cost, obstacleFree
- from Search_3D.plot_util3D import visualization
- import queue
- class RTA_A_star:
- def __init__(self, resolution=0.5, N=7):
- self.N = N # node to expand
- self.Astar = Astar3D.Weighted_A_star(resolution=resolution) # initialize A star
- self.path = [] # empty path
- self.strst = []
- self.localhvals = []
- def updateHeuristic(self):
- # Initialize hvalues at infinity
- self.localhvals = []
- nodeset, vals = [], []
- for (_,strxi) in self.Astar.OPEN.enumerate():
- nodeset.append(strxi)
- vals.append(self.Astar.Space[strxi] + self.Astar.h[strxi])
- strj, fj = nodeset[np.argmin(vals)], min(vals)
- self.strst = strj
- # single pass update of hvals
- for strxi in self.Astar.CLOSED:
- # xi = dehash(strxi)
- self.Astar.h[strxi] = fj - self.Astar.Space[strxi]
- self.localhvals.append(self.Astar.h[strxi])
-
- def move(self):
- strst, localhvals = self.strst, self.localhvals
- maxhval = max(localhvals)
- st = dehash(strst)
- sthval = self.Astar.h[strst]
- # find the lowest path up hill
- while sthval < maxhval:
- parentsvals , parents = [] , []
- # find the max child
- for xi in self.Astar.children(st):
- strxi = hash3D(xi)
- if strxi in self.Astar.CLOSED:
- parents.append(xi)
- parentsvals.append(self.Astar.h[strxi])
- lastst = st
- st, strst = parents[np.argmax(parentsvals)], hash3D(st)
- self.path.append([st,lastst]) # add to path
- sthval = self.Astar.h[strst]
- self.Astar.reset(dehash(self.strst))
- def run(self):
- while True:
- if self.Astar.run(N=self.N):
- self.Astar.Path = self.Astar.Path + self.path
- self.Astar.done = True
- visualization(self.Astar)
- plt.show()
- break
- self.updateHeuristic()
- self.move()
- if __name__ == '__main__':
- T = RTA_A_star(resolution=0.5, N=500)
- T.run()
|