27편 - 대중교통 승하차 알림
여러분은 평소 대중교통을 자주 이용하시나요?
우리는 대중교통을 이용하며 동시에 영상 시청, 웹 서핑, 음악 감상, 게임, 메신저 등에 집중하며 이동시간을 보내곤 합니다. 그러다 보면 내릴 타이밍을 놓치거나 혹은 문이 닫힐 때쯤 급히 하차하느라 당황스러운 상황이 펼쳐지기도 합니다.
이렇게 대중교통 이용자들이 하차 타이밍을 놓치지 않도록 알림을 제공하는 티맵의 승하차 알림 서비스를 소개해 드리고자 합니다.
혹시 'TMAP 대중교통' 앱을 기억하시나요? 국내 최초로 출시된 티맵의 대중교통 승하차 알림 기능은 'TMAP 대중교통' 앱에서 선보였던 기능입니다. 사용자들에게 많은 사랑을 받았던 대중교통 승하차 알림은 'TMAP 대중교통' 앱이 티맵으로 통합된 후 다시 추가되었습니다.
1. 목적지까지의 경로 및 현 위치 파악
2. 승차해야 하는 버스 / 지하철 정보 안내
3. 승하차 타이밍 안내를 통해 사용자들이 경로를 이탈하지 않도록 유도
주요 기능 중 1번과 2번은 티맵에서 자신 있고, 잘하는 분야입니다. 여러분들의 경로를 찾아주는 일이죠.
이 부분은 길 찾기 엔진을 믿고 서버에서 내려주는 정보들을 활용하여 최대한 인지하기 쉽도록 가공해 보여주는 부분이 관건이었습니다.
저희는 2가지 방법으로 기존 대중교통 경로 가이드에서 사용자들이 현 위치를 더 쉽게 파악할 수 있도록 개선하였습니다.
1. 경로 상에 현 위치 표시
2. ios의 Live Activities & Dynamic Island 활용
이러한 기능들을 추가하여 사용자가 폰을 확인했을 때 현재 어느 정도 왔는지, 목적지까지 얼마나 남았는지 확인할 수 있는 것이죠.
가장 중요한 부분은 주요 기능 3번의 승하차 타이밍에 맞추어 알림을 주는 것이었습니다.
이러한 알림을 주기 위해서 티맵에서는 크게 두 가지 방법으로 타이밍을 처리했습니다.
1. GPS
GPS를 이용하는 방식은 2가지가 있는데, 하나는 Geofence라는 기술이고 다른 하나는 실시간 위치 계산 방식입니다. Geofence란 특정 위경도에 일정한 반경을 설정하고 해당 반경에 들어가는지 혹은 나가지는지를 탐지하는 기능입니다. Geofence를 사용한 부분은 정류장/역에 도달했는지 판단하는 근거로 사용했습니다.
특히 마지막 내리는 시점은 정류장/역 거리가 먼 경우를 고려하여 구간의 약 75% 정도 남았을 경우 알림이 가도록 고도화하였습니다.
하지만 Geofence는 정상동작하기 위해서는 최소 100~150m 범위 설정이 필요하였고, 그보다 가까운 거리를 탐지할 때 정상동작을 하지 않는 경우가 발생한다는 단점이 있었습니다.
이러한 문제를 보완하기 위해 실시간 위치 계산 방식을 병행하게 되었습니다. 실시간 위치 계산 방식은 사실 모든 기능을 raw 하게 다루는 단순 무식한 방식인데요. 현재 위치를 이용해 실시간으로 계산하여 로직을 처리하는 방식입니다. 실시간으로 계산하는 로직은 도보구간에서의 목표지점 거리 계산, 경로 이탈 감지가 있습니다. 이 계산들은 가볍게 처리하기 위해 정확도를 버리고 수선의 발이나 지구의 곡률 등 복잡한 계산을 생략하고 단순하게 직선거리를 가정하여 처리하였습니다.
이런 GPS만으로 문제가 해결되었다면 좋았겠지만 현실은 그렇지 못했습니다. 바로 지하구간 때문인데요. 특히 서울의 대중교통에서 큰 비중을 차지하는 지하철 구간으로 인해 GPS만으로는 해결이 불가능했습니다.
지하구간은 GPS 위치정보가 감지되지 않거나 실제 위치가 아닌 다른 지역으로 랜덤하게 튀는 경우가 생겼고, 도보구간으로 길게 걷는 경우에는 위치감지가 어려워 승차시점을 알기 힘들었습니다.
여기서 저희는 꾀를 내었습니다.
2. Timer
티맵의 길안내 정보에는 각 구간별 예상시간이 있습니다. 그 예상시간 정보를 활용해 Timer를 돌려 도착이 예상되는 타이밍을 계산하는 방식입니다.
물론 그 정보는 평균치 정보라 모든 사용자의 상황에 맞지 않았습니다. 도보를 이동하는 수단이 다를 수 있고 같은 수단이라도 속도는 사용자마다 다를 것입니다. 하지만 평균의 힘을 믿고 최대한 근접한 타이밍에 알림을 제공해 주는 것을 선택했습니다. 이 부분은 앞으로 많은 기술적 시도를 통해 개선해 나갈 예정입니다. 그 기술적 시도 중 성공한 사례가 있는데요. 안드로이드의 지하철 알림 기능입니다.
안드로이드 OS는 주기적으로 근처에 있는 WiFi를 스캔하여 MAC 주소 및 신호 강도와 같은 각종 정보를 제공합니다. 여기에 승하차 알림을 시작할 때 지나가는 지하철 지하 구간 역에 설치된 WiFi 정보를 티맵 서버로부터 미리 수신합니다. 이후 사용자가 지하구간 역을 들릴 타이밍에 주기적으로 WiFi 스캔을 시도하고 신호 강도가 가장 강한 WiFi만 추려 해당 역에 설치되어 있는 WiFi 정보와 맵핑하여 사용자의 대략적인 지하구간 위치를 탐지합니다.
추가로 지하 구간을 지나갈 때 신호 강도가 낮아 맵핑되지 않았다면, 시작역을 기준으로 다음역까지 이동에 필요한 시간과 거리를 통해 사용자의 대략적인 중간 위치를 추론합니다.
대중교통 승하차 알림을 구현하는 데 있어 예상하지 못한 많은 상황들이 있었는데요.
간단히 소개해 보려고 합니다.
Geofence를 여러 곳에 설정하다 보면 위치상으로 경로의 다음 순서로 감지되어야 하는 트리거를 건너뛰고 다른 순서의 Geofence에 먼저 감지되는 경우가 생깁니다. 그 문제를 해결하기 위해 Geofence 설정을 유동적으로 처리하도록 보완했습니다.
승차구간, 도보구간을 Step이라 정의, 1개의 정류장/역 구간을 Section이라고 정의해 봅시다. 승차구간에서는 현재의 Step내의 각 Section 도착 구간에만 Geofence를 설정하고, 도보구간에서는 Geofence 대신 실시간 위치 계산 방식으로 전환했습니다. 또 Geofence 감지 거리를 조정해 보면서 최적의 반경을 찾으려 노력하였습니다. 이렇게 하니 다음 구간에 있는 Geofence를 미리 감지할 확률이 현저히 줄어들어 대부분 무난하게 순서대로 현 위치를 잘 감지하게 되었습니다.
정류장/역마다 가까운 구간이 존재하면 Geofence 및 Timer의 동작에 오류를 발생시키는 요소가 되었습니다. Geofence의 경우 다음 반경에 바로 포함되어 버리는 경우가 새겨 최적의 반경을 찾기 위해 몇 차례 조정하였습니다. Timer는 지하철 케이스로 예상시간보다 너무 빨리 도착하거나, 출발이 지연되는 등 다양한 변수들이 있어 모든 케이스에 대응하지 못하고 일반적인 상황을 가정하여 설계하게 되었습니다.
지하구간에서는 위치를 잡을 수 있는 방법이 없어 Timer로 계산하고 있는데, 이는 대표적인 오작동 원인이 됩니다. 아무래도 이동시간이 개인별로 차이가 크고, 지하구간의 길이에 따라 마지막 위치 감지에 대한 오차가 있어 발생하는 현상으로 이 부분은 기술적인 연구를 통해 개선할 계획입니다.
센서는 기계임에도 가끔 예상하지 못한 위치로 잘 못 인지되는 경우가 발생했습니다. 또 오차범위가 있어 실제 위치와 조금씩 차이가 생겨 경로 이탈 등으로 오해하는 경우도 생겼습니다. 이를 해소하기 위해 ios에서는 3 strike 1 out(이상한 위치가 감지되면 검증을 추가로 2번 더 함) 처리로 위치 값이 갑자기 이상한 곳으로 잡히는 경우를 보완했고, 안드로이드에서는 위치 갱신 주기를 이용해 보완하고 있습니다.
지하철이 항상 일정하게 운행하고 정확한 시간에 도착할 것 같지만 실제로는 기사님마다 운전 스타일 및 운행 속도가 다릅니다. 또 출퇴근 및 특수상황에 따라 중앙관제실에서 각 열차 이동을 실시간으로 조절하게 됩니다. 그로 인해 생각보다 자주 Timer로 계산하는 부분에 오차가 발생합니다. 이 부분을 보완하기 위해 다양한 기술적인 시도들이 있으니 추후 업데이트를 기다려 주시길 바랍니다.
마치며
이상으로 티맵에서 사용자들이 하차 타이밍을 놓치지 않도록 도움을 주는 대중교통 승하차 알림 기능을 소개해 드렸습니다. 앞으로도 티맵 승하차 알림 기능 많이 사용해 주시고, 더불어 기능 개선 요청도 해주시길 바랍니다. 감사합니다.