Skip to content

Commit da82628

Browse files
committed
try implemnt grid map
1 parent 3952b9c commit da82628

File tree

1 file changed

+141
-7
lines changed

1 file changed

+141
-7
lines changed

Mapping/grid_map/grid_map.py

Lines changed: 141 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,139 @@
66
77
"""
88

9+
10+
# function gm=RayCastingUpdate(gm,z)
11+
# %レイキャスティングによるGridの更新
12+
13+
# %事前レイキャスティングモデルの作成
14+
# gm=PreCasting(gm,z.ANGLE_TICK);
15+
16+
# rayId=0;
17+
# %事前レイキャスティングモデルに従ってグリッドの確率の更新
18+
# for iz=1:length(z.data(:,1))%それぞれの観測点に対して
19+
# range=z.data(iz,1);
20+
21+
# rayId=rayId+1;%レイキャスティングクラスタにおけるデータID
22+
# %各観測点はそれぞれのクラスタから取得できるとする。
23+
24+
# %クラスタ内の各gridのデータからビームモデルによるupdate
25+
# for ir=1:length(gm.precasting(rayId).grid(:,1))
26+
# grange=gm.precasting(rayId).grid(ir,1);
27+
# gid=gm.precasting(rayId).grid(ir,5);
28+
29+
# if grange<(range-gm.RESO/2) %free
30+
# gm.data(gid)=0;
31+
# elseif grange<(range+gm.RESO/2) %hit
32+
# gm.data(gid)=1;
33+
# end %それ以上の距離のgridはunknownなので何もしない
34+
# end
35+
# end
36+
37+
# function gm=PreCasting(gm,angleTick)
38+
# %事前レイキャスティングモデルの作成
39+
40+
# %各角度について対応するグリッドを追加していく
41+
# precasting=[];%プレキャスティングの結果 [最小角度,最大角度,中に入るgridのデータ]
42+
# for ia=(0-angleTick/2):angleTick:(360+angleTick/2)
43+
# %角度範囲の保存
44+
# ray.minAngle=ia;
45+
# ray.maxAngle=ia+angleTick;
46+
# grid=[];%角度範囲に入ったグリッドのデータ
47+
# for ig=1:(gm.nGrid)
48+
# %各グリッドのxy値を取得
49+
# gxy=GetXYFromDataIndex(ig,gm);
50+
# range=norm(gxy);
51+
# angle=atan2(gxy(2),gxy(1));
52+
# if angle<0 %[0 360]度に変換
53+
# angle=angle+2*pi;
54+
# end
55+
# if ray.minAngle<=toDegree(angle) && ray.maxAngle>=toDegree(angle)
56+
# grid=[grid;[range,angle,gxy,ig]];
57+
# end
58+
# end
59+
# %rangeの値でソーティングしておく
60+
# if ~isempty(grid)
61+
# ray.grid=sortrows(grid,1);
62+
# end
63+
# precasting=[precasting;ray];
64+
# end
65+
# gm.precasting=precasting;%Grid Mapデータに追加
66+
67+
68+
# function gm=LikelihoodUpdate(gm,z)
69+
# %尤度場のGridMapを作る関数
70+
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
77+
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);
100+
101+
# function xy=GetXYFromDataIndex(ig,gm)
102+
# %Gridのデータインデックスから,そのグリッドのx,y座標を取得する関数
103+
104+
# %x,yインデックスの取得
105+
# indy=rem(ig,gm.WIDTH)-1;
106+
# indx=fix(ig/gm.WIDTH);
107+
108+
# x=GetXYPosition(indx,gm.WIDTH,gm.RESO);
109+
# y=GetXYPosition(indy,gm.HEIGHT,gm.RESO);
110+
# xy=[x y];
111+
112+
# function position=GetXYPosition(index, width, resolution)
113+
# %x-yインデックスの値から、位置を取得する関数
114+
# position=resolution*(index-width/2)+resolution/2;
115+
116+
# function gm=HitGridUpdate(gm,z)
117+
# %観測点がヒットしたグリッドの確率を1にする関数
118+
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
141+
9142
import numpy as np
10143
import matplotlib.pyplot as plt
11144

@@ -24,12 +157,12 @@ def generate_ray_casting_grid_map(ox, oy, reso):
24157
# calc each potential
25158
pmap = [[0.0 for i in range(yw)] for i in range(xw)]
26159

27-
for ix in range(xw):
28-
x = ix * reso + minx
160+
for (x, y) in zip(ox, oy):
161+
162+
ix = round(x * reso - minx)
163+
iy = round(y * reso - miny)
29164

30-
for iy in range(yw):
31-
y = iy * reso + miny
32-
pmap[ix][iy] = x + y
165+
pmap[ix][iy] = 100.0
33166

34167
draw_heatmap(pmap)
35168
plt.show()
@@ -38,13 +171,14 @@ def generate_ray_casting_grid_map(ox, oy, reso):
38171
def draw_heatmap(data):
39172
data = np.array(data).T
40173
plt.pcolor(data, vmax=100.0, cmap=plt.cm.Blues)
174+
plt.axis("equal")
41175

42176

43177
def main():
44178
print(__file__ + " start!!")
45179

46-
ox = [0.0]
47-
oy = [0.0]
180+
ox = [0.0, 5.0]
181+
oy = [0.0, 5.0]
48182
reso = 1.0
49183

50184
generate_ray_casting_grid_map(ox, oy, reso)

0 commit comments

Comments
 (0)