Технологии, лежащие в основе Soundscape
Цель этой страницы — дать общее представление о том, как приложение Soundscape работает изнутри. Вам не нужно читать это, чтобы пользоваться приложением, но есть несколько причин, по которым она была написана:
- Чтобы помочь заинтересованным новичкам понять, в чём заключаются ограничения приложения
- Чтобы дать пользователям представление о том, что ещё может стать возможным с новыми функциями
- Чтобы дать разработчикам обзор работы приложения
Есть две технологии, которые делают приложение возможным: GPS и данные OpenStreetMap. GPS даёт нам хорошее представление о том, где находится телефон и где он был. Данные OpenStreetMap затем можно использовать, чтобы выяснить, что находится поблизости, и описать это пользователю.
Звуковые маяки
Во многих отношениях это самые простые вещи для реализации с технологической точки зрения. Предполагая, что у нас есть местоположение телефона и его направление, мы можем затем изменить звук маяка так, чтобы он звучал, как будто идёт с этого направления. Для позиционирования звука мы используем библиотеку Steam Audio, которая применяет передаточные функции, связанные с головой (head related transfer functions), чтобы обеспечить максимально качественное по звучанию позиционирование. Единственное, что мы ещё делаем, — это изменяем звук маяка так, чтобы воспроизводился разный звук в зависимости от угла между направлением пользователя и расположением маяка. Углы различаются в зависимости от выбранного маяка (Тактильный, Вспышка, Пинг и т. д.), и у некоторых из них большее количество звуков, чем у других. И это звуковые маяки на самом простом уровне.
Единственная дополнительная сложность — это предположение о местоположении телефона и направлении, в котором направлен пользователь. Рассмотрим их по очереди.
Местоположение
Местоположение, возвращаемое GPS, может иметь довольно большую погрешность, и она зависит от того, насколько открыто небо для GPS телефона и сколько деревьев и высоких зданий отражают GPS-сигнал на пути к телефону.
Подход, который мы выбрали для фильтрации местоположения, заключается в использовании так называемого сопоставления с картой (map matching). При этом предполагается, что пользователь, скорее всего, движется вдоль нанесённой на карту дорожки или дороги — мы используем термин «Way» (путь) для обозначения всех дорог, троп и дорожек. Сопоставление с картой смотрит на то, где был пользователь, и, используя направление движения вместе с местными картографическими данными, выбирает наиболее вероятное местоположение на Way. Этот подход учитывает не только погрешности GPS, но и погрешности в данных карты. Не все Way нанесены на карту точно, поэтому у них тоже есть погрешности. Чтобы определить, на каком Way наиболее вероятно находится пользователь, алгоритм учитывает:
- Насколько близко Way находится к местоположению по GPS и предыдущим местоположениям по GPS
- Направление движения — движется ли пользователь в том же направлении, что и Way
- Возможно ли попасть из последнего сопоставленного с картой местоположения в новое местоположение через сеть Way. Это необходимо, чтобы исключить переключение между Way, которые на самом деле не соединены, например, один проходит над другим по мосту или под ним по туннелю. Сопоставление с картой может решить, что поблизости нет ни одного Way или что оно не уверено, на каком из них находится пользователь, и в этом случае оно просто ждёт следующего местоположения по GPS и пробует снова, пока не будет уверено.
Направление
В программном обеспечении мы отслеживаем несколько направлений:
- Направление, в котором направлен телефон. Мы используем его, когда телефон разблокирован и приложение используется, а также когда телефон заблокирован, при условии что он держится горизонтально экраном к небу. Это полезно иметь в виду, когда вы кладёте телефон в сумку. Если он положен горизонтально на дно вертикально стоящей сумки, приложение будет использовать случайное направление, в котором ориентирована ваша сумка.
- Направление, в котором движется телефон.
- Направление от наушников с отслеживанием движения головы. В настоящее время мы его не используем, хотя приложение для iOS его поддерживало. У нас есть технология, чтобы добавить это в будущем.
Когда телефон заблокирован и находится в сумке, приложение будет использовать направление движения. Однако если пользователь не двигается, то направление недоступно. Когда это происходит, звуковые маяки становятся тише, чтобы показать, что невозможно узнать текущее направление на маяк — пользователь может поворачиваться, не меняя местоположения.
При некоторых способах использования направления в приложении направление «привязывается» к направлению сопоставленного с картой Way, поэтому если пользователь идёт примерно в направлении Way, то фактическое направление Way считается верным и используется в этих расчётах.
Заключение
Хотя на первый взгляд звуковые маяки просты, использование сопоставления с картой для попытки устранить погрешности местоположения и направления добавляет немалую сложность.
Картографические данные
Картографические данные, используемые приложением, почти полностью происходят из проекта OpenStreetMap. Мы держим сервер, на котором находится карта всего мира с несколькими уровнями масштаба. Каждый уровень масштаба разбит на тайлы. Уровень масштаба 0 содержит 1 тайл, уровень 1 содержит 4 тайла, уровень 2 содержит 16 тайлов и так далее вплоть до уровня 14, который содержит около 268 миллионов тайлов, чтобы покрыть планету. Каждый тайл содержит несколько слоёв, и в каждом слое есть точки, линии и многоугольники, которые можно нарисовать, чтобы создать графическую карту. Эта графическая карта и есть то, что показывается пользователю в графическом интерфейсе приложения. У каждой точки, линии и многоугольника есть метаданные, описывающие, что это такое. Это в основном напрямую из данных OpenStreetMap, поэтому линия может быть footway, который является sidewalk, или road, который является minor
Данные превращаются в графическую карту через «стиль», в котором есть правила, как рисовать различные точки, линии и многоугольники в каждом слое, например, как нарисовать дорожку, как нарисовать лес, как нарисовать автобусную остановку. Правила могут различаться по уровню масштаба, поэтому, когда вы приближаете карту, всё больше точек и линий становятся видимыми, которые не видны при отдалении, например, автобусные остановки и дорожки.
Изменяя стиль, мы можем менять внешний вид карты в интерфейсе, отсюда и берётся «доступная карта», которую мы пробуем. Она нацелена на больший контраст, более жирные линии и текст. Стиль встроен в приложение, поэтому нам не нужно менять карту на сервере, чтобы изменить её внешний вид.
Но как мы используем картографические данные для звука?
Использование картографических данных для звука
В настоящее время мы используем относительно небольшую часть картографических данных для создания звукового пользовательского интерфейса. Почти весь звуковой интерфейс использует только тайлы на максимальном уровне масштаба. Приложение сшивает сетку 2 на 2 из тайлов вокруг места, где находится пользователь, а затем смотрит лишь на несколько слоёв:
transportation— для всех типов Way, включая дороги, дорожки, железные дороги и трамвайные пути.poi— объекты интереса, например, магазины, спортивные центры, скамейки, почтовые ящики, автобусные остановки и т. д.building— это дляpoi, которые нанесены на карту не просто как точка, например, большие супермаркеты или ратуши.
Оно соединяет линии и многоугольники через границы тайлов и превращает все Way в связанные сегменты Way и перекрёстки. Это важно, потому что позволяет нам искать вдоль Way, чтобы выяснить, куда мы можем попасть.
Все разобранные данные также помещаются в удобный для поиска формат, чтобы приложение могло легко находить, какие объекты карты находятся поблизости. На этом этапе данные классифицируются по категориям. Текущие категории:
- Дороги
- Дороги и дорожки (все Way)
- Перекрёстки — точки, в которых пересекаются Way
- Входы — это точки на здании, которые были отмечены как вход.
- Пешеходные переходы — переходы через дорогу
- Объекты интереса — все объекты интереса
- Остановки общественного транспорта — автобусные остановки, железнодорожные станции, трамвайные остановки и так далее.
- Подкатегории объектов интереса:
- Информация
- Объект
- Место
- Достопримечательность
- Мобильность
- Безопасность
- Населённые пункты и подкатегории (см. следующий раздел)
- Города
- Городки
- Деревни
- Хутора
С этим на месте для любого местоположения приложение может затем легко найти
- «Все остановки общественного транспорта в радиусе 50 м» или
- «Ближайший перекрёсток передо мной» или
- «Ближайший хутор, деревню, городок или город»
С этим на месте создание звуковых уточнений — это просто вопрос запроса данных на основе текущего местоположения и направления. По мере того как пользователь перемещается по сетке тайлов, она обновляется так, чтобы быть центрированной вокруг текущего местоположения.
Больше данных
Одна из проблем нашей очень локальной сетки картографических данных в том, что это означает, что мы можем «видеть» максимум примерно на 1 км в любом направлении. Это нормально, когда мы описываем, что находится перед нами, но иногда нам хотелось бы дать больше контекста. Главный пример этого — когда приложение используется, а пользователь не идёт пешком.
Когда приложение обнаруживает, что пользователь движется со скоростью более 5 метров в секунду, оно переключает то, как описывает мир. Вместо того чтобы озвучивать каждый перекрёсток и объект интереса, оно делает уточнения реже и только о ближайших дорогах. Проблема в том, что знать название дороги не очень полезно, если вы не знаете, в каком городе она находится.
Чтобы попытаться решить это, мы теперь также разбираем картографические данные на более низком уровне масштаба и извлекаем данные из слоя place. Он содержит названия городков, городов, районов, деревень и так далее. Одна из проблем с нанесением вещей на карту в том, что не всегда есть очевидная граница между этими местами. В OpenStreetMap иногда есть границы городов в его базе данных, но даже когда это так, к тому времени, как это попадает на нашу тайловую карту, эта информация часто теряется. Что у нас есть, так это местоположение, в котором названия мест нарисованы на карте. Они классифицируются, и затем приложение находит ближайший к пользователю хутор, деревню, городок или город и сообщает об этом.
Для многих городов фактическое название города никогда не будет озвучено, потому что большинство городов разделены на более мелкие части, такие как районы, но они дают дополнительный контекст и очень полезны. Просто помните, что если приложение сообщает, что вы находитесь рядом с улицей в определённом районе, это лишь означает, что метка для этого района является ближайшей точкой, и она может быть неверной или даже находиться за рекой.
Больше контекста
Чем больше контекста можно добавить в описания, тем лучше, при условии что он остаётся кратким и предсказуемым. Одна из проблем, которую мы видели при описании перекрёстков, в том, что часто были задействованы «безымянные» Way. Это Way, у которых нет названия. В картографических данных это может быть просто тропа, дорожка или подъездная дорога, но без дополнительного контекста это не очень полезно в текстовых описаниях. К счастью, мы можем сделать лучше, поэтому приложение поступает так: всякий раз, когда оно собирается объявить безымянный Way, оно смотрит, может ли оно выяснить для него какой-то дополнительный контекст.
-
Это тротуар? Во многих районах OpenStreetMap тротуары теперь нанесены на карту отдельно от дорог. Они обычно помечены как
sidewalk, но обычно не указывают, какая это дорога, тротуаром которой они являются.Когда приложение встречает безымянный тротуар, оно ищет дорогу, которая, по его мнению, проходит рядом с ним, и использует её, чтобы назвать тротуар. Это оказывается очень важным для наших уточнений. Вместо того чтобы объявлять каждый перекрёсток тротуара, по мере того как мы движемся вдоль тротуара, уточнения делаются так, как будто мы движемся вдоль связанной дороги. Вместо «Движемся на запад вдоль дорожки» мы получаем «Движемся на запад вдоль Moor Road». Пользователь находится на нанесённом на карту тротуаре, но описание имеет больше смысла.
-
Заканчивается ли он у названного Way? Очень часто есть пешеходные дорожки, которые соединяют две дороги вместе. Глядя на оба конца дорожки, мы можем легко добавить этот контекст, так что в одном направлении это может быть «Дорожка к Moor Road», а при приближении с другого конца — «Дорожка к Roselea Drive». Это делается только там, где дорожка не разветвляется; если она разветвляется на две безымянные дорожки, то мы не пытаемся добавить этот контекст.
-
Заканчивается ли он рядом с Отметкой? Если безымянный Way начинается или заканчивается рядом с Отметкой, она используется для его описания, например, «Дорожка к развилке большого дерева». Пользователь может добавлять Отметки где угодно, и, добавляя Отметки вдоль сетей дорожек, он может добавить контекст ко всему маршруту.
-
Входит ли он в объект интереса или выходит из него? Если безымянный Way начинается за пределами объекта интереса и заканчивается внутри него (или наоборот), то мы можем добавить этот контекст, например, «Тропа к Lennox Park».
-
Заканчивается ли он рядом со Входом? Если безымянный Way начинается или заканчивается ближе ко Входу, то мы можем добавить этот контекст, например, «Подъездная дорога к Best Buy».
-
Заканчивается ли он рядом с Достопримечательностью или Местом? Если безымянный Way начинается или заканчивается ближе к Достопримечательности, то мы также можем добавить этот контекст, например, «Подъездная дорога к собору St. Giles».
-
Это тупик? Приложение помечает как тупик любые безымянные Way, которые никуда не ведут.
-
Проходит ли он мимо каких-либо ступенек? Если безымянный Way проходит по мосту, через туннель или вверх/вниз по ступенькам, то это отмечается и добавляется в контекст. Это отдельно от тегирования пункта назначения, поэтому возможен контекст вроде «Дорожка по мосту к Lennox Park».
Эти контексты добавляются по порядку, поэтому возможно иметь «Дорожка к Park Lane через ступеньки» в одном направлении и «Дорожка к Lennox Park через ступеньки» в другом направлении. Названная улица получает приоритет при выходе, но парк используется при входе в него.
Будущий контекст
Есть различные дополнительные контексты, которые мы надеемся добавить в будущем, включая:
- Контекст для Way, следующих вдоль линейных водных объектов, например, «Дорожка рядом с River Dee»
- Контекст для Way, следующих по краю водоёмов, «Дорожка рядом с водохранилищем Milngavie»
- Контекст для Way, следующих вдоль железных дорог, например, «Дорожка рядом с железной дорогой». Это могло бы даже включать название железнодорожной линии
- Добавить дополнительное содержание для мостов и туннелей — что над ними или под ними, например, «Дорожка через мост над железной дорогой к Moor Road»
Звуковые уточнения
Теперь, когда у нас есть картографические данные в формате, который мы можем легко использовать, создание уточнений действительно довольно просто.
Уточнения при ходьбе
При ходьбе звуковые уточнения, которые могут происходить, такие (в порядке приоритета):
- Описать, как далеко находится текущий пункт назначения
- Описать предстоящий перекрёсток
- Описать 5 ближайших объектов интереса
Все уточнения ограничены по частоте, чтобы они не повторялись слишком часто. Если пользователь перестаёт двигаться, уточнения прекращаются, и даже при движении уточнение не повторяется при каждом новом местоположении по GPS. Частота, как в приложении для iOS:
- Каждые 60 секунд для текущего пункта назначения
- Каждые 30 секунд для предстоящего перекрёстка
- Каждые 60 секунд для объекта интереса
Уточнения можно фильтровать через меню настроек, и здесь, безусловно, есть простор для расширения этого поведения.
Уточнения при более быстром передвижении
При передвижении со скоростью более 5 метров в секунду уточнение о текущем пункте назначения по-прежнему происходит, но уточнения о перекрёстках и объектах интереса заменяются уточнением, описывающим примерно, где находится пользователь. Оно даёт ближайшую остановку общественного транспорта, объект интереса, который нас содержит, например, внутри большого парка, или ближайшую дорогу и населённый пункт. Они используют данные, описанные ранее, и есть очевидное место для того, чтобы позволить настройку этого в будущем.
Отметки и пути
По большей части отметки и пути — это просто функция пользовательского интерфейса, которая не полагается ни на GPS, ни, по сути, на картографические данные. Отметки — это названные местоположения, которые пользователь хочет сохранить, а пути — это упорядоченный список этих отметок. Пользовательский интерфейс для создания обоих взят напрямую из версии для iOS.
Воспроизведение пути
Воспроизведение пути — это то, где пути оживают. Когда путь воспроизводится, у первой отметки пути создаётся звуковой маяк. Как только пользователь приближается к этой отметке, путь автоматически перемещает звуковой маяк к следующей отметке пути. Если больше отметок нет, то воспроизведение пути завершается.
Заключение
Надеемся, это дало некоторое представление о том, как работает приложение. Приложение постоянно развивается на основе отзывов пользователей, поэтому, пожалуйста, свяжитесь с нами, если есть что-то, что, по вашему мнению, можно было бы добавить.