컨테이너

BLE를 활용한 실내 위치 측위 (5) - 삼변측량 기법을 활용한 실내 위치 측위 본문

Research/Bluetooth

BLE를 활용한 실내 위치 측위 (5) - 삼변측량 기법을 활용한 실내 위치 측위

어항 2022. 3. 2. 18:25
반응형

 

이번 글에선 삼변측량 기법을 활용하여 실내에서 사용자의 위치를 계산하는 방법을 알아보겠습니다. 지난 글에서 삼변측량 기법을 사용하기 위한 배경지식을 다루었었습니다. 오늘 내용을 이해하는 데 큰 도움이 되니 못 보신 분들은 아래 링크를 통해 지난 글을 먼저 보시는 것을 추천드립니다.

 

 

BLE를 활용한 실내 위치 측위 (4) - 삼변측량 기법을 사용하기 위한 예비지식

제가 작성하고 있는 BLE를 활용한 실내 위치 측위 시리즈는 삼변측량 기법을 다룰 예정입니다. 현재까지 나온 실내 위치 측위 기법 중 삼변측량 기법은 정확도가 낮은 편에 속하지만, 이 분야에

ahang.tistory.com

 


삼변측량 기법

 

아래 그림과 같은 상황에서 사용자 (Tag)의 위치를 구한다고 가정해봅시다. 

 

 

사용자 (Tag)는 비콘 메시지를 송신하는 송신기의 역할을 하고,  AP는 비콘 메시지를 수신하는 수신기의 역할을 합니다. 각 AP에 대해 반지름 r1, r2, r3를 갖는 원의 방정식은 아래와 같습니다.

 

(xx1)2+(yy1)2=r21

(xx2)2+(yy2)2=r22

(xx3)2+(yy3)2=r23

 

위 식의 제곱을 풀어쓴 원의 방정식은 아래와 같습니다.

 

x22xx1+x21+y22yy1+y21=r21

x22xx2+x22+y22yy2+y22=r22

x22xx3+x23+y22yy3+y23=r23

 

이제 원의 방정식 2개를 연립하여 두 원의 교점을 지나는 방정식을 구해봅시다. AP1과 AP2의 교점을 지나는 방정식은 아래와 같습니다.

 

2(x2x1)x+2(y2y1)=r21r22x21+x22y21+y22

 

그리고 AP2과 AP3의 교점을 지나는 방정식은 아래와 같습니다.

 

2(x3x2)x+2(y3y2)=r22r23x22+x23y22+y23

 

이후의 연산에서 식이 복잡해지므로 각 항을 알파벳으로 치환하겠습니다. 치환된 항은 아래와 같습니다.

 

A=2(x2x1)

B=2(y2y1)

C=r21r22x21+x22y21+y22

D=2(x3x2)

E=2(y3y2)

F=r22r23x22+x23y22+y23

 

결과적으로 치환된 두 식은 아래와 같습니다.

 

Ax+By=C

Dx+Ey=F

 

우리가 구해야하는 미지수 xy는 각각 사용자 (Tag)의 x좌표, y좌표를 의미합니다. 사용자의 좌표는 위 2개의 방정식을 연립하여 얻을 수 있습니다. AP1과 AP2의 교점을 지나는 방정식을 y에 대한 식으로 이항하면 아래와 같습니다.

 

By=CAx...(1)

y=CAxB

 

위 식을 AP2와 AP3의 교점을 지나는 방정식에 대입하여 아래와 같이 x를 구할 수 있습니다.

 

Dx+E(CAxB)=F...(1)

(BDEA)x=FBEC...(2)

x=FBECBDEA

 

같은 방식으로 y도 구해보겠습니다. AP1과 AP2의 교점을 지나는 방정식을 x에 대한 식으로 이항하면 아래와 같습니다.

 

Ax=CBy...(1)

x=CByA

 

위 식을 AP2와 AP3의 교점을 지나는 방정식에 대입하여 y를 구해봅시다.

 

D(CBxA)+Ey=F...(1)

(AEDB)y=FADC...(2)

y=FADCAEDB

 

위에서 구한 사용자 (tag)의 좌표 xy를 다시 수식으로 치환하여 식을 완성합니다.

 

x=(r22r23x22+x23y22+y23)(2(y2y1)(2(y3y2))(r21r22x21+x22y21+y22)(2(y2y1))(2(x3x2))(2(y3y2))(2(x2x1))

y=(r22r23x22+x23y22+y23)(2(x2x1))(2(x3x2))(r21r22x21+x22y21+y22)(2(x2x1))(2(y3y2))(2(x3x2))(2(y2y1))

 

식은 매우 복잡한 듯 보이지만 위의 과정을 천천히 따라오셨다면 이해하는 데 큰 어려움은 없으셨을 거라 생각합니다. 이제 위 수식을 바탕으로 실내에서의 사용자 (Tag)의 위치를 측위해보겠습니다.

 


 

사용 코드

class AP:
    def __init__(self, x, y, distance):
        self.x = x
        self.y = y
        self.distance = distance

class Trilateration:
    def __init__(self, AP1, AP2, AP3):
        self.AP1 = AP1
        self.AP2 = AP2
        self.AP3 = AP3
    
    def calcUserLocation(self):
        A = 2 * (self.AP2.x - self.AP1.x)
        B = 2 * (self.AP2.y - self.AP1.y)
        C = self.AP1.distance**2 - self.AP2.distance**2 - self.AP1.x**2 + self.AP2.x**2 - self.AP1.y**2 + self.AP2.y**2
        D = 2 * (self.AP3.x - self.AP2.x)
        E = 2 * (self.AP3.y - self.AP2.y)
        F = self.AP2.distance**2 - self.AP3.distance**2 - self.AP2.x**2 + self.AP3.x**2 - self.AP2.y**2 + self.AP3.y**2
        
        user_x = ( (F * B) - (E * C) ) / ( (B * D) - (E * A))
        user_y = ( (F * A) - (D * C) ) / ( (A * E) - (D * B))
        return user_x, user_y

 


 

실험 가정

 

 

위 그림과 같이 좌푯값이 주어진 세 개의 AP를 사용하여 Tag의 위치를 계산해봅시다. AP별 Tag의 거리는 비콘 메시지의 RSSI를 활용하여 계산된 거리입니다. 따라서 실험 가정을 기반의 실행 코드는 아래와 같습니다.

 

if __name__ == "__main__":
    ap1 = AP(4, 4, np.sqrt(32))
    ap2 = AP(12, 4, np.sqrt(32))
    ap3 = AP(8, 12, 4)

    tril = Trilateration(ap1, ap2, ap3)
    x, y = tril.calcUserLocation()
    print(x)
    print(y)

 


결과

 

 

8.0
8.0
반응형
Comments