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

推荐订阅源

大猫的无限游戏
大猫的无限游戏
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threat Research - Cisco Blogs
A
Arctic Wolf
S
Securelist
O
OpenAI News
T
Threatpost
Forbes - Security
Forbes - Security
N
News and Events Feed by Topic
S
Secure Thoughts
H
Heimdal Security Blog
S
Security Affairs
P
Privacy International News Feed
C
Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Palo Alto Networks Blog
S
Security @ Cisco Blogs
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
T
Tailwind CSS Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hacker News: Ask HN
Hacker News: Ask HN
T
Troy Hunt's Blog
S
SegmentFault 最新的问题
腾讯CDC
V
Visual Studio Blog
Last Week in AI
Last Week in AI
H
Hacker News: Front Page
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Project Zero
Project Zero
WordPress大学
WordPress大学
NISL@THU
NISL@THU
博客园 - 【当耐特】
博客园 - Franky
Webroot Blog
Webroot Blog
博客园_首页
T
Tenable Blog
雷峰网
雷峰网
Google Online Security Blog
Google Online Security Blog
阮一峰的网络日志
阮一峰的网络日志
V2EX - 技术
V2EX - 技术
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
Lohrmann on Cybersecurity
The Hacker News
The Hacker News

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет 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 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Охота на «лис» в 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;

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

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

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

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

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

  • компас;

  • карту;

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

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

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

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

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