66
77"""
88
9+ from scipy .stats import norm
10+ import math
11+
912
1013# function gm=RayCastingUpdate(gm,z)
1114# %レイキャスティングによるGridの更新
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
148110def 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
171135def 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
177141def 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
187152if __name__ == '__main__' :
0 commit comments