2015-07-28 84 views
0

我試圖根據從4個Wi-Fi接入點收到的信號強度來估計位置。我測量位於100平方米(10x10)的方形房間每個角落的4個接入點的信號強度。我使用Android手機將已知位置(x,y)=(9.5,1.5)的信號強度記錄下來。現在我想檢查在這種情況下多邊測量方法的準確性。 使用MATLAB,我應用了一個公式來計算使用信號強度的距離。下面MATLAB函數表示式的應用:根據信號強度查找位置(圓圈之間的交叉區域)

function [ d_vect ] = distance(RSS) 
    % Calculate distance from signal strength 
    result = (27.55 - (20 * log10(2400)) + abs(RSS))/20; 

    d_vect = power(10, result); 

    end 

輸入RSS是與測試點(X,Y)=(9.5,1.5)測得的四個信號強度的載體。 RSS的矢量看起來是這樣的:

RSS = 

    -57.6000 
    -60.4000 
    -44.7000 
    -54.4000 

,並與所有的估計距離每個接入點的合成矢量是這樣的:

d_vect = 

    7.5386 
    10.4061 
    1.7072 
    5.2154 

現在我想根據這些距離估計我的位置,接入點位置,以便找到估計位置和已知位置(9.5,1.5)之間的誤差。我想找到四個圓圈之間的交叉區域(爲了估計位置),其中每個接入點是其中一個圓的中心,距離是圓的半徑。

我想找到的灰色區域,如圖此圖像中: http://www.biologycorner.com/resources/venn4.gif

+1

你爲什麼用標記吧'matlab'?這看起來不像是Matlab代碼。 – kkuilla

+0

你說得對。這是Java代碼(我的最終目標是Android)。不過,我正在MATLAB中測試計算。我會把類似的MATLAB代碼。 –

+0

您的標籤現在不一致。 android標籤不再適用。另外,你應該提供[mcve](http://stackoverflow.com/help/mcve)。在這種情況下,這意味着您應該添加一些樣本數據和該數據的預期輸出。這將顯着增加獲得有用答案的機會。你的問題目前有些武斷。它可能是一個數學,幾何或甚至無線網絡問題。 – kkuilla

回答

0

我發現了一個完美解決問題的answear。它在細節在這個環節上解釋說:

https://gis.stackexchange.com/questions/40660/trilateration-algorithm-for-n-amount-of-points

我也制定了一些問題的MATLAB代碼。這裏有雲:從接入點

估算距離:

function [ d_vect ] = distance(RSS) 
    result = (27.55 - (20 * log10(2400)) + abs(RSS))/20; 
    d_vect = power(10, result); 
end 

三邊測量功能:

function [] = trilat(X, d, real1, real2) 
cla 
circles(X(1), X(5), d(1), 'edgecolor', [0 0 0],'facecolor', 'none','linewidth',4); %AP1 - black 
circles(X(2), X(6), d(2), 'edgecolor', [0 1 0],'facecolor', 'none','linewidth',4); %AP2 - green 
circles(X(3), X(7), d(3), 'edgecolor', [0 1 1],'facecolor', 'none','linewidth',4); %AP3 - cyan 
circles(X(4), X(8), d(4), 'edgecolor', [1 1 0],'facecolor', 'none','linewidth',4); %AP4 - yellow 
axis([0 10 0 10]) 
hold on 
tbl = table(X, d); 
d = d.^2; 
weights = d.^(-1); 
weights = transpose(weights); 
beta0 = [5, 5]; 
modelfun = @(b,X)(abs(b(1)-X(:,1)).^2+abs(b(2)-X(:,2)).^2).^(1/2); 
mdl = fitnlm(tbl,modelfun,beta0, 'Weights', weights); 
b = mdl.Coefficients{1:2,{'Estimate'}} 
scatter(b(1), b(2), 70, [0 0 1], 'filled') 
scatter(real1, real2, 70, [1 0 0], 'filled') 
hold off 

其中,

X:矩陣,AP的座標

d:距離估計矢量

real1:實際位置x

REAL2:真正的位置y

0

所以基本上你需要交4圈。可以有很多方法,並且有兩個方法可以生成確切的交叉區域。

第一種方法是從一個圓開始,與第二個圓相交,然後將結果區與第三個圓相交,依此類推。也就是說,在每一步你知道當前的交集區域,並且你將它與新的圓相交。相交區域將始終是由圓弧限定的區域,因此要與沿着該區域邊界行走的新圓相交,並檢查每個邊界圓弧是否與新圓相交。如果是這樣,那麼只留下位於新圓圈內的圓弧部分,請記住,您應該繼續使用新圓形的圓弧,並繼續遍歷邊界,直到找到下一個交點。

另一種似乎會導致時間複雜性更差的方法,但是對於4個圓圈而言,這並不重要,它是找到兩個圓的所有交點並只選擇那些您感興趣的點,這是在所有其他圈子裏面。這些點將是您所在地區的角落,然後重建該地區相當容易。谷歌搜索了一下之後,我甚至找到了live demo of this approach

1

如果您想要估算位置而不估算圓的交點的替代方法,您可以使用trilateration。在導航(例如GPS)中,在給定一組距離測量值的情況下估計位置是常用的技術。另外,如果你需要這個區域,因爲你還需要估計位置的不確定性,我建議使用least squares來解決三邊測量問題,這將很容易地給你估計所涉及的參數和錯誤傳播以產生一個位置的不確定性。

+0

如果不是相交的圓/球體,那麼三角測量是什麼? –

+0

他們是相關但不相同的,OP詢問有關找到交集的顯式區域,這是比交叉點更難以解決(而不是真正需要)。 – dpmcmlxxvi