在this链接中,给出了三边测量的过程。
这是我的本地化过程的java代码:
public static double[] localize(final double[] p1, final double[] p2, final double[] p3, final double[] p4, final double r1, final double r2, final double r3, final double r4)
{
double[] ex = normalize(difference(p2,p1));
double i = dot(ex, difference(p3, p1));
double[] ey = normalize(difference(difference(p3,p1), scalar(i,ex)));
double[] ez = cross(ex, ey);
double d = distance(p2, p1);
if(d - r1 >= r2 || r2 >= d + r1 )
return null;
double j = dot(ey, difference(p3, p1));
double x = ((r1*r1) - (r2*r2) + (d*d)) / (2*d);
double y = (((r1*r1) - (r3*r3) + (i*i) + (j*j)) / (2*j)) - ((i*x) / j);
double z = r1*r1- x*x - y*y;
if(z < 0)
return null;
double z1 = Math.sqrt(z);
double z2 = z1*-1;
double[] result1 = new double[]{p1[0], p1[1], p1[2]};
result1 = add(result1, scalar(x,ex));
result1 = add(result1, scalar(y,ey));
result1 = add(result1, scalar(z1,ez));
double[] result2 = new double[]{p1[0], p1[1], p1[2]};
result2 = add(result2, scalar(x,ex));
result2 = add(result2, scalar(y,ey));
result2 = add(result2, scalar(z2,ez));
double d1 = Math.abs(distance(result1, p4) - r4);
double d2 = Math.abs(distance(result2, p4) - r4);
if(d1<=d2)
return result1;
else
return result2;
}
但是现在,正如this论文所示,我想在距离测量中引入一些错误
对于错误alpha
,将有六个相交的球体:三个内球体和三个外球体
它们的厚度为alpha
(测量误差)。
我会得到两个区域而不是两个点。但是,我如何估计给定两个区域的点的位置?
为了编写这样的代码,我尝试了这种方法:
public static boolean inside(final double[] p, double[] c, final double r, final double error)
{
if(Math.pow(p[0]-c[0],2) + Math.pow(p[1]-c[1],2) + Math.pow(p[2]-c[2],2) >= r-error)
if(Math.pow(p[0]-c[0],2) + Math.pow(p[1]-c[1],2) + Math.pow(p[2]-c[2],2) <= r+error)
return true;
return false;
}
public static double[] localize(final double[] p1, final double[] p2, final double[] p3, final double[] p4, final double r1, final double r2, final double r3, final double r4, final double error)
{
double[][][] result = new double[8][3][3];
result[0] = intersection(p1,p2,p3,r1-error,r2-error,r3-error);
result[1] = intersection(p1,p2,p3,r1-error,r2-error,r3+error);
result[2] = intersection(p1,p2,p3,r1-error,r2+error,r3-error);
result[3] = intersection(p1,p2,p3,r1-error,r2+error,r3+error);
result[4] = intersection(p1,p2,p3,r1+error,r2-error,r3-error);
result[5] = intersection(p1,p2,p3,r1+error,r2-error,r3+error);
result[6] = intersection(p1,p2,p3,r1+error,r2+error,r3-error);
result[7] = intersection(p1,p2,p3,r1+error,r2+error,r3+error);
for(int i=0; i<8; i++)
if(result[i] != null)
for(int j=0; j<2; j++)
if(inside(result[i][j], p4, r4, error))
return result[i][j];
return null;
}
这始终给我null
。
你能帮助我解决这个问题吗?
修改:[{1}}函数与intersection()
相同。它不会选择任何一点,但会返回两者。
论文摘要:
本文通过使用成对距离和距离测量误差的影响来研究三维定位。有趣的是,在论文中,二次方程用于构建线性矩阵,因此,通过使用四个以上的信标(参考)来完成定位。 Here,您可以搜索关键字错误,并查看错误的建模方式以及如何构建线性等值。
此外,我会在this论文中提及问题的二维版本。