1
1
"""
2
2
3
- 2D grid map sample
3
+ 2D gaussian grid map sample
4
4
5
5
author: Atsushi Sakai (@Atsushi_twi)
6
6
11
11
import matplotlib .pyplot as plt
12
12
from scipy .stats import norm
13
13
14
- AREA_WIDTH = 10.0
14
+ EXTEND_AREA = 10.0 # [m] grid map extention length
15
15
16
- STD = 10.0 # standard diviation
16
+ show_animation = True
17
17
18
18
19
- def generate_gaussian_grid_map (ox , oy , xyreso ):
19
+ def generate_gaussian_grid_map (ox , oy , xyreso , std ):
20
20
21
21
minx , miny , maxx , maxy , xw , yw = calc_grid_map_config (ox , oy , xyreso )
22
22
23
- # calc each potential
24
- pmap = [[0.0 for i in range (yw )] for i in range (xw )]
23
+ gmap = [[0.0 for i in range (yw )] for i in range (xw )]
25
24
26
25
for ix in range (xw ):
27
26
for iy in range (yw ):
@@ -36,104 +35,23 @@ def generate_gaussian_grid_map(ox, oy, xyreso):
36
35
if mindis >= d :
37
36
mindis = d
38
37
39
- pdf = (1.0 - norm .cdf (mindis , 0.0 , STD ))
40
- pmap [ix ][iy ] = pdf
38
+ pdf = (1.0 - norm .cdf (mindis , 0.0 , std ))
39
+ gmap [ix ][iy ] = pdf
41
40
42
- draw_heatmap (pmap , minx , maxx , miny , maxy , xyreso )
43
- plt .plot (ox , oy , "xr" )
44
- plt .plot (0.0 , 0.0 , "ob" )
41
+ return gmap , minx , maxx , miny , maxy
45
42
46
43
47
44
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 )
45
+ minx = round (min (ox ) - EXTEND_AREA / 2.0 )
46
+ miny = round (min (oy ) - EXTEND_AREA / 2.0 )
47
+ maxx = round (max (ox ) + EXTEND_AREA / 2.0 )
48
+ maxy = round (max (oy ) + EXTEND_AREA / 2.0 )
52
49
xw = int (round ((maxx - minx ) / xyreso ))
53
50
yw = int (round ((maxy - miny ) / xyreso ))
54
51
55
52
return minx , miny , maxx , maxy , xw , yw
56
53
57
54
58
- class precastDB :
59
-
60
- def __init__ (self ):
61
- self .px = 0.0
62
- self .py = 0.0
63
- self .d = 0.0
64
- self .angle = 0.0
65
- self .ix = 0
66
- self .iy = 0
67
-
68
- def __str__ (self ):
69
- return str (self .px ) + "," + str (self .py ) + "," + str (self .d ) + "," + str (self .angle )
70
-
71
-
72
- def precasting (minx , miny , xw , yw , xyreso , yawreso ):
73
-
74
- precast = [[] for i in range (round ((math .pi * 2.0 ) / yawreso ) + 1 )]
75
-
76
- for ix in range (xw ):
77
- for iy in range (yw ):
78
- px = ix * xyreso + minx
79
- py = iy * xyreso + miny
80
-
81
- 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
-
86
- angleid = math .floor (angle / yawreso )
87
-
88
- pc = precastDB ()
89
-
90
- pc .px = px
91
- pc .py = py
92
- pc .d = d
93
- pc .ix = ix
94
- pc .iy = iy
95
- pc .angle = angle
96
-
97
- precast [angleid ].append (pc )
98
-
99
- return precast
100
-
101
-
102
- def generate_ray_casting_grid_map (ox , oy , xyreso ):
103
-
104
- minx , miny , maxx , maxy , xw , yw = calc_grid_map_config (ox , oy , xyreso )
105
-
106
- pmap = [[0.0 for i in range (yw )] for i in range (xw )]
107
-
108
- yawreso = math .radians (10.0 )
109
-
110
- precast = precasting (minx , miny , xw , yw , xyreso , yawreso )
111
-
112
- for (x , y ) in zip (ox , oy ):
113
-
114
- 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
-
119
- angleid = math .floor (angle / yawreso )
120
-
121
- gridlist = precast [angleid ]
122
-
123
- ix = int (round ((x - minx ) / xyreso ))
124
- iy = int (round ((y - miny ) / xyreso ))
125
-
126
- for grid in gridlist :
127
- if grid .d > (d ):
128
- pmap [grid .ix ][grid .iy ] = 0.5
129
-
130
- pmap [ix ][iy ] = 1.0
131
-
132
- draw_heatmap (pmap , minx , maxx , miny , maxy , xyreso )
133
- plt .plot (ox , oy , "xr" )
134
- plt .plot (0.0 , 0.0 , "ob" )
135
-
136
-
137
55
def draw_heatmap (data , minx , maxx , miny , maxy , xyreso ):
138
56
x , y = np .mgrid [slice (minx - xyreso / 2.0 , maxx + xyreso / 2.0 , xyreso ),
139
57
slice (miny - xyreso / 2.0 , maxy + xyreso / 2.0 , xyreso )]
@@ -144,18 +62,21 @@ def draw_heatmap(data, minx, maxx, miny, maxy, xyreso):
144
62
def main ():
145
63
print (__file__ + " start!!" )
146
64
147
- xyreso = 0.5
65
+ xyreso = 0.5 # xy grid resolution
66
+ STD = 5.0 # standard diviation for gaussian distribution
148
67
149
68
for i in range (5 ):
150
69
ox = (np .random .rand (4 ) - 0.5 ) * 10.0
151
70
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 )
71
+ gmap , minx , maxx , miny , maxy = generate_gaussian_grid_map (
72
+ ox , oy , xyreso , STD )
73
+
74
+ if show_animation :
75
+ plt .cla ()
76
+ draw_heatmap (gmap , minx , maxx , miny , maxy , xyreso )
77
+ plt .plot (ox , oy , "xr" )
78
+ plt .plot (0.0 , 0.0 , "ob" )
79
+ plt .pause (1.0 )
159
80
160
81
161
82
if __name__ == '__main__' :
0 commit comments