1212from scipy .stats import norm
1313
1414EXTEND_AREA = 10.0 # [m] grid map extention length
15+ SIM_TIME = 50.0 # simulation time [s]
16+ DT = 0.1 # time tick [s]
17+ MAX_RANGE = 10.0 # maximum observation range
1518
1619show_animation = True
1720
1821
19- def generate_gaussian_grid_map ( ox , oy , xyreso , std ):
22+ def observation_update ( gmap , z , std , xyreso , minx , miny ):
2023
21- minx , miny , maxx , maxy , xw , yw = calc_grid_map_config (ox , oy , xyreso )
24+ for iz in range (z .shape [0 ]):
25+ for ix in range (len (gmap )):
26+ for iy in range (len (gmap [ix ])):
2227
23- gmap = [[0.0 for i in range (yw )] for i in range (xw )]
28+ zr = z [iz , 0 ]
29+ x = ix * xyreso + minx
30+ y = iy * xyreso + miny
2431
25- for ix in range (xw ):
26- for iy in range (yw ):
32+ d = math .sqrt ((x - z [iz , 1 ])** 2 + (y - z [iz , 2 ])** 2 )
2733
28- x = ix * xyreso + minx
29- y = iy * xyreso + miny
34+ pdf = ( 1.0 - norm . cdf ( abs ( d - zr ), 0.0 , std ))
35+ gmap [ ix ][ iy ] *= pdf
3036
31- # Search minimum distance
32- mindis = float ("inf" )
33- for (iox , ioy ) in zip (ox , oy ):
34- d = math .sqrt ((iox - x )** 2 + (ioy - y )** 2 )
35- if mindis >= d :
36- mindis = d
37+ gmap = normalize_probability (gmap )
3738
38- pdf = (1.0 - norm .cdf (mindis , 0.0 , std ))
39- gmap [ix ][iy ] = pdf
39+ return gmap
4040
41- return gmap , minx , maxx , miny , maxy
4241
42+ def calc_input ():
43+ v = 1.0 # [m/s]
44+ yawrate = 0.1 # [rad/s]
45+ u = np .matrix ([v , yawrate ]).T
46+ return u
4347
44- def calc_grid_map_config (ox , oy , xyreso ):
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 )
49- xw = int (round ((maxx - minx ) / xyreso ))
50- yw = int (round ((maxy - miny ) / xyreso ))
5148
52- return minx , miny , maxx , maxy , xw , yw
49+ def motion_model (x , u ):
50+
51+ F = np .matrix ([[1.0 , 0 , 0 , 0 ],
52+ [0 , 1.0 , 0 , 0 ],
53+ [0 , 0 , 1.0 , 0 ],
54+ [0 , 0 , 0 , 0 ]])
55+
56+ B = np .matrix ([[DT * math .cos (x [2 , 0 ]), 0 ],
57+ [DT * math .sin (x [2 , 0 ]), 0 ],
58+ [0.0 , DT ],
59+ [1.0 , 0.0 ]])
60+
61+ x = F * x + B * u
62+
63+ return x
5364
5465
5566def draw_heatmap (data , minx , maxx , miny , maxy , xyreso ):
@@ -59,24 +70,91 @@ def draw_heatmap(data, minx, maxx, miny, maxy, xyreso):
5970 plt .axis ("equal" )
6071
6172
73+ def observation (xTrue , u , RFID ):
74+
75+ xTrue = motion_model (xTrue , u )
76+
77+ # add noise to gps x-y
78+ z = np .matrix (np .zeros ((0 , 3 )))
79+
80+ for i in range (len (RFID [:, 0 ])):
81+
82+ dx = xTrue [0 , 0 ] - RFID [i , 0 ]
83+ dy = xTrue [1 , 0 ] - RFID [i , 1 ]
84+ d = math .sqrt (dx ** 2 + dy ** 2 )
85+ if d <= MAX_RANGE :
86+ dn = d
87+ zi = np .matrix ([dn , RFID [i , 0 ], RFID [i , 1 ]])
88+ z = np .vstack ((z , zi ))
89+
90+ return xTrue , z
91+
92+
93+ def normalize_probability (gmap ):
94+
95+ sump = sum ([sum (igmap ) for igmap in gmap ])
96+ # print(sump)
97+
98+ for i in range (len (gmap )):
99+ for ii in range (len (gmap [i ])):
100+ gmap [i ][ii ] /= sump
101+
102+ return gmap
103+
104+
105+ def init_gmap (xyreso ):
106+
107+ minx = - 15.0
108+ miny = - 5.0
109+ maxx = 15.0
110+ maxy = 25.0
111+ xw = int (round ((maxx - minx ) / xyreso ))
112+ yw = int (round ((maxy - miny ) / xyreso ))
113+
114+ gmap = [[1.0 for i in range (yw )] for i in range (xw )]
115+ gmap = normalize_probability (gmap )
116+
117+ return gmap , minx , maxx , miny , maxy ,
118+
119+
62120def main ():
63121 print (__file__ + " start!!" )
64122
65123 xyreso = 0.5 # xy grid resolution
66- STD = 5.0 # standard diviation for gaussian distribution
124+ STD = 1.0 # standard diviation for gaussian distribution
125+
126+ # RFID positions [x, y]
127+ RFID = np .array ([[10.0 , 0.0 ],
128+ [10.0 , 10.0 ],
129+ [0.0 , 15.0 ],
130+ [- 5.0 , 20.0 ]])
131+
132+ time = 0.0
133+
134+ xTrue = np .matrix (np .zeros ((4 , 1 )))
135+
136+ gmap , minx , maxx , miny , maxy = init_gmap (xyreso )
137+
138+ while SIM_TIME >= time :
139+ time += DT
140+
141+ u = calc_input ()
142+ xTrue , z = observation (xTrue , u , RFID )
67143
68- for i in range (5 ):
69- ox = (np .random .rand (4 ) - 0.5 ) * 10.0
70- oy = (np .random .rand (4 ) - 0.5 ) * 10.0
71- gmap , minx , maxx , miny , maxy = generate_gaussian_grid_map (
72- ox , oy , xyreso , STD )
144+ gmap = observation_update (gmap , z , STD , xyreso , minx , miny )
73145
74146 if show_animation :
75147 plt .cla ()
76148 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 )
149+ plt .plot (xTrue [0 , :], xTrue [1 , :], "xr" )
150+ plt .plot (RFID [:, 0 ], RFID [:, 1 ], ".k" )
151+ for i in range (z .shape [0 ]):
152+ plt .plot ([xTrue [0 , :], z [i , 1 ]], [
153+ xTrue [1 , :], z [i , 2 ]], "-k" )
154+ plt .title ("Time[s]:" + str (time )[0 : 4 ])
155+ plt .pause (0.1 )
156+
157+ print ("Done" )
80158
81159
82160if __name__ == '__main__' :
0 commit comments