목차
Geofence, 타이머, WiFi 스캔을 겹친 대중교통 승하차 알림 (2024-09)
원문 정보
- 원문: 승하차 타이밍을 놓치지 않는 방법
- 부제: 27편 - 대중교통 승하차 알림
- 매체 · 게시일: 티맵모빌리티 테크노트(브런치) · 2024-09-30
- 저자: 티맵모빌리티 (본문에 저자 미표기)
- 원문 내용을 바탕으로 재구성한 요약입니다.
승하차 알림의 세 가지 기능
승하차 알림은 별도 앱이던 TMAP 대중교통이 국내 최초로 선보인 기능입니다. 앱이 티맵에 통합된 뒤 다시 추가됐습니다. 앞 단계 사정은 대중교통 백엔드 글에 있습니다.
기능은 세 가지입니다. 목적지까지의 경로와 현재 위치를 보여 주고, 타야 할 버스나 지하철을 안내하고, 승하차 타이밍을 알려 경로를 벗어나지 않게 돕습니다. 앞의 둘은 길 찾기 엔진과 서버가 내려주는 정보를 보기 쉽게 가공하는 일이었습니다. 경로 위에 현재 위치를 표시하고, iOS의 Live Activities와 Dynamic Island를 써서 폰을 켰을 때 얼마나 왔고 얼마나 남았는지 바로 보이게 했습니다. 어려운 쪽은 세 번째, 타이밍에 맞춘 알림이었습니다.
GPS 기반의 Geofence와 실시간 계산
Geofence는 특정 위경도에 반경을 정해 두고 그 안에 들어오거나 나가는 것을 감지하는 기능입니다. 정류장이나 역에 도착했는지 판단하는 근거로 썼습니다. 마지막 하차는 정류장 간 거리가 먼 경우를 고려해 구간이 약 75% 남았을 때 알리도록 다듬었습니다.
한계도 분명했습니다. Geofence가 제대로 동작하려면 반경이 최소 100~150m는 되어야 했고, 그보다 가까운 거리에서는 동작하지 않는 경우가 있었습니다. 이를 보완하려고 실시간 위치 계산을 병행했습니다. 도보 구간의 목표 지점까지 거리와 경로 이탈을 현재 위치로 바로 계산하는 방식입니다. 가볍게 처리하려고 수선의 발이나 지구 곡률 같은 복잡한 계산은 빼고 직선거리로 가정했습니다.
지하 구간의 타이머와 안드로이드 WiFi 스캔
GPS만으로는 지하 구간을 풀 수 없었습니다. 지하에서는 위치가 잡히지 않거나 엉뚱한 지역으로 튀었고, 도보 구간이 길어도 승차 시점을 알기 어려웠습니다. 서울은 대중교통에서 지하철 비중이 커서 영향이 컸습니다.
그래서 길안내 정보의 구간별 예상 시간으로 타이머를 돌려 도착 시점을 계산합니다. 평균치라 모든 사용자에게 맞지는 않지만 평균에 기대 가장 가까운 시점에 알리기로 했습니다.
성공한 개선은 안드로이드의 지하철 알림입니다. 안드로이드는 주변 WiFi를 주기적으로 스캔해 MAC 주소와 신호 강도를 제공합니다. 알림을 시작할 때 지나갈 지하 역의 WiFi 정보를 티맵 서버에서 미리 받아 두고, 역에 가까워지면 주기적으로 스캔합니다. 신호가 가장 센 WiFi만 추려 역의 WiFi 정보와 맞춰 보면 대략적인 지하 위치가 나옵니다. 신호가 약해 맞추지 못한 구간은 출발역에서 다음 역까지의 시간과 거리로 중간 위치를 추정합니다.
현장에서 만난 예외 상황
- 버스 진행 방향과 하차 후 보행 방향이 반대인 경우: 다음 순서여야 할 Geofence를 건너뛰고 다른 Geofence가 먼저 감지되었습니다. 승차 구간을 Step, 정류장이나 역 단위를 Section이라 정의하고, 승차 구간에서는 현재 Step 안의 각 Section 도착 지점에만 Geofence를 걸었습니다. 도보 구간은 Geofence 대신 실시간 계산으로 바꿨고 반경도 조정했습니다.
- 정류장이나 역이 가까운 경우: 다음 Geofence 반경에 바로 들어가 버려 반경을 여러 번 조정했습니다. 타이머는 지하철이 예상보다 일찍 오거나 출발이 늦는 변수가 많아, 일반적인 상황을 가정해 설계했습니다.
- 입구가 많고 지하 보행이 긴 큰 역사: 지하에서는 위치를 잡을 방법이 없어 타이머에 의존하며, 대표적인 오작동 원인입니다. 원문은 기술 연구로 개선할 계획이라고 밝혔습니다.
- 위치 센서 오차: iOS는 이상한 위치가 잡히면 검증을 두 번 더 하는 방식으로 튀는 값을 걸러 냅니다. 안드로이드는 위치 갱신 주기를 이용해 보완하고 있다고 합니다.
- 지하철 운행 편차: 기관사마다 운행 속도가 다르고, 출퇴근 시간이나 특수 상황에는 중앙관제실이 열차 이동을 실시간으로 조절합니다. 그래서 타이머 계산에 오차가 자주 생기며, 보완 방법은 추후 업데이트로 공개하겠다고만 밝혔습니다.
원문의 주요 설정값
| 항목 | 값 |
|---|---|
| Geofence 최소 반경 | 100~150m |
| 마지막 하차 알림 시점 | 구간의 약 75% 남았을 때 |
| iOS 위치 검증 | 이상 값 감지 시 2회 추가 검증 (3 strike 1 out) |
| 안드로이드 지하 위치 | 신호 강도 최상위 WiFi를 역 WiFi 정보와 매핑 |