从iBeacon RSSI信号获取位置

时间:2014-09-22 13:15:50

标签: location distance ibeacon rssi trilateration

我试图在3个或更多iBeacons的帮助下获得准确的位置。有两个步骤

  1. 与iBeacon的RSSI保持准确距离。
  2. 应用Trilateration算法计算位置。
  3. 现在我没有得到确切的距离。 iOS"准确度"不是真正的距离。我应用不同的公式计算距离,但我无法找到精确的距离。到目前为止,我能够获得高达10米的精确距离,但我至少需要20米的距离。

    (我使用iBeacon的默认txPower为-59 dbm,我测得C3的功率并使用300ms的广播间隔。

    任何帮助都将受到高度赞赏。谢谢!

2 个答案:

答案 0 :(得分:0)

不幸的是,实际上不可能获得超过10米的非常精确的距离估计。问题是信号在该距离处变得相对较弱并且噪声超过了RSSI测量 - 至少对于快速响应而言。众所周知,信噪比是所有无线电应用中的一般问题。对于蓝牙LE应用,您必须接受更远距离的不准确距离估计,或者在很长一段时间内平均RSSI样本以帮助滤除噪声。

答案 1 :(得分:0)

一旦达到距离,您可以使用以下代码示例来查找三角点的坐标

 {
   //Declarations 
   //include the math.h header file

   double xa=0, ya=0;       //Co-ordinates of 1st ACCESS Point(preferably set as origin)
   double xb=10,yb=0;       //Co-ordinates of 2nd ACCESS Point
   double xc=5,yc=10;       //Co-ordinates of 3rd ACCESS Point
   double triPt[2]={0,0};   //Trilaterated point
   double p1[2]={xa,ya};
   double p2[2]={xb,yb};
   double p3[2]={xc,yc};
   double ex[2],ey[2],ez[2];
   double i=0,k=0,x=0,y=0;
   double distA=5*1.41;    //Distance from API 1 (Measured using RSSI values)  
   double distB=5*1.41;    //"""""             2
   double distC=5;         //"""""             3

   //Transforms to find circles around the three access points
   //Here it is assumed that all access points and the trilaterated point are in the same plane 

   for(int j=0;j<2;j++)
      {
       ex[j]=p2[j]-p1[j];
      }
   double d=sqrt(pow(ex[0],2)+pow(ex[1],2));
   for(int j=0;j<2;j++)
      {
       ex[j]=ex[j]/(sqrt(pow(ex[0],2)+pow(ex[1],2)));
      }
   for(int j=0;j<2;j++)
      {
       i=i+(p3[j]-p1[j])*ex[j];
      }
   for(int j=0;j<2;j++)
      {
       ey[j]=p3[j]-p1[j]-i*ex[j];
      }
   for(int j=0;j<2;j++)
      {
       ey[j]=ey[j]/(sqrt(pow(ey[0],2)+pow(ey[1],2)));
      }
   for(int j=0;j<2;j++)
      {
       k=k+(ey[j]*(p3[j]-p1[j]));
      }
   x=(pow(distA,2)-pow(distB,2)+pow(d,2))/(2*d);
   y=((pow(distA,2)-pow(distC,2)+pow(i,2)+pow(k,2))/(2*k))-((i/k)*x);

   //Calculating the co-ordinates of the point to be trilaterated

   for(int j=0;j<3;j++)
      {
       triPt[j]=p1[j]+x*ex[j]+y*ey[j];
      }

   //Print the values

    cout<<triPt[0]<<endl<<triPt[1];
    getch();
    return 0;
 }