Skip to content

Commit bc296aa

Browse files
committed
keep coding
1 parent c57b40e commit bc296aa

1 file changed

Lines changed: 111 additions & 33 deletions

File tree

Localization/histogram_filter/histogram_filter.py

Lines changed: 111 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,44 +12,55 @@
1212
from scipy.stats import norm
1313

1414
EXTEND_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

1619
show_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

5566
def 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+
62120
def 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

82160
if __name__ == '__main__':

0 commit comments

Comments
 (0)