RTA_Astar3D.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # this is the three dimensional Real-time Adaptive LRTA* algo
  2. # !/usr/bin/env python3
  3. # -*- coding: utf-8 -*-
  4. """
  5. @author: yue qi
  6. """
  7. import numpy as np
  8. import matplotlib.pyplot as plt
  9. import os
  10. import sys
  11. sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../Search-based Planning/")
  12. from Search_3D.env3D import env
  13. from Search_3D import Astar3D
  14. from Search_3D.utils3D import getDist, getRay, StateSpace, Heuristic, getNearest, isCollide, hash3D, dehash, \
  15. cost, obstacleFree
  16. from Search_3D.plot_util3D import visualization
  17. import queue
  18. class RTA_A_star:
  19. def __init__(self, resolution=0.5, N=7):
  20. self.N = N # node to expand
  21. self.Astar = Astar3D.Weighted_A_star(resolution=resolution) # initialize A star
  22. self.path = [] # empty path
  23. self.strst = []
  24. self.localhvals = []
  25. def updateHeuristic(self):
  26. # Initialize hvalues at infinity
  27. self.localhvals = []
  28. nodeset, vals = [], []
  29. for (_,strxi) in self.Astar.OPEN.enumerate():
  30. nodeset.append(strxi)
  31. vals.append(self.Astar.Space[strxi] + self.Astar.h[strxi])
  32. strj, fj = nodeset[np.argmin(vals)], min(vals)
  33. self.strst = strj
  34. # single pass update of hvals
  35. for strxi in self.Astar.CLOSED:
  36. # xi = dehash(strxi)
  37. self.Astar.h[strxi] = fj - self.Astar.Space[strxi]
  38. self.localhvals.append(self.Astar.h[strxi])
  39. def move(self):
  40. strst, localhvals = self.strst, self.localhvals
  41. maxhval = max(localhvals)
  42. st = dehash(strst)
  43. sthval = self.Astar.h[strst]
  44. # find the lowest path up hill
  45. while sthval < maxhval:
  46. parentsvals , parents = [] , []
  47. # find the max child
  48. for xi in self.Astar.children(st):
  49. strxi = hash3D(xi)
  50. if strxi in self.Astar.CLOSED:
  51. parents.append(xi)
  52. parentsvals.append(self.Astar.h[strxi])
  53. lastst = st
  54. st, strst = parents[np.argmax(parentsvals)], hash3D(st)
  55. self.path.append([st,lastst]) # add to path
  56. sthval = self.Astar.h[strst]
  57. self.Astar.reset(dehash(self.strst))
  58. def run(self):
  59. while True:
  60. if self.Astar.run(N=self.N):
  61. self.Astar.Path = self.Astar.Path + self.path
  62. self.Astar.done = True
  63. visualization(self.Astar)
  64. plt.show()
  65. break
  66. self.updateHeuristic()
  67. self.move()
  68. if __name__ == '__main__':
  69. T = RTA_A_star(resolution=0.5, N=100)
  70. T.run()