Skip to content

Commit 05ff909

Browse files
committed
try to implement
1 parent 273728a commit 05ff909

File tree

1 file changed

+121
-3
lines changed

1 file changed

+121
-3
lines changed

SLAM/iterative_closest_point/iterative_closest_point.py

Lines changed: 121 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,132 @@
66
77
"""
88

9-
# import math
10-
# import numpy as np
11-
# import matplotlib.pyplot as plt
9+
import math
10+
import numpy as np
11+
import matplotlib.pyplot as plt
12+
13+
# % 点をランダムでばら撒く(t-1の時の点群)
14+
# data1=fieldLength*rand(2,nPoint)-fieldLength/2;
15+
16+
# % data2= data1を移動させる & ノイズ付加
17+
# % 回転方向 & ノイズ付加
18+
# theta=toRadian(motion(3))+toRadian(thetaSigma)*rand(1);
19+
# % 並進ベクトル & ノイズ付加
20+
# t=repmat(motion(1:2)',1,nPoint)+transitionSigma*randn(2,nPoint);
21+
# % 回転行列の作成
22+
# A=[cos(theta) sin(theta);-sin(theta) cos(theta)];
23+
# % data1を移動させてdata2を作る
24+
# data2=t+A*data1;
25+
26+
# % ICPアルゴリズム data2とdata1のMatching
27+
# % R:回転行列 t:併進ベクトル
28+
# % [R,T]=icp(data1,data2)
29+
# [R,T] = ICPMatching(data2,data1);
30+
31+
# function [R, t]=ICPMatching(data1, data2)
32+
# % ICPアルゴリズムによる、並進ベクトルと回転行列の計算を実施する関数
33+
# % data1 = [x(t)1 x(t)2 x(t)3 ...]
34+
# % data2 = [x(t+1)1 x(t+1)2 x(t+1)3 ...]
35+
# % x=[x y z]'
36+
37+
# R=eye(2);%回転行列
38+
# t=zeros(2,1);%並進ベクトル
39+
40+
# while ~(dError < EPS)
41+
# count=count+1;
42+
43+
# [ii, error]=FindNearestPoint(data1, data2);%最近傍点探索
44+
# [R1, t1]=SVDMotionEstimation(data1, data2, ii);%特異値分解による移動量推定
45+
# %計算したRとtで点群とRとtの値を更新
46+
# data2=R1*data2;
47+
# data2=[data2(1,:)+t1(1) ; data2(2,:)+t1(2)];
48+
# R = R1*R;
49+
# t = R1*t + t1;
50+
51+
# dError=abs(preError-error);%エラーの改善量
52+
# preError=error;%一つ前のエラーの総和値を保存
53+
54+
# if count > maxIter %収束しなかった
55+
# disp('Max Iteration');return;
56+
# end
57+
# end
58+
# disp(['Convergence:',num2str(count)]);
59+
60+
# function [index, error]=FindNearestPoint(data1, data2)
61+
# %data2に対するdata1の最近傍点のインデックスを計算する関数
62+
# m1=size(data1,2);
63+
# m2=size(data2,2);
64+
# index=[];
65+
# error=0;
66+
67+
# for i=1:m1
68+
# dx=(data2-repmat(data1(:,i),1,m2));
69+
# dist=sqrt(dx(1,:).^2+dx(2,:).^2);
70+
# [dist, ii]=min(dist);
71+
# index=[index; ii];
72+
# error=error+dist;
73+
# end
74+
75+
# function [R, t]=SVDMotionEstimation(data1, data2, index)
76+
# %特異値分解法による並進ベクトルと、回転行列の計算
77+
78+
# %各点群の重心の計算
79+
# M = data1;
80+
# mm = mean(M,2);
81+
# S = data2(:,index);
82+
# ms = mean(S,2);
83+
84+
# %各点群を重心中心の座標系に変換
85+
# Sshifted = [S(1,:)-ms(1); S(2,:)-ms(2);];
86+
# Mshifted = [M(1,:)-mm(1); M(2,:)-mm(2);];
87+
88+
# W = Sshifted*Mshifted';
89+
# [U,A,V] = svd(W);%特異値分解
90+
91+
# R = (U*V')';%回転行列の計算
92+
# t = mm - R*ms;%並進ベクトルの計算
93+
94+
95+
def ICP_matching(pdata, data):
96+
R = 0.0 # rotation matrix
97+
T = 0.0 # translation vector
98+
99+
# ICP
100+
# EPS = 0.0001
101+
# maxIter = 100
102+
103+
# preError = 0
104+
# loopcount = 0
105+
# dError = 1000.0
106+
107+
return R, T
12108

13109

14110
def main():
15111
print(__file__ + " start!!")
16112

113+
# simulation parameters
114+
nPoint = 10
115+
fieldLength = 50.0
116+
motion = [0.5, 1.0, math.radians(-40.0)] # movement [x[m],y[m],yaw[deg]]
117+
# transitionSigma=0.01;%並進方向の移動誤差標準偏差[m]
118+
# thetaSigma=1; %回転方向の誤差標準偏差[deg]
119+
120+
# previous point data
121+
px = (np.random.rand(nPoint) - 0.5) * fieldLength
122+
py = (np.random.rand(nPoint) - 0.5) * fieldLength
123+
124+
cx = [math.cos(motion[2]) * x - math.sin(motion[2]) * y + motion[0]
125+
for (x, y) in zip(px, py)]
126+
cy = [math.sin(motion[2]) * x + math.cos(motion[2]) * y + motion[1]
127+
for (x, y) in zip(px, py)]
128+
129+
plt.plot(px, py, ".b")
130+
plt.plot(cx, cy, ".r")
131+
plt.plot(0.0, 0.0, "xr")
132+
plt.axis("equal")
133+
plt.show()
134+
17135

18136
if __name__ == '__main__':
19137
main()

0 commit comments

Comments
 (0)