Skip to content

Commit 1ee13a7

Browse files
committed
first release raycasting_grid_map
1 parent 4c71239 commit 1ee13a7

File tree

1 file changed

+30
-59
lines changed

1 file changed

+30
-59
lines changed

Mapping/raycasting_grid_map/raycasting_grid_map.py

Lines changed: 30 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""
22
3-
2D grid map sample
3+
Ray casting 2D grid map example
44
55
author: Atsushi Sakai (@Atsushi_twi)
66
@@ -9,46 +9,17 @@
99
import math
1010
import numpy as np
1111
import matplotlib.pyplot as plt
12-
from scipy.stats import norm
1312

14-
AREA_WIDTH = 10.0
13+
EXTEND_AREA = 10.0
1514

16-
STD = 10.0 # standard diviation
17-
18-
19-
def generate_gaussian_grid_map(ox, oy, xyreso):
20-
21-
minx, miny, maxx, maxy, xw, yw = calc_grid_map_config(ox, oy, xyreso)
22-
23-
# calc each potential
24-
pmap = [[0.0 for i in range(yw)] for i in range(xw)]
25-
26-
for ix in range(xw):
27-
for iy in range(yw):
28-
29-
x = ix * xyreso + minx
30-
y = iy * xyreso + miny
31-
32-
# Search minimum distance
33-
mindis = float("inf")
34-
for (iox, ioy) in zip(ox, oy):
35-
d = math.sqrt((iox - x)**2 + (ioy - y)**2)
36-
if mindis >= d:
37-
mindis = d
38-
39-
pdf = (1.0 - norm.cdf(mindis, 0.0, STD))
40-
pmap[ix][iy] = pdf
41-
42-
draw_heatmap(pmap, minx, maxx, miny, maxy, xyreso)
43-
plt.plot(ox, oy, "xr")
44-
plt.plot(0.0, 0.0, "ob")
15+
show_animation = True
4516

4617

4718
def calc_grid_map_config(ox, oy, xyreso):
48-
minx = round(min(ox) - AREA_WIDTH / 2.0)
49-
miny = round(min(oy) - AREA_WIDTH / 2.0)
50-
maxx = round(max(ox) + AREA_WIDTH / 2.0)
51-
maxy = round(max(oy) + AREA_WIDTH / 2.0)
19+
minx = round(min(ox) - EXTEND_AREA / 2.0)
20+
miny = round(min(oy) - EXTEND_AREA / 2.0)
21+
maxx = round(max(ox) + EXTEND_AREA / 2.0)
22+
maxy = round(max(oy) + EXTEND_AREA / 2.0)
5223
xw = int(round((maxx - minx) / xyreso))
5324
yw = int(round((maxy - miny) / xyreso))
5425

@@ -69,6 +40,14 @@ def __str__(self):
6940
return str(self.px) + "," + str(self.py) + "," + str(self.d) + "," + str(self.angle)
7041

7142

43+
def atan_zero_to_twopi(y, x):
44+
angle = math.atan2(y, x)
45+
if angle < 0.0:
46+
angle += math.pi * 2.0
47+
48+
return angle
49+
50+
7251
def precasting(minx, miny, xw, yw, xyreso, yawreso):
7352

7453
precast = [[] for i in range(round((math.pi * 2.0) / yawreso) + 1)]
@@ -79,10 +58,7 @@ def precasting(minx, miny, xw, yw, xyreso, yawreso):
7958
py = iy * xyreso + miny
8059

8160
d = math.sqrt(px**2 + py**2)
82-
angle = math.atan2(py, px)
83-
if angle < 0.0:
84-
angle += math.pi * 2.0
85-
61+
angle = atan_zero_to_twopi(py, px)
8662
angleid = math.floor(angle / yawreso)
8763

8864
pc = precastDB()
@@ -99,23 +75,18 @@ def precasting(minx, miny, xw, yw, xyreso, yawreso):
9975
return precast
10076

10177

102-
def generate_ray_casting_grid_map(ox, oy, xyreso):
78+
def generate_ray_casting_grid_map(ox, oy, xyreso, yawreso):
10379

10480
minx, miny, maxx, maxy, xw, yw = calc_grid_map_config(ox, oy, xyreso)
10581

10682
pmap = [[0.0 for i in range(yw)] for i in range(xw)]
10783

108-
yawreso = math.radians(10.0)
109-
11084
precast = precasting(minx, miny, xw, yw, xyreso, yawreso)
11185

11286
for (x, y) in zip(ox, oy):
11387

11488
d = math.sqrt(x**2 + y**2)
115-
angle = math.atan2(y, x)
116-
if angle < 0.0:
117-
angle += math.pi * 2.0
118-
89+
angle = atan_zero_to_twopi(y, x)
11990
angleid = math.floor(angle / yawreso)
12091

12192
gridlist = precast[angleid]
@@ -124,14 +95,12 @@ def generate_ray_casting_grid_map(ox, oy, xyreso):
12495
iy = int(round((y - miny) / xyreso))
12596

12697
for grid in gridlist:
127-
if grid.d > (d):
98+
if grid.d > d:
12899
pmap[grid.ix][grid.iy] = 0.5
129100

130101
pmap[ix][iy] = 1.0
131102

132-
draw_heatmap(pmap, minx, maxx, miny, maxy, xyreso)
133-
plt.plot(ox, oy, "xr")
134-
plt.plot(0.0, 0.0, "ob")
103+
return pmap, minx, maxx, miny, maxy, xyreso
135104

136105

137106
def draw_heatmap(data, minx, maxx, miny, maxy, xyreso):
@@ -144,18 +113,20 @@ def draw_heatmap(data, minx, maxx, miny, maxy, xyreso):
144113
def main():
145114
print(__file__ + " start!!")
146115

147-
xyreso = 0.5
116+
xyreso = 0.25 # x-y grid resolution [m]
117+
yawreso = math.radians(10.0) # yaw angle resolution [rad]
148118

149119
for i in range(5):
150120
ox = (np.random.rand(4) - 0.5) * 10.0
151121
oy = (np.random.rand(4) - 0.5) * 10.0
152-
plt.cla()
153-
generate_gaussian_grid_map(ox, oy, xyreso)
154-
plt.pause(1.0)
155-
156-
plt.cla()
157-
generate_ray_casting_grid_map(ox, oy, xyreso)
158-
plt.pause(1.0)
122+
pmap, minx, maxx, miny, maxy, xyreso = generate_ray_casting_grid_map(
123+
ox, oy, xyreso, yawreso)
124+
if show_animation:
125+
plt.cla()
126+
draw_heatmap(pmap, minx, maxx, miny, maxy, xyreso)
127+
plt.plot(ox, oy, "xr")
128+
plt.plot(0.0, 0.0, "ob")
129+
plt.pause(1.0)
159130

160131

161132
if __name__ == '__main__':

0 commit comments

Comments
 (0)