11"""
22
3- 2D grid map sample
3+ 2D gaussian grid map sample
44
55author: Atsushi Sakai (@Atsushi_twi)
66
1111import matplotlib .pyplot as plt
1212from scipy .stats import norm
1313
14- AREA_WIDTH = 10.0
14+ EXTEND_AREA = 10.0 # [m] grid map extention length
1515
16- STD = 10.0 # standard diviation
16+ show_animation = True
1717
1818
19- def generate_gaussian_grid_map (ox , oy , xyreso ):
19+ def generate_gaussian_grid_map (ox , oy , xyreso , std ):
2020
2121 minx , miny , maxx , maxy , xw , yw = calc_grid_map_config (ox , oy , xyreso )
2222
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 )]
2524
2625 for ix in range (xw ):
2726 for iy in range (yw ):
@@ -36,104 +35,23 @@ def generate_gaussian_grid_map(ox, oy, xyreso):
3635 if mindis >= d :
3736 mindis = d
3837
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
4140
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
4542
4643
4744def 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 )
5249 xw = int (round ((maxx - minx ) / xyreso ))
5350 yw = int (round ((maxy - miny ) / xyreso ))
5451
5552 return minx , miny , maxx , maxy , xw , yw
5653
5754
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-
13755def draw_heatmap (data , minx , maxx , miny , maxy , xyreso ):
13856 x , y = np .mgrid [slice (minx - xyreso / 2.0 , maxx + xyreso / 2.0 , xyreso ),
13957 slice (miny - xyreso / 2.0 , maxy + xyreso / 2.0 , xyreso )]
@@ -144,18 +62,21 @@ def draw_heatmap(data, minx, maxx, miny, maxy, xyreso):
14462def main ():
14563 print (__file__ + " start!!" )
14664
147- xyreso = 0.5
65+ xyreso = 0.5 # xy grid resolution
66+ STD = 5.0 # standard diviation for gaussian distribution
14867
14968 for i in range (5 ):
15069 ox = (np .random .rand (4 ) - 0.5 ) * 10.0
15170 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 )
15980
16081
16182if __name__ == '__main__' :
0 commit comments