Skip to content

Commit 5f56c6a

Browse files
committed
keep implementing but it has a bug
1 parent 98ea30f commit 5f56c6a

File tree

1 file changed

+66
-67
lines changed

1 file changed

+66
-67
lines changed

Mapping/grid_map/grid_map.py

Lines changed: 66 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,69 +6,10 @@
66
77
"""
88

9-
from scipy.stats import norm
109
import math
11-
12-
13-
# function gm=RayCastingUpdate(gm,z)
14-
# %レイキャスティングによるGridの更新
15-
16-
# %事前レイキャスティングモデルの作成
17-
# gm=PreCasting(gm,z.ANGLE_TICK);
18-
19-
# rayId=0;
20-
# %事前レイキャスティングモデルに従ってグリッドの確率の更新
21-
# for iz=1:length(z.data(:,1))%それぞれの観測点に対して
22-
# range=z.data(iz,1);
23-
24-
# rayId=rayId+1;%レイキャスティングクラスタにおけるデータID
25-
# %各観測点はそれぞれのクラスタから取得できるとする。
26-
27-
# %クラスタ内の各gridのデータからビームモデルによるupdate
28-
# for ir=1:length(gm.precasting(rayId).grid(:,1))
29-
# grange=gm.precasting(rayId).grid(ir,1);
30-
# gid=gm.precasting(rayId).grid(ir,5);
31-
32-
# if grange<(range-gm.RESO/2) %free
33-
# gm.data(gid)=0;
34-
# elseif grange<(range+gm.RESO/2) %hit
35-
# gm.data(gid)=1;
36-
# end %それ以上の距離のgridはunknownなので何もしない
37-
# end
38-
# end
39-
40-
# function gm=PreCasting(gm,angleTick)
41-
# %事前レイキャスティングモデルの作成
42-
43-
# %各角度について対応するグリッドを追加していく
44-
# precasting=[];%プレキャスティングの結果 [最小角度,最大角度,中に入るgridのデータ]
45-
# for ia=(0-angleTick/2):angleTick:(360+angleTick/2)
46-
# %角度範囲の保存
47-
# ray.minAngle=ia;
48-
# ray.maxAngle=ia+angleTick;
49-
# grid=[];%角度範囲に入ったグリッドのデータ
50-
# for ig=1:(gm.nGrid)
51-
# %各グリッドのxy値を取得
52-
# gxy=GetXYFromDataIndex(ig,gm);
53-
# range=norm(gxy);
54-
# angle=atan2(gxy(2),gxy(1));
55-
# if angle<0 %[0 360]度に変換
56-
# angle=angle+2*pi;
57-
# end
58-
# if ray.minAngle<=toDegree(angle) && ray.maxAngle>=toDegree(angle)
59-
# grid=[grid;[range,angle,gxy,ig]];
60-
# end
61-
# end
62-
# %rangeの値でソーティングしておく
63-
# if ~isempty(grid)
64-
# ray.grid=sortrows(grid,1);
65-
# end
66-
# precasting=[precasting;ray];
67-
# end
68-
# gm.precasting=precasting;%Grid Mapデータに追加
69-
7010
import numpy as np
7111
import matplotlib.pyplot as plt
12+
from scipy.stats import norm
7213

7314
AREA_WIDTH = 30.0
7415

@@ -107,6 +48,50 @@ def generate_gaussian_grid_map(ox, oy, reso):
10748
plt.show()
10849

10950

51+
class precastDB:
52+
53+
def __init__(self):
54+
self.px = 0.0
55+
self.py = 0.0
56+
self.d = 0.0
57+
self.angle = 0.0
58+
self.ix = 0
59+
self.iy = 0
60+
61+
def __str__(self):
62+
return str(self.px) + "," + str(self.py) + "," + str(self.d) + "," + str(self.angle)
63+
64+
65+
def precasting(minx, miny, xw, yw, reso, yawreso):
66+
67+
precast = [[] for i in range(round((math.pi * 2.0) / yawreso) + 1)]
68+
69+
for ix in range(xw):
70+
for iy in range(yw):
71+
px = ix / reso + minx
72+
py = iy / reso + miny
73+
74+
d = math.sqrt(px**2 + py**2)
75+
angle = math.atan2(py, px)
76+
if angle < 0.0:
77+
angle += math.pi * 2.0
78+
79+
angleid = round(angle / yawreso)
80+
81+
pc = precastDB()
82+
83+
pc.px = px
84+
pc.py = py
85+
pc.d = d
86+
pc.ix = ix
87+
pc.iy = iy
88+
pc.angle = angle
89+
90+
precast[angleid].append(pc)
91+
92+
return precast
93+
94+
11095
def generate_ray_casting_grid_map(ox, oy, reso):
11196

11297
minx = min(ox) - AREA_WIDTH / 2.0
@@ -116,17 +101,30 @@ def generate_ray_casting_grid_map(ox, oy, reso):
116101
xw = round((maxx - minx) / reso)
117102
yw = round((maxy - miny) / reso)
118103

119-
# calc each potential
120104
pmap = [[0.0 for i in range(yw)] for i in range(xw)]
121105

106+
yawreso = math.radians(10.0)
107+
108+
precast = precasting(minx, miny, xw, yw, reso, yawreso)
109+
122110
for (x, y) in zip(ox, oy):
123111

112+
d = math.sqrt(x**2 + y**2)
113+
angle = math.atan2(y, x)
114+
115+
angleid = round(angle / yawreso)
116+
117+
gridlist = precast[angleid]
118+
124119
ix = round(x * reso - minx)
125120
iy = round(y * reso - miny)
126121

127-
pmap[ix][iy] = 100.0
122+
for grid in gridlist:
128123

129-
# print(norm.cdf(x, mean, std))
124+
if ix == grid.ix and iy == grid.iy:
125+
pmap[grid.ix][grid.iy] = 1.0
126+
elif grid.d > d:
127+
pmap[grid.ix][grid.iy] = 0.5
130128

131129
draw_heatmap(pmap)
132130
plt.show()
@@ -141,12 +139,13 @@ def draw_heatmap(data):
141139
def main():
142140
print(__file__ + " start!!")
143141

144-
ox = [0.0, 5.0, 0.0]
145-
oy = [0.0, 5.0, 10.0]
142+
# obstacle positions
143+
ox = [-5.0, 5.0, 0.0, 10.0]
144+
oy = [0.0, 5.0, 10.0, -5.0]
146145
reso = 1.0
147146

148-
generate_gaussian_grid_map(ox, oy, reso)
149-
# generate_ray_casting_grid_map(ox, oy, reso)
147+
# generate_gaussian_grid_map(ox, oy, reso)
148+
generate_ray_casting_grid_map(ox, oy, reso)
150149

151150

152151
if __name__ == '__main__':

0 commit comments

Comments
 (0)