惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
V
Visual Studio Blog
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
L
LangChain Blog
Martin Fowler
Martin Fowler
GbyAI
GbyAI
博客园 - 司徒正美

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
Охота на «лис» в XXI веке: как я воссоздал радиоспорт в с...
Alex Marshal · 2026-06-22 · via Все публикации подряд на Хабре

Средний

8 мин

24

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

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

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

Многие, кто вырос в 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;

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

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

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

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

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

  • компас;

  • карту;

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

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

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

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

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