66
77"""
88
9- from scipy .stats import norm
109import 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-
7010import numpy as np
7111import matplotlib .pyplot as plt
12+ from scipy .stats import norm
7213
7314AREA_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+
11095def 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):
141139def 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
152151if __name__ == '__main__' :
0 commit comments