2014-09-22 52 views
0

我試圖通過3個或更多iBeacons獲得準確的位置。有兩個步驟從iBeacon獲取位置RSSI信號

  1. 從iBeacon的RSSI獲得準確的距離。
  2. 應用Trilateration算法來計算位置。

現在我沒有得到準確的距離。 iOS「精確度」並不是真正的距離。我正在應用不同的公式來計算距離,但我無法找到精確的距離。到目前爲止,我可以獲得長達10米的精確距離,但至少需要20米的距離。

(我使用的是默認iBeacon顯示魔女TXPOWER是-59 DBM和我測量的C3的功率和300毫秒使用廣播區間。

任何幫助,將不勝感激。謝謝!

回答

0

不幸的是,實際上不可能在10米以上獲得非常精確的距離估計值,問題是在該距離信號變得相對較弱,並且噪聲壓倒了RSSI測量結果 - 至少對於快速響應來說,信噪比,因爲它是衆所周知的,在所有的無線電應用中都是一個普遍的問題,對於藍牙LE應用,你必須接受更遠距離處的不準確的距離估計,或者平均RSSI山姆在很長的一段時間內,它們會幫助濾除噪音。

0

一旦你得到你的距離,你可以使用下面的代碼示例找到trilaterated點的座標

{ 
    //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; 
}