11"""
22
3- 2D grid map sample
3+ Ray casting 2D grid map example
44
55author: Atsushi Sakai (@Atsushi_twi)
66
99import math
1010import numpy as np
1111import 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
4718def 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+
7251def 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
137106def draw_heatmap (data , minx , maxx , miny , maxy , xyreso ):
@@ -144,18 +113,20 @@ def draw_heatmap(data, minx, maxx, miny, maxy, xyreso):
144113def 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
161132if __name__ == '__main__' :
0 commit comments