基于rssi的三點(diǎn)定位算法(基于RSSI)

三點(diǎn) 算法 定位 rssi| 2022-12-17 hwszkj

基于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