与距离测量误差的三边测量

时间:2014-05-30 14:45:33

标签: java geometry computational-geometry trilateration

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论文中提及问题的二维版本。

0 个答案:

没有答案