-
Notifications
You must be signed in to change notification settings - Fork 0
GPS오차를 보정하기 위한 칼만 필터 구현기 🗺️
우리는 GPS앱을 이용하는 특성상 GPS에 오차에 조심해야 합니다. 대부분 GPS오차는 보정된다고 하더라도 튀는 값들이 존재했습니다. 이 튀는 값을 자세하게 설명하면 다음과 같았습니다. 이동하다가 움직인 적이 없는 곳에 좌표가 찍힙니다. 이러한 경우가 빈번하게 나타나지 않지만 튀는 경우는 무조건 존재했습니다.
우리 어플리케이션은 달리는 중간에 지도에 폴리라인을 그리는 것이 요구사항 이었습니다. 즉 실시간으로 폴리라인을 반영해야하는 요구사항이 존재합니다. 특히 위치에 대한 정보를 갖고 로직을 작성해야 하기 때문에 오차를 보정하는 방법은 매우 중요한 기술이라고 생각했습니다.
실제 어플리케이션을 통한 폴리라인을 그리면서 튀는 값을 발견했습니다. 만약 이를 수정하게 된다면 미래에 다른 앱으로 거리를 측정할 때 좋은 영향을 미칠 것이라 생각했습니다.
칼만 필터(Kalman filter)는 잡음이 포함되어 있는 측정치를 바탕으로 선형 역학계의 상태를 추정하는 재귀 필터로, 루돌프 칼만이 개발하였다. 칼만 필터는 컴퓨터 비전, 로봇 공학, 레이다 등의 여러 분야에 사용된다. 칼만 필터는 과거에 수행한 측정값을 바탕으로 현재의 상태 변수의 결합분포를 추정한다. 알고리즘은 예측과 업데이트의 두 단계로 이루어진다. 예측 단계에서는 현재 상태 변수의 값과 정확도를 예측한다. 현재 상태 변수의 값이 실제로 측정된 이후, 업데이트 단계에서는 이전에 추정한 상태 변수를 기반으로 예측한 측정치와 실제 측정치의 차이를 반영해 현재의 상태 변수를 업데이트한다.
확장 칼만 필터는 비선형 시스템을 기반으로 동작한다.
출처 : 위키피디아
보자마자 어려워 지는 정의입니다. 짧게 정리하면 다음과 같습니다. 칼만 필터는 지속적으로 입력되는 값은 오차(Noise)가 있다고 가정합니다. 어떤 오차를 칼만 필터를 통해서(수식) 값을 보정합니다. 즉 오차를 보정하는 것입니다. 내부 변수의 값을 변화 시키면서, 다음에 받는 값을 보정 하는 것 입니다.
GPS 칼만 필터를 구현함에 있어서, 일반적으로 GPS 측정값은 리니어 하며, 가우시안 분포를 따른다고 가정합니다.
칼만 필터를 구현하기 전 우리는 예측값에 대한 관계식을 상정해야 합니다.
- 우리는 사전 정보로서 전방으로 휴대폰이 위치한다고 가정합니다. 즉 가려는 방향에 휴대폰방향도 따라간다고 가정합니다. 이는 Apple에서 제공하는 CLLocation의 Heading값을 통해서 얻을 수 있습니다.
- 그리고 이동하는 위치를 지속적으로 모니터링 하여, 이전과 현재의 속력이 별로 차이나지 않는다고 가정합니다. 즉 과거 속력을 통해서 현재 속력을 대신할 수 있다고 생각합시다.
그러면 다음과 같은 관계식을 얻을 수 있습니다.
- 둘을 곱하게 되면 우리가 원하는 예측값을 얻을 수 있습니다.
센서에 관한 에러입니다. 에플의 새 아이폰은 약 나뭇잎이 우거진 곳에서 최대 11m GPS의 오차를 낸다는 [Paper를 참고했습니다](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6638960/). 이를 통해서 아이폰 센서의 오차를 간이로 설정해 보았습니다. 최대
-
위도 기준
- 1도 일 때 몇 km ? = 지구 반지름 6371km (1도) (pi/180) = 111.19km
- 1º : 111190m = x : 10m
- x = 0.00008993614 ~= 0.000899
-
경도 기준
- 1도 일 때 몇 km? = 지구 반지름 6371 * cos(37) * 1 (pi/180) = 85.18km
- 1º : 85180m = y : 10m
- y = 0.00011739 ~= 0.000117
하지만 실제 적용을 해보니 생각보다 GPS성능이 좋아서 위의 오차 1/2만 가져갔습니다
아래는 heading을 45로 하고 최대 오차가 날 수 있게 세팅을 했습니다. 빨간색 점은실제 데이터고 초록색 점은 오타가 있는 데이터 입니다. 마지막으로 파란색 점은 실제 보정한 값 입니다. 3차원 평면에서 볼 수 있듯이 실제 보정한 값이, 빨간색 점 보다 가깝게 위치한 모습입니다. 데이터상으로 약 10퍼센트정도 오차를 잡아주는 모습을 보았습니다.
칼만필터를 구현했지만 몇가지 잘못된 가정이 있었습니다.
GPS는 가우시안 분포를 따르지 않을 수 있음, 또한 linear하지 않을 수 있다. 사실 몇몇 논문에서 GPS에서 칼만 필터를 활용한것을 보고 따라했지만, 근본적으로 아닐 수 있다는 것을 깨달았음.
헤딩값을 휴대폰이 바라보는 방향이 앞으로 상정했지만 사실 아닐 수도 있습니다. Heading값을 백퍼센트 신뢰했지만 휴대폰을 파지하거나, 다른 방향으로 놓을 경우에는 Heading에 관한 오차를 수정해서 반영해야 합니다.
상태방정식에 과거 위도와 현재 위도의 값이 쓰입니다. Velocity Of Latitude 그리고 Velocity Of Longitude 둘이 쓰이는데 이는 과거 위도경도와 새로 받은 위도 경도 모두를 받는 값이라 오차에 의존적일 수 밖에 없었습니다.
결국 제가 만든 상태 방정식에 대한 에러를 깨달았습니다. 그리고 개선점으로 ExtendedKalman Filter와 ICN을 통합한 알고리즘을 구상중에 있습니다. 아이폰에 있는 자이로센서와 가속도 센서를 활용해 시간 및 위치값과 결부시켜, 계산하고 싶다는 생각을 했습니다. 이는 논문을 참고하여 구현하고 싶습니다.
[Part 3) 칼만 필터 응용 - Ch10. 영상 속의 물체 추적하기