如图所示,从理论而言,所有的测量点都必须位于空间平面内,首先需要进行空间平面拟合; 其次,在空间圆中任意两点连线可以得到一条弦,通过这条弦的直线方程可以计算出对应的中垂面方程,以测量点 N ( N > 3 ) N(N > 3) N(N>3)为例,可以得到 N − 1 N-1 N−1条线性不相关的弦,从而得出 N − 1 N-1 N−1个线性不相关的中垂面方程。根据空间圆的特性,拟合平面和所有空间平面相交有且只有一个交点,这个交点即为平面圆的圆心; 最后,将拟合的空间平面作为限制条件,中垂面作为观测方程,利用带有限制条件的间接平差作为基本函数模型推导出平面圆圆心的计算方程,再根据点到圆心的代数距离方程计算出平面圆半径。
由于所有观测点必在平面上,所以首先需对实测点进行平面拟合。任何空间平面方程可表示为:
a x + b y + c z − 1 = 0 (1) ax + by + cz-1 = 0 \tag{1} ax+by+cz−1=0(1)
将 n n n个观测点的三维坐标代入式(1)可得:
A ⋅ X − l = 0 (2) A·X-l = 0 \tag{2} A⋅X−l=0(2)
式中:
A = ( x 1 x 2 ⋯ x n y 1 y 2 ⋯ y n z 1 z 2 ⋯ z n ) T , X = ( a b c ) T , l = ( 1 1 ⋯ 1 ) T A=\left( \begin{matrix} x_1 & x_2 & \cdots& x_n\\ y_1 & y_2 & \cdots& y_n \\ z_1 & z_2 & \cdots& z_n \end{matrix} \right)^T,X=\left( \begin{matrix} a & b & c\\ \end{matrix} \right)^T, l=\left( \begin{matrix} 1 & 1 & \cdots& 1\\ \end{matrix} \right)^T A= x1y1z1x2y2z2⋯⋯⋯xnynzn T,X=(abc)T,l=(11⋯1)T
权阵 P P P 为单位矩阵。
根据最小二乘法则 V T P V = m i n V^TPV = min VTPV=min 可知,拟合平面的法向量的方向系数为:
X = ( A T A ) − 1 A T l (3) X = (A^TA)^{-1} A^Tl\tag{3} X=(ATA)−1ATl(3)
而各个点 P i ( x i , y i , z i ) P_i(x_i,y_i,z_i) Pi(xi,yi,zi) 的平整度为:
d i = ∣ a x i + b y i + c z i − 1 ∣ a 2 + b 2 + c 2 (4) d_i=\frac{|ax_i+by_i+cz_i-1|}{\sqrt{a^2+b^2+c^2}}\tag{4} di=a2+b2+c2∣axi+byi+czi−1∣(4)
运用空间向量思想推导球面上任意两点之间的中垂面方程。
向量 P 1 P 2 ⃗ \vec{P_1P_2} P1P2为 ( x 2 − x 1 , y 2 − y 1 , z 2 − z 1 ) (x_2-x_1,y_2-y_1,z_2-z_1) (x2−x1,y2−y1,z2−z1),设圆心 P 0 ( x 0 , y 9 , z 0 ) P_0(x_0,y_9,z_0) P0(x0,y9,z0),过 P 1 P_1 P1和 P 2 P_2 P2的中间点 P 12 P_{12} P12与圆心 P 0 P_0 P0连线的方向向量为 P 0 P 12 ⃗ ( x 2 + x 1 2 − x 0 , y 2 + y 1 2 − y 0 , z 2 + z 1 2 − z 0 ) \vec{P_0P_{12}}(\frac{x_2+x_1}{2}-x_0,\frac{y_2+y_1}{2}-y_0,\frac{z_2+z_1}{2}-z_0) P0P12(2x2+x1−x0,2y2+y1−y0,2z2+z1−z0),由于2个空间向量垂直,得出:
( x 2 − x 1 , y 2 − y 1 , z 2 − z 1 ) ⋅ ( x 2 + x 1 2 − x 0 , y 2 + y 1 2 − y 0 , z 2 + z 1 2 − z 0 ) = 0 (5) (x_2-x_1,y_2-y_1,z_2-z_1)\cdot(\frac{x_2+x_1}{2}-x_0,\frac{y_2+y_1}{2}-y_0,\frac{z_2+z_1}{2}-z_0)=0\tag{5} (x2−x1,y2−y1,z2−z1)⋅(2x2+x1−x0,2y2+y1−y0,2z2+z1−z0)=0(5)
式(5) 可以简化为下式:
Δ x 12 ⋅ x 0 + Δ y 12 ⋅ y 0 + Δ z 12 ⋅ z 0 - l 1 = 0 (6) Δx_{12}·x_0 + Δy_{12}·y_0 + Δz_{12}·z_0 - l_1=0 \tag{6} Δx12⋅x0+Δy12⋅y0+Δz12⋅z0-l1=0(6)
式中, Δ x 12 = x 2 − x 1 , Δ y 12 = y 2 − y 1 , Δ z 12 = z 2 − z 1 , l 1 = ( x 2 2 + y 2 2 + z 2 2 − x 1 2 − y 1 2 − z 1 2 ) 2 Δx_{12} = x_2-x_1,Δy_{12} = y_2-y_1,Δz_{12} = z_2-z_1,l_1=\frac{(x_2^2+y_2^2+z_2^2-x_1^2-y_1^2-z_1^2)}{2} Δx12=x2−x1,Δy12=y2−y1,Δz12=z2−z1,l1=2(x22+y22+z22−x12−y12−z12)。
由空间球体中垂面方程的相关性, n n n个观测点坐标可以列出 n − 1 n-1 n−1个线性无关的中垂面方程,可得误差方程:
( v 1 v 2 ⋮ v n − 1 ) = ( Δ x 12 Δ x 23 ⋯ Δ x ( n − 1 ) n Δ y 12 Δ y 23 ⋯ Δ y ( n − 1 ) n Δ z 12 Δ z 23 ⋯ Δ z ( n − 1 ) n ) ( l 1 l 2 ⋮ l n ) (7) \left( \begin{matrix} v_1 \\ v_2 \\ \vdots \\ v_{n-1} \end{matrix} \right)= \left( \begin{matrix} Δx_{12}&Δx_{23}&\cdots&Δx_{(n-1)n} \\ Δy_{12}&Δy_{23}&\cdots&Δy_{(n-1)n} \\ Δz_{12}&Δz_{23}&\cdots&Δz_{(n-1)n} \\ \end{matrix} \right) \left( \begin{matrix} l_1 \\ l_2 \\ \vdots \\ l_n\\ \end{matrix} \right) \tag{7} v1v2⋮vn−1 = Δx12Δy12Δz12Δx23Δy23Δz23⋯⋯⋯Δx(n−1)nΔy(n−1)nΔz(n−1)n l1l2⋮ln (7)
上式简化为: V = B ⋅ X - L (8) V = B·X - L \tag{8} V=B⋅X-L(8)
此时权阵 P P P为单位阵。认定圆心必在拟合的空间平面上,依此作为限制条件,按照附有条件的间接平差进行计算,限制条件为式(9),推导法方程,可得圆心的最小二乘解。
限制条件: C ⋅ X − W x = 0 (9) C·X-W_x = 0 \tag{9} C⋅X−Wx=0(9)
式中: C = ( a , b , c ) C = (a, b, c) C=(a,b,c), W x = 1 W_x = 1 Wx=1 。
法方程为:
( B T P B C T C 0 ) ⋅ ( X K s ) − ( B T P l W x ) = 0 (10) \left( \begin{matrix} B^TPB & C^T\\ C & 0 \\ \end{matrix} \right)·\left( \begin{matrix} X \\ K_s \\ \end{matrix} \right)- \left( \begin{matrix} B^TPl \\ W_x \\ \end{matrix} \right)=0 \tag{10} (BTPBCCT0)⋅(XKs)−(BTPlWx)=0(10)
式中 K s K_s Ks为限制条件的联系数向量。
得出最小二乘解:
( X K s ) = ( B T P B C T C 0 ) − 1 ⋅ ( B T P l W x ) = 0 (11) \left( \begin{matrix} X \\ K_s \\ \end{matrix} \right)= \left( \begin{matrix} B^TPB & C^T\\ C & 0 \\ \end{matrix} \right)^{-1}\cdot \left( \begin{matrix} B^TPl \\ W_x \\ \end{matrix} \right)=0 \tag{11} (XKs)=(BTPBCCT0)−1⋅(BTPlWx)=0(11)
再根据解出的圆心坐标,求出各个观测点到空间圆圆心的距离:
r i = ( x i − x 0 ) 2 + ( y i - y 0 ) 2 + ( z i - z 0 ) 2 , ( i = 1 , 2 , … , n ) (12) r_i= \sqrt{(x_i -x_0)^2 + (y_i-y_0)^2 + (z_i-z_0) ^2} ,(i = 1,2,…,n)\tag{12} ri=(xi−x0)2+(yi-y0)2+(zi-z0)2,(i=1,2,…,n)(12)
圆的拟合半径 r r r为这些距离的平均值, Δ r i = r i − r ( i = 1 , 2 , … , n ) Δr_i = r_i -r(i =1,2,…,n) Δri=ri−r(i=1,2,…,n)为这些点的圆度。
[1] 李英硕,杨帆,袁兆奎.空间圆形拟合检测新方法[J].测绘科学,2013,38(06):147-148.DOI:10.16251/j.cnki.1009-2307.2013.06.060.
# --------------------------------读取点云--------------------------------
pc = PointCloudReader('E://data//Circle.pcd');
# -------------------------------获取xyz坐标------------------------------
P = []; % XYZ坐标
n = point_num; % 点的个数
# ----------------------最小二乘求拟合平面的法向量系数--------------------
% 法方程:AX-l=0
A = []; % 法方程系数
l = []; % 法方程常数项
X = A * [] * l; % 求解法方程
di = |(ax+by+cz-1)/sqrt(a^2+b^2+c^2)|; % 各点的平整度
# ------------------------------空间圆拟合--------------------------------
B = []; % 系数矩阵B
L = []; % 系数矩阵L
% 限制条件:CX - Wx = 0
C = (a, b, c);
% 法方程系数
N = [B'*B C';C 0];
% 法方程常数项
W = [B'*L;1];
% 求解法方程
Xo = N^-1 * W;
% 计算圆心
center = [xo yo zo];
% 计算半径
ri = sqrt((xi-xo)^2+(yi-yo)^2+(zi-zo)^2);
r = mean(ri); % 空间圆拟合半径
% 计算点的圆度
dri = ri - r;
# ----------------------------结果可视化----------------------------------
figure
% 1、绘制原始点
h1 = plot3(P(:,1), P(:,2), P(:,3), '*');
% 2、绘制拟合空间圆
x = c1 + r * a(1) * cos(theta) + r * b(1) * sin(theta);% 圆上各点的x坐标
y = c2 + r * a(2) * cos(theta) + r * b(2) * sin(theta);% 圆上各点的y坐标
z = c3 + r * a(3) * cos(theta) + r * b(3) * sin(theta);% 圆上各点的z坐标
hold on;
h2 = plot3(x, y, z, '-r');
% 3、绘制拟合圆圆心
h3 = plot3(center(1),center(2),center(3),'go');
grid on
% 4、误差分布统计
plot(di); % 平整度
hold on
plot(dri,'.-'); % 圆度