我正在尝试创建一个使用 Apple iBeacon 技术来确定自身当前室内位置的 android 智能手机应用程序。我已经设法获取所有可用的信标并通过 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;
}
当然,不利的一面是,我在 300 平方米的地板上有 30.000 个位置,我必须迭代并测量到我收到信号的每个信标的距离(如果是 5,我只进行 150.000 次计算以确定一个位置)。这很多 - 所以我会让这个问题开放,并希望有一些进一步的解决方案或对这个现有解决方案的良好改进,以使其更有效率。
当然,它不必是三边测量方法,就像这个问题的原始标题一样,拥有一个包含三个以上用于位置确定的信标的算法(多边测量)也是很好的。