mirror of
https://github.com/AtsushiSakai/PythonRobotics.git
synced 2026-04-22 03:00:22 -04:00
release potentialfieldplanning
This commit is contained in:
BIN
PathPlanning/PotentialFieldPlanning/animation.gif
Normal file
BIN
PathPlanning/PotentialFieldPlanning/animation.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.9 MiB |
@@ -4,6 +4,9 @@ Potential Field based path planner
|
|||||||
|
|
||||||
author: Atsushi Sakai (@Atsushi_twi)
|
author: Atsushi Sakai (@Atsushi_twi)
|
||||||
|
|
||||||
|
Ref:
|
||||||
|
https://www.cs.cmu.edu/~motionplanning/lecture/Chap4-Potential-Field_howie.pdf
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@@ -12,7 +15,7 @@ import matplotlib.pyplot as plt
|
|||||||
# Parameters
|
# Parameters
|
||||||
KP = 5.0 # attractive potential gain
|
KP = 5.0 # attractive potential gain
|
||||||
ETA = 100.0 # repulsive potential gain
|
ETA = 100.0 # repulsive potential gain
|
||||||
AREA_WIDTH = 70.0 # potential area width [m]
|
AREA_WIDTH = 30.0 # potential area width [m]
|
||||||
|
|
||||||
show_animation = True
|
show_animation = True
|
||||||
|
|
||||||
@@ -84,11 +87,19 @@ def potential_field_planning(sx, sy, gx, gy, ox, oy, reso, rr):
|
|||||||
|
|
||||||
# calc potential field
|
# calc potential field
|
||||||
pmap, minx, miny = calc_potential_field(gx, gy, ox, oy, reso, rr)
|
pmap, minx, miny = calc_potential_field(gx, gy, ox, oy, reso, rr)
|
||||||
|
draw_heatmap(pmap)
|
||||||
|
|
||||||
# search path
|
# search path
|
||||||
d = np.hypot(sx - gx, sy - gy)
|
d = np.hypot(sx - gx, sy - gy)
|
||||||
ix = round((sx - minx) / reso)
|
ix = round((sx - minx) / reso)
|
||||||
iy = round((sy - miny) / reso)
|
iy = round((sy - miny) / reso)
|
||||||
|
gix = round((gx - minx) / reso)
|
||||||
|
giy = round((gy - miny) / reso)
|
||||||
|
|
||||||
|
if show_animation:
|
||||||
|
plt.plot(ix, iy, "*k")
|
||||||
|
plt.plot(gix, giy, "*m")
|
||||||
|
|
||||||
rx, ry = [sx], [sy]
|
rx, ry = [sx], [sy]
|
||||||
motion = get_motion_model()
|
motion = get_motion_model()
|
||||||
while d >= reso:
|
while d >= reso:
|
||||||
@@ -110,20 +121,25 @@ def potential_field_planning(sx, sy, gx, gy, ox, oy, reso, rr):
|
|||||||
xp = ix * reso + minx
|
xp = ix * reso + minx
|
||||||
yp = iy * reso + miny
|
yp = iy * reso + miny
|
||||||
d = np.hypot(gx - xp, gy - yp)
|
d = np.hypot(gx - xp, gy - yp)
|
||||||
|
|
||||||
if show_animation:
|
|
||||||
plt.plot(rx, ry, "-r")
|
|
||||||
plt.pause(0.01)
|
|
||||||
|
|
||||||
rx.append(xp)
|
rx.append(xp)
|
||||||
ry.append(yp)
|
ry.append(yp)
|
||||||
|
|
||||||
|
if show_animation:
|
||||||
|
plt.plot(ix, iy, ".r")
|
||||||
|
plt.pause(0.01)
|
||||||
|
|
||||||
print("Goal!!")
|
print("Goal!!")
|
||||||
|
|
||||||
return rx, ry
|
return rx, ry
|
||||||
|
|
||||||
|
|
||||||
|
def draw_heatmap(data):
|
||||||
|
data = np.array(data).T
|
||||||
|
plt.pcolor(data, vmax=100.0, cmap=plt.cm.Blues)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
print("potential_field_planning start")
|
||||||
|
|
||||||
sx = 0.0 # start x position [m]
|
sx = 0.0 # start x position [m]
|
||||||
sy = 10.0 # start y positon [m]
|
sy = 10.0 # start y positon [m]
|
||||||
@@ -136,9 +152,6 @@ def main():
|
|||||||
oy = [25.0, 15.0, 26.0, 25.0] # obstacle y position list [m]
|
oy = [25.0, 15.0, 26.0, 25.0] # obstacle y position list [m]
|
||||||
|
|
||||||
if show_animation:
|
if show_animation:
|
||||||
plt.plot(ox, oy, "ok")
|
|
||||||
plt.plot(sx, sy, "*c")
|
|
||||||
plt.plot(gx, gy, "*c")
|
|
||||||
plt.grid(True)
|
plt.grid(True)
|
||||||
plt.axis("equal")
|
plt.axis("equal")
|
||||||
|
|
||||||
@@ -147,7 +160,6 @@ def main():
|
|||||||
sx, sy, gx, gy, ox, oy, grid_size, robot_radius)
|
sx, sy, gx, gy, ox, oy, grid_size, robot_radius)
|
||||||
|
|
||||||
if show_animation:
|
if show_animation:
|
||||||
plt.plot(rx, ry, "-r")
|
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,9 @@ It's heuristic is 2D Euclid distance.
|
|||||||
|
|
||||||
## Model Predictive Trajectory Generator
|
## Model Predictive Trajectory Generator
|
||||||
|
|
||||||
This script is a path planning code with model predictive trajectory generator.
|
This is a path optimization sample on model predictive trajectory generator.
|
||||||
|
|
||||||
|
This algorithm is used for state lattice planner.
|
||||||
|
|
||||||
### Path optimization sample
|
### Path optimization sample
|
||||||
|
|
||||||
|
|||||||
12
tests/test_potential_field_planning.py
Normal file
12
tests/test_potential_field_planning.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
from PathPlanning.PotentialFieldPlanning import potential_field_planning as m
|
||||||
|
|
||||||
|
print(__file__)
|
||||||
|
|
||||||
|
|
||||||
|
class Test(TestCase):
|
||||||
|
|
||||||
|
def test1(self):
|
||||||
|
m.show_animation = False
|
||||||
|
m.main()
|
||||||
Reference in New Issue
Block a user