LRT_Astar3D.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. # this is the three dimensional N>1 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 LRT_A_star2:
  19. def __init__(self, resolution=0.5, N=7):
  20. self.N = N
  21. self.Astar = Astar3D.Weighted_A_star(resolution=resolution)
  22. self.path = []
  23. def updateHeuristic(self):
  24. # Initialize hvalues at infinity
  25. for strxi in self.Astar.CLOSED:
  26. self.Astar.h[strxi] = np.inf
  27. Diff = True
  28. while Diff: # repeat DP until converge
  29. hvals, lasthvals = [], []
  30. for strxi in self.Astar.CLOSED:
  31. xi = dehash(strxi)
  32. lasthvals.append(self.Astar.h[strxi])
  33. # update h values if they are smaller
  34. Children = self.Astar.children(xi)
  35. minfval = min([cost(xi, xj, settings=0) + self.Astar.h[hash3D(xj)] for xj in Children])
  36. # h(s) = h(s') if h(s) > c(s,s') + h(s')
  37. if self.Astar.h[strxi] >= minfval:
  38. self.Astar.h[strxi] = minfval
  39. hvals.append(self.Astar.h[strxi])
  40. if lasthvals == hvals: Diff = False
  41. def move(self):
  42. strst = self.Astar.x0
  43. st = self.Astar.start
  44. ind = 0
  45. # find the lowest path down hill
  46. while strst in self.Astar.CLOSED: # when minchild in CLOSED then continue, when minchild in U, stop
  47. # strChildren = self.children(st)
  48. strChildren = [hash3D(i) for i in self.Astar.children(st)]
  49. minh, minchild = np.inf, None
  50. for child in strChildren:
  51. h = self.Astar.h[child]
  52. if h <= minh:
  53. minh, minchild = h, dehash(child)
  54. self.path.append([st, minchild])
  55. strst, st = hash3D(minchild), minchild
  56. for (_, strp) in self.Astar.OPEN.enumerate():
  57. if strp == strst:
  58. break
  59. ind += 1
  60. if ind > 1000:
  61. break
  62. self.Astar.reset(st)
  63. def run(self):
  64. while True:
  65. if self.Astar.run(N=self.N):
  66. self.Astar.Path = self.Astar.Path + self.path
  67. self.Astar.done = True
  68. visualization(self.Astar)
  69. plt.show()
  70. break
  71. self.updateHeuristic()
  72. self.move()
  73. if __name__ == '__main__':
  74. T = LRT_A_star2(resolution=0.5, N=150)
  75. T.run()