基于rssi的三點(diǎn)定位算法,是已知三個點(diǎn)的坐標(biāo)和未知點(diǎn)到這三個點(diǎn)的rssi的信號值,求解未知點(diǎn)的坐標(biāo)。
首先是將rssi信號轉(zhuǎn)換為距離:
d=10^((ABS(RSSI)-A)/(10*n))
其中d為距離,單位是m。
RSSI為rssi信號強(qiáng)度,為負(fù)數(shù)。
A為距離探測設(shè)備1m時的rssi值的絕對值,最佳范圍在45-49之間。
n為環(huán)境衰減因子,需要測試矯正,最佳范圍在3.25-4.5之間。
在獲取未知點(diǎn)到三個點(diǎn)的距離后,剩下的就是求解未知點(diǎn)的坐標(biāo)。我們都知道兩個圓會相交于一個或者兩個點(diǎn)(如果相交),那么三個圓如果相交的話,必然會交于一個點(diǎn)(三個探測設(shè)備在一條直線上的情況下有可能相交于兩個點(diǎn),這里不考慮),所以我們要求解的未知點(diǎn)便是以三個已知點(diǎn)為圓心,以他們與未知點(diǎn)之間的距離為半徑畫出的三個圓的交點(diǎn)。那么這個問題就轉(zhuǎn)化為了求三個已知圓的交點(diǎn),然后如果根據(jù)圓的方程:
(x1 – x)^2 + (y1-y)^2 = r1^2
(x2 – x)^2 + (y2-y)^2= r2^2
(x3 – x)^2 + (y3-y)^2= r3^2
求解的話,是非常難求出未知點(diǎn)的坐標(biāo)的。
這里介紹另一種程序容易實現(xiàn)的計算方法:
一、判斷任意兩個圓是否相切(內(nèi)切或外切),這里可以設(shè)定一個誤差允許值d,也就是
(x1 – x2)^2 + (y1-y2)^2= (r1+r2+d)^2
滿足上述公式時就認(rèn)為兩個圓相切,其中d為誤差值,可以是正數(shù)或者負(fù)數(shù)。如果兩個圓相切的話,那么交點(diǎn)就比較好求解了:
x = x1+ (x2 - x1)*(r1/(r1 + r2));
y = y1 + (y2- y1)*(r1/(r1 + r2));
求解到x和y的坐標(biāo)后,只需要用第三個圓進(jìn)行驗證,即求出這個點(diǎn)到第三個圓的圓心的距離,再和第三個圓的半徑做比較,如果在誤差允許范圍內(nèi),那么就可以認(rèn)為求得的x,y是三個圓的交點(diǎn),也就是未知點(diǎn)的坐標(biāo)。
二、沒有任意兩個圓相切,那么就先用兩個圓求解兩個交點(diǎn),如下圖:
其中A,B是兩個圓心,坐標(biāo)分別為(xa,ya)和(xb,ybs),C,D是兩個圓的焦點(diǎn),E為AB與CD的交點(diǎn)。
其中
AB^2 = (xa – xb)^2 +(ya-yb)^2
其中
AC^2 =AE^2 + CE^2 1
BC^2 = BE^2+ CE^2 2
AC = ra
BC= rb
AE + BE = AB = (xa – xb)^2+ (ya
– yb)^2
等式2轉(zhuǎn)換為
BC^2 = (AB - AE)^2 + CE^2
BC^2 = AB^2 + AE^2 – 2*AB*AE + CE^2 3
等式3減去等式1:
BC^2 - AC^2 = AB^2 – 2*AB*AE
AE = (rb ^2 - ra ^2 -AB^2)/( – 2*AB)
于是可以根據(jù)以下公式求得CE
CE^2 = AC^2 – AE^2
我們還可以獲取E點(diǎn)的坐標(biāo)(xE, yE)
xE = xa + ( (xb- xa)*AE )/AB
yE = ya + ( (yb- ya)*AE )/AB
然后我需要求得AB和CD的斜率KAB和KCD
kAB = (yb - ya)/(xb - xa)
kCD = (-1)/kAB //這里要注意kAB為0的情況
然后求得CD和x軸的夾角
∠CDX = atan(kCD)
這時候就可以求得C (xc, yc)和D(xd, yd)的坐標(biāo)
xc = xE + CE*cos(∠CDXs)
yc = yE + CE*sin (∠CDXs)
xd = xE - CE*cos(∠CDXs)
yd = yE - CE*sin (∠CDXs) //這里也要注意sin (∠CDXs)和cos(∠CDXs)為nan的情況
至此,我們就求得了兩個圓的兩個交點(diǎn)坐標(biāo),然后只需要用這兩個點(diǎn)去第三個圓做驗證,就可以獲得三個圓的交點(diǎn),也就是我們要求的未知點(diǎn)。
來源:CSDN