핀수로그
  • GPS 보정하기 - 03
    2023년 11월 22일 22시 37분 03초에 업로드 된 글입니다.
    작성자: 핀수
    728x90
    반응형

    지난이야기

     

    GPS 보정하기 - 02

    들어가며 GPS 보정하기 - 01 사실 이 알고리즘은 이전 프로젝트에서 개발 되었던 것인데, GPS 정확도 개선을 위한 좌충우돌 얼레벌레 MapMatching 구현기들어가며 정말 오랜만에 글을 쓰는 것 같다. 못

    www.pinslog.com

    지난 글에서는 알고리즘의 문제점들을 개선하는 과정을 작성했다. 이번 글에서는 경로이탈에 관해서 작성해보려고 한다.
     

    경로이탈

    개인적으로 나는...내비게이션의 꽃은 경로이탈이라고 생각한다...(부들
    사용자들은 자유의지를 가지고 있기 때문에 절대로 안내된 경로대로 가지 않는다.

    난 그걸 내 눈으로 똑똑히 보았다.

    지 눈으로 똑똑히 봤슈

    그래서 경로이탈이 감지되면

    사용자의 현재 위치를 바탕으로 목적지까지의 길을 재탐색하여 다른 경로를 제공해야한다.

     

    그런데 보정 알고리즘을 적용하면서...

    부정확한 GPS가 찰떡같이 경로 상에 보정되었던 것처럼...

     

    우리 안드로이드 입장에서는 사용자가 경로를 이탈해서 위치가 안 맞는 건지,

    GPS가 엉망이어서 위치가 안 맞는 건지...

    도무지 알 길이 없기 때문에 모조리 보정해버린다는 문제점이 있었다.

     

    그렇기 때문에 경로이탈 판단은 보정 알고리즘에 있어 굉장히 중요한 과제가 되었다. 

    경로이탈의 유형

    해당 기능을 구현하며 내가 만난 경로이탈에는 크게 두가지 유형이 존재했다.

    T자 유형


    T자 이탈의 경우 경로와 사용자 이동 방향의 차이가 크게 나타나므로 이탈을 판단하기 수월하다.

    F자 유형

    F자 유형 뒤집어진 F자 유형
    이하 'F자 유형'
    이하 '뒤집힌 F자 유형'


    F자 이탈의 경우 경로와 사용자 이동 방향의 차이가 크지 않으므로

    이탈을 판단하기 까다로운 부분이 있다.

    경로이탈 판단기준 수립하기

    시행착오

    위에서 설명한 유형을 보면 이동 방향에 집중하고 있는 것을 알 수 있다.

    실제로 사용자의 GPS 말고도 다른 여러 요소를 통해 사용자의 위치를 추정할 수 있는데

    그중 하나가 방향값이다.

    그래서 사용자의 이동 방향과 경로의 방향을 비교해 경로이탈 판단을 수행하려고 했다.

    이는 여러 레퍼런스를 찾아보다 발견한 판단기준에서 아이디어를 얻은 것이다.

    출처 : https://patents.google.com/patent/KR100663027B1/ko



    그런데 문제가 하나 있었다.

    프로젝트 특성상 해당 앱은 전동보장구에 거치되어야 하는 형태였다.

     

    그런데 거치대가 수직방향으로 되어있는 구조였고,

    이 때문에 방향이 제대로 사용자의 진행방향을 가리키지 않았다.

     

    또 전동보장구에 매달려있다보니 전동보장구가 충격을 받으면

    그 충격이 거치대까지 고스란히 전달되었다..

     

    그래서 방향값이 제대로 수집되지 않았고,

    정상적으로 주행하고 있는데도 계속해서 경로 재탐색이 일어났다.

     

    하여 경로 이탈 판단 기준으로 방향값을 사용하는 것에는 무리가 있다고 판단하여 제거했다.

    이와 더불어 최종 보정값을 결정하는 부분에서도 방향값을 제거하였다.

    F자 유형

    F자 유형의 경우 사용자가 해당 경로가 아닌 다른 경로로 이동할 경우,

    일정 구간을 뛰어 넘은 후 경로에 위치하는 것을 확인할 수 있다.

    이때의 보정 과정을 살펴보면 이전 위치 ㄱ에서 ㄴ으로 이동했다고 가정하고, 둘 사이의 거리를 계산한다.

    그리고 이전 위치 정보를 통해 평균 이동 거리를 구한다.

    이때, ㄱ 이전 위치 - ㄱ 와 평균 거리의 차(2.3m - 1.6m)와

    ㄱ - ㄴ와 평균 거리의 차(43.3m - 1.5m)를

    비교해 보았을 때, 후자가 더 큰 것을 확인할 수 있다.

     

    비슷한 유형의 다른 사례를 찾아본 결과

    위와 마찬가지로 어느정도의 차이가 발생하는 것을 확인할 수 있었다.



    다만, 실제 올바른 경로로 이동하는 경우에도

    부정확한 GPS 획득으로 인해 거리 간의 차이가 발생할 수 있음을 확인했다.

     

    또한, 2차선 도로의 폭이 15m인 것을 감안하고 다양한 사례를 수집하여

    이들의 중간값인 20m를 기준으로 지정해

    이전 위치에서 보정된 값까지의 거리가 20m가 넘을 경우를

    경로이탈 판단 기준 중 하나로 정하였다.

    (매번 다른 값을 획득하는 GPS 특성상 기준값에 대한 정확성 판단은 보류한다.)

    정상적으로 이동하였으나 경로이탈로 판단된 경우



    T자 유형

    T자 유형의 경우

    경로와 사용자 이동방향이 일치하는 지점까지는 보정이 수월하게 이루어지다가

    사용자가 경로를 이탈하는 시점부터 비슷한 지점에 보정이 되는 것을 알 수 있었다.

    (그림 상의 파란색 마커 부근에 계속해서 보정이 수행됨)

    이는 육안으로 확인할 경우 사용자가 이동하는 것이 아니라 정지한 상태처럼 보인다.

     

    실제로 사용자가 정지해 있는 경우도 있기 때문에,

    현재 위치와 경로 링크와 실제 GPS간 거리까지 고려한다.

     

    보정은 비슷한 구간에 수행되겠지만,

    사용자는 실제로 어디론가로 이동하고 있기 때문에 경로와 점점 멀어지기 때문이다.

     

    아래의 로그를 확인해보면

    ㄱ의 경우 이전 위치에서 보정값까지의 거리가 2.8m이지만

    ㄴ의 경우 이전 위치에서 보정값까지의 거리가 0.1m로 거의 움직이지 않은 것을 알 수 있다.

     

    그러나 현재 위치와 대상 선분간의 거리를 살펴보면

    ㄱ는 15m, ㄴ은 16m로 거리는 더 멀어진 것을 알 수 있다.

     

    따라서, 위에서 말한 판단 기준과 더불어 평균 거리가 1m보다 작고,

    실제 GPS와 경로 링크 간의 거리가 10m이상일 경우를

    경로이탈 판단 기준 중 하나로 정하였다.

    (거리 기준은 일반적인 휴대용 단말기의 GPS 오차가 10-20m임을 감안한 것이다.)


    뒤집힌 F자 유형

    뒤집힌 F자 유형의 경우

    F자 유형와 달리 건너뛰는 링크도 없고

    거리만 멀어지기 때문에 보정이 그대로 수행되는 경우가 존재한다.

     

    이럴 경우에는 해당 경로 링크의 끝부분에 다다르면 경로 이탈을 잡아내거나,

    아래의 예시처럼 다시 기존 경로에 합류하게 되는 경우에는

    경로 이탈 없이 경로 안내가 되기도 한다.

     

    이런 경우, 반대의 상황 (경로대로 주행하고 있는데 부정확한 GPS로 인해 경로 이탈 처리가 되는 경우)이 존재하고

    경로 이탈 판단까지의 시간이 조금 소요될 뿐이지

    대부분의 경우에서 이탈을 잡아냈기 때문에

    별도의 처리 없이 현재 판단기준을 유지하기로 하였다.

    다음이야기

    경로이탈 판단 로직이 들어오게 되면서 결국 알고리즘을 다시 뒤집어 엎게 되었다.

    크게 달라진건 없지만..최종적으로 정리하려고 다음 글로 뺀다.

    읽으신 분들은 알겠지만 대단한 알고리즘도 아니고 그냥...

    진짜 경로 위에 사용자 위치를 매칭시키려는...그냥 그런....사실 허점이 굉장히 많다.

     

    그렇지만 이걸 글로 남기는 이유는

    어디선가 나처럼 GPS 때문에 끙끙 앓고 있을 사람을 위해서이다.

    또 열심히 한거니까 잘 정리해두고 싶은 마음도 있고!

     

    다음 글이 아마 GPS 보정에 관해서는 마지막 글이 되지 않을까 생각한다.

    그럼 다음 글에서 만나용

    728x90
    반응형

    'Android' 카테고리의 다른 글

    [Kotlin] Scope Function 범위 지정 함수  (0) 2023.12.09
    GPS 보정하기 - 02  (0) 2023.11.20
    GPS 보정하기 - 01  (0) 2023.11.02
    GPS 보정하기 - 프롤로그  (0) 2023.11.01
    [Android] Hilt와 Room  (0) 2023.09.29
    댓글