数学初始预估
在获得球中心和半径r的初始估值后,利用高斯牛顿法来得到球中心和半径r的最终数值。
最小化函数
d 1 = r i − r , r i = ( x − x 0 ) 2 + ( y − y 0 ) 2 + ( z − z 0 ) 2 d_1=r_i-r,r_i=\sqrt {(x-x_0)^2+(y-y_0)^2+(z-z_0)^2} d1=ri−r,ri=(x−x0)2+(y−y0)2+(z−z0)2
参考上图, B = { u 1 , u 2 , u 3 } B=\{u_1,u_2,u_3\} B={u1,u2,u3}经过旋转生成了新的基准 B ′ = { u 1 ′ , u 2 ′ , u 3 ′ } B'=\{u_1',u_2',u_3'\} B′={u1′,u2′,u3′},其中 u 1 , u 2 , u 3 和 u 1 ′ , u 2 ′ , u 3 ′ u_1,u_2,u_3 和 u_1',u_2',u_3' u1,u2,u3和u1′,u2′,u3′都是单位向量, u 1 ′ , u 2 ′ , u 3 ′ u_1',u_2',u_3' u1′,u2′,u3′可以被表示为
[ u 1 ′ ] B = [ c o s ( θ ) s i n ( θ ) 0 ] , [ u 2 ′ ] B = [ − s i n ( θ ) c o s ( θ ) 0 ] , [ u 3 ′ ] B = [ 0 0 1 ] \begin{bmatrix} u_1'\\ \end{bmatrix}_B=\begin{bmatrix} cos(θ)\\ sin(θ)\\ 0\\ \end{bmatrix},\begin{bmatrix} u_2'\\ \end{bmatrix}_B=\begin{bmatrix} -sin(θ)\\ cos(θ)\\ 0\\ \end{bmatrix},\begin{bmatrix} u_3'\\ \end{bmatrix}_B=\begin{bmatrix} 0\\ 0\\ 1\\ \end{bmatrix} [u1′]B=⎣ ⎡cos(θ)sin(θ)0⎦ ⎤,[u2′]B=⎣ ⎡−sin(θ)cos(θ)0⎦ ⎤,[u3′]B=⎣ ⎡001⎦ ⎤
从B’到B的变换矩阵是:
p = [ c o s ( θ ) s i n ( θ ) 0 − s i n ( θ ) c o s ( θ ) 0 0 0 1 ] p=\begin{bmatrix} cos(θ)&sin(θ)&0\\ -sin(θ)&cos(θ)&0\\ 0&0&1\\ \end{bmatrix} p=⎣ ⎡cos(θ)−sin(θ)0sin(θ)cos(θ)0001⎦ ⎤
所以新的坐标(X’,Y’,Z’)可以由旧的坐标(X,Y,Z)计算得到
[ x ′ y ′ z ′ ] = [ c o s ( θ ) s i n ( θ ) 0 − s i n ( θ ) c o s ( θ ) 0 0 0 1 ] [ x y z ] \begin{bmatrix} x'\\ y'\\ z'\\ \end{bmatrix}=\begin{bmatrix} cos(θ)&sin(θ)&0\\ -sin(θ)&cos(θ)&0\\ 0&0&1\\ \end{bmatrix}\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix} ⎣ ⎡x′y′z′⎦ ⎤=⎣ ⎡cos(θ)−sin(θ)0sin(θ)cos(θ)0001⎦ ⎤⎣ ⎡xyz⎦ ⎤
设置坐标轴的方向是a,b,c。 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0,y0,z0)是坐标轴上的点, ( x i , y i , z i ) (x_i,y_i,z_i) (xi,yi,zi)是圆柱上的点,
A 2 + B 2 + C 2 = R 2 A^2+B^2+C^2=R^2 A2+B2+C2=R2其中
A = c ( y i − y 0 ) − b ( z i − z 0 ) A=c(y_i-y_0)-b(z_i-z_0) A=c(yi−y0)−b(zi−z0)
B = a ( z i − z 0 ) − b ( x i − x 0 ) B=a(z_i-z_0)-b(x_i-x_0) B=a(zi−z0)−b(xi−x0)
C = b ( x i − x 0 ) − b ( y i − y 0 ) C=b(x_i-x_0)-b(y_i-y_0) C=b(xi−x0)−b(yi−y0)
R = 半径的初始评估 R=半径的初始评估 R=半径的初始评估
代入上式
[ c ( y i − y 0 ) − b ( z i − z 0 ) ] 2 + [ a ( z i − z 0 ) − b ( x i − x 0 ) ] 2 + [ b ( x i − x 0 ) − b ( y i − y 0 ) ] 2 = R 2 [c(y_i-y_0)-b(z_i-z_0)]^2+[a(z_i-z_0)-b(x_i-x_0)]^2+[b(x_i-x_0)-b(y_i-y_0)]^2=R^2 [c(yi−y0)−b(zi−z0)]2+[a(zi−z0)−b(xi−x0)]2+[b(xi−x0)−b(yi−y0)]2=R2
这个等式是简化了的,它产生下式
A x 2 + B y 2 + C z 2 + D x y + E x z + F y z + G x + H y + I z + J = 0 Ax^2+By^2+ Cz^2+ Dxy + Exz + Fyz + Gx + Hy +Iz + J=0 Ax2+By2+Cz2+Dxy+Exz+Fyz+Gx+Hy+Iz+J=0
其中
A = ( b 2 + c 2 ) A=(b^2+c^2) A=(b2+c2)
B = ( a 2 + c 2 ) B=(a^2+c^2) B=(a2+c2)
C = ( a 2 + b 2 ) C=(a^2+b^2) C=(a2+b2)
D = − 2 a b D=-2ab D=−2ab
E = − 2 a c E=-2ac E=−2ac
F = − 2 b c F=-2bc F=−2bc
G = − 2 ( b 2 + c 2 ) x 0 + 2 a b y 0 + 2 a c z 0 G=-2(b^2+c^2)x_0+2aby_0+2acz_0 G=−2(b2+c2)x0+2aby0+2acz0
H = 2 a b x 0 − 2 ( a 2 + c 2 ) x 0 + 2 b c z 0 H=2abx_0-2(a^2+c^2)x_0+2bcz_0 H=2abx0−2(a2+c2)x0+2bcz0
I = 2 a c x 0 + 2 b c y 0 − 2 ( a 2 + b 2 ) z 0 I=2acx_0+2bcy_0-2(a^2+b^2)z_0 I=2acx0+2bcy0−2(a2+b2)z0
J = ( b 2 + c 2 ) x 0 2 + ( a 2 + c 2 ) y 0 2 + ( a 2 + b 2 ) z 0 2 − 2 b c y 0 z 0 − 2 a c z 0 x 0 − 2 a b x 0 y 0 − R 2 J=(b^2+c^2)x_0^2+(a^2+c^2)y_0^2+(a^2+b^2)z_0^2-2bcy_0z_0-2acz_0x_0-2abx_0y_0-R^2 J=(b2+c2)x02+(a2+c2)y02+(a2+b2)z02−2bcy0z0−2acz0x0−2abx0y0−R2
等式两边同时除以A
x 2 + B A y 2 + C A z 2 + D A x y + E A x z + F A y z + G A x + H A y + I A z + J A = 0 x^2+\frac{B}{A}y^2+ \frac{C}{A}z^2+\frac{D}{A}xy +\frac{E}{A}xz + \frac{F}{A}yz + \frac{G}{A}x +\frac{H}{A}y +\frac{I}{A}z +\frac{J}{A}=0 x2+ABy2+ACz2+ADxy+AExz+AFyz+AGx+AHy+AIz+AJ=0
因此
B A y 2 + C A z 2 + D A x y + E A x z + F A y z + G A x + H A y + I A z + J A = − x 2 \frac{B}{A}y^2+ \frac{C}{A}z^2+\frac{D}{A}xy +\frac{E}{A}xz + \frac{F}{A}yz + \frac{G}{A}x +\frac{H}{A}y +\frac{I}{A}z +\frac{J}{A}=-x^2 ABy2+ACz2+ADxy+AExz+AFyz+AGx+AHy+AIz+AJ=−x2
这个可以写作一个线性系统方程
( y 1 2 z 1 2 x 1 y 1 x 1 z 1 y 1 z 1 x 1 y 1 z 1 1 y 2 2 z 2 2 x 2 y 2 x 2 z 2 y 2 z 2 x 2 y 2 z 2 1 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ y 2 2 z n 2 x n y n x n z n y n z n x n y n z n 1 ) ( B / A C / A D / A E / A F / A G / A H / A I / A J / A ) = ( − x 1 2 − x 2 2 ⋮ − x n 2 ) \begin{pmatrix} y_1^2&z_1^2&x_1y_1&x_1z_1&y_1z_1&x_1&y_1&z_1&1\\ y_2^2&z_2^2&x_2y_2&x_2z_2&y_2z_2&x_2&y_2&z_2&1\\ \vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\ y_2^2&z_n^2&x_ny_n&x_nz_n&y_nz_n&x_n&y_n&z_n&1\\ \end{pmatrix}\begin{pmatrix} B/A\\ C/A\\ D/A\\ E/A\\ F/A\\ G/A\\ H/A\\ I/A\\ J/A\\ \end{pmatrix}=\begin{pmatrix} -x_1^2\\ -x_2^2\\ \vdots\\ -x_n^2\\ \end{pmatrix} ⎝ ⎛y12y22⋮y22z12z22⋮zn2x1y1x2y2⋮xnynx1z1x2z2⋮xnzny1z1y2z2⋮ynznx1x2⋮xny1y2⋮ynz1z2⋮zn11⋮1⎠ ⎞⎝ ⎛B/AC/AD/AE/AF/AG/AH/AI/AJ/A⎠ ⎞=⎝ ⎛−x12−x22⋮−xn2⎠ ⎞
这是 A T A P = A T B A^TAP=A^TB ATAP=ATB的一种形式,P可以被解为
P = ( A T A ) − 1 A T B P=(A^TA)^{-1} A^TB P=(ATA)−1ATB
让C’=C/A,D’=D/A,E’=E/A,F’=F/A,G’=G/A,H’=H/A,I’=I/A,J’=J/A
求解上式如果|D’|,|E’|和|F’|接近于0,B’接近于1表明(a,b,c)=(0,0,1),如果C’接近于1表明(a,b,c)=(0,1,0),否则
K = 2 1 + B ′ + C ′ K=\frac{2}{1+B'+C'} K=1+B′+C′2
A=k,B=kB’,C=kC’,D=kD’,E=kE’,F=kF’,G=kG’,I=kI’,J=kJ’
如果A和B接近于1,那么
c ′ = ( 1 − C ) 1 / 2 , a ′ = E / − 2 c , b ′ = F / 2 c ′ c'=(1-C)^{1/2},a'=E/-2c,b'=F/2c' c′=(1−C)1/2,a′=E/−2c,b′=F/2c′
如果A接近于1,B不接近于1
b ′ = ( 1 − B ) 1 / 2 , a ′ = D / − 2 b ′ , c ′ = F / − 2 b ′ b'=(1-B)^{1/2},a'=D/-2b',c'=F/-2b' b′=(1−B)1/2,a′=D/−2b′,c′=F/−2b′
如果A不接近于1
a ′ = ( 1 − A ) 1 / 2 , a ′ = D / − 2 a ′ , c ′ = E / − 2 a ′ a'=(1-A)^{1/2},a'=D/-2a',c'=E/-2a' a′=(1−A)1/2,a′=D/−2a′,c′=E/−2a′
方向(a’,b’,c’)被归一化得到向量(a,b,c)
已知(a,b,c)是系数G,H,I的定义,而等式 a x 0 + b y 0 + c z 0 = 0 ax_0+by_0+cz_0=0 ax0+by0+cz0=0是用来求解参数 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0,y0,z0)的,这将生成以下的线性系统
( − 2 ( b 2 + c 2 ) 2 a b 2 a c 2 a b − 2 ( a 2 + c 2 ) 2 b c 2 a c − 2 b c − 2 ( a 2 + b 2 ) a b c ) ( x 0 y 0 z 0 ) = ( G H I 0 ) \begin{pmatrix} -2(b^2+c^2)&2ab&2ac\\ 2ab&-2(a^2+c^2)&2bc\\ 2ac&-2bc&-2(a^2+b^2)\\ a&b&c\\ \end{pmatrix}\begin{pmatrix} x_0\\ y_0\\ z_0\\ \end{pmatrix}=\begin{pmatrix} G\\ H\\ I\\ 0\\ \end{pmatrix} ⎝ ⎛−2(b2+c2)2ab2aca2ab−2(a2+c2)−2bcb2ac2bc−2(a2+b2)c⎠ ⎞⎝ ⎛x0y0z0⎠ ⎞=⎝ ⎛GHI0⎠ ⎞
利用正规方程 A T A P = A T B A^TAP=A^TB ATAP=ATB求解这个等式,P包含了在轴上点的初始估值
这可以通过使用J的定义来实现
J = ( b 2 + c 2 ) x 0 2 + ( a 2 + c 2 ) y 0 2 + ( a 2 + b 2 ) z 0 2 − 2 b c y 0 z 0 − 2 a c z 0 x 0 − 2 a b x 0 y 0 − R 2 J=(b^2+c^2)x_0^2+(a^2+c^2)y_0^2+(a^2+b^2)z_0^2-2bcy_0z_0-2acz_0x_0-2abx_0y_0-R^2 J=(b2+c2)x02+(a2+c2)y02+(a2+b2)z02−2bcy0z0−2acz0x0−2abx0y0−R2
所以
R 2 = ( b 2 + c 2 ) x 0 2 + ( a 2 + c 2 ) y 0 2 + ( a 2 + b 2 ) z 0 2 − 2 b c y 0 z 0 − 2 a c z 0 x 0 − 2 a b x 0 y 0 − J R^2=(b^2+c^2)x_0^2+(a^2+c^2)y_0^2+(a^2+b^2)z_0^2-2bcy_0z_0-2acz_0x_0-2abx_0y_0-J R2=(b2+c2)x02+(a2+c2)y02+(a2+b2)z02−2bcy0z0−2acz0x0−2abx0y0−J
点 ( x i , y i , z i ) (x_i,y_i,z_i) (xi,yi,zi)到圆柱体的距离为 d = r i − r d=r_i-r d=ri−r其中
r i = u i 2 + v i 2 + w i 2 a 2 + b 2 + c 2 r_i=\frac{\sqrt {u_i^2+v_i^2+w_i^2}}{\sqrt {a^2+b^2+c^2}} ri=a2+b2+c2ui2+vi2+wi2
u i = c ( y i − y 0 ) − b ( z i − z 0 ) u_i=c(y_i-y_0)-b(z_i-z_0) ui=c(yi−y0)−b(zi−z0)
v i = a ( z i − z 0 ) − b ( x i − x 0 ) v_i=a(z_i-z_0)-b(x_i-x_0) vi=a(zi−z0)−b(xi−x0)
w i = b ( x i − x 0 ) − b ( y i − y 0 ) w_i=b(x_i-x_0)-b(y_i-y_0) wi=b(xi−x0)−b(yi−y0)
雅可比矩阵
J = ( − x 1 r 1 − y 1 r 1 − x 1 z 1 r 1 − y 1 z 1 r 1 − 1 − x 2 r 2 − y 2 r 2 − x 2 z 2 r 2 − y 2 z 2 r 2 − 1 ⋮ ⋮ ⋮ ⋮ ⋮ − x n r n − y n r n − x n z n r n − y n z n r n − 1 ) J=\begin{pmatrix} \frac {-x_1}{r_1}&\frac {-y_1}{r_1}&\frac {-x_1 z_1}{r_1} \frac {-y_1 z_1}{r_1}&-1\\ \frac {-x_2}{r_2}&\frac {-y_2}{r_2}&\frac {-x_2 z_2}{r_2} \frac {-y_2 z_2}{r_2}&-1\\ \vdots&\vdots&\vdots&\vdots&\vdots\\ \frac {-x_n}{r_n}&\frac {-y_n}{r_n}&\frac {-x_n z_n}{r_n} \frac {-y_n z_n}{r_n}&-1\\ \end{pmatrix} J=⎝ ⎛r1−x1r2−x2⋮rn−xnr1−y1r2−y2⋮rn−ynr1−x1z1r1−y1z1r2−x2z2r2−y2z2⋮rn−xnznrn−ynzn−1−1⋮−1⋮⎠ ⎞
J ( p x 0 p y 0 p a p b p r ) = − d J\begin{pmatrix} p_{x0}\\ p_{y0}\\ p_a\\ p_b\\ p_r\\ \end{pmatrix}=-d J⎝ ⎛px0py0papbpr⎠ ⎞=−d
5.根据下式更新参数
( x 0 y 0 z 0 ) = ( x 0 y 0 z 0 ) + U T ( p x 0 p y 0 − p x 0 p a − p y 0 p b ) \begin{pmatrix}x_0\\ y_0\\ z_0\end{pmatrix}=\begin{pmatrix}x_0\\ y_0\\ z_0\end{pmatrix}+U^T\begin{pmatrix}p_{x0}\\p_{y0}\\ -p_{x0}p_a-p_{y0}p_b\end{pmatrix} ⎝ ⎛x0y0z0⎠ ⎞=⎝ ⎛x0y0z0⎠ ⎞+UT⎝ ⎛px0py0−px0pa−py0pb⎠ ⎞
( a b c ) = U T ( p a p b 1 ) \begin{pmatrix}a\\ b\\ c\end{pmatrix}=U^T\begin{pmatrix}p_a\\ p_b\\ 1\end{pmatrix} ⎝ ⎛abc⎠ ⎞=UT⎝ ⎛papb1⎠ ⎞
r = r + p r r=r+p_r r=r+pr
重复以上步骤直到算法收敛,在第一步中使用的是原始数据集的副本而不是经过迭代后的转换数据集
在这篇报告中,详细的讨论了最小二乘法拟合线、平面、圆、球、和圆柱的方法。算法的实现方式是matlab源码都已经包含在附录中。本文还详细地讨论了实现中涉及的数学步骤。我们用来介绍这个项目的文章的摘要也包含在了附录中。