28
28
RANGE_STD = 3.0 # standard deviation for observation gaussian distribution
29
29
30
30
# grid map param
31
- XY_RESO = 0.5 # xy grid resolution
32
- MINX = - 15.0
33
- MINY = - 5.0
34
- MAXX = 15.0
35
- MAXY = 25.0
31
+ XY_RESOLUTION = 0.5 # xy grid resolution
32
+ MIN_X = - 15.0
33
+ MIN_Y = - 5.0
34
+ MAX_X = 15.0
35
+ MAX_Y = 25.0
36
36
37
37
# simulation parameters
38
38
NOISE_RANGE = 2.0 # [m] 1σ range noise parameter
41
41
show_animation = True
42
42
43
43
44
- class GridMap () :
44
+ class GridMap :
45
45
46
46
def __init__ (self ):
47
47
self .data = None
48
- self .xy_reso = None
49
- self .minx = None
50
- self .miny = None
51
- self .maxx = None
52
- self .maxx = None
53
- self .xw = None
54
- self .yw = None
48
+ self .xy_resolution = None
49
+ self .min_x = None
50
+ self .min_y = None
51
+ self .max_x = None
52
+ self .max_y = None
53
+ self .x_w = None
54
+ self .y_w = None
55
55
self .dx = 0.0 # movement distance
56
56
self .dy = 0.0 # movement distance
57
57
@@ -64,10 +64,10 @@ def histogram_filter_localization(grid_map, u, z, yaw):
64
64
return grid_map
65
65
66
66
67
- def calc_gaussian_observation_pdf (gmap , z , iz , ix , iy , std ):
67
+ def calc_gaussian_observation_pdf (grid_map , z , iz , ix , iy , std ):
68
68
# predicted range
69
- x = ix * gmap . xy_reso + gmap . minx
70
- y = iy * gmap . xy_reso + gmap . miny
69
+ x = ix * grid_map . xy_resolution + grid_map . min_x
70
+ y = iy * grid_map . xy_resolution + grid_map . min_y
71
71
d = math .hypot (x - z [iz , 1 ], y - z [iz , 2 ])
72
72
73
73
# likelihood
@@ -76,16 +76,16 @@ def calc_gaussian_observation_pdf(gmap, z, iz, ix, iy, std):
76
76
return pdf
77
77
78
78
79
- def observation_update (gmap , z , std ):
79
+ def observation_update (grid_map , z , std ):
80
80
for iz in range (z .shape [0 ]):
81
- for ix in range (gmap . xw ):
82
- for iy in range (gmap . yw ):
83
- gmap .data [ix ][iy ] *= calc_gaussian_observation_pdf (
84
- gmap , z , iz , ix , iy , std )
81
+ for ix in range (grid_map . x_w ):
82
+ for iy in range (grid_map . y_w ):
83
+ grid_map .data [ix ][iy ] *= calc_gaussian_observation_pdf (
84
+ grid_map , z , iz , ix , iy , std )
85
85
86
- gmap = normalize_probability (gmap )
86
+ grid_map = normalize_probability (grid_map )
87
87
88
- return gmap
88
+ return grid_map
89
89
90
90
91
91
def calc_input ():
@@ -112,8 +112,8 @@ def motion_model(x, u):
112
112
113
113
114
114
def draw_heat_map (data , mx , my ):
115
- maxp = max ([max (igmap ) for igmap in data ])
116
- plt .pcolor (mx , my , data , vmax = maxp , cmap = plt .cm .get_cmap ("Blues" ))
115
+ max_value = max ([max (i_data ) for i_data in data ])
116
+ plt .pcolor (mx , my , data , vmax = max_value , cmap = plt .cm .get_cmap ("Blues" ))
117
117
plt .axis ("equal" )
118
118
119
119
@@ -140,43 +140,47 @@ def observation(xTrue, u, RFID):
140
140
return xTrue , z , ud
141
141
142
142
143
- def normalize_probability (gmap ):
144
- sump = sum ([sum (igmap ) for igmap in gmap .data ])
143
+ def normalize_probability (grid_map ):
144
+ sump = sum ([sum (i_data ) for i_data in grid_map .data ])
145
145
146
- for ix in range (gmap . xw ):
147
- for iy in range (gmap . yw ):
148
- gmap .data [ix ][iy ] /= sump
146
+ for ix in range (grid_map . x_w ):
147
+ for iy in range (grid_map . y_w ):
148
+ grid_map .data [ix ][iy ] /= sump
149
149
150
- return gmap
150
+ return grid_map
151
151
152
152
153
- def init_gmap ( xy_reso , minx , miny , maxx , maxy ):
153
+ def init_grid_map ( xy_resolution , min_x , min_y , max_x , max_y ):
154
154
grid_map = GridMap ()
155
155
156
- grid_map .xy_reso = xy_reso
157
- grid_map .minx = minx
158
- grid_map .miny = miny
159
- grid_map .maxx = maxx
160
- grid_map .maxy = maxy
161
- grid_map .xw = int (round ((grid_map .maxx - grid_map .minx ) / grid_map .xy_reso ))
162
- grid_map .yw = int (round ((grid_map .maxy - grid_map .miny ) / grid_map .xy_reso ))
163
-
164
- grid_map .data = [[1.0 for _ in range (grid_map .yw )] for _ in range (grid_map .xw )]
156
+ grid_map .xy_resolution = xy_resolution
157
+ grid_map .min_x = min_x
158
+ grid_map .min_y = min_y
159
+ grid_map .max_x = max_x
160
+ grid_map .max_y = max_y
161
+ grid_map .x_w = int (round ((grid_map .max_x - grid_map .min_x )
162
+ / grid_map .xy_resolution ))
163
+ grid_map .y_w = int (round ((grid_map .max_y - grid_map .min_y )
164
+ / grid_map .xy_resolution ))
165
+
166
+ grid_map .data = [[1.0 for _ in range (grid_map .y_w )]
167
+ for _ in range (grid_map .x_w )]
165
168
grid_map = normalize_probability (grid_map )
166
169
167
170
return grid_map
168
171
169
172
170
173
def map_shift (grid_map , x_shift , y_shift ):
171
- tgmap = copy .deepcopy (grid_map .data )
174
+ tmp_grid_map = copy .deepcopy (grid_map .data )
172
175
173
- for ix in range (grid_map .xw ):
174
- for iy in range (grid_map .yw ):
176
+ for ix in range (grid_map .x_w ):
177
+ for iy in range (grid_map .y_w ):
175
178
nix = ix + x_shift
176
179
niy = iy + y_shift
177
180
178
- if 0 <= nix < grid_map .xw and 0 <= niy < grid_map .yw :
179
- grid_map .data [ix + x_shift ][iy + y_shift ] = tgmap [ix ][iy ]
181
+ if 0 <= nix < grid_map .x_w and 0 <= niy < grid_map .y_w :
182
+ grid_map .data [ix + x_shift ][iy + y_shift ] = \
183
+ tmp_grid_map [ix ][iy ]
180
184
181
185
return grid_map
182
186
@@ -185,22 +189,26 @@ def motion_update(grid_map, u, yaw):
185
189
grid_map .dx += DT * math .cos (yaw ) * u [0 ]
186
190
grid_map .dy += DT * math .sin (yaw ) * u [0 ]
187
191
188
- x_shift = grid_map .dx // grid_map .xy_reso
189
- y_shift = grid_map .dy // grid_map .xy_reso
192
+ x_shift = grid_map .dx // grid_map .xy_resolution
193
+ y_shift = grid_map .dy // grid_map .xy_resolution
190
194
191
195
if abs (x_shift ) >= 1.0 or abs (y_shift ) >= 1.0 : # map should be shifted
192
196
grid_map = map_shift (grid_map , int (x_shift ), int (y_shift ))
193
- grid_map .dx -= x_shift * grid_map .xy_reso
194
- grid_map .dy -= y_shift * grid_map .xy_reso
197
+ grid_map .dx -= x_shift * grid_map .xy_resolution
198
+ grid_map .dy -= y_shift * grid_map .xy_resolution
195
199
196
200
grid_map .data = gaussian_filter (grid_map .data , sigma = MOTION_STD )
197
201
198
202
return grid_map
199
203
200
204
201
- def calc_grid_index (gmap ):
202
- mx , my = np .mgrid [slice (gmap .minx - gmap .xy_reso / 2.0 , gmap .maxx + gmap .xy_reso / 2.0 , gmap .xy_reso ),
203
- slice (gmap .miny - gmap .xy_reso / 2.0 , gmap .maxy + gmap .xy_reso / 2.0 , gmap .xy_reso )]
205
+ def calc_grid_index (grid_map ):
206
+ mx , my = np .mgrid [slice (grid_map .min_x - grid_map .xy_resolution / 2.0 ,
207
+ grid_map .max_x + grid_map .xy_resolution / 2.0 ,
208
+ grid_map .xy_resolution ),
209
+ slice (grid_map .min_y - grid_map .xy_resolution / 2.0 ,
210
+ grid_map .max_y + grid_map .xy_resolution / 2.0 ,
211
+ grid_map .xy_resolution )]
204
212
205
213
return mx , my
206
214
@@ -217,7 +225,7 @@ def main():
217
225
time = 0.0
218
226
219
227
xTrue = np .zeros ((4 , 1 ))
220
- grid_map = init_gmap ( XY_RESO , MINX , MINY , MAXX , MAXY )
228
+ grid_map = init_grid_map ( XY_RESOLUTION , MIN_X , MIN_Y , MAX_X , MAX_Y )
221
229
mx , my = calc_grid_index (grid_map ) # for grid map visualization
222
230
223
231
while SIM_TIME >= time :
@@ -234,8 +242,9 @@ def main():
234
242
if show_animation :
235
243
plt .cla ()
236
244
# for stopping simulation with the esc key.
237
- plt .gcf ().canvas .mpl_connect ('key_release_event' ,
238
- lambda event : [exit (0 ) if event .key == 'escape' else None ])
245
+ plt .gcf ().canvas .mpl_connect (
246
+ 'key_release_event' ,
247
+ lambda event : [exit (0 ) if event .key == 'escape' else None ])
239
248
draw_heat_map (grid_map .data , mx , my )
240
249
plt .plot (xTrue [0 , :], xTrue [1 , :], "xr" )
241
250
plt .plot (RF_ID [:, 0 ], RF_ID [:, 1 ], ".k" )
0 commit comments