Algorithm 不精确距离数据的多读写实现

Algorithm 不精确距离数据的多读写实现,algorithm,localization,ibeacon,indoor-positioning-system,trilateration,Algorithm,Localization,Ibeacon,Indoor Positioning System,Trilateration,我正在尝试创建一个android智能手机应用程序,它使用苹果iBeacon技术来确定自身当前的室内位置。我已经设法获得所有可用的信标,并通过rssi信号计算到它们的距离 目前我面临的问题是,我无法找到任何算法库或算法实现,该算法使用3个(或更多)固定点的距离计算2D中的估计位置,条件是这些距离不准确(这意味着三个“三边测量圆”不在一个点上相交) 如果有人能用任何通用的编程语言(java、C++、python、php、javascript或其他语言)来发布我的链接或实现,我将深感感激。我已经读了很

我正在尝试创建一个android智能手机应用程序,它使用苹果iBeacon技术来确定自身当前的室内位置。我已经设法获得所有可用的信标,并通过rssi信号计算到它们的距离

目前我面临的问题是,我无法找到任何算法库或算法实现,该算法使用3个(或更多)固定点的距离计算2D中的估计位置,条件是这些距离不准确(这意味着三个“三边测量圆”不在一个点上相交)

如果有人能用任何通用的编程语言(java、C++、python、php、javascript或其他语言)来发布我的链接或实现,我将深感感激。我已经读了很多关于stackoverflow的文章,但是找不到任何我能在代码中转换的答案(只有一些数学方法,用矩阵求逆,用向量计算等等)

编辑

我想到了一种自己的方法,对我来说效果很好,但没有那么有效和科学。我迭代位置网格的每一米(或者像我的例子中的0.1米),通过比较该位置到所有信标的距离和我用接收到的rssi信号计算的距离,计算该位置成为手机实际位置的可能性

代码示例:

public Location trilaterate(ArrayList<Beacon> beacons, double maxX, double maxY)
{
    for (double x = 0; x <= maxX; x += .1)
    {
        for (double y = 0; y <= maxY; y += .1)
        {
            double currentLocationProbability = 0;
            for (Beacon beacon : beacons)
            {
                // distance difference between calculated distance to beacon transmitter
                // (rssi-calculated distance) and current location:
                // |sqrt(dX^2 + dY^2) - distanceToTransmitter|
                double distanceDifference = Math
                    .abs(Math.sqrt(Math.pow(beacon.getLocation().x - x, 2)
                                   + Math.pow(beacon.getLocation().y - y, 2))
                         - beacon.getCurrentDistanceToTransmitter());
                // weight the distance difference with the beacon calculated rssi-distance. The
                // smaller the calculated rssi-distance is, the more the distance difference
                // will be weighted (it is assumed, that nearer beacons measure the distance
                // more accurate)
                distanceDifference /= Math.pow(beacon.getCurrentDistanceToTransmitter(), 0.9);
                // sum up all weighted distance differences for every beacon in
                // "currentLocationProbability"
                currentLocationProbability += distanceDifference;
            }
            addToLocationMap(currentLocationProbability, x, y);
            // the previous line is my approach, I create a Set of Locations with the 5 most probable locations in it to estimate the accuracy of the measurement afterwards. If that is not necessary, a simple variable assignment for the most probable location would do the job also
        }
    }
    Location bestLocation = getLocationSet().first().location;
    bestLocation.accuracy = calculateLocationAccuracy();
    Log.w("TRILATERATION", "Location " + bestLocation + " best with accuracy "
                           + bestLocation.accuracy);
    return bestLocation;
}
trilaterate公共位置(ArrayList信标、双maxX、双maxY)
{
对于(double x=0;x你有3个点:A(xA,yA,zA),B(xB,yB,zB)和C(xC,yC,zC),它们分别大约在距离目标点G(xG,yG,zG)的dA,dB和dC处。

假设cA、cB和cC是置信率(0 否则,将长方体一分为二,根据长方体的哪一侧更长,可以用x或y来划分。对于两半,计算解的质量界限,如下所示。由于目标函数是相加的,求每个信标的下界之和。信标的下界是圆到长方体的距离乘以比例因子。递归在具有下限的子项中查找最佳解。仅当第一个子项中的最佳解比另一个子项的下限差时,才检查另一个子项

这里的大部分实现工作是框到圆的距离计算。由于框是轴对齐的,我们可以使用来确定从框点到圆心的精确距离范围


附言:
Math.hypot
是计算二维欧几里德距离的一个很好的函数。

我不考虑单个信标的置信水平,而是在您使用可用数据做出最佳猜测后,尝试为您的结果分配一个总体置信水平。我不认为唯一可用的指标(感知功率)是准确度的良好指标。如果几何结构不良或信标行为不当,您可能会高度信任不良数据。如果您平等信任所有信标,则根据感知到的信标距离与计算点的吻合程度,得出总体置信水平可能更有意义

我在下面写了一些Python,根据3-beacon案例中提供的数据,通过计算前两个信标的两个圆交点,然后选择与第三个最匹配的点,得出最佳猜测。这是为了开始解决问题,而不是最终解决方案。如果信标不相交,我t稍微增加每个信标的半径,直到它们达到或达到阈值。同样,它确保第三个信标在可设置的阈值内一致。对于n个信标,我会选择3或4个最强的信号并使用这些信号。可以进行大量优化,我认为这是一个由unw引起的试射问题艾迪的信标特性

导入数学
信标=[[0.0,0.0,7.0],[0.0,10.0,7.0],[10.0,5.0,16.0]#x,y,半径
def点距离(x1、y1、x2、y2):
x=x2-x1
y=y2-y1
返回math.sqrt((x*x)+(y*y))
#确定两个圆的两个交点[x,y,半径]
#如果圆不相交,则返回None
def环形交叉口(信标1、信标2):
r1=信标1[2]
r2=信标2[2]
距离=点距离(信标1[0],信标1[1],信标2[0],信标2[1])
heron_根=(dist+r1+r2)*(-dist+r1+r2)*(dist-r1+r2)*(dist-r1+r2)*(dist+r1-r2)
如果(heron_root>0):
heron=0.25*math.sqrt(heron_根)
xbase=(0.5)*(beacon1[0]+beacon2[0])+(0.5)*(beacon2[0]-beacon1[0])*(r1*r1-r2*r2)/(dist*dist)
xdiff=2*(beacon2[1]-beacon1[1])*heron/(dist*dist)
ybase=(0.5)*(beacon1[1]+beacon2[1])+(0.5)*(beacon2[1]-beacon1[1])*(r1*r1-r2*r2)/(dist*dist)
ydiff=2*(beacon2[0]-beacon1[0])*heron/(dist*dist)
返回(xbase+xdiff,ybase-ydiff),(xbase-xdiff,ybase+ydiff)
其他:
#无交叉口,需要增加伪信标功率,然后重试
一无所获
#找到beacon0和beacon1之间的两个交点
#将使用beacon2确定两点中较好的一点
失败=正确
功率增加=0
当发生故障且功率_增加<10时:
res=圆形交叉点(信标[0],信标[1])
如果(res):
交叉点=res
其他:
信标[0][2]*=1.001
信标[1][2]*=1.001
功率增加+=1
持续
失败=错误
#确保最佳配合在x%以内(在这种情况下,为距离第三个信标总距离的10%)
#否则,结果
var sum = (cA*dA) + (cB*dB) + (cC*dC);
dA = cA*dA/sum;
dB = cB*dB/sum;
dC = cC*dC/sum;

xG = (xA*dA) + (xB*dB) + (xC*dC);
yG = (yA*dA) + (yB*dB) + (yC*dC);
xG = (zA*dA) + (zB*dB) + (zC*dC);