Предисловие
В двух словах стоит рассказать о технологии. iBeacon — это небольшой bluetooth маячок, который может передавать окружающим устройствам информацию о своих идентификаторах (UUID, major, minor). Человек с установленным приложением подходит к маячку, смартфон получает данные о нем и отсылает к нам на сервер. Мы находим у себя в базе этот маячок и отправляем пользователю координаты на местности. Естественно, если пользователь находится в зоне видимости двух или трех маячков, мы можем определить его местоположение точнее.
Все вышеописанное очень удобно внутри помещений — там, где GPS не может обеспечить достаточно высокую точность для навигации.
Само собой, такая технология открывает массу потрясающих возможностей, и наша команда с огромным энтузиазмом взялась за разработку платформы и мобильного SDK для работы с маячками.
Часть 1. Подготовка
Наигравшись вдоволь с несколькими пробными образцами маячков, подготовив первые версии сервиса настройки и iOS SDK, мы почувствовали в себе силы сделать что-то большее. Был конец февраля, отличным вариантом для первого крупного запуска выглядела конференция РИФ+КИБ: до нее оставалось два месяца, а это ого-го, что угодно можно сделать за такой-то срок, верно?
Нужно было успеть:
- понять, сколько маячков нужно, закупить и получить их;
- найти или подготовить какой-то инструмент, который позволит пакетно настроить всю кучку биконов (выдать им правильные идентификаторы, указать мощность и частоту);
- разработать iOS приложение для участников конференции;
- существенно допилить веб-платформу;
- и сущая мелочь — приехать на место и установить правильные маячки в правильные точки.
Пробные экземпляры маячков, бывшие в нашем распоряжении, были далеко не так хороши, как те, о которых так много сейчас пишут в сети: они били на расстояние 5-10 метров, а совсем не на 50, при этом работали все немного по-разному и не очень стабильно. Но их невысокая стоимость и наш оптимизм стали решающими факторами — для конференции было решено заказывать их же.
Получив от организаторов примерную карту выставки, а также маленький кусок архитектурного плана с обозначенными размерами, мы стали продумывать оптимальное расположение маячков.
Проблемы начались тогда, когда обнаружилось, что архитектурный план, нарисованная карта мероприятия и вид на это же место в google maps похожи друг на друга лишь отдельными местами. Контуры, пропорции и размеры зданий были очевидно разными.
Получить более точную карту не представлялось возможным.
Конечно, лучшим решением было бы съездить туда примерно за месяц до конференции и самостоятельно прикинуть масштаб, вручную поправить карту, обдумать оптимальные точки для размещения маячков. Но в тот момент мы решили подсчитать необходимое количество маячков приблизительно и накинуть сколько-то сверху «про запас».
Другой серьезной сложностью была настройка маячков. Дело в том, что для выбранных нами девайсов существовало iOS приложение, позволяющее увидеть все доступные маячки и задать каждому настройки, введя их вручную с экранной клавиатуры в виде шестнадцатеричных значений. Для настройки двух сотен маячков это категорически не подходило. В связи с этим, один из наших разработчиков взялся за создание инструмента, позволяющего получить весь список видимых маячков, указать необходимые настройки и отдыхать, наблюдая, как маячки получают эти настройки и весело подмигивают голубым диодом. Был март и все шло по плану.
Подготовка самого мобильного приложения и веб-интерфейса для управления навигацией на РИФ продвигались идеально вплоть до последнего момента.
Часть 2. РИФ+КИБ
После нашего приезда в Москву за 2 дня до мероприятия, события развивались стремительно, каждые несколько часов открывая перед нами новые непредвиденные обстоятельства.
Обстоятельство 1
Оказалось, что собирать маячки из деталей сложно, а когда их 200 штук — еще сложнее. Детали корпуса плохо стыкуются друг с другом, печатные платы по форме не совсем соответствуют крышке, в которую их нужно вставлять.
В общем, пару часов мы были похожи на неопытных сотрудников подпольной китайской фабрики. Но дело было сделано: батарейки вставлены, печатные платы надежно вбиты в корпуса, передние и задние крышки соединены настолько, насколько это было возможно. Победа.
Обстоятельство 2
Вопреки нашим надеждам, выяснилось, что программа для пакетной настройки кучи маячков стабильно работает только в том случае, если размер кучи <= 10 шт. Но сдаваться мы не собирались.
Было нужно лишь придумать способ как-то избавиться от сигнала лишних 190 маячков при настройке очередной партии: все сбивалось, если программа засекала больше биконов, чем требовалось.
Помня о том, что дальность действия маячков не так велика, мы всего лишь отнесли сумку с ними в соседнюю комнату и … были потрясены, обнаружив, что нынешняя партия работала значительно лучше той, что была у нас месяц назад. Сигнал оставался превосходным в любой точке квартиры.
Вынимать батарейки не хотелось: слишком много невосполнимых усилий было вложено в сборку. Экспериментально был выведен один абсолютно надежный способ экранирования: мешок маячков помещался в толстостенный казан и закрывался крышкой, а сам казан ставился на дно чугунной ванны.
Пробегав всю ночь с кучками маячков в ванную и обратно, к 5 утра мы закончили настройку.
Обстоятельство 3, кульминационное
Несмотря на мелкие технические трудности, установка маячков на территории будущей выставки шла очень бодро. Мы расставляли их по заранее подготовленному плану, и отходить от него практически не пришлось.
Установив около 100 штук, мы решили проверить навигацию. Пока человек с сумкой маячков отбегал на несколько десятков метров от корпуса (казана и ванны для экранирования у нас под рукой не оказалось), другой должен был с телефоном пройтись по корпусу и проследить за работой навигации в приложении.
Результат был ужасающим. Приложение показывало, что пользователь все время топчется где-то в северной части здания. Это соответствовало ошибке в 5-10 метров и это было недопустимо.
Еще пара экспериментов — тот же результат.
Такую панику испытывает студент, вытащивший на важном экзамене незнакомый билет. Так чувствуют себя перед лицом практически неминуемого провала. Мы расположились в каком-то пустом помещении и стали думать. Один из разработчиков (grohman) наворачивал круги по залу, время от времени посматривая в приложение, пока не заметил простую вещь, которая нам почему-то сразу не пришла в голову. Координаты местоположения вычислялись правильно, но сама карта была сдвинута южнее реальных координат, что давало такое искажение в отображении локации.
Старым добрым методом «на глазок» мы подобрали поправку для всех передаваемых в приложение координат. Все встало на свои места.
Обстоятельство 4
Вскоре нас сменила другая часть команды. Отправив нас отдыхать, они собирались расставить оставшиеся маячки и окончательно все затестить. Спустя полтора часа они позвонили с плохой новостью: локация снова не работает, причем на этот раз искажения появляются и исчезают внезапно, ошибка составляет до нескольких десятков метров. Находясь на ногах уже почти двое суток, мы ошалело смотрели на монитор, наблюдая фантастические метания «булавки» локации по карте.
Разбирая тонны логов, удалось обнаружить удивительную вещь: в списке видимых устройству маячков время от времени попадался маячок #68, которого в том месте видно быть не должно. Вскоре закралось верное подозрение, и мы попросили ребят пойти в место, где должен быть установлен тот маячок и посмотреть, что с ним. Естественно, его на месте не оказалось.
Кто-то отклеил #68 от стены и ходил с ним в кармане, время от времени создавая для системы своеобразный «эффект присутствия».
Отключив обработку данных от этого маячка, мы снова получили приличные данные о локации, но оказались перед вопросом о том, как в следующий раз оперативно бороться с такими ситуациями.
Было внедрено следующее решение: у каждого маячка есть «соседи» — другие маячки, находящиеся на расстоянии <=N. Когда пользователь передает нам данные о видимых маячках и уровне сигнала (rssi), мы выбираем маячки с наибольшими rssi и проверяем, являются ли остальные маячки их соседями. Если мы обнаруживаем маячок, который соседом тут быть явно не должен, мы исключаем его из вычисления локации. Локация снова работала хорошо.
Итог
Потом было еще несколько срочных багфиксов, три дня конференции, масса интересных людей и событий. Несмотря на весь накал страстей в последние дни подготовки, мы смогли запустить indoor навигацию с помощью BLE маячков, продемонстрировали (да что уж там, убедились сами), что она работает. Для себя мы смогли сделать несколько выводов:
- тестирование «в миниатюре» никогда не заменит тестирования в боевых условиях. Проверить навигацию на нескольких маячках даже в просторном помещении — недостаточно для того, чтобы быть уверенными, что навигация заработает с двумя сотнями маячков на 1000 кв.м
- экономия сил и времени на планировании — очень плохой вариант экономии. Если бы мы уделили больше внимания вопросам точности карты с самого начала, нам не пришлось бы подгонять координаты вручную в последний вечер.
- крепить маячки на двусторонний скотч — недостаточно надежно
- несколько бессонных ночей — не такая большая плата за возможность реализовать первый в стране настолько масштабный проект навигации по BLE маячкам. Мы получили интересный и необычный опыт и надеемся, что скоро расскажем о новых проектах внедрения indoor навигации и не только.
В комментариях будем рады ответить на вопросы о деталях реализации )
ссылка на оригинал статьи http://habrahabr.ru/post/225713/
Добавить комментарий