我正在研究使用多个 iBeacons 进行“粗略”室内定位的可能性。该应用程序是一种“博物馆”设置,能够更容易地形成一个包含不同对象位置的网格,然后形成单独的信标(尽管这也不是不可能的)。
是否有使用多个信标对某种位置进行三角测量的示例、经验,或者一些逻辑来帮助我自己编写它?
我一直在进行一些实验,以使用三个信标获得精确位置。
三边测量结果
不幸的是,结果在质量方面非常令人失望。主要有两个问题:
- 在非受控环境中,您可以找到金属和其他影响信号的物体,信标接收到的信号强度变化如此频繁,以至于误差范围似乎不可能低于 5 米。
- 根据用户处理接收器设备的方式,读数也会发生很大变化。如果用户将他/她的手放在蓝牙天线上,则算法将具有低信号作为输入,因此信标将距离设备很远。看这个图片 http://sotovik.ru//images/review/Apple/iPad3/an.jpeg查看蓝牙天线的精确位置。
可能的解决方案
在与一位积极劝阻我走这条路的苹果工程师交谈后,我觉得现在更倾向于使用的选项是暴力。尝试每隔 X 米设置一个信标(X 是系统中可容忍的最大误差),以便我们可以通过计算网格上的哪个信标距离设备最近并假设在此信标网格上跟踪给定设备的位置设备位于同一位置。
三边测量算法
不过,为了完整起见,我将三边测量算法的核心功能分享如下。它基于第 3 段(“已知的三个距离”)本文 http://everything2.com/title/Triangulate.
- (CGPoint)getCoordinateWithBeaconA:(CGPoint)a beaconB:(CGPoint)b beaconC:(CGPoint)c distanceA:(CGFloat)dA distanceB:(CGFloat)dB distanceC:(CGFloat)dC {
CGFloat W, Z, x, y, y2;
W = dA*dA - dB*dB - a.x*a.x - a.y*a.y + b.x*b.x + b.y*b.y;
Z = dB*dB - dC*dC - b.x*b.x - b.y*b.y + c.x*c.x + c.y*c.y;
x = (W*(c.y-b.y) - Z*(b.y-a.y)) / (2 * ((b.x-a.x)*(c.y-b.y) - (c.x-b.x)*(b.y-a.y)));
y = (W - 2*x*(b.x-a.x)) / (2*(b.y-a.y));
//y2 is a second measure of y to mitigate errors
y2 = (Z - 2*x*(c.x-b.x)) / (2*(c.y-b.y));
y = (y + y2) / 2;
return CGPointMake(x, y);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)