얼마전 유아 교육용 태블릿 대여 사업을 하는 분으로부터 연락을 받았다. 교육용 태블릿을 3개월 동안 무료 체험할 수 있게 제공 하는데, 체험 완료 즈음에 태블릿을 잃어버렸다면서 돌려주지 않는 사람이 점점 늘어나고 있어서 고민이라고. 근데, 정말 분실을 한 건지 일부러 돌려주지 않는 것인지 알 길이 없다고 했다. 태블릿의 위치만 알아도 진위여부를 알 수 있을 것 같은데 GPS 가 없어서 위치를 알 길이 없다고 했다. 이럴 때 사용될 수 있는 기술이 WPS 인 것 같다.
WPS (WiFi Positioning System)은 태블릿과 같은 IoT 기기의 위치를 주변 WiFi AP 위치를 기준으로 추정하는 기술이다. 안드로이드 폰과 같은 스마트 기기에서도 실내에서는 GPS 로부터 위치를 획득할 수 없기 때문에 WPS 를 함께 사용해서 위치를 추정한다. 이쯤에서 아마도 다음과 같은 궁금증이 생길 것이다. WiFi AP의 위치는 어떻게 알고 있을까?
War driving 이라고 들어보셨는지? 초기에는 자동차를 타고 도로를 다니면서 주변 WiFi 신호를 수집하고, 이때 보조 GPS 기기로부터 현재 위치를 획득해서 WiFi AP 의 Map 을 만들었다. 시간이 지나면서 일반 사용자의 스마트폰에서 수집되는 정보로 보다 정교하게 WiFi AP 의 위치를 추정하는 기술들이 개발되기 시작했다(예, https://patents.google.com/patent/US8738043B2/en). Google 은 후발주자지만 WPS를 잘 구축하고 있고, 자신의 안드로이드 플랫폼 뿐만아니라, REST API 형태로 서비스를 오픈해서 제공하고 있다. 다만, 쫌 비싸다. 국내에서도 일부 통신사 및 인터넷 기업에서 자체 WPS 를 구축해서 각자 활용하고 있다.
현재, 로플랫은 WPS 를 REST API 형태로 오픈 해서 서비스를 제공하고 있다. 전국단위의 WPS 구축 기술에 대해 궁금해 하는 이를 위해 우리가 어떻게 구현을 했는지 간략히 기술을 해 볼까 한다.
로플랫은 매일 15,000,000건의 위치 관련한 기록을 쌓고 있다. 그 기록은 스마트폰 주변의 WiFi AP 정보와 기기 위치정보를 동시에 담고 있다. 이 기록을 3개월 정도 쌓으면 1,350,000,000 건 정도가 된다. 무려 13억 건. 이정도의 데이터는 우리나라에 4000만개의 AP가 있다고 가정했을 경우 모든 AP가 최소 30번 이상 다른 위치에서 관측되는 수치이다.
AP 의 위치를 추정하는 가장 단순한 방법은 무엇일까? 개별 AP 별로 관측된 모든 위치 값을 산술평균하면 되지 않을까? 어느 정도는 맞다. 다만, 현실을 마주하게 되면 우리가 풀어야 하는 여러가지 문제들이 생기게 된다. 성능에 가장 크게 영향을 끼치는 두가지만 예를 들어 보겠다. 첫번째는 mobile AP 이다. 두번째는, AP 가 이사하는 경우이다. 두 경우 모두 AP 의 위치가 어느 순간에 변경이 된다는 것이다. 그래서 위치가 변하는 AP 를 제거하는 게 가장 중요한 과제로 남는다. 우리는 이를 해결하기 위해 AP의 위치를 time series 데이터로 보고 clustering 을 수행했다. 이 과정을 통해 여러개의 cluster가 생성되는 AP 를 AP Map 구성에서 제외하는 접근법을 택했다. 다음은 clustering을 수행하는 샘플코드 이다.
var clusters = [];
for(var l = 0; l < location_list.length; l++) {
location = location_list[l];
last_ts = location.ts;
weight = f(...)
if(weight > 0) {
found = false;
used_loc_no += 1
for(var i=0; i<clusters.length; i++) {
cluster = clusters[i]
if(Math.abs(cluster[0] - location.lat) < LOC_DIFF &&
Math.abs(cluster[1] - location.lng) < LOC_DIFF) {
cluster_lat = cluster[0];
cluster_lng = cluster[1];
cluster_weight = cluster[2];
weight_sum = cluster_weight + weight;
cluster[0] = (cluster_lat*cluster_weight + location.lat*weight) / weight_sum;
cluster[1] = (cluster_lng*cluster_weight + location.lng*weight) / weight_sum;
cluster[2] = weight_sum;
cluster[3] += 1
if(cluster[cluster.length-1] != location.ts) {
cluster.push(location.ts);
}
found = true;
break;
}
}
if(!found) {
if(location.rss > -80) {
cluster = [location.lat, location.lng, weight, 1, location.ts];
clusters.push(cluster);
}
}
}
}
자 그런데, 13억 건의 방대한 데이터로부터 AP 기록을 추출하고 clustering 을 수행해서 mobile AP 를 제거한 후에 AP 의 위치를 추정하는 과정은 쉽게 할 수 있을까? 아무리 우수한 성능의 컴퓨터라도 이는 불가능할 것이다. 여기서 우리 CTO 의 놀라운 능력이 발휘되었다. 우리는 그의 뛰어난 data engineering 능력으로인해 단 몇분 만에 이러한 결과를 얻어낼 수 있는 빅데이터 시스템을 이미 구성해 놓았던 것이다. 단지, 내가 해야 할 일은 위와 같이 javascript 코드를 열심히 짜는것 뿐. 실은 대량의 데이터를 processing 할 수 있는 시스템을 갖추고 있느냐가 WPS 를 구축하는데 아주 중요한 역할을 하는 것 같다.
일단 AP Map을 구성하게되면, 성능을 확인해야 한다. Golden Set 라고 명명된 데이터 세트에는 WiFi 스캔 값과 해당 WiFi 가 스캔된 위치, 즉 관측 값과 정답 값의 샘플이 포함되어 있다. 만개 이상의 샘플로 구성된 Golden Set 데이터를 가지고 AP Map 과 WPS 위치 추정 알고리즘을 계속 업그레이드 했다.
현재 로플랫 WPS는 최근 3개월 기록 데이터로부터 추출된 전국 1500만개AP의 위치를 바탕으로 평균 15m 오차를 가지는 서비스를 제공하고 있다. 전국 50만 곳 이상에서 직접 수집한 WiFi AP 데이터를 함께 활용하여 주요상업 지역에서는 꽤나 정확한 위치 정보를 제공하고 있다. 한가지 주요한 특징은 2.5 dimension 정보라고 말하는 층 정보를 국내 주요 백화점 및 복합몰과 같은 장소에서 제공한다는 것이다. 이 특징은 미아찾기 등과 같은 IoT 서비스에서 활용되면 그 가치가 더 클 것으로 보인다.
WPS 활용에 관심있으신 분은 아래 링크를 통해서 쉽게 사용해 볼 수 있다.
https://developers.loplat.com/#/documentation/wps
학교나 연구단체 등 공익적인 목적의 사용처에는 가능한한 무료로 제공될 예정입니다~
그리고 로플랫은 함께 미래를 만들어 갈 안드로이드, ML/AI 개발자를 찾고있습니다~