6
6
7
7
"""
8
8
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
+
9
142
import numpy as np
10
143
import matplotlib .pyplot as plt
11
144
@@ -24,12 +157,12 @@ def generate_ray_casting_grid_map(ox, oy, reso):
24
157
# calc each potential
25
158
pmap = [[0.0 for i in range (yw )] for i in range (xw )]
26
159
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 )
29
164
30
- for iy in range (yw ):
31
- y = iy * reso + miny
32
- pmap [ix ][iy ] = x + y
165
+ pmap [ix ][iy ] = 100.0
33
166
34
167
draw_heatmap (pmap )
35
168
plt .show ()
@@ -38,13 +171,14 @@ def generate_ray_casting_grid_map(ox, oy, reso):
38
171
def draw_heatmap (data ):
39
172
data = np .array (data ).T
40
173
plt .pcolor (data , vmax = 100.0 , cmap = plt .cm .Blues )
174
+ plt .axis ("equal" )
41
175
42
176
43
177
def main ():
44
178
print (__file__ + " start!!" )
45
179
46
- ox = [0.0 ]
47
- oy = [0.0 ]
180
+ ox = [0.0 , 5.0 ]
181
+ oy = [0.0 , 5.0 ]
48
182
reso = 1.0
49
183
50
184
generate_ray_casting_grid_map (ox , oy , reso )
0 commit comments