从iBeacon获取位置RSSI信号

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

  • 从iBeacon的RSSI获得准确的距离。
  • 应用Trilateration算法来计算位置。
  • 现在我没有得到准确的距离。 iOS“精确度”并不是真正的距离。 我正在应用不同的公式来计算距离,但我无法找到精确的距离。 到目前为止,我可以获得长达10米的精确距离,但至少需要20米的距离。

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

    任何帮助将不胜感激。 谢谢!


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


    一旦你得到了距离,你可以使用下面的代码示例来找到三角点的坐标

     {
       //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;
     }
    
    链接地址: http://www.djcxy.com/p/84959.html

    上一篇: Getting location from iBeacon RSSI signals

    下一篇: Multiliteration implementation with inaccurate distance data