三角测量:寻找一个三维点,使其距离N条/射线的距离最小化。

3

3D空间中给定多条直线(N条),使用最小二乘法找到距离所有直线距离最小的3D点。

enter image description here

How can I express this in Least Square Matrix Form? Thus, Having:
[A] - Variables matrix ( known )
[x] - Unknown vector
[b] - dependent variables vector

Ax=b => Least-Square 

有了距离公式的基础,A、x和'b'应该填什么?

可能是查找使得到N条直线的距离最小的点的重复问题。 - Ivaylo Strandjev
我想说“续集”,但不幸的是,我无法按照时间顺序将上面的图片添加到您描述的帖子讨论中,因此我创建了一个新帖子。 - NadavRub
这不就是d个平方和吗?对于每一行,你都有一个距离,只需将它们平方并相加即可。 - Salix alba
我想使用最小二乘矩阵形式来解决它,因此我需要: 变量的矩阵[A](已知值),未知数的向量[x],以及因变量的向量[b]。 然后,应使用标准最小二乘法来解决(Ax=b) ==> x = (ATA)-1ATb(其中T-转置,-1是逆)。我正在尝试弄清如何以矩阵形式表达上述内容。 - NadavRub
1个回答

4
如果您展开上述 d^2 的公式,您会发现它的形式为:
d^2 = Cxx Px Px + Cxy Px Py + ... + Ex Px + Ey Py + Ez Pz + F

其中Cxx,Ex,F等是与A和B向量有关的常数。现在对每一行求和,将其称为S,这是Px、Py和Pz的二次函数。

S = Sxx Px Px + Sxy Px Py + ... +  Rx Px + Ry Py + Rz Pz + T

现在进行区分。
dS/dx = 2 Sxx Px +   Sxy Py +   Sxz Pz + Rx
dS/dy =   Syx Px + 2 Syy Py +   Syz Pz + Ry
dS/dz =   Szx Px +   Szy Py + 2 Szz Pz + Rz

作为S的最小值,每个都必须为零。您可以将其以矩阵形式写成A x = b。[A]是Sxx等的矩阵,b是向量-[Rx,Ry,Rz],x是向量[Px,Py,Pz]。
我现在已经实现了一个2D版本作为jsfiddle http://jsfiddle.net/SalixAlba/Y3yT9/1/,算法的核心非常简单。
var sxx = 0;
var sxy = 0;
var syy = 0;
var rx = 0;
var ry = 0;
var t = 0;
// each line is defined by a x + b y + c = 0
lines.forEach(function(line, index, array) {
    var div = line.a * line.a + line.b * line.b;
    sxx += line.a * line.a / div;        
    sxy += line.a * line.b / div;        
    syy += line.b * line.b / div;        
    rx += line.a * line.c / div;        
    ry += line.b * line.c / div;        
    t += line.c * line.c / div;        
});
// Derivative of S wrt x and y is
//  2 sxx x + 2 sxy y + 2 rx = 0
//  2 sxy x + 2 syy y + 2 ry = 0

// Solve this pair of linear equations
var det = sxx * syy - sxy * sxy;
if(Math.abs(det) < 1e-6) {
    sol = { x: -10, y: -10 };
    return;
}
// (x) =  1  ( syy    -sxy ) ( -rx )
// ( ) = --- (             ) (     )
// (y)   det ( -sxy    sxx ) ( -ry )
var x = ( - syy * rx + sxy * ry ) / det;
var y = (   sxy * rx - sxx * ry ) / det;
console.log("x "+x+" y "+y);
sol = { x: x, y: y };
return;

感谢您的回复,非常有帮助。考虑到 Ax=b,虽然我清楚如何表达向量 [x],但我不确定我是否理解您回复中“Sxx”和“Rx”符号之间的区别。 - NadavRub
Sxx和Rx只是常数。如果您展开d^2的公式,您将得到Px、Py、Pz的二次方程,其中将有9个二次项、3个一次项和一个常数。现在将这些加在一起,每行一个,这又会给出一个二次方程,我使用Sxx、Rx和T表示这些常数。 - Salix alba
点P和线AB之间的最小距离总是在另一条垂直于AB的线TP上,因此需要至少两条线来三角化点以最小化距离。对于如何将这两条线纳入考虑,我并不清楚,我的猜测是上述Ax=b系统将导致无限解(即垂直线)... - NadavRub
将d的平方项相加。这就是最小二乘法所做的,它最小化平方和的总和。 - Salix alba
我在这里一定是漏掉了什么。平方和可以表示单条或多条线,对于单条线来说,存在无限解(即线上的所有点),考虑到单条线的系数可以表示不同多条线的系数之和, 为什么这个线性系统应该有唯一解而不是无限解呢? - NadavRub
所有的线都已知,称它们为l1、l2、l3……我们想找到一个单独的点P。让d1、d2、d3……分别为P到每条线上最近点的距离。将它们的平方相加得到S。如果只有一条线,则矩阵A将会降秩并且你会在该线上拥有解。最简单的非退化情况是两条线。有一条惟一的最短线段连接着这两条线,最小二乘法将找到该线段的中点,如果您考虑一下,必须是使两个平方距离之和最小的中点。 - Salix alba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接