1
1
"""
2
2
3
- 2D grid map sample
3
+ Ray casting 2D grid map example
4
4
5
5
author: Atsushi Sakai (@Atsushi_twi)
6
6
9
9
import math
10
10
import numpy as np
11
11
import matplotlib .pyplot as plt
12
- from scipy .stats import norm
13
12
14
- AREA_WIDTH = 10.0
13
+ EXTEND_AREA = 10.0
15
14
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
45
16
46
17
47
18
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 )
52
23
xw = int (round ((maxx - minx ) / xyreso ))
53
24
yw = int (round ((maxy - miny ) / xyreso ))
54
25
@@ -69,6 +40,14 @@ def __str__(self):
69
40
return str (self .px ) + "," + str (self .py ) + "," + str (self .d ) + "," + str (self .angle )
70
41
71
42
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
+
72
51
def precasting (minx , miny , xw , yw , xyreso , yawreso ):
73
52
74
53
precast = [[] for i in range (round ((math .pi * 2.0 ) / yawreso ) + 1 )]
@@ -79,10 +58,7 @@ def precasting(minx, miny, xw, yw, xyreso, yawreso):
79
58
py = iy * xyreso + miny
80
59
81
60
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 )
86
62
angleid = math .floor (angle / yawreso )
87
63
88
64
pc = precastDB ()
@@ -99,23 +75,18 @@ def precasting(minx, miny, xw, yw, xyreso, yawreso):
99
75
return precast
100
76
101
77
102
- def generate_ray_casting_grid_map (ox , oy , xyreso ):
78
+ def generate_ray_casting_grid_map (ox , oy , xyreso , yawreso ):
103
79
104
80
minx , miny , maxx , maxy , xw , yw = calc_grid_map_config (ox , oy , xyreso )
105
81
106
82
pmap = [[0.0 for i in range (yw )] for i in range (xw )]
107
83
108
- yawreso = math .radians (10.0 )
109
-
110
84
precast = precasting (minx , miny , xw , yw , xyreso , yawreso )
111
85
112
86
for (x , y ) in zip (ox , oy ):
113
87
114
88
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 )
119
90
angleid = math .floor (angle / yawreso )
120
91
121
92
gridlist = precast [angleid ]
@@ -124,14 +95,12 @@ def generate_ray_casting_grid_map(ox, oy, xyreso):
124
95
iy = int (round ((y - miny ) / xyreso ))
125
96
126
97
for grid in gridlist :
127
- if grid .d > ( d ) :
98
+ if grid .d > d :
128
99
pmap [grid .ix ][grid .iy ] = 0.5
129
100
130
101
pmap [ix ][iy ] = 1.0
131
102
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
135
104
136
105
137
106
def draw_heatmap (data , minx , maxx , miny , maxy , xyreso ):
@@ -144,18 +113,20 @@ def draw_heatmap(data, minx, maxx, miny, maxy, xyreso):
144
113
def main ():
145
114
print (__file__ + " start!!" )
146
115
147
- xyreso = 0.5
116
+ xyreso = 0.25 # x-y grid resolution [m]
117
+ yawreso = math .radians (10.0 ) # yaw angle resolution [rad]
148
118
149
119
for i in range (5 ):
150
120
ox = (np .random .rand (4 ) - 0.5 ) * 10.0
151
121
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 )
159
130
160
131
161
132
if __name__ == '__main__' :
0 commit comments