졸업 프로젝트 진행하면서 GPS를 사용하는데 실제 테스트를 해보니 GPS위치가 튀어서
한번에 원래 자리에서 몇십미터씩 이동하는 경우가 있었다.
이런 경우를 해결하기 위한 방법을 생각해봤다.
먼저, 필자는 GPS위치를 구하기 위해 LocationManager의 GPS Provider를 사용한다.
그리고 이 GPS Provider에는 좌표값 외에 속도값도 존재하는데, 이 속도값을 사용하여 GPS 보정을 해준다.
(속도값은 m/s로 계산된다)
방법은 다음과 같다.
1. 이전에 구한 GPS 위치를 저장해둔다.
2. 현재 GPS Provider에서 구한 속도값을 사용하여 이전 좌표에서 이동 가능한 최대 거리를 계산한다.
3. 현재 구한 좌표가 이 최대 거리를 넘어가서 측정되면 보정을 통해 이동 가능한 최대 거리로 줄여준다.
이런 기능을 생각할 때 문제였던 점은 "GPS Provider에서 속도를 어떻게 측정하는가?" 였다.
보통 우리가 아는 속도를 구하는 방법은 거리와 시간을 통해서 구하게된다.
따라서 GPS Provider에서 이런 방식으로 이전 좌표와 현재 좌표간의 거리, 시간으로 구하게 되면
이 방법은 사용할 수 없다는 생각을 했다.
그래서 해당 내용을 찾아보니 GPS에서는 이런 방식과는 다르게 속도를 측정한다.
GPS에서는 '도플러 현상'을 사용해서 속도를 계산하게 되는데, 물체와 관측자 간의 상대 속도에 따라
물체에서 발생하는 파장이 길어지거나 짧아지는 현상을 말한다고 한다.
필자는 예전에 과학수업을 들으면서 선생님께서 사이렌 소리를 예로 들어서 설명하신 적이 있는데,
구급차가 멀리 있을때는 파장이 길어 낮은 음의 소리가 나는데, 구급차가 가까워질 수록
파장이 짧아지면서 높은음의 소리가 난다는 것이다.
잠깐 이야기가 새었는데, 아무튼 GPS에서는 이런 도플러 현상을 사용해서 속도를 측정한다는 것이다.
우리가 가진 기기에서 발생한 파장을 위성에서 받아 미리 정해진 수치와 비교하여 사용자의 이동속도를 측정한다는 것이다.
때문에 GPS사용 중에 지도상에서 위치가 몇 십 미터씩 튀는 현상이 발생해도 속도는 정상적으로 측정된다.
추가) 기존에 GPS보정에 사용했던 방식은 이전에 사용자가 움직인 방향과 상관 없이
새롭게 찍힌(GPS가 튄)위치와 이전 위치의 사이에서 위치 보정이 되도록 설계했다.
그림으로 표현하면 아래와 같다.
그런데 보정에 방향을 넣어보는게 어떻냐는 조언을 받아서 해당 내용을 추가시켜 보앗다.
보정위치를 계산하는 알고리즘 자체는 동일하고 방향만을 이전에 사용자가 이동하던 방향으로 보정하는 방법이다.
그림으로 표현하면 아래와 같다.
이 방법 외에도 방향을 이용하는 방법과 방향을 이용하지 않는 방법 두 가지의 알고리즘으로 구한
두 좌표의 중간지점을 채택하는 방법도 고려해봤다.
그림으로 표현하면 아래처럼 된다.
세 알고리즘을 모두 사용해서 각각 1KM정도 동일한 코스를 몇 번 돌아봤는데,
3번 알고리즘이 보정 받은 위치와 그 다음에 받은 정상적인 위치의 거리 차이가 가장 적었다.
'안드로이드 > 개발관련(Kotlin)' 카테고리의 다른 글
안드로이드 버튼 클릭 시 퍼지는 effct주기(Ripple Effect) (0) | 2022.01.23 |
---|---|
Geocoder를 사용해 주소를 좌표로 변경하는 방법(안드로이드, Koltin) (0) | 2022.01.21 |
안드로이드 AudioManager로 볼륨 조절(Kotlin) (0) | 2022.01.03 |
안드로이드 Geofence(지오펜스) (0) | 2021.12.30 |
안드로이드 데이터베이스 SQLite(Koltin) (1) | 2021.12.27 |