与iBeacons的生物化

时间:2014-01-07 16:18:08

标签: ios geometry ibeacon trilateration

我正在尝试使用多个iBeacons来跟踪用户在iOS中的位置。我知道这可以(有点)使用3个信标和三边测量来完成,但我想用两个(​​bilateration)来做。我知道我最终可能会得到两个答案。考虑到信标的(x,y)位置(相对于房间),以及每个信标的平均RSSI,有没有人知道一种简单的方法来实现这一点?

我有这个用于trilateration的代码,我从javascript改为objective-c:

- (CGPoint)getTrilaterationWithBeacon1:(BBBeacon *)beacon1 Beacon2:(BBBeacon *)beacon2 Beacon3:(BBBeacon *)beacon3 {
    float xa = beacon1.x;
    float ya = beacon1.y;
    float xb = beacon2.x;
    float yb = beacon2.y;
    float xc = beacon3.x;
    float yc = beacon3.y;
    float ra = beacon1.distance;
    float rb = beacon2.distance;
    float rc = beacon3.distance;

    float S = (pow(xc, 2.) - pow(xb, 2.) + pow(yc, 2.) - pow(yb, 2.) + pow(rb, 2.) - pow(rc, 2.)) / 2.0;
    float T = (pow(xa, 2.) - pow(xb, 2.) + pow(ya, 2.) - pow(yb, 2.) + pow(rb, 2.) - pow(ra, 2.)) / 2.0;
    float y = ((T * (xb - xc)) - (S * (xb - xa))) / (((ya - yb) * (xb - xc)) - ((yc - yb) * (xb - xa)));
    float x = ((y * (ya - yb)) - T) / (xb - xa);

    CGPoint point = CGPointMake(x, y);
    return point;
}

1 个答案:

答案 0 :(得分:0)

所以这是我最终使用的代码,感谢ChuckCottrill建议我寻找一个计算两个圆的交集的公式。它是从我在网上找到的C版本修改的:http://paulbourke.net/geometry/circlesphere/tvoght.c

由于iBeacons返回的RSSI值不一致,结果有些不一致。

我仍然需要添加代码以某种方式选择正确的点(它给出了两个结果)。

- (CGPoint)getBilaterationWithBeacon1:(BBBeacon *)beacon1 Beacon2:(BBBeacon *)beacon2 {
    float x0 = beacon1.locationX;
    float y0 = beacon1.locationY;
    float r0 = beacon1.filteredDistance;
    float x1 = beacon2.locationX;
    float y1 = beacon2.locationY;
    float r1 = beacon2.filteredDistance;

    float a, dx, dy, d, h, rx, ry;
    float x2, y2;

    /* dx and dy are the vertical and horizontal distances between
     * the circle centers.
     */
    dx = x1 - x0;
    dy = y1 - y0;

    /* Determine the straight-line distance between the centers. */
    d = sqrt((dy*dy) + (dx*dx));

    /* Check for solvability. */
    if (d > (r0 + r1)) {
        /* no solution. circles do not intersect. */
        return CGPointMake(-1, -1);
    }
    if (d < abs(r0 - r1)) {
        /* no solution. one circle is contained in the other */
        return CGPointMake(-1, -1);
    }

    /* 'point 2' is the point where the line through the circle
     * intersection points crosses the line between the circle
     * centers.
     */

    /* Determine the distance from point 0 to point 2. */
    a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ;

    /* Determine the coordinates of point 2. */
    x2 = x0 + (dx * a/d);
    y2 = y0 + (dy * a/d);

    /* Determine the distance from point 2 to either of the
     * intersection points.
     */
    h = sqrt((r0*r0) - (a*a));

    /* Now determine the offsets of the intersection points from
     * point 2.
     */
    rx = -dy * (h/d);
    ry = dx * (h/d);

    /* Determine the absolute intersection points. */
    float xi = x2 + rx;
    float xi_prime = x2 - rx;
    float yi = y2 + ry;
    float yi_prime = y2 - ry;

    CGPoint point1 = CGPointMake(xi, yi);
    CGPoint point2 = CGPointMake(xi_prime, yi_prime);

    //pick one

    return point2;
}