Skip to content

Commit ae58cd9

Browse files
committed
finish gaussian mapping implementation
1 parent 041ad9f commit ae58cd9

File tree

1 file changed

+37
-72
lines changed

1 file changed

+37
-72
lines changed

Mapping/grid_map/grid_map.py

Lines changed: 37 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
77
"""
88

9+
from scipy.stats import norm
10+
import math
11+
912

1013
# function gm=RayCastingUpdate(gm,z)
1114
# %レイキャスティングによるGridの更新
@@ -64,85 +67,44 @@
6467
# end
6568
# gm.precasting=precasting;%Grid Mapデータに追加
6669

70+
import numpy as np
71+
import matplotlib.pyplot as plt
6772

68-
# function gm=LikelihoodUpdate(gm,z)
69-
# %尤度場のGridMapを作る関数
73+
AREA_WIDTH = 30.0
7074

71-
# for ig=1:(gm.nGrid-1)
72-
# gxy=GetXYFromDataIndex(ig,gm);%それぞれのグリッドxyインデックスを取得
73-
# zxy=FindNearest(gxy,z);%最近傍の観測値の取得
74-
# p=GaussLikelihood(gxy,zxy);%ガウシアン尤度の計算
75-
# gm.data(ig)=p*10;%グリッドへの格納
76-
# end
7775

78-
# function p=GaussLikelihood(gxy,zxy)
79-
# %ガウス分布の尤度を計算する関数
80-
# Sigma=diag([3,3]);%共分散行列
81-
# p=det(2*pi*Sigma)^(-0.5)*exp(-0.5*(gxy-zxy)*inv(Sigma)*(gxy-zxy)');
82-
83-
# function zxy=FindNearest(xy,z)
84-
# %ある座標値xyに一番近いzの値を返す関数
85-
86-
# %すべてのzとxyの差を計算
87-
# d=z.data(:,3:4)-repmat(xy,length(z.data(:,1)),1);
88-
89-
# %ノルム距離の最小値のインデックスを取得
90-
# min=inf;%最小値
91-
# minid=0;
92-
# for id=1:length(d(:,1))
93-
# nd=norm(d(id,:));
94-
# if min>nd
95-
# min=nd;
96-
# minid=id;
97-
# end
98-
# end
99-
# zxy=z.data(minid,3:4);
76+
def generate_gaussian_grid_map(ox, oy, reso):
10077

101-
# function xy=GetXYFromDataIndex(ig,gm)
102-
# %Gridのデータインデックスから,そのグリッドのx,y座標を取得する関数
78+
minx = min(ox) - AREA_WIDTH / 2.0
79+
miny = min(oy) - AREA_WIDTH / 2.0
80+
maxx = max(ox) + AREA_WIDTH / 2.0
81+
maxy = max(oy) + AREA_WIDTH / 2.0
82+
xw = round((maxx - minx) / reso)
83+
yw = round((maxy - miny) / reso)
10384

104-
# %x,yインデックスの取得
105-
# indy=rem(ig,gm.WIDTH)-1;
106-
# indx=fix(ig/gm.WIDTH);
85+
# calc each potential
86+
pmap = [[0.0 for i in range(yw)] for i in range(xw)]
10787

108-
# x=GetXYPosition(indx,gm.WIDTH,gm.RESO);
109-
# y=GetXYPosition(indy,gm.HEIGHT,gm.RESO);
110-
# xy=[x y];
88+
STD = 10.0 # standard diviation
11189

112-
# function position=GetXYPosition(index, width, resolution)
113-
# %x-yインデックスの値から、位置を取得する関数
114-
# position=resolution*(index-width/2)+resolution/2;
90+
for ix in range(xw):
91+
for iy in range(yw):
11592

116-
# function gm=HitGridUpdate(gm,z)
117-
# %観測点がヒットしたグリッドの確率を1にする関数
93+
x = ix / reso + minx
94+
y = iy / reso + miny
11895

119-
# for iz=1:length(z.data(:,1))
120-
# zx=z.data(iz,3);
121-
# zy=z.data(iz,4);
122-
# ind=GetDBIndexFromXY(zx,zy,gm);
123-
# gm.data(ind)=1.0;
124-
# end
125-
# gm.data=Normalize(gm.data);%正規化
126-
127-
# function z=GetObservation()
128-
# %観測点をセンサのモデルに基いて、ランダムに取得する関数
129-
# z.data=[];% 観測値[range, angle x y;...]
130-
# z.ANGLE_TICK=10;%スキャンレーザの角度解像度[deg]
131-
# z.MAX_RANGE=50;%スキャンレーザの最大観測距離[m]
132-
# z.MIN_RANGE=5;%スキャンレーザの最小さい観測距離[m]
133-
134-
# for angle=0:z.ANGLE_TICK:360
135-
# range=rand()*(z.MAX_RANGE-z.MIN_RANGE)+z.MIN_RANGE;
136-
# rad=toRadian(angle);
137-
# x=range*cos(rad);
138-
# y=range*sin(rad);
139-
# z.data=[z.data;[range rad x y]];
140-
# end
96+
# Search minimum distance
97+
mindis = float("inf")
98+
for (iox, ioy) in zip(ox, oy):
99+
d = math.sqrt((iox - x)**2 + (ioy - y)**2)
100+
if mindis >= d:
101+
mindis = d
141102

142-
import numpy as np
143-
import matplotlib.pyplot as plt
103+
pdf = (1.0 - norm.cdf(mindis, 0.0, STD))
104+
pmap[ix][iy] = pdf
144105

145-
AREA_WIDTH = 30.0
106+
draw_heatmap(pmap)
107+
plt.show()
146108

147109

148110
def generate_ray_casting_grid_map(ox, oy, reso):
@@ -164,24 +126,27 @@ def generate_ray_casting_grid_map(ox, oy, reso):
164126

165127
pmap[ix][iy] = 100.0
166128

129+
# print(norm.cdf(x, mean, std))
130+
167131
draw_heatmap(pmap)
168132
plt.show()
169133

170134

171135
def draw_heatmap(data):
172136
data = np.array(data).T
173-
plt.pcolor(data, vmax=100.0, cmap=plt.cm.Blues)
137+
plt.pcolor(data, vmax=1.0, cmap=plt.cm.Blues)
174138
plt.axis("equal")
175139

176140

177141
def main():
178142
print(__file__ + " start!!")
179143

180-
ox = [0.0, 5.0]
181-
oy = [0.0, 5.0]
144+
ox = [0.0, 5.0, 0.0]
145+
oy = [0.0, 5.0, 10.0]
182146
reso = 1.0
183147

184-
generate_ray_casting_grid_map(ox, oy, reso)
148+
generate_gaussian_grid_map(ox, oy, reso)
149+
# generate_ray_casting_grid_map(ox, oy, reso)
185150

186151

187152
if __name__ == '__main__':

0 commit comments

Comments
 (0)