Охота на «лис» в XXI веке: как я воссоздал радиоспорт в современных технологиях

от автора

«О спорт, ты — мир!» — эта знаменитая фраза принадлежит основателю современных Олимпийских игр Пьеру де Кубертену. Спорт не только укрепляет здоровье, но и объединяет людей, создавая новые формы общения.

К сожалению, некоторые спортивные дисциплины со временем теряют популярность. Одной из них стала спортивная радиопеленгация, более известная как «Охота на лис». Когда-то она привлекала тысячи энтузиастов, сочетая физическую активность, ориентирование на местности и работу с радиооборудованием.

В этой статье я расскажу, как попытался вдохнуть новую жизнь в этот необычный вид спорта, объединив его с современными мобильными технологиями, геолокацией и игровыми механиками.

Многие, кто вырос в 80-х и 90-х годах, наверняка помнят этот необычный вид спорта. Несмотря на своё название, никакой охоты в привычном понимании здесь не было. Участники искали не животных, а скрытые радиопередатчики, используя специальные приемники-пеленгаторы.

Сегодня «Охота на лис» по-прежнему существует, однако ее популярность заметно снизилась. Одной из причин является высокий порог входа: для участия требуется специализированное оборудование, которое стоит недешево, да и найти его непросто. К тому же многое устарело.

Мне захотелось выяснить, можно ли перенести идею классической радиопеленгации в современный мир смартфонов и мобильных приложений. Так появился проект виртуальной «Охоты на лис», построенный на Unity и технологиях геолокации.

Немного истории

Классическая «Охота на лис» (радио спорт, радиопеленгация) представляет собой соревнование, в котором участники должны обнаружить несколько скрытых радиопередатчиков, расположенных на пересечённой местности.

Каждый передатчик периодически излучает радиосигнал, а задача спортсмена — определить направление на источник и как можно быстрее добраться до него.

Для поиска используются специальные приемники с направленными антеннами. Побеждает тот, кто найдёт все передатчики за минимальное время.

Помимо спортивного интереса, такие соревнования развивают навыки ориентирования, работы с картой и понимания принципов радиосвязи.

Постановка задачи

Главная цель проекта заключалась в том, чтобы максимально сохранить дух оригинальной игры, но избавиться от необходимости использовать дорогостоящее оборудование.

В качестве альтернативы я решил использовать:

  • смартфон как универсальное устройство;

  • GPS для определения местоположения игрока;

  • цифровые «передатчики» вместо реальных радиомаяков;

  • пространственный звук для имитации радиосигнала.

В результате получилось мобильное приложение, позволяющее играть как в одиночку, так и в составе группы практически в любой точке мира. Ниже приведена блок-схема отображающая концепт мобильной игры «Охота на лис».

блок-схема мобильной игры "Охота на лис"

блок-схема мобильной игры «Охота на лис»

Архитектура решения

Основная идея оказалась довольно простой.

Вместо физических передатчиков приложение создаёт виртуальные объекты — «лис». Каждая такая «лиса» имеет реальные географические координаты.

Смартфон игрока одновременно выполняет роль:

  • приемника;

  • компаса;

  • карты;

  • устройства определения координат.

Когда игрок приближается к координатам передатчика на заданное расстояние, система считает объект найденным и удаляет его из игрового поля.

Схематично процесс выглядит так:

  1. Создаются координаты виртуальных передатчиков.

  2. Игрок получает своё текущее местоположение через GPS.

  3. Приложение вычисляет расстояние до каждой «лисы».

  4. При достижении заданного радиуса цель считается обнаруженной.

  5. Результат отправляется на сервер турнира.

Турниры и тренировочные режимы

Помимо одиночной игры, была реализована система турниров.

Любой пользователь может принять участие в соревновании на заранее подготовленной локации. Координаты всех передатчиков хранятся в базе данных и одинаковы для всех участников.

Например, соревнования могут проводиться:

  • в Центральном парке Нью-Йорка;

  • на Елисейских Полях в Париже;

  • в городских парках других стран.

Для тренировок используется иной режим. Координаты «лис» генерируются случайным образом внутри игрового поля размером 1 км².

Это позволяет постоянно получать новые маршруты и не запоминать расположение целей.

Техническая реализация

Проект написан на Unity и ориентирован на Android-устройства.

В приложении используются:

  • GPS;

  • электронный компас;

  • собственная система картографии;

  • пространственный звук;

  • сервер турниров.

Для усиления эффекта присутствия каждая «лиса» передает собственный звуковой сигнал, стилизованный под телеграфный код Морзе.

Каждый источник имеет уникальный набор звуков и собственный идентификатор.

Инициализация игровых объектов

При запуске приложения загружаются аудио источники и скрываются все виртуальные передатчики.

public Transform[] targetObject;AudioSource[] comp = GetComponents<AudioSource>();audioNoise = comp[0];audioTubes = comp[1];m_MyAudioSource = new AudioSource[targetObject.Length];for (int i = 0; i < targetObject.Length; i++){    m_MyAudioSource[i] = targetObject[i].GetComponent<AudioSource>();    targetObject[i].GetComponent<Image>().enabled = false;}

Таким образом пользователь изначально не видит расположение целей и вынужден искать их самостоятельно.

Работа с GPS и компасом

Перед началом игры необходимо проверить разрешения на доступ к геолокации и активировать датчики устройства.

if (Permission.HasUserAuthorizedPermission(Permission.FineLocation)){    if (!Input.compass.enabled)        Input.compass.enabled = true;}else{    Permission.RequestUserPermission(Permission.FineLocation);}if (Input.location.isEnabledByUser){    Input.location.Start(10, 0.01f);    currentSessionCode = System.DateTime.Now.Ticks.ToString("X");    if (!tourSign.enabled)        StartCoroutine(GetGPSLocation());    else        StartCoroutine(...);}

После успешной инициализации запускается корутина, отвечающая за обновление координат игрока.

Альтернативный движок карт

Первоначально проект использовал картографические сервисы Google Maps. Однако после изменения условий доступа использование API стало экономически нецелесообразным.

Поэтому был разработан альтернативный механизм загрузки карт через промежуточный сервер.

IEnumerator LoadMap(){    string baseUrl = DomainURL + "map.php";    string requestUrl =        $"{baseUrl}?lat={StartedLocation[0]}&lon={StartedLocation[1]}&zoom={altitude}";    imageMap.GetComponent<Image>().enabled = false;    using (UnityWebRequest uwr =           UnityWebRequestTexture.GetTexture(requestUrl))    {        yield return uwr.SendWebRequest();        if (uwr.result != UnityWebRequest.Result.Success)        {            Debug.LogError("Unity Error: " + uwr.error);        }        else        {            Texture2D finalTexture =                DownloadHandlerTexture.GetContent(uwr);            imageMap.GetComponent<Image>().sprite =                Sprite.Create(                    finalTexture,                    new Rect(0, 0, 640, 640),                    new Vector2());            imageMap.GetComponent<Image>().enabled = true;        }    }}

Поиск передатчиков

Основная игровая логика заключается в непрерывном вычислении расстояния между игроком и виртуальными передатчиками.

for (int i = 0; i < targetObject.Length; i++){    if (m_MyAudioSource[i].isPlaying)        m_MyAudioSource[i].volume =            getDirectionLevel(targetObject[i]);    float distance =        Vector3.Distance(            playerMarker.localPosition,            targetObject[i].localPosition);    if (distance < 40 &&        m_MyAudioSource[i].isPlaying)    {        targetObject[i].GetComponent<Image>().enabled =            !targetVisibleProperty;        m_MyAudioSource[i].Stop();        audioTubes.Play();        StartCoroutine(...);    }}RotateMap();GetAudioLevel();

При достижении радиуса обнаружения цель считается найденной, а сервер получает соответствующее событие.

Серверная часть

Для получения карт был написан небольшой PHP-сервис, выполняющий роль промежуточного шлюза между приложением и картографическим API.

$parts = [    "https://api.service.com",    "/styles/v1/",    $lon . "," . $lat . "," . $zoom . ",0,0",    "/640x640",    "?access_token=" . $token];$url = implode("", $parts);$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);$data = curl_exec($ch);echo $data;

Такой подход позволил централизованно управлять запросами и скрыть ключи доступа от клиента.

Борьба с шумами GPS

Во время тестирования выяснилось, что координаты смартфона могут заметно «плавать» даже при неподвижном положении пользователя.

Для сглаживания измерений был реализован фильтр Калмана.

float kalmanGain =    _errorEstimate /    (_errorEstimate + _measurementVariance);_currentEstimate =    _currentEstimate +    kalmanGain *    (measurement - _currentEstimate);_errorEstimate =    (1 - kalmanGain) * _errorEstimate +    Mathf.Abs(_currentEstimate - measurement) *    _processVariance;return _currentEstimate;

После внедрения фильтра точность определения местоположения заметно улучшилась, а количество ложных срабатываний существенно сократилось.

Что получилось в итоге

Проект показал, что многие классические виды спорта можно успешно адаптировать к современным технологиям.

Смартфон смог заменить сразу несколько устройств:

  • радиоприёмник;

  • компас;

  • карту;

  • систему фиксации результатов.

Конечно, такая реализация не является полноценной заменой настоящей спортивной радиопеленгации. Однако она позволяет познакомить новых участников с идеей «Охоты на лис» и делает этот вид активности гораздо более доступным.

Кроме того, система открывает возможности для проведения международных соревнований без необходимости устанавливать реальное радиооборудование на местности.

Если у вас возникли вопросы по реализации проекта или отдельным техническим решениям — буду рад обсудить их в комментариях.

Спасибо за внимание и удачной охоты на лис!

ссылка на оригинал статьи https://habr.com/ru/articles/1050210/