Мы планировали создать инструмент для поисковых игр — игр, в которых нужно находить места в реальном мире.
Первое, что нам потребовалось — точный инструмент для сбора точек и создания маршрутов. Простое указание их на карте не подходило, т.к. погрешность геометок достигает 200 метров — человек мог прийти по координатам в поисках небольшой вещи, а оказывалось, что до места еще сотни шагов. Чтобы не заставлять пользователей бродить, было решено разработать систему снятия координат телефонами прямо на месте.
Имея опыт разработки такой системы под Android и помучившись с ее сервисами геолокации, мы предположили, что сделать это на iOS будет проще (айфоны вроде бы очень похожи) и точнее (в идеале мы должны не бояться бросить айфон в лесу, чтобы потом найти его по компасу).
Для проверки этих предположений мы написали прототип, который приводил пользователя стрелкой к месту снятия координат, а заодно сделали интересные выводы о точности встроенного компаса, GPS и способах эту точность повысить.
Точность определения координат
Наши проверки показали, что максимальная точность GPS на разных айфонах разная, все-таки производители чипов не стоят на месте.
Вот какую максимальная точность мы получили в хороших условиях приема:
- iPhone 3Gs — 17м,
- iPhone 4 — 10м,
- iPhone 4s и 5 — 5м (неужели ГЛОНАСС влияет?!).
Эту точность мы спрашивали у самого телефона через location.horizontalAccuracy, а локацию получали от LocationManager-а при максимальной точности и частоте обновления. Все это довольно хорошо соответствовало действительности.
Во многих инструкциях пишут, что хорошие условия предполагают также отсутствие деревьев. Но наши тесты летом в хвойно-лиственном лесу не показали каких-либо заметных отклонений.
Интересно было понять, как айфоны отдают координаты там, где GPS не принимается. Здесь никаких сюрпризов не произошло.
Существует достаточно много хороших статей, которые описывают как работает GPS и геолокация в смартфонах в условиях отсутствующего GPS.
Пример от Яндекса.
Получается, что когда телефон не ловит GPS, то в location.horizontalAcuracy выдается ±1414 метров, используя информацию с базовой станции оператора. Такая точность продуцируется GSM-сетями.
Если рядом есть Wi-Fi точки, в соответствие которым установлены географические координаты, то, как правило, точность увеличивается до сотен метров, если Wi-Fi точка одна, или десятков метров, если их несколько.
Разницы между iPhone 4S и 5 мы не заметили, зато заметили, что они обновляют location значительно чаще. Поэтому, подходя к снятой точке, можно видеть как уменьшается цифра, показывающая расстояние до цели (30, 29, 28...). Это создает приятное ощущение прихода к успеху.
Направление
Далее, чтобы привести человека к месту, кроме координат точки назначения, нужно знать еще и направление, в котором пойти. Мы не рассматриваем задачу проведения человека по транспортной сети, как делают это навигаторы, мы решаем задачу приведения человека к месту, даже если мы не знаем ничего об окружающих его транспортных сетях.
Для вывода стрелки, указывающей на место, используется информация об ориентации телефона относительно Северного полюса. Эту информацию отдает компас устройства, который появился в айфонах, начиная с 3GS.
На этом мы и построили компас-навигатор, стрелка которого указывает на место.
Что можно улучшить
Интересно, что точность компаса является бутылочным горлышком всей системы указания направления.
Мы можем сколь угодно точно знать, каким курсом движемся в данный момент, но чтобы показать эту информацию пользователю в виде стрелки, необходимо как можно точнее понять ориентацию на север самого аппарата. Хоть у компаса и нет зон, где он не работает, зато он охотно реагирует на разные помехи и аномалии, а также углы наклона аппарата, и это особенно заметно в движении. Мы решили побороться и с этой проблемой.
Для уточнения использовался путевой угол, или location.course, если говорить в терминах iOS API. Это позволило в значительной степени увеличить точность компаса в движении.
Но появились проблемы. Поправка работает исходя из предположения, что люди ходят с телефоном, держа его верхней стороной вперед (по результатам различных экспериментов мы поняли, что для пеших айфоноводов это действительно так). А вот если человек едет на машине или в общественном транспорте, то ситуация, когда телефон расположен боком относительно направления движения, происходит значительно чаще. Следовательно поправку нужно отключать:
- при большой скорости (т.к. телефон быстро пролетает над разными помехами и аномалиями и реагировать на них значит создавать помехи над помехами);
- если поправка более 75гр. (т.к. тут уже придется развести руками, вряд ли можно предложить что-то более точное).
Есть, конечно, и более изощренные методы уточнения показаний стрелки — можно реализовать настоящий dead run (ссылка, которую пока не нашел). Но мы надеемся, что эту задачу лучше решат производители железа. Да и наше тестирование показало что компас-указатель с небольшими программными поправками выполняет свою функцию — приводит человека к месту.
Эксперимент
Для проверки точности работы прототипа решили провести небольшой эксперимент (ох, сколько мы провели экспериментов).
Вера в надежность разработанного прототипа вызывала споры в команде. Поэтому коллега, который больше всех в него верил (он его и разрабатывал), осмелился закопать свой айфон в лесу в качестве доказательства его надежности (ничего необычного, так все делают). Он ушел с двумя аппаратами, снял место и, вернувшись, отдал один айфон мне.
Я шел по лесу, следуя стрелке на экране. Когда экран показал оставшееся расстояние 0 метров, я посмотрел вниз и увидел сфотографированное место. Оказалось, коллега все же решил не рисковать своим телефоном, а подложил муляж (негодяй), но эксперимент безусловно удался.
Из этого прототипа получилось полезное приложение для шаринга мест Placer, но оно — тема другого поста.
Автор: tresher