commit f48465dfb11f59bb8eef61e89a9f6578a9bd0730 Author: mavxa Date: Wed Sep 9 16:28:02 2026 +0300 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..58eb50e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +__pycache__/ +*.py[cod] +.venv/ +.idea/ +.vscode/ + diff --git a/COMPETITION_NOTES.md b/COMPETITION_NOTES.md new file mode 100644 index 0000000..17374f5 --- /dev/null +++ b/COMPETITION_NOTES.md @@ -0,0 +1,74 @@ +# Актуальные заметки по соревнованию + +## Рабочие допущения + +- Будет отдельный день настройки оборудования. +- Основной ожидаемый формат — физические РМК, но Webots остаётся запасным и учебным вариантом. +- На физических РМК ожидается тот же ROS 2 API. Если площадка выдаёт другое окружение без документации и времени адаптации, это нужно сразу поднимать как проблему инфраструктуры. +- Интернет и документация разрешены. +- По телефонному разъяснению эксперта LLM разрешены, формат близок к хакатону. Это устное актуальное разъяснение; его стоит повторно зафиксировать на инструктаже. +- Целевой ArUco ID сообщает эксперт. +- Для модуля В, вероятно, понадобится новый датасет с выданной камеры и физических деталей либо готовый датасет организаторов. +- Для модуля Г важнее работоспособный интерфейс по критериям, чем сложный дизайн. + +## Ограничение числа скриптов + +По полному финальному КЗ: + +| Модуль | Максимум взаимодействий/скриптов на зачётном ПК | +| --- | ---: | +| Б | 2 | +| В | 1 | +| Д | 4 | + +Текущий `module5/module5.py`, запускаемый одним процессом, не нарушает ограничение модуля Д. Он не использует собственный UDP-протокол: один ROS 2 node на зачётном ПК публикует команды в пространства `/RMC1/*` и `/RMC2/*` и получает телеметрию обоих роботов через DDS. + +Это работает, если оба физических РМК доступны в одном согласованном ROS-домене. Если площадка разведёт роботов по разным доменам или компьютерам, архитектуру нужно будет адаптировать в день настройки. + +Официальный сценарий модуля Д допускает последовательные или параллельные операции. Текущее решение выполняет их последовательно — медленнее, но проще и безопаснее. + +## Предлагаемые изменения 30% + +### Модуль Б — навигация + +- заменить ID стартового и целевого ArUco; +- переставить несколько закрытых ячеек; +- изменить место появления динамического препятствия; +- передавать старт, финиш и препятствия через конфиг. + +Это меняет входные данные, но сохраняет планировщик, маршрут, возврат, объезд и оценку времени. + +### Модуль В — техническое зрение + +- выбирать другой целевой класс из заранее подготовленных классов; +- менять расположение детали перед камерой; +- менять цвет или номер целевой детали; +- не вводить неизвестную категорию и новую архитектуру непосредственно на площадке. + +Если физические детали отличаются от симулятора, новый датасет всё равно потребуется. Классы и формат разметки лучше сохранить прежними. + +### Модуль Г — GUI/FMS + +- переключатель РМК-1/РМК-2; +- состояния `ONLINE/OFFLINE`, `AUTO/MANUAL/STOP`; +- перестановка блоков интерфейса; +- цвет свободных и занятых ячеек; +- окно последних событий; +- неизменные ROS-топики и сервисы. + +### Модуль Д — складской сценарий + +- менять ячейки хранения, комплектации и выдачи; +- выбирать другую известную деталь; +- менять порядок существующих операций; +- сохранять РМК, ARM95 и ROS-интерфейсы; +- хранить точки и класс детали в YAML/JSON или аргументах запуска. + +### Модуль А — диагностика + +- заменить диагностируемую плату; +- изменить набор заранее внесённых неисправностей; +- использовать единый шаблон отчёта; +- ограничить дефекты теми, которые обнаруживаются осмотром и мультиметром без пайки. + +Этот вариант безопасен только при наличии схемы или документации на плату и заранее определённого перечня допустимых неисправностей. diff --git a/README.md b/README.md new file mode 100644 index 0000000..be18476 --- /dev/null +++ b/README.md @@ -0,0 +1,248 @@ +# ЧВТ-2026: документы и памятка по подготовке + +Этот приватный репозиторий — офлайн-набор для подготовки: исходные материалы организаторов, порядок установки окружения, ссылки на документацию и короткие ROS-примеры. Рабочие решения модулей лежат отдельно в [`mavxa/mvch`](https://github.com/mavxa/mvch). + +> Конкурсное задание, критерии и указания экспертов на площадке имеют приоритет над этой памяткой и старыми презентациями. Не меняйте мир Webots, расположение объектов и штатные управляющие пакеты, если это прямо не разрешено экспертами. + +## Что лежит в репозитории + +- [`materials/presentations`](materials/presentations) — пять учебных презентаций (введение, документация, Python/ROS, симулятор, развитие компетенции). +- [`materials/pdf`](materials/pdf) — шестая презентация про датасет и модели, расписание. +- [`materials/final`](materials/final) — полный очный финал: инфраструктурный лист, КЗ модулей А–Д, критерии и приложения. +- [`materials/tasks`](materials/tasks) — отдельный ранний/отборочный комплект по навигации; не путать с полным финалом. +- [`basic`](basic) — примеры для реального ROS 2: движение к ArUco с odometry/TF/lidar, ручной `cmd_vel`, остановка, лифт, мониторинг и BFS-маршрут. +- [`setup/FROM_ZERO.md`](setup/FROM_ZERO.md) — подготовка полностью чистого Windows/Ubuntu и день настройки оборудования. +- [`setup/COMMANDS.md`](setup/COMMANDS.md) — только команды для копирования в терминал. +- [`setup/check_environment.sh`](setup/check_environment.sh) — безопасная read-only проверка окружения. +- [`COMPETITION_NOTES.md`](COMPETITION_NOTES.md) — актуальные устные уточнения, лимиты скриптов и предложения 30% изменений. + +Материалы собраны из выданного набора ЧВТ. Репозиторий оставлен приватным: права на исходные презентации и задание принадлежат их авторам/организаторам. +Актуальную опубликованную редакцию сверяйте с [официальным комплектом финала 2026](https://esim.firpo.ru/d/f/2026), раздел «Оператор-техник складских роботов (AGV/AMR)». + +## Порядок чтения + +1. `materials/final/04-final-task.docx` и `materials/final/05-final-criteria.xlsx` — сначала понять конечный результат и баллы очного финала. +2. `1. Введение...` и `2. Документация...` — термины, РМК и структура компетенции. +3. `3. Разбор...` — Python, ROS 2, топики и сервисы. +4. `4. Практика... (симулятор)` — установка и работа с Webots. +5. `5. Практика... (датасет + модели)` — разметка и обучение детектора. +6. `setup/FROM_ZERO.md` — подготовка ПК и оборудования. +7. README каждого модуля в `mvch` — точные команды текущего решения. + +## Быстрый старт на подготовленной VM + +Нужны SSH-ключ с доступом к приватным GitHub-репозиториям и уже установленное окружение ROS/Webots. + +```bash +mkdir -p ~/scripts +git clone git@github.com:mavxa/mvch-docs.git ~/scripts/mvch-docs +git clone git@github.com:mavxa/mvch.git ~/scripts/mvch + +cd ~/scripts/mvch-docs +./setup/check_environment.sh +``` + +В каждом новом ROS-терминале: + +```bash +source /opt/ros/jazzy/setup.bash +source ~/ros2_ws/install/setup.bash +``` + +Перед поездкой обновлять только fast-forward: + +```bash +cd ~/scripts/mvch +git switch main +git pull --ff-only +``` + +## Установка чистого окружения + +Официальная целевая база материалов — **Ubuntu 24.04 LTS + ROS 2 Jazzy + Webots + Fast DDS + colcon**. На площадке лучше использовать выданный и заранее проверенный образ, если он будет предоставлен. + +Полный путь от чистой Windows/Ubuntu, включая VS Code, расширения, Git/SSH, ROS, Webots, Python/YOLO, Bun, Node.js и OpenCode: [`setup/FROM_ZERO.md`](setup/FROM_ZERO.md). Краткий файл только с командами: [`setup/COMMANDS.md`](setup/COMMANDS.md). + +### 1. ROS 2 Jazzy + +Устанавливайте Jazzy по [официальной инструкции ROS 2 для Ubuntu](https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debs.html), включая настройку locale и репозитория ROS. Минимальный набор после подключения репозитория: + +```bash +sudo apt update +sudo apt install ros-jazzy-desktop ros-dev-tools python3-colcon-common-extensions \ + python3-rosdep python3-venv git + +source /opt/ros/jazzy/setup.bash +``` + +`rosdep init` выполняется один раз на систему: + +```bash +sudo rosdep init +rosdep update +``` + +Если команда сообщает, что sources list уже существует, повторный `rosdep init` не нужен. + +### 2. Webots + +Сверяйте установку с [официальной инструкцией Cyberbotics](https://cyberbotics.com/doc/guide/installing-webots). Версия симулятора должна совпадать с версией, под которую собран выданный ROS-пакет; самовольно обновлять её прямо перед соревнованием не стоит. + +### 3. Пакеты симулятора ЧВТ + +Команды из выданных материалов: + +```bash +mkdir -p ~/ros2_ws/src +cd ~/ros2_ws/src + +git clone https://gitlab.mobird.dev/fms_group/ar_webots_fms_ros2.git +git clone https://gitlab.mobird.dev/fms_group/ar_arm95_moveit_config.git +git clone https://gitlab.mobird.dev/fms_group/ar_aruco_detect_ros2.git +git clone https://gitlab.mobird.dev/fms_group/ar_dual_lidar_merge_ros2.git +git clone https://gitlab.mobird.dev/fms_group/ar_nav_ros2.git + +cd ~/ros2_ws +rosdep install --from-paths src -y --ignore-src +colcon build --symlink-install +source ~/ros2_ws/install/setup.bash +``` + +GitLab может потребовать выданный организаторами аккаунт/токен. Если clone не работает, не ищите случайные зеркала: запросите доступ у эксперта. + +### 4. Python-окружение YOLO и ROS + +ROS-библиотеки установлены системно, поэтому venv для модуля В создаётся с `--system-site-packages`. Это также предотвращает несовместимость отдельного Python с бинарными пакетами ROS; подробнее — в [официальной памятке ROS 2 по Python-пакетам](https://docs.ros.org/en/jazzy/How-To-Guides/Using-Python-Packages.html). + +```bash +cd ~/scripts/mvch/module3 +python3 -m venv --system-site-packages .venv +.venv/bin/python -m pip install -U pip +.venv/bin/pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu +.venv/bin/pip install -r requirements.txt tqdm ultralytics-thop +``` + +В текущем образе `cv_bridge` требует NumPy 1.x: + +```bash +.venv/bin/pip install --force-reinstall "numpy<2" "opencv-python<4.12" lark transforms3d +``` + +Для NVIDIA/ROCm сначала установите подходящую сборку PyTorch по [официальному селектору PyTorch](https://pytorch.org/get-started/locally/), затем остальные зависимости. Для CPU готовая команда выше достаточна. + +### 5. Веб-интерфейс модуля Г + +Установите [Bun](https://bun.sh/docs/installation), затем: + +```bash +cd ~/scripts/mvch/module4 +bun install +bun run build +``` + +## Быстрая проверка перед работой + +```bash +cd ~/scripts/mvch-docs +./setup/check_environment.sh + +source /opt/ros/jazzy/setup.bash +source ~/ros2_ws/install/setup.bash +ros2 topic list +ros2 pkg prefix ar_webots_fms_ros2 +``` + +Проверьте только один launch-файл за раз. После его запуска отдельно убедитесь, что приходят сообщения: + +```bash +ros2 topic hz /RMC1/odometry +ros2 topic echo /RMC1/odometry --once +ros2 topic echo /RMC2/scan_front --once +``` + +Точный список топиков зависит от активного launch-файла. Если `scan_front` отсутствует, сначала посмотрите `ros2 topic list | sort`, а не меняйте код вслепую. + +## Запуск модулей + +| Модуль | Решение | Основной запуск | +| --- | --- | --- | +| Б | навигация RMC2 по ArUco | `python3 module2/module_b.py --target 14 --sim` | +| В | YOLO + ARM95 | `module3/.venv/bin/python module3/module3.py --target hammer` | +| Г | веб-FMS двух роверов | `cd module4 && bun run start` | +| Д | общий сценарий RMC1 + RMC2 | `module3/.venv/bin/python module5/module5.py --target hammer` | + +Запускайте команды из `~/scripts/mvch`. До движения используйте dry-run: + +```bash +python3 module2/module_b.py --target 14 --dry-run +module3/.venv/bin/python module3/module3.py --target hammer --dry-run --no-window +python3 module5/module5.py --target hammer --dry-run +``` + +Для модуля Д сначала проверяйте платформы и лифт без руки: `python3 module5/module5.py --target hammer --skip-arm`. + +Лимит полного финального КЗ: модуль Б — максимум 2 скрипта, В — 1, Д — 4. Текущий модуль Д использует один центральный ROS 2 процесс для обоих пространств имён и укладывается в лимит; отдельного UDP-протокола нет. + +## Модель для симулятора + +Текущая YOLO11n лежит в `mvch/module3/models/latest.pt`. Классы и их написание: + +```text +hammer +pliers +wrench +``` + +Текущий симуляторный датасет очень маленький: 28 train, 8 validation и 4 test изображения. Он годится для проверки пайплайна, но не доказывает работу на реальном стенде. Для реального оборудования нужен отдельный набор кадров с его камеры, светом, фоном, ракурсами и реальными карточками/деталями. Инструкции обучения — в `mvch/module3/README.md` и [Ultralytics Train mode](https://docs.ultralytics.com/modes/train/). + +## План подготовки + +1. Сохранить рабочую VM и проверить clone обоих репозиториев без старых локальных файлов. +2. Для каждого launch-файла записать реальные `ros2 topic list`, стартовые ID и положения объектов. +3. Пройти модуль Б на нескольких целях и с препятствием у стеллажа; проверить остановку при потере ArUco/лидара. +4. В модуле В сначала подтвердить dry-run координат, затем pick/place на каждом классе. +5. В модуле Г проверить ручной STOP, телеметрию обоих роверов и fallback без Nav2. +6. В модуле Д пройти `--skip-arm`, затем полный последовательный сценарий. +7. Сделать чистый контрольный прогон строго по процедуре эксперта и сохранить логи. +8. На площадке сначала снять фактические топики, TF, размеры, тормозной путь и геометрию ARM95; только потом менять параметры. + +## Что уточнить у главного эксперта + +- Финал проходит полностью в Webots, на физических РМК или в смешанном формате? +- Какая редакция конкурсного задания и критериев считается действующей? +- Будет ли готовая VM, доступ к закрытому GitLab и разрешено ли принести свой Git-репозиторий? +- Разрешены ли интернет, локальная документация, поисковики и LLM; как технически фиксируются нарушения? +- Какие действия участника допустимы между этапами: Enter, stop/resume, выбор цели, ручное подтверждение маршрута? +- Какие точки/ID сообщаются перед попыткой, а какие должны определяться автоматически? +- Что именно входит в разрешённые 30% изменений задания? + +Ответы лучше получить письменно или зафиксировать в протоколе инструктажа. + +## Документация и форумы + +- [ROS 2 Jazzy documentation](https://docs.ros.org/en/jazzy/) +- [ROS 2 concepts](https://docs.ros.org/en/jazzy/Concepts.html) +- [ROS 2 tf2 tutorials](https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Tf2/Tf2-Main.html) +- [webots_ros2_driver API](https://docs.ros.org/en/jazzy/p/webots_ros2_driver/) +- [Webots User Guide](https://cyberbotics.com/doc/guide/index) +- [Webots Discussions](https://github.com/cyberbotics/webots/discussions) +- [MoveIt 2 documentation](https://moveit.picknik.ai/main/index.html) +- [MoveIt 2 issues](https://github.com/moveit/moveit2/issues) +- [Ultralytics documentation](https://docs.ultralytics.com/) +- [Roboflow Annotate documentation](https://docs.roboflow.com/annotate) +- [Robotics Stack Exchange: ROS 2](https://robotics.stackexchange.com/questions/tagged/ros2) — конкретные технические вопросы с логами и минимальным примером. +- [Open Robotics Discourse](https://discourse.ros.org/) — новости и общие обсуждения экосистемы; не основная площадка техподдержки. + +Публичного официального форума именно по этому заданию ЧВТ в выданных материалах не указано. Вопросы о правилах, критериях, доступе к репозиториям и оборудованию адресуйте главному эксперту, а не стороннему форуму. + +## Git на соревновании + +Для критериев обычно достаточно локальной истории: `main`, понятные коммиты и при необходимости ветки модулей. GitHub удобен как резервная копия, но не рассчитывайте на интернет на площадке. + +```bash +git status +git log --oneline --decorate --graph --all -20 +git switch main +``` + +Не выполняйте `git reset --hard`, `git clean` и force-push перед попыткой. Скопируйте оба репозитория и веса модели на внешний накопитель или в снапшот VM. diff --git a/basic/README.md b/basic/README.md new file mode 100644 index 0000000..3dae951 --- /dev/null +++ b/basic/README.md @@ -0,0 +1,74 @@ +# Базовые примеры для реального ROS 2 + +Это короткие учебные скрипты, которые работают через штатные ROS 2 интерфейсы +роверов: `cmd_vel`, `odometry`, `scan_front`, `aruco_id`, TF и `lift`. В них нет +прямого управления моторами и нет подмены симулятора. Один и тот же ROS API можно +проверять в Webots, а затем перенести на физический РМК после сверки имён топиков, +TF, размеров поля и безопасных скоростей. + +Это не готовые конкурсные решения и не замена аппаратному аварийному STOP. + +Перед запуском: + +```bash +source /opt/ros/jazzy/setup.bash +source ~/ros2_ws/install/setup.bash +export RMW_IMPLEMENTATION=rmw_fastrtps_cpp +``` + +Сначала проверьте реальные интерфейсы: + +```bash +ros2 topic list | sort +ros2 topic info /RMC2/cmd_vel -v +ros2 topic info /RMC2/odometry -v +ros2 topic info /RMC2/scan_front -v +ros2 topic echo /RMC2/aruco_id +ros2 run tf2_ros tf2_echo RMC2/odom aruco_0 +``` + +Практические примеры: + +```bash +# Проехать RMC2 от текущей метки до ArUco 14 на физическом ROS +python3 basic/drive_to_aruco.py 14 + +# То же в Webots; только здесь нужен --sim +python3 basic/drive_to_aruco.py 14 --sim + +# Закрытые клетки и уменьшенная реальная скорость +python3 basic/drive_to_aruco.py 14 --blocked 8 9 --max-speed 0.08 + +# Короткая проверка движения; lidar обязателен, после 1 с будет stop +python3 basic/move_rmc.py --robot RMC1 --x 0.15 --seconds 1 + +# Поворот RMC2 на месте +python3 basic/move_rmc.py --robot RMC2 --yaw 0.3 --seconds 1 + +# Статус положения и лидара +python3 basic/watch_robot.py --robot RMC1 + +# Управление лифтом RMC2 +python3 basic/lift_rmc2.py up +python3 basic/lift_rmc2.py down + +# Остановить оба ровера +python3 basic/stop_all.py +``` + +`drive_to_aruco.py` рассчитан на регулярную сетку 6×6: `0=(0,0)`, +`1=(0,+1 м)`, `6=(-1 м,0)`. Ровер должен стартовать центром над видимой меткой. +Скрипт сам определяет старт, строит BFS-маршрут, печатает его до движения, затем +едет по odometry и уточняет положение через TF каждой ArUco. Без свежих odometry, +лидара, метки на финише или при препятствии ближе `--stop-distance` он отправляет +нулевой `Twist` и завершает работу. + +На реальном поле сначала измерьте шаг сетки и при необходимости задайте +`--spacing`. Если организаторы используют другой топик лидара, передайте +`--scan-topic /нужный/топик`. Не используйте `--yes` в первом физическом заезде. + +У RMC1 доступно боковое движение (`linear.y`), у RMC2 оно принудительно запрещено +в `move_rmc.py`. Режим `--no-lidar` предназначен только для вывешенного стенда, +где колёса не могут переместить робот. + +`grid_route.py` оставлен как офлайн-проверка графа. Он ничего не публикует в ROS. diff --git a/basic/drive_to_aruco.py b/basic/drive_to_aruco.py new file mode 100755 index 0000000..5fe776b --- /dev/null +++ b/basic/drive_to_aruco.py @@ -0,0 +1,346 @@ +#!/usr/bin/env python3 +"""Безопасно проехать на RMC по сетке до указанной ArUco-метки. + +Скрипт использует штатные ROS 2 топики и TF. По умолчанию рассчитан на +физический робот; для Webots явно передайте --sim. +""" + +import argparse +import math +import re +import time +from collections import deque + +import rclpy +from geometry_msgs.msg import Twist +from nav_msgs.msg import Odometry +from rclpy.node import Node +from rclpy.parameter import Parameter +from rclpy.qos import qos_profile_sensor_data +from rclpy.time import Time +from sensor_msgs.msg import LaserScan +from std_msgs.msg import String +from tf2_ros import Buffer, TransformException, TransformListener + + +def clamp(value, low, high): + return max(low, min(high, value)) + + +def wrap(angle): + return math.atan2(math.sin(angle), math.cos(angle)) + + +def yaw(quaternion): + return math.atan2( + 2 * (quaternion.w * quaternion.z + quaternion.x * quaternion.y), + 1 - 2 * (quaternion.y**2 + quaternion.z**2), + ) + + +def compose(a, b): + """Перенести позу b из системы a в родительскую систему a.""" + cosine, sine = math.cos(a[2]), math.sin(a[2]) + return ( + a[0] + cosine * b[0] - sine * b[1], + a[1] + sine * b[0] + cosine * b[1], + wrap(a[2] + b[2]), + ) + + +def inverse(pose): + cosine, sine = math.cos(pose[2]), math.sin(pose[2]) + return ( + -cosine * pose[0] - sine * pose[1], + sine * pose[0] - cosine * pose[1], + -pose[2], + ) + + +def marker_pose(marker, columns, spacing): + """Штатная схема ЧВТ: 0=(0,0), 1=(0,+S), COLS=(-S,0).""" + row, column = divmod(marker, columns) + return -row * spacing, column * spacing, 0.0 + + +def build_route(start, target, rows, columns, blocked): + queue = deque([start]) + previous = {start: None} + + while queue: + current = queue.popleft() + if current == target: + break + row, column = divmod(current, columns) + for next_row, next_column in ( + (row - 1, column), + (row + 1, column), + (row, column - 1), + (row, column + 1), + ): + candidate = next_row * columns + next_column + if not (0 <= next_row < rows and 0 <= next_column < columns): + continue + if candidate in blocked or candidate in previous: + continue + previous[candidate] = current + queue.append(candidate) + + if target not in previous: + raise RuntimeError(f"Нет маршрута {start} -> {target}") + route = [] + current = target + while current is not None: + route.append(current) + current = previous[current] + return list(reversed(route)) + + +class ArucoDrive(Node): + def __init__(self, args): + super().__init__("mvch_basic_aruco_drive") + self.args = args + self.robot = args.robot.strip("/") + if args.sim: + self.set_parameters([Parameter("use_sim_time", value=True)]) + + self.odom = None + self.pose = None + self.map_from_odom = None + self.marker = None + self.marker_error = math.inf + self.front = None + self.odom_wall = 0.0 + self.marker_wall = 0.0 + self.scan_wall = 0.0 + + self.odom_frame = f"{self.robot}/odom" + self.tf_buffer = Buffer() + self.tf_listener = TransformListener(self.tf_buffer, self) + self.publisher = self.create_publisher( + Twist, f"/{self.robot}/cmd_vel", 10 + ) + self.create_subscription( + Odometry, + f"/{self.robot}/odometry", + self.on_odometry, + qos_profile_sensor_data, + ) + self.create_subscription( + LaserScan, + args.scan_topic or f"/{self.robot}/scan_front", + self.on_scan, + qos_profile_sensor_data, + ) + self.create_subscription( + String, f"/{self.robot}/aruco_id", self.on_marker, 10 + ) + + def on_odometry(self, message): + pose = message.pose.pose + values = (pose.position.x, pose.position.y, yaw(pose.orientation)) + if all(math.isfinite(value) for value in values): + self.odom = values + self.odom_wall = time.monotonic() + + def on_marker(self, message): + match = re.fullmatch(r"(?:aruco_)?(\d+)", message.data.strip()) + if match: + marker = int(match.group(1)) + if 0 <= marker < self.args.rows * self.args.columns: + self.marker = marker + self.marker_wall = time.monotonic() + + def on_scan(self, message): + if not message.ranges or message.angle_increment == 0: + return + distances = [] + for index, distance in enumerate(message.ranges): + angle = message.angle_min + index * message.angle_increment + if abs(angle) > math.radians(25): + continue + if math.isfinite(distance) and message.range_min <= distance <= message.range_max: + distances.append(distance) + # Пустое пространство lidar часто кодирует как inf. Это свежий скан, + # просто без препятствий в выбранном секторе. + self.front = min(distances, default=math.inf) + self.scan_wall = time.monotonic() + + def localize(self): + """Привязать odometry к сетке по последней видимой метке.""" + if self.odom is None or self.marker is None: + return + try: + transform = self.tf_buffer.lookup_transform( + self.odom_frame, f"aruco_{self.marker}", Time() + ).transform + except TransformException: + return + + odom_marker = ( + transform.translation.x, + transform.translation.y, + yaw(transform.rotation), + ) + correction = compose( + marker_pose(self.marker, self.args.columns, self.args.spacing), + inverse(odom_marker), + ) + new_pose = compose(correction, self.odom) + if self.pose is not None: + jump = math.hypot(new_pose[0] - self.pose[0], new_pose[1] - self.pose[1]) + if jump > 0.35: + return + self.map_from_odom = correction + self.pose = new_pose + self.marker_error = math.hypot( + odom_marker[0] - self.odom[0], odom_marker[1] - self.odom[1] + ) + + def update(self): + rclpy.spin_once(self, timeout_sec=0.05) + self.localize() + if self.map_from_odom is not None and self.odom is not None: + self.pose = compose(self.map_from_odom, self.odom) + + def stop(self): + self.publisher.publish(Twist()) + + def wait_until_ready(self): + print("Жду odometry, scan_front, aruco_id и TF метки...") + deadline = time.monotonic() + self.args.ready_timeout + while rclpy.ok() and time.monotonic() < deadline: + self.update() + self.stop() + now = time.monotonic() + if ( + self.pose is not None + and self.front is not None + and now - self.odom_wall < 1.0 + and now - self.scan_wall < 1.0 + and now - self.marker_wall < 1.0 + ): + return + raise RuntimeError( + "Датчики не готовы. Проверьте ros2 topic list, aruco_id и TF aruco_." + ) + + def check_safety(self): + now = time.monotonic() + if now - self.odom_wall > 1.0: + raise RuntimeError("Потеря odometry") + if now - self.scan_wall > 1.0: + raise RuntimeError("Потеря scan_front") + if self.front < self.args.stop_distance: + raise RuntimeError( + f"Препятствие спереди: {self.front:.2f} м " + f"(< {self.args.stop_distance:.2f} м)" + ) + + def drive_to(self, target): + target_pose = marker_pose(target, self.args.columns, self.args.spacing) + deadline = time.monotonic() + self.args.waypoint_timeout + + while rclpy.ok() and time.monotonic() < deadline: + self.update() + self.check_safety() + dx = target_pose[0] - self.pose[0] + dy = target_pose[1] - self.pose[1] + distance = math.hypot(dx, dy) + marker_is_fresh = ( + self.marker == target + and time.monotonic() - self.marker_wall < 1.0 + and self.marker_error <= self.args.tolerance + ) + if distance <= self.args.tolerance and marker_is_fresh: + self.stop() + print(f"Метка {target} достигнута, ошибка {self.marker_error:.3f} м") + return + + angle_error = wrap(math.atan2(dy, dx) - self.pose[2]) + command = Twist() + if abs(angle_error) > 0.15: + command.angular.z = clamp( + 1.4 * angle_error, + -self.args.max_angular, + self.args.max_angular, + ) + else: + command.linear.x = min(self.args.max_speed, 0.5 * distance) + command.angular.z = clamp( + 1.2 * angle_error, + -self.args.max_angular, + self.args.max_angular, + ) + self.publisher.publish(command) + + raise RuntimeError(f"Таймаут движения к метке {target}") + + +def arguments(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("target", type=int, help="ID целевой ArUco") + parser.add_argument("--robot", default="RMC2", help="RMC1 или RMC2") + parser.add_argument("--rows", type=int, default=6) + parser.add_argument("--columns", type=int, default=6) + parser.add_argument("--spacing", type=float, default=1.0, help="Шаг сетки, м") + parser.add_argument("--blocked", type=int, nargs="*", default=[]) + parser.add_argument("--max-speed", type=float, default=0.12, help="м/с") + parser.add_argument("--max-angular", type=float, default=0.30, help="рад/с") + parser.add_argument("--stop-distance", type=float, default=0.55, help="м") + parser.add_argument("--tolerance", type=float, default=0.06, help="м") + parser.add_argument("--ready-timeout", type=float, default=15.0, help="с") + parser.add_argument("--waypoint-timeout", type=float, default=45.0, help="с") + parser.add_argument("--scan-topic", help="Например /RMC2/scan_front") + parser.add_argument("--yes", action="store_true", help="Не ждать Enter") + parser.add_argument("--sim", action="store_true", help="Использовать /clock Webots") + args = parser.parse_args() + count = args.rows * args.columns + if args.rows <= 0 or args.columns <= 0 or not 0 <= args.target < count: + parser.error(f"target должен быть в диапазоне 0..{count - 1}") + if args.spacing <= 0 or args.max_speed <= 0 or args.max_angular <= 0: + parser.error("spacing и скорости должны быть больше нуля") + return args + + +def main(): + args = arguments() + rclpy.init() + node = ArucoDrive(args) + exit_code = 0 + try: + node.wait_until_ready() + start = node.marker + blocked = set(args.blocked) - {start, args.target} + route = build_route( + start, args.target, args.rows, args.columns, blocked + ) + print(f"Стартовая метка: {start}") + print("Маршрут:", " -> ".join(map(str, route))) + print( + f"Топики: /{node.robot}/cmd_vel, /{node.robot}/odometry, " + f"/{node.robot}/aruco_id, {args.scan_topic or f'/{node.robot}/scan_front'}" + ) + if not args.yes: + input("Проверьте поле и держите аппаратный STOP. Enter — начать: ") + # Во время input ROS не обрабатывал сообщения: перед движением снова + # получить свежие odometry/lidar/ArUco. + node.wait_until_ready() + for marker in route[1:]: + node.drive_to(marker) + node.stop() + print(f"FINISHED: ровер стоит над ArUco {args.target}") + except (KeyboardInterrupt, RuntimeError) as error: + exit_code = 1 + print(f"STOP: {error}") + finally: + for _ in range(10): + node.stop() + rclpy.spin_once(node, timeout_sec=0.02) + node.destroy_node() + rclpy.shutdown() + raise SystemExit(exit_code) + + +if __name__ == "__main__": + main() diff --git a/basic/grid_route.py b/basic/grid_route.py new file mode 100755 index 0000000..4763beb --- /dev/null +++ b/basic/grid_route.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Строит кратчайший маршрут по сетке маркеров 6x6 без ROS.""" + +import argparse +from collections import deque + + +SIZE = 6 + + +def neighbors(marker: int): + row, column = divmod(marker, SIZE) + for dr, dc in ((-1, 0), (1, 0), (0, -1), (0, 1)): + next_row, next_column = row + dr, column + dc + if 0 <= next_row < SIZE and 0 <= next_column < SIZE: + yield next_row * SIZE + next_column + + +def build_route(start: int, target: int, blocked: set[int]): + queue = deque([start]) + previous = {start: None} + + while queue: + current = queue.popleft() + if current == target: + break + for candidate in neighbors(current): + if candidate not in blocked and candidate not in previous: + previous[candidate] = current + queue.append(candidate) + + if target not in previous: + return None + + route = [] + current = target + while current is not None: + route.append(current) + current = previous[current] + return list(reversed(route)) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("start", type=int, help="Стартовый маркер 0..35") + parser.add_argument("target", type=int, help="Целевой маркер 0..35") + parser.add_argument( + "--blocked", + type=int, + nargs="*", + default=[], + help="Маркеры, через которые нельзя ехать", + ) + args = parser.parse_args() + + if not 0 <= args.start < SIZE * SIZE or not 0 <= args.target < SIZE * SIZE: + parser.error("start и target должны быть от 0 до 35") + + blocked = set(args.blocked) + blocked.discard(args.start) + blocked.discard(args.target) + route = build_route(args.start, args.target, blocked) + if route is None: + raise SystemExit("Маршрут не найден") + print(" -> ".join(map(str, route))) + + +if __name__ == "__main__": + main() + diff --git a/basic/lift_rmc2.py b/basic/lift_rmc2.py new file mode 100755 index 0000000..578ca24 --- /dev/null +++ b/basic/lift_rmc2.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +"""Поднимает или опускает лифт RMC2 через штатный ROS-топик.""" + +import argparse +import time + +import rclpy +from rclpy.node import Node +from std_msgs.msg import Float64, String + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("state", choices=("up", "down")) + parser.add_argument("--wait", type=float, default=6.0, help="Сколько ждать статус, с") + args = parser.parse_args() + + rclpy.init() + node = Node("mvch_basic_lift") + publisher = node.create_publisher(Float64, "/RMC2/lift", 10) + statuses = [] + node.create_subscription(String, "/RMC2/lift_status", lambda msg: statuses.append(msg.data), 10) + + height = 0.1 if args.state == "up" else 0.0 + print(f"RMC2 lift: {args.state}, команда {height}") + for _ in range(5): + publisher.publish(Float64(data=height)) + rclpy.spin_once(node, timeout_sec=0.1) + + deadline = time.monotonic() + args.wait + while time.monotonic() < deadline and not statuses: + rclpy.spin_once(node, timeout_sec=0.1) + + if statuses: + print(f"Статус: {statuses[-1]}") + else: + print("Нового lift_status нет. Это возможно, если лифт уже был в нужном положении.") + + node.destroy_node() + rclpy.shutdown() + + +if __name__ == "__main__": + main() + diff --git a/basic/move_rmc.py b/basic/move_rmc.py new file mode 100755 index 0000000..5efc50e --- /dev/null +++ b/basic/move_rmc.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Подаёт ограниченную по времени ROS-команду скорости и затем останавливает RMC.""" + +import argparse +import math +import time + +import rclpy +from geometry_msgs.msg import Twist +from rclpy.node import Node +from rclpy.qos import qos_profile_sensor_data +from sensor_msgs.msg import LaserScan + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--robot", choices=("RMC1", "RMC2"), required=True) + parser.add_argument("--x", type=float, default=0.0, help="Скорость вперёд, м/с") + parser.add_argument("--y", type=float, default=0.0, help="Боковая скорость RMC1, м/с") + parser.add_argument("--yaw", type=float, default=0.0, help="Угловая скорость, рад/с") + parser.add_argument("--seconds", type=float, default=1.0) + parser.add_argument("--stop-distance", type=float, default=0.55, help="Стоп по lidar, м") + parser.add_argument("--no-lidar", action="store_true", help="Только стенд без препятствий") + args = parser.parse_args() + + if args.seconds <= 0: + parser.error("--seconds должен быть больше нуля") + if args.robot == "RMC2" and args.y != 0: + parser.error("RMC2 не поддерживает боковое движение: используйте --y 0") + + rclpy.init() + node = Node("mvch_basic_move") + publisher = node.create_publisher(Twist, f"/{args.robot}/cmd_vel", 10) + front_distance = [None] + + def on_scan(message): + if not message.ranges or message.angle_increment == 0: + return + front = [] + for index, distance in enumerate(message.ranges): + angle = message.angle_min + index * message.angle_increment + if abs(angle) <= 0.44 and math.isfinite(distance): + if message.range_min <= distance <= message.range_max: + front.append(distance) + front_distance[0] = min(front, default=math.inf) + + if not args.no_lidar: + node.create_subscription( + LaserScan, + f"/{args.robot}/scan_front", + on_scan, + qos_profile_sensor_data, + ) + command = Twist() + command.linear.x = args.x + command.linear.y = args.y + command.angular.z = args.yaw + + print(f"{args.robot}: cmd_vel x={args.x}, y={args.y}, yaw={args.yaw}") + if not args.no_lidar: + print(f"Жду /{args.robot}/scan_front...") + deadline = time.monotonic() + 3.0 + while front_distance[0] is None and time.monotonic() < deadline: + rclpy.spin_once(node, timeout_sec=0.1) + if front_distance[0] is None: + node.destroy_node() + rclpy.shutdown() + raise SystemExit("Нет scan_front: движение запрещено. Для стенда: --no-lidar") + started = time.monotonic() + exit_code = 0 + try: + while time.monotonic() - started < args.seconds: + if front_distance[0] is not None and front_distance[0] < args.stop_distance: + raise RuntimeError( + f"Препятствие {front_distance[0]:.2f} м — аварийный стоп" + ) + publisher.publish(command) + rclpy.spin_once(node, timeout_sec=0.05) + except RuntimeError as error: + exit_code = 1 + print(f"STOP: {error}") + finally: + stop = Twist() + for _ in range(5): + publisher.publish(stop) + rclpy.spin_once(node, timeout_sec=0.05) + node.destroy_node() + rclpy.shutdown() + raise SystemExit(exit_code) + + +if __name__ == "__main__": + main() diff --git a/basic/stop_all.py b/basic/stop_all.py new file mode 100755 index 0000000..43c1a60 --- /dev/null +++ b/basic/stop_all.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +"""Публикует нулевую скорость обоим роверам.""" + +import time + +import rclpy +from geometry_msgs.msg import Twist +from rclpy.node import Node + + +def main(): + rclpy.init() + node = Node("mvch_basic_stop_all") + publishers = [ + node.create_publisher(Twist, "/RMC1/cmd_vel", 10), + node.create_publisher(Twist, "/RMC2/cmd_vel", 10), + ] + stop = Twist() + for _ in range(10): + for publisher in publishers: + publisher.publish(stop) + rclpy.spin_once(node, timeout_sec=0.05) + time.sleep(0.02) + print("Нулевая скорость отправлена RMC1 и RMC2") + node.destroy_node() + rclpy.shutdown() + + +if __name__ == "__main__": + main() + diff --git a/basic/watch_robot.py b/basic/watch_robot.py new file mode 100755 index 0000000..6c9bc7d --- /dev/null +++ b/basic/watch_robot.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Показывает одометрию и минимальную дистанцию перед ровером.""" + +import argparse +import math +import time + +import rclpy +from nav_msgs.msg import Odometry +from rclpy.node import Node +from rclpy.qos import qos_profile_sensor_data +from sensor_msgs.msg import LaserScan + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--robot", choices=("RMC1", "RMC2"), required=True) + args = parser.parse_args() + + rclpy.init() + node = Node("mvch_basic_watch") + state = {"pose": None, "front": None} + + def on_odom(message): + position = message.pose.pose.position + orientation = message.pose.pose.orientation + siny = 2.0 * (orientation.w * orientation.z + orientation.x * orientation.y) + cosy = 1.0 - 2.0 * (orientation.y**2 + orientation.z**2) + state["pose"] = (position.x, position.y, math.atan2(siny, cosy)) + + def on_scan(message): + front = [] + for index, distance in enumerate(message.ranges): + angle = message.angle_min + index * message.angle_increment + if abs(angle) <= math.radians(20) and math.isfinite(distance): + if message.range_min <= distance <= message.range_max: + front.append(distance) + state["front"] = min(front, default=math.inf) + + node.create_subscription( + Odometry, f"/{args.robot}/odometry", on_odom, qos_profile_sensor_data + ) + node.create_subscription( + LaserScan, f"/{args.robot}/scan_front", on_scan, qos_profile_sensor_data + ) + + print(f"Слушаю {args.robot}. Ctrl+C — выход.") + last_print = 0.0 + try: + while rclpy.ok(): + rclpy.spin_once(node, timeout_sec=0.1) + if time.monotonic() - last_print >= 0.5: + pose = state["pose"] + front = state["front"] + pose_text = "нет odometry" if pose is None else ( + f"x={pose[0]:.2f}, y={pose[1]:.2f}, yaw={math.degrees(pose[2]):.1f}°" + ) + front_text = "нет scan_front" if front is None else f"{front:.2f} м" + print(f"{pose_text}; спереди: {front_text}") + last_print = time.monotonic() + except KeyboardInterrupt: + pass + finally: + node.destroy_node() + rclpy.shutdown() + + +if __name__ == "__main__": + main() + diff --git a/materials/final/01-final-competence-description.docx b/materials/final/01-final-competence-description.docx new file mode 100644 index 0000000..30d0ff1 Binary files /dev/null and b/materials/final/01-final-competence-description.docx differ diff --git a/materials/final/02-final-infrastructure.xlsx b/materials/final/02-final-infrastructure.xlsx new file mode 100644 index 0000000..cdc1b1c Binary files /dev/null and b/materials/final/02-final-infrastructure.xlsx differ diff --git a/materials/final/04-final-task.docx b/materials/final/04-final-task.docx new file mode 100644 index 0000000..1a38fb3 Binary files /dev/null and b/materials/final/04-final-task.docx differ diff --git a/materials/final/05-final-criteria.xlsx b/materials/final/05-final-criteria.xlsx new file mode 100644 index 0000000..dc4e7c9 Binary files /dev/null and b/materials/final/05-final-criteria.xlsx differ diff --git a/materials/final/06-final-approval-sheet.pdf b/materials/final/06-final-approval-sheet.pdf new file mode 100644 index 0000000..fb08564 Binary files /dev/null and b/materials/final/06-final-approval-sheet.pdf differ diff --git a/materials/final/07-final-program.docx b/materials/final/07-final-program.docx new file mode 100644 index 0000000..d9caac2 Binary files /dev/null and b/materials/final/07-final-program.docx differ diff --git a/materials/final/08-final-appendix.zip b/materials/final/08-final-appendix.zip new file mode 100644 index 0000000..a3e5157 Binary files /dev/null and b/materials/final/08-final-appendix.zip differ diff --git a/materials/final/appendix/Приложение 1. Инструкция по заполнению матрицы компетенции.docx b/materials/final/appendix/Приложение 1. Инструкция по заполнению матрицы компетенции.docx new file mode 100644 index 0000000..9e11d40 Binary files /dev/null and b/materials/final/appendix/Приложение 1. Инструкция по заполнению матрицы компетенции.docx differ diff --git a/materials/final/appendix/Приложение 2. Матрица конкурсного задания.xlsx b/materials/final/appendix/Приложение 2. Матрица конкурсного задания.xlsx new file mode 100644 index 0000000..7b8ed5c Binary files /dev/null and b/materials/final/appendix/Приложение 2. Матрица конкурсного задания.xlsx differ diff --git a/materials/final/appendix/Приложение 3. Инструкция по охране труда.docx b/materials/final/appendix/Приложение 3. Инструкция по охране труда.docx new file mode 100644 index 0000000..f285ae4 Binary files /dev/null and b/materials/final/appendix/Приложение 3. Инструкция по охране труда.docx differ diff --git a/materials/final/appendix/Приложение 4. Руководство по оцениванию.docx b/materials/final/appendix/Приложение 4. Руководство по оцениванию.docx new file mode 100644 index 0000000..7b4ce0d Binary files /dev/null and b/materials/final/appendix/Приложение 4. Руководство по оцениванию.docx differ diff --git a/materials/final/appendix/Приложение 5. Размещение ArUco маркеров.docx b/materials/final/appendix/Приложение 5. Размещение ArUco маркеров.docx new file mode 100644 index 0000000..c52dec7 Binary files /dev/null and b/materials/final/appendix/Приложение 5. Размещение ArUco маркеров.docx differ diff --git a/materials/final/extracted/final-program.txt b/materials/final/extracted/final-program.txt new file mode 100644 index 0000000..f92dd74 --- /dev/null +++ b/materials/final/extracted/final-program.txt @@ -0,0 +1,132 @@ + ПРОГРАММА ПРОВЕДЕНИЯ + соревнований по компетенции + Оператор-техник складских роботов (AGV/AMR) + Финала Чемпионата высоких технологий в 2026 г + Великий Новгород + Общая информация + +Период проведения 13-18 сентября + +Место проведения и адрес площадки Великий Новгород + +ФИО Главного эксперта Даукаев Руслан Ильнурович + +Контакты Главного эксперта 79856178554 + + + + Д-2 / «13» сентября 2026 г. + +09:00 – 09:30 Регистрация экспертов на площадке: сверка паспортов, подписание протокола. +09:30 – 10:00 Проведение инструктажа по охране труда, подписание протокола. +10:00 – 12:00 Ознакомление экспертов с нормативной документацией. +12:00 – 13:00 Обед + Ознакомление экспертов с конкурсной документацией. + Внесение 30% изменений в конкурсное задание. +13:00 – 15:00 + Обсуждение критериев оценки, загрузка схемы оценки в ЦСО, блокировка. + Подписание протоколов. + Проведение специальной подготовки экспертов для обеспечения высокого +15:00 – 16:00 качества, профессионализма и соответствия процесса оценки правилам и + процедурам. + Распределение ролей главным экспертом на чемпионате: оценивающие эксперты; + эксперт ответственный за охрану труда на площадке проведения чемпионатного +16:00 – 16:30 мероприятия по компетенции; эксперт, ответственный за взаимодействие с + посетителями и представителями СМИ и др. + Подписание протоколов. + Формирование оценочных групп в ЦСО. +16:30 – 18:00 Подготовка ведомостей оценок. + Подписание протоколов. +18:00 – 19:00 Ужин + Д-1 / «14» сентября 2026 г. + +09:00 – 09:30 Регистрация конкурсантов на площадке: сверка паспортов, подписание протокола. + +09:30 – 10:00 Проведение инструктажа по охране труда, подписание протокола. +10:00 – 10:30 Ознакомление конкурсантов с нормативной документацией. + Ознакомление конкурсантов с актуализированной конкурсной документацией. +10:30 – 11:00 + Подписание протоколов. + Жеребьевка рабочих мест. +11:00 – 12:00 + Ознакомление конкурсантов с рабочими местами, тестирование оборудования. +12:00 – 13:00 Обед + Ознакомление конкурсантов с рабочими местами, тестирование оборудования. +13:00 – 17:00 + Подписание протоколов. +17:00 – 19:00 Церемония открытия +19:30 – 20:30 Ужин + Д1 / «15» сентября 2026 г. +08:00 – 08:10 Прибытие на площадку экспертов и конкурсантов. +08:10 – 08:30 Проведение инструктажа по охране труда, подписание протокола. + Ознакомление конкурсантов с конкурсным заданием, подписание протокола. +08:30 – 09:00 + Брифинг с Главным экспертом. + Выполнение конкурсантами задания, модуль А. Диагностика и отладка +09:00 – 10:00 + электронных компонентов + Выполнение конкурсантами задания, модуль Б. Разработка и настройка +10:00 – 13:00 + навигационных алгоритмов для РМК +13:00 – 14:00 Обед + Выполнение конкурсантами задания, модуль Б. Разработка и настройка +14:00 – 17:00 + навигационных алгоритмов для РМК + + Проведение экспертами оценки работ конкурсантов. +17:00 – 18:00 + Занесение оценок в ЦСО. + +18:00 – 19:00 Ужин + Д2 / «16» сентября 2026 г. +08:00 – 08:10 Прибытие на площадку экспертов и конкурсантов. +08:10 – 08:30 Проведение инструктажа по охране труда, подписание протокола. + Ознакомление конкурсантов с конкурсным заданием, подписание протокола. +08:30 – 09:00 + Брифинг с Главным экспертом. + Выполнение конкурсантами задания, модуль В. Системы технического зрения с +09:00 – 14:00 + использованием инструментов искусственного интеллекта +14:00 – 15:00 Обед +15:00 – 17:00 Выполнение конкурсантами задания, модуль Г. Разработка и тестирование + + 1 + графического интерфейса (FMS-системы) для управления и визуализации работы + РМК и их группы + Проведение экспертами оценки работ конкурсантов. +17:00 – 18:00 + Занесение оценок в ЦСО. +18:00 – 19:00 Ужин + Д3 / «17» сентября 2026 г. +08:00 – 08:10 Прибытие на площадку экспертов и конкурсантов. +08:10 – 08:30 Проведение инструктажа по охране труда, подписание протокола. + Ознакомление конкурсантов с конкурсным заданием, подписание протокола. +08:30 – 09:00 + Брифинг с Главным экспертом. + Выполнение конкурсантами задания, модуль Г. Разработка и тестирование +09:00 – 11:00 графического интерфейса (FMS-системы) для управления и визуализации работы + РМК и их группы + Выполнение конкурсантами задания, модуль Д. Решение складского кейса +11:00 – 13:00 + гетерогенной группой РМК +13:00 – 14:00 Обед + Выполнение конкурсантами задания, модуль Д. Решение складского кейса +14:00 – 18:00 + гетерогенной группой РМК +18:00 – 19:00 Ужин + Проведение экспертами оценки работ конкурсантов. + Занесение оценок в ЦСО. Блокировка оценок. +19:00 – 21:00 + Сверка ведомостей экспертами-наставниками. + Подведение итогов. + Д+1 / «18» сентября 2026 г. +09:00 – 14:00 Активности на площадке +14:00 – 16:00 Демонтаж площадки +16:00 – 19:00 Церемония награждения +19:00 – 20:00 Ужин + + + + + 2 + \ No newline at end of file diff --git a/materials/final/extracted/final-task.txt b/materials/final/extracted/final-task.txt new file mode 100644 index 0000000..ea9b88c --- /dev/null +++ b/materials/final/extracted/final-task.txt @@ -0,0 +1,1762 @@ + КОНКУРСНОЕ ЗАДАНИЕ КОМПЕТЕНЦИИ +«Оператор-техник складских роботов (AGV/AMR)» + +Финала чемпионата высоких технологий в 2026 г. + г. Великий Новгород + + + + + 2026 г + Конкурсное задание разработано экспертным сообществом +и утверждено Менеджером компетенции, в котором установлены +нижеследующие правила и необходимые требования владения +профессиональными навыками для участия в соревнованиях +по профессиональному мастерству. + + + Конкурсное задание включает в себя следующие разделы + + +1.ОСНОВНЫЕ ТРЕБОВАНИЯ КОМПЕТЕНЦИИ..............................................8 + 1.1. Общие сведения о требованиях компетенции............................................8 + 1.2. Перечень профессиональных задач специалиста по компетенции + «Оператор-техник складских роботов (AGV/AMR)».......................................9 + 1.3. Требования к схеме оценки........................................................................20 + 1.4. Спецификация оценки компетенции.........................................................21 + 1.5. Содержание конкурсного задания.............................................................24 + 1.5.1. Разработка/выбор конкурсного задания................................................24 + 1.5.2. Структура модулей конкурсного задания.............................................25 +2. СПЕЦИАЛЬНЫЕ ПРАВИЛА КОМПЕТЕНЦИИ..........................................57 + 2.1. Личный инструмент конкурсанта..............................................................57 + 2.2. Материалы, оборудование и инструменты, запрещенные на площадке + ..............................................................................................................................57 +3. ПРИЛОЖЕНИЯ.................................................................................................58 + ИСПОЛЬЗУЕМЫЕ СОКРАЩЕНИЯ +1. ФГОС – Федеральный государственный образовательный стандарт; +2. ПС – Профессиональный стандарт; +3. КЗ – Конкурсное задание; +4. ИЛ – Инфраструктурный лист; +5. ИИ – Искусственный интеллект; +6. СП – Среда программирования; +7. API (Application Programming Interface или интерфейс программирования + приложений) – это совокупность инструментов и функций в виде интерфейса для + создания новых приложений, благодаря которому одна программа будет + взаимодействовать с другой; +8. OpenCV – библиотека для компьютерного зрения; +9. VSCode – Visual Studio Code, редактор кода; +10. РИ – рабочий инструмент; +11. СТЗ – система технического зрения; +12. РМК – роботизированный мобильный комплекс (может быть представлен + роботом /подъемным механизмом и СТЗ); +13. РМК-1 - роботизированный мобильный комплекс, оснащённый манипулятором и + СТЗ; +14. РМК-2 - роботизированный мобильный комплекс, оснащенный подъемным + механизмом и СТЗ; +15. FMS (Fleet Management System) — система управления группой роботов, которая + отвечает за распределение задач, планирование и статистику данных о работе + роботов. + Термины и условные обозначения: + + + РМК — робототехнический мобильный комплекс. + РМК-1 — робототехнический мобильный комплекс с манипулятором. + РМК-2 — робототехнический мобильный комплекс с подъемным +механизмом. + Соревновательное поле — отгороженное бортиками пространство, +разделенное на «ячейки», в границах которого перемещаются РМК и прочие +объекты. + Ячейка соревновательного поля — условная клетка соревновательного +поля, размером NxN, в центре которой находится Aruco-маркер. Ячейка +считается свободной, если в ее пределах нет сторонних объектов (кроме +стеллажа). В противном случае ячейка считается занятой. + Aruco-маркер — техническая метка, используемая в робототехнике для +ориентации в пространстве. + Стеллаж — специализированная конструкция для хранения на ней +деталей и ее собственного перемещения с помощью РМК-2. РМК-2 в рамках +компетенции может заезжать под стеллаж и перемещать стеллаж. + Полка — специализированная конструкция для хранения на ней +объектов. В отличие от стеллажа, не предназначена для перемещения с +помощью РМК. + Динамическое препятствие — любой объект на поле, препятствующий +перемещению конкретного РМК. + Стартовая точка (стартовый маркер) — ячейка (маркер), с которой +конкретный РМК начинает свое движение в рамках конкретного задания. + Целевая точка (целевой маркер) — ячейка (маркер), в которую +конкретный РМК должен переместиться в рамках конкретного задания. + Кратчайший маршрут — минимальное расстояние между стартовой и +целевой точкой, которое считается дискретно по ячейкам соревновательного +поля с учетом количества поворотов РМК (маршруты с равным количеством + + 4 + дискретных перемещений по ячейкам, но с разным количеством поворотов, не +считаются равными). Термин применим к РМК-2. Поворот считается +дискретно по 90 градусов. + Граф aruco-маркеров — набор данных об aruco-маркерах на +соревновательном поле, включая уникальный номер (ID), положение, +ориентацию и ID соседних aruco-маркеров. + Карта занятости — двухмерная интерпретация соревновательного поля, +используемая РМК для задач автономного перемещения и локализации. + Лог-файл — файл формата .txt или .log, содержащий необходимую +информацию о проделанной работе в рамках конкретного модуля. + Деталь — твердая коробка с нанесенным на двух сторонах рисунком +какого-либо объекта. Захватывается манипулятором. + Мобильная платформа — часть РМК, отвечающая за перемещение в +пространстве с помощью колес. + Рабочий инструмент — часть РМК, перевозимая мобильной +платформой, отвечающая за выполнение своей конкретной задачи (в рамках +компетенции — манипулятор для РМК-1 и подъемный механизм для РМК-2). + Схват — механизм на манипуляторе РМК-1, предназначенный для +захвата деталей. + Захват — процесс взятия и удержания детали манипулятором РМК-1 +при помощи схвата. + Исходное положение манипулятора — специальное положение звеньев +манипулятора, при котором обеспечивается обзор модулю технического +зрения на детали на полке. + Транспортировочное положение манипулятора — в рамках модуля Д +специальное положение звеньев манипулятора, при котором обеспечивается +безопасное перемещение РМК-1 (манипулятор в вертикальной проекции не +выходит за габариты мобильной платформы РМК-1) + Рабочее место конкурсанта — место со столом, ПК и другим +оборудованием, закрепленным за конкретным конкурсантом. Работает в + + 5 + локальной сети, не имеет доступа к ПК других конкурсантов, ПК зачетного +рабочего места и к РМК на соревновательном поле. + Зачетное рабочее место — место со столом, ПК и другим оборудованием +для взаимодействия с РМК на соревновательном поле. Не имеет доступа к ПК +других конкурсантов. + Локальный репозиторий конкурсанта — приватный репозиторий в +системе git, названый chvt2026_Фамилия_Имя_номер конкурсанта, куда +конкурсант загружает свои решения. Конкурсант обязан предоставить доступ +к репозиторию экспертам. Номер в названии — порядковый номер, +определяемый жеребьевкой. Этот репозиторий создается в Д-1. + + + + + 6 + 1.ОСНОВНЫЕ ТРЕБОВАНИЯ КОМПЕТЕНЦИИ + 1.1. Общие сведения о требованиях компетенции + Требования компетенции (ТК) «Оператор-техник складских роботов +(AGV/AMR)» определяют знания, умения, навыки и трудовые функции, +которые лежат в основе наиболее актуальных требований работодателей +отрасли. + Целью соревнований по компетенции является демонстрация лучших +практик и высокого уровня выполнения работы по соответствующей рабочей +специальности или профессии. + Требования компетенции являются руководством для подготовки +конкурентоспособных, высококвалифицированных специалистов / рабочих +и участия их в конкурсах профессионального мастерства. + В соревнованиях по компетенции проверка знаний, умений, навыков +и трудовых функций осуществляется посредством оценки выполнения +практической работы. + Требования компетенции разделены на четкие разделы с номерами +и заголовками, каждому разделу назначен процент относительной важности, +сумма которых составляет 100. + + + + + 7 + 1.2. Перечень профессиональных задач специалиста по +компетенции «Оператор-техник складских роботов (AGV/AMR)» + Перечень видов профессиональной деятельности, умений, знаний +и профессиональных трудовых функций специалиста (из ФГОС/ПС/ЕТКС) +базируется на требованиях современного рынка труда к данному специалисту. + Таблица №1 + Перечень профессиональных задач специалиста + +№ Важность + Раздел +п/п в% + + 1 Управление РМК 30 + + - Специалист должен знать и понимать: + ● Связи между программным кодом (структурой программы), + управляющим роботом и действиями исполнительных механизмов; + ● Принципы выполнения программы роботом, выбора и запуска + программы, создание программных модулей, обработки + программных модулей (механика, кинематика, динамика); + ● Основы работы с промышленными контроллерами и + интерфейсами управления роботами (ROS/ROS2); + ● Методы организации обмена данными между компонентами + роботизированных систем; + ● Методы программирования и настройки параметров движения + РМК; + ● Структуру мобильной платформы, различия в кинематических + схемах; + ● Логику работы приводов мобильной платформы, алгоритму + движения мобильных платформ; + ● Правила техники безопасности при эксплуатации + роботизированных систем; + ● Техническую терминологию и условные обозначения в сфере + интеллектуальных систем; + ● Методы диагностики неисправностей и оценки работоспособности + РМК; + + + + + - Специалист должен уметь: + ● Программировать на фреймворке ROS2; + ● Применять логические функции в программе РМК, + программировать функции ожидания, простые функции + перемещения; + + 8 + № Важность + Раздел +п/п в% + + ● Настраивать механизмы безопасности, включая системы + ограничения движения при обнаружении на пути движения + препятствий; + ● Писать программы управления робототехнической системой, + визуализировать процесс работы РМК при помощи программного + обеспечения; + ● Программировать и настраивать робототехническую систему с + помощью программных пакетов для конфигурирования + роботизированных систем, открывать проекты, сравнивать + проекты, соединять системы, передавать проекты в систему + управления роботом; + ● Работать с системами логирования и диагностики, выявлять и + устранять ошибки в управлении роботом; + ● Читать и понимать техническую документацию на + роботизированным системам, РМК и системы автоматизации. + +2 Разработка программного обеспечения 24 + + - Специалист должен знать и понимать: + ● Подходы к разработке программного обеспечения; + ● Приемы анализа данных; + ● Принципы работы с графическими и текстовыми данными; + ● Архитектуры программного обеспечения; + ● Способы разработки программного обеспечения; + ● Общие типы проблем, которые могут возникнуть при разработке + программного обеспечения; + ● Тенденции и разработки в отрасли, включая новые платформы, + языки, условные обозначения и технические навыки; + ● Принципы построения человеко-машинного взаимодействия; + ● Необходимость симуляторов в разработке; + ● Назначение и применение IDE в разработке систем; + ● Принципы разработки графических интерфейсов для + промышленных систем (UI/UX, эргономика, удобство + использования); + ● Методы обработки событий в интерфейсе (кнопки, формы, + клавиши управления); + ● Методы обеспечения отказоустойчивости интерфейса (аварийная + остановка, сброс ошибок, индикаторы состояния системы); + ● Языки программирования высокого уровня (С++, Python + PyQt); + ● Основы клиент-серверного взаимодействия: + ● Низкоуровневые и сетевые протоколы (TCP/IP, UDP, EtherCAT, + CAN/CANopen); + ● Протоколы и технологии для удаленного управления (SSH, SFTP, + + 9 + № Важность + Раздел +п/п в% + + WebSockets); + ● Специализированные системы управления роботами (ROS/ROS2). + + + - Специалист должен уметь: + ● Создавать графическое представление будущей программы; + ● Интерпретировать результаты решения; + ● Осуществлять разработку программного обеспечения, + использующих нейросети; + ● Демонстрировать работоспособность программного обеспечения; + ● Разрабатывать интуитивно понятный графический интерфейс с + возможностью ручного и автоматического управления роботом; + ● Подключаться к API управления роботом, отправлять команды и + получать статус системы; + ● Интегрировать графический интерфейс с системами логирования и + диагностики для мониторинга работы робота; + ● Вести техническую документацию по настройке, эксплуатации и + программированию системы, описывать алгоритмы работы, + параметры настройки и результаты тестирования; + ● Оформлять отчеты о проделанной работе, фиксировать + выявленные ошибки, пути их устранения и результаты + тестирования; + ● Работать с системой контроля версий (Git/GitHub/GitVerse), вести + структурированное хранение кода, управлять ветками, коммитами + и мержами; + ● Оформлять README-файлы, техническую документацию и + комментарии в коде для упрощения работы с проектом; + ● Разрабатывать пользовательские инструкции; + ● Разворачивать и настраивать систему в контейнерах с + использованием Docker для удобной интеграции, + масштабируемости и развертывания на различных устройствах; + ● Оптимизировать контейнеры для минимизации потребления + ресурсов и обеспечения стабильной работы системы. + +3 Использование технологий технического зрения 9 + + - Специалист должен знать и понимать: + ● Принципы работы компьютерного зрения, основные алгоритмы + обработки изображений (фильтрация, бинаризация, выделение + контуров); + ● Принципы работы оптических устройств (веб-камер,смарт-камер); + ● Алгоритмы предобработки изображений (гистограмма, + фильтрация, сегментация); + + 10 + № Важность + Раздел +п/п в% + + ● Принципы работы с видеоданными; + ● Принципы калибровки и настройки промышленных камер; + ● Методы организации взаимодействия между системами + компьютерного зрения и исполнительными механизмами; + ● Принципы эргономичного дизайна графических интерфейсов для + отображения результатов работы компьютерного зрения; + ● Методы обеспечения безопасности при использовании складских + роботов в сочетании с системами технического зрения; + ● Инструменты для систем технического зрения (OpenCV и др.); + ● Оптимизация алгоритмов технического зрения для работы в + реальном времени. + + - Специалист должен уметь: + ● Настраивать и калибровать промышленные камеры и датчики + освещения; + ● Разрабатывать алгоритмы обработки изображений и применять их + для идентификации деталей; + ● Программировать системы технического зрения для работы в + производственной среде; + ● Визуализировать процесс сортировки, отображая обработанные + изображения и результаты классификации; + ● Работать с цветовым анализом и сегментацией изображений; + ● Адаптировать алгоритмы под разные сценарии работы (ручной + контроль, полуавтоматический, полностью автоматический + режим); + ● Разрабатывать автоматические системы идентификации объектов + по штрих-коду или QR-коду; + ● Анализировать ошибки работы системы и вносить корректировки + в алгоритмы; + ● Реализовывать обработку больших потоков данных в режиме + реального времени. + +4 Обучение и интеграция моделей искусственного интеллекта 12 + + - Специалист должен знать и понимать: + ● Какие бывают нейронные сети; + ● Для чего нужны нейронные сети и как они работают; + ● Понятия: нейрон, синапс, итерация, эпоха, функция активации; + ● Методы и алгоритмы глубокого обучения (supervised, unsupervised, + transfer learning); + ● Критерии качества моделей машинного обучения; + ● Последовательность разработки моделей машинного обучения; + ● Какие методы машинного обучения применять в зависимости от + + + 11 + № Важность + Раздел +п/п в% + + исходных данных; + ● Как работать с различными выборками данных; + ● Как использовать различные программные средства для + разработки и улучшения моделей; + ● Методы сбора, обработки и аннотации данных для обучения + нейросетевых моделей; + ● Оптимизация работы нейросетей и их использование в реальном + времени; + ● Основы работы с нейросетевыми моделями (CNN, YOLO, + EfficientNet, ViT); + ● Методы аннотации и создания датасетов (LabelImg, CVAT, + Roboflow); + ● Основы работы с TensorFlow, PyTorch, OpenVINO, ONNX; + ● Принципы оптимизации моделей для работы на встраиваемых + устройствах (TensorRT, OpenVINO, Edge TPU); + ● Методы логирования и отладки работы нейросетей; + ● Методы ускорения инференса моделей для работы в реальном + времени. + + + - Специалист должен уметь: + ● Структурировать данные; + ● Проводить нормализацию и подготовку данных; + ● Выделять признаки, свойства и характеристики объектов в данных; + ● Осуществлять операции с большими данными; + ● Проводить визуальный анализ данных; + ● Собирать и аннотировать датасеты; + ● Реализовывать автоматический процесс сбора и аннотации + данных; + ● Применять классические алгоритмы машинного обучения: + 1. обучение без учителя (уменьшение размерности, поиск правил, + кластеризация); + 2. обучение с учителем (регрессия, классификация); + ● Применять методы глубокого обучения и нейросети: перцептроны, + сверточные нейросети, рекуррентные сети; + ● Разрабатывать и дообучать нейросетевые модели для + классификации, детекции и сегментации объектов; + ● Оптимизировать работу нейросетей для работы на встраиваемых + системах; + ● Реализовывать визуализацию данных, отображая результаты + работы модели; + ● Анализировать ошибки работы модели и дообучать её при + необходимости; + + 12 + № Важность + Раздел +п/п в% + + ● Работать с системами логирования и диагностики работы модели; + ● Реализовывать механизмы безопасности при работе + коллаборативного робота; + ● Использовать контейнеризацию (Docker) для развертывания + моделей в производственной среде. + +5 Диагностика и отладка электронных компонентов 6 + + - Специалист должен знать и понимать: + ● Основы электротехники: закон Ома, схемы последовательного и + параллельного соединения, расчет параметров цепей; + ● Принципы работы цифровых и аналоговых схем, назначение и + характеристики основных электронных компонентов + (микроконтроллеры, датчики, преобразователи напряжения, + конденсаторы, резисторы, диоды); + ● Назначение и принципы использования измерительных приборов + (мультиметр, осциллограф, сетевой анализатор, анализатор + логических уровней); + ● Методы диагностики неисправностей: измерение напряжения и + тока, анализ сигналов, проверка целостности компонентов и цепей; + ● Стандартные процедуры прошивки и перепрошивки + микроконтроллеров для целей отладки и диагностики; + ● Правила техники безопасности при работе с электрическим + оборудованием, включая защиту от поражения электрическим + током и повреждения компонентов электростатическим разрядом. + ● Правила техники безопасности при работе с электрическим + оборудованием, включая защиту от поражения электрическим + током и повреждения компонентов электростатическим разрядом. + + + + + - Специалист должен уметь: + ● Использовать мультиметр для измерения напряжения, тока и + сопротивления на различных участках схемы; + ● Работать с осциллографом для анализа временных параметров + сигналов, частоты, амплитуды и формы волны; + ● Визуально осматривать плату и выявлять механические + повреждения, дефекты припоя и отсутствующие компоненты; + ● Проверять целостность цепей и проводимость между контактными + площадками; + ● Прошивать микроконтроллер тестовыми программами для + проверки функциональности портов ввода-вывода, интерфейсов и + памяти; + + 13 + № Важность + Раздел +п/п в% + + ● Анализировать полученные измерения и логировать выявленные + проблемы, определять причину неисправности (отсутствие + питания, разрыв цепи, неправильная конфигурация, дефектный + компонент); + ● Документировать результаты диагностики с указанием координат + дефектов на плате, значений параметров и рекомендаций по + исправлению; + ● Применять логический анализ для систематизации полученной + информации и построения алгоритма дальнейших проверок. + + Чтение, анализ и ведение технической документации. Организация +6 14 + и управление работой, охрана труда, бережливое производство + + - Специалист должен знать и понимать: + ● Важность документирования разработанных решений; + ● Принципы работы с техническим проектом; + ● Параметры деятельности, подлежащие планированию; + ● Принципы эффективного планирования используемого времени + при работе над проектом; + ● Навыки организации рабочего пространства при работе за + компьютером; + ● Навыки контроля собственной продуктивности в ходе работы над + проектом; + ● Принципы и способы безопасного выполнения работ; + ● Принципы и положения безопасной работы в общем и по + отношению к производству; + ● Основы и принципы бережливого производства. + + - Специалист должен уметь: + ● Читать, интерпретировать и извлекать технические данные и + инструкции из документации в любом доступном формате; + ● Проводить анализ технической документации, выявлять + требования к программному обеспечению системы управления + роботом; + ● Разрабатывать пользовательскую документацию по эксплуатации; + ● Использовать и правильно интерпретировать техническую + терминологию и обозначения в техническом проекте, руководстве + пользователя и презентации; + ● Сохранять результаты проделанной работы в виде файлов + восстановления для восстановления работы в случае её утери; + ● Сохранять результаты проделанной работы (файлы) для + представления их заказчику в полном объеме; + + + 14 + № Важность + Раздел +п/п в% + + ● Восстанавливать зону проведения работ до первоначального + состояния; + ● Соблюдать правила в области техники безопасности и норм + охраны труда на рабочем месте. + +7 Коммуникативные и межличностные навыки 5 + + - Специалист должен знать и понимать: + ● Область применения и назначение документации и публикаций как + в бумажном виде, так и на основе электронных форм; + ● Технический язык, связанный с профессиональным навыком и + технологией; + ● Стандарты, требуемые для рутинной отчетности и исключений в + устной, письменной и электронной форме; + ● Требуемые стандарты для общения с клиентами, членами команды + и другими людьми; + ● Цели и методы для поддержания и представления отчетности, + включая финансовую. + + + - Специалист должен уметь: + ● Читать, интерпретировать и извлекать технические данные и + инструкции из документации в любом доступном формате; + ● Производить необходимые исследования для решения проблем и + непрерывного профессионального развития; + ● Использовать устные, письменные и электронных средства + коммуникации для обеспечения ясности, эффективности и + результативности; + ● Использовать стандартный набор коммуникационных технологий; + ● Обсуждать сложные технические принципы и приложения с + другими людьми; + ● Пояснять сложные технические принципы и приложения для + неспециалистов; + ● Готовить полноценные отчёты и отвечать на возникающие + вопросы; + ● Отвечать на запросы заказчиков как в личном общении, так и + опосредованно; + ● Организовать сбор информации и подготовить документацию в + соответствии с требованиями заказчиков. + + + + + 15 + 1.3. Требования к схеме оценки + Сумма баллов, присуждаемых по каждому аспекту, должна попадать +в диапазон баллов, определенных для каждого раздела компетенции, +обозначенных в требованиях и указанных в таблице 2. + Таблица №2 + Матрица пересчета требований компетенции в критерии оценки + Итого баллов за + раздел + Критерий/Модуль + ТРЕБОВАНИЙ + КОМПЕТЕНЦИИ + + A Б В Г Д + + 1 0,00 14,00 0,00 0,00 16,00 30,00 + + 2 0,00 5,00 3,00 14,00 2,00 24,00 + Разделы 3 0,00 0,00 7,00 0,00 2,00 9,00 + ТРЕБОВАНИЙ + КОМПЕТЕНЦИИ 4 0,00 0,00 9,00 0,00 3,00 12,00 + + 5 6,00 0,00 0,00 0,00 0,00 6,00 + + 6 2,00 3,00 3,00 3,00 3,00 14,00 + + 7 1,00 1,00 1,00 1,00 1,00 5,00 + + Итого баллов за 9,00 23,00 23,00 18,00 27,00 100 + + 16 + критерий/модуль + + + + + 17 + 1.4. Спецификация оценки компетенции + Оценка Конкурсного задания будет основываться на критериях, +указанных в таблице 3. + Таблица 3 + Оценка конкурсного задания + Критерий Методика проверки навыков в критерии + + А Диагностика и отладка - Проверить соответствие найденных конкурсантом + электронных дефектов с таблицей дефектов плат (найдены ли все + компонентов существующие дефекты на этой плате) + - Проверить все ли найденные конкурсантом дефекты + существуют на этой плате (не нашел ли конкурсант + дефекта, которого нет на этой плате) + + Б Разработка и настройка - Проверить, выводится ли в терминал или лог-файл + навигационных маршрут, построенный РМК-2 (в маршруте должны + алгоритмов для РМК быть только свободные ячейки) + - Проверить, кратчайший ли маршрут строит РМК-2 + (см. «Термины и условные обозначения») + - В процессе перемещения РМК-2 не заезжал на + ячейки, которых не было в построенном маршруте + (проверять визуально в процессе перемещения) + - Проверить, добрался ли РМК-2 из стартовой точки в + целевую (в терминал должно быть выведено + сообщение о начале и конце перемещения) + - Засечь время выполнения РМК-2 задач перемещения + (время начинается с началом вывода в терминал и + заканчивается с выводом в терминал) + - Проверять визуально, не было ли в процессе + перемещения РМК-2 столкновений с границами + поля, объектами и динамическими препятствиями + - Проверить оформление README файла в + соответствии с критериями оценки (есть описание + запуска, принципа работы) + + + + + В Системы технического - Проверить наличие сделанных изображений с + зрения с камеры и / или с симулятора + использованием - Проверить, есть ли в видеопотоке конкурента + инструментов bounding box, подпись принадлежности к классу и + + 18 + Критерий Методика проверки навыков в критерии + + искусственного процент уверенности в распознавании + интеллекта - Проверить, не было ли распознавания + несуществующих деталей (ложные срабатывания) + - Проверить, привело ли решение конкурсанта в + движение манипулятор и схват манипулятора + - Проверить, выводятся ли логи работы в терминал и + лог-файл (класс, уверенность распознавания, смена + состояния схвата) + - Проверить, взял ли манипулятор выбранную + экспертами деталь (манипулятор принял исходное + положение вместе с деталью) + - Проверить, поместил ли манипулятор деталь + обратно на полку и вернулся в исходное положение + без столкновений + - Проверить оформление README файла в + соответствии с критериями оценки (есть описание + запуска, принципа работы) + + + + +Г Разработка и - Проверить, форма открывается как отдельная web- + тестирование страница или графическое окно, все заявленные + графического элементы видны или к ним можно получить доступ + интерфейса (FMS- - Проверить, Графический интерфейс предоставляет + системы) для хотя один инструмент для взаимодействия / + управления и визуализации данных для конкретного РМК + визуализации работы - Проверить наличие визуилизации данных + РМК и их группы конкретного РМК (построение маршрута, точки + лидара, карта занятости, граф aruco-маркеров, + занятость каждой ячейки соревновательного поля, + заряд батареи) + - Проверить функционал управления конкретным + РМК (ручное управление, смена текущего + положения, выбор целевой точки, экстренная + остановка, взаимодействие с рабочим + инструментом) + - Проверить стабильность работы (нет ли вылетов или + зависаний решения конкурсанта) + - Проверить оформление README файла в + соответствии с критериями оценки (есть описание + запуска, принципа работы) +Д Решение складского - Проверить, соответствует ли перемещение обоих РМК + кейса гетерогенной перемещению критериям оценки и конкурсному + группой РМК заданию + - Проверить взаимодействия рабочего инструмента + каждого РМК на соответствие с критериями оценки и + конкурсным заданием + + 19 + Критерий Методика проверки навыков в критерии + + - Проверить, не было ли во время движения РМК + столкновений с границами поля, объектами и + динамическими препятствиями (как между самими + РМК, так и между другими объектами друг с другом) + - Засечь время выполнения РМК задач перемещения + (время начинается с началом вывода в терминал и + заканчивается с выводом в терминал) + - Проверить оформление README файла в + соответствии с критериями оценки (есть описание + запуска, принципа работы) + + + + + 1.5. Содержание конкурсного задания + Общая продолжительность Конкурсного задания1: 22 часа + Количество конкурсных дней: 3 дня + КЗ включает оценку по каждому из разделов требований компетенции. + Оценка знаний конкурсанта проводится через практическое +выполнение Конкурсного задания. + + + 1.5.1. Разработка/выбор конкурсного задания + Конкурсное задание состоит из 5 модулей, включает обязательную к +выполнению часть (инвариант) – 3 модуля (Б, В, Д), и вариативную часть – 2 +модуля (А, Г). Общее количество баллов конкурсного задания по всем +модулям составляет 100. + 1.5.2. Структура модулей конкурсного задания + Модуль А. Диагностика и отладка электронных компонентов +(вариатив) + Время на выполнение модуля: 1 час + Задания: + +1 Указывается суммарное время на выполнение всех модулей КЗ одним конкурсантом. + 20 + Конкурсантам необходимо продиагностировать плату, применяемую в +РМК. На платах будут различные производственные и эксплуатационные +дефекты, обнаружить которые возможно как с помощью визуального осмотра, + + + + +так и + + + + +средствами вспомогательных средств (мультиметр). + + + + + 21 + Всем конкурсантам будут выданы одинаковые платы с различными +дефектами на них. Также всем конкурсантам будет выдан мультиметр. Будет +дано текстовое описание, что это за плата, какие функции она должна +выполнять, какие-то основные технические характеристики. Конкурсантам +необходимо визуальным осмотром и выданным набором инструментов найти +все дефекты платы и описать их в соответствующем отчете. По истечении +времени на выполнение модуля конкуренты сдают отчет. + Оценка будет производиться следующим образом: + 1) Конкурсант сдает отчет с перечнем найденных дефектов. + 2) У экспертов будет таблица со списком дефектов для каждой платы в + отдельности. + 3) Максимальный балл можно получить в случае, если дефекты из + отчета конкурента совпадают с дефектами из таблицы экспертов. + Оценивается: + - Количество найденных существующих дефектов платы из таблицы. + - Не указал ли конкурсант дефектов, который нет на плате и в таблице. + - Если конкурсант обнаружил дефект, который действительно есть на + плате, но не указан в таблице, это никак не влияет на баллы. + + +Перечень дефектов, возможных на плате: +1. Светодиод HL1 установлен неверно. В результате он не мигает (и вообще + не светится), при этом HL1 светится. +Как проверять: измерить напряжение питания на выходе VD3, убедиться, что +оно там есть и равно примерно 11,5 В, после чего замерить напряжение на +выходе микросхемы U5. Затем замерить напряжение на аноде HL1. Раз +напряжение там появляется раз в секунду, сделать вывод, что он неисправен + 22 + или запаян наоборот. В том, что он именно неверно установлен, можно +убедиться и визуально, сравнив его монтаж со сборочным чертежом. + + +2. Номинал резистора R17 составляет 1 МОм вместо правильного 1 кОм. В +результате после подачи напряжения светодиод HL2 не светится. + +Как проверять: измерить напряжение питания на выходе VD3, убедиться, что +оно там есть, после чего замерить напряжение на аноде HL1. Раз напряжение +там значительно ниже необходимого для зажигания светодиодов, то измерить +напряжение на верхнем по схеме выводе R17. Убедиться, что напряжение в +этой точке выше необходимого для зажигания светодиодов, сделать вывод, что +R17 неисправен или имеет увеличенное сопротивление. После этого +прозвонить этот резистор мультиметром в ОБЫЧНОМ режиме и убедиться, +что он исправен, но сопротивление в сотни раз больше указанного на схеме. + + +3. Короткое замыкание под (или над) конденсатором C5. В результате +светодиоды HL1, HL2 светятся постоянно, а HL4 – не мигает. + +Как проверять: в данном случае необходимо ЛОГИЧЕСКИ сделать вывод, что +процессор не запускается, затем прочитать пункт 3.1 (см. далее раздел +“последовательность проверки плат”), убедиться, что напряжения на выводах +кварца не соответствуют указанным там, внимательно рассмотреть плату и +найти или путем осмотра, или путем прозвонки мультиметром, что под (или +над) конденсатором С5 имеется короткое замыкание. +4. У диода VD1 не запаян один вывод. В результате после подачи напряжения +ни один светодиод не светится. + +Как проверять: измерить напряжение питания до и после этого диода. +Убедиться, что после него напряжения нет. После этого мультиметром в +режиме измерения диодов (строго) прозвонить этот диод и убедиться, что он +смонтирован верно. Затем следует визуально убедиться, что один из выводов +диода не запаян на плату. Самостоятельно прижав диод к плате, можно +убедиться, что оба светодиода светятся. +5. Светодиод HL2 установлен неверно. В результате он не светится, а HL1 и +HL4 мигают. + + + 23 + Как проверять: измерить напряжение питания на выходе VD3, убедиться, что +оно там есть и равно примерно 11,5 В, после чего замерить напряжение на +выходе микросхемы U5. Затем замерить напряжение на аноде HL2. Раз +напряжение там есть, сделать вывод, что он неисправен или запаян наоборот. +В том, что он именно неверно установлен, можно убедиться и визуально, +сравнив его монтаж со сборочным чертежом. +6. Диод VD1 установлен неверно (анод и катод поменяны местами). В +результате после подачи напряжения ни один светодиод не светится. + +Как проверять: измерить напряжение питания до и после этого диода. +Убедиться, что после него напряжения нет. После этого мультиметром в +режиме измерения диодов (строго) прозвонить этот диод и убедиться, что он +смонтирован неверно. +7. Кварц Y1 установлен частотой 27 МГц вместо правильного значения 16 +МГц. В результате светодиод HL1 вспыхивает заметно реже, чем на +образцовой плате. + +Как проверять: в данном случае необходимо ЛОГИЧЕСКИ сделать вывод, что, +раз частота вспышек отличается, то это свидетельствует о том, что рабочая +частота процессора U9 отличается от образцовой платы. В большинстве +случаев это происходит из-за установки на плату кварца на другую частоту. +Следует убедиться, что гравировка номинала частоты на корпусе кварца +отличается от номинала на схеме. +8. Номинал резистора R16 составляет 1 МОм вместо правильного 1 кОм. В +результате после подачи напряжения светодиод HL1 не мигает и не светится. + +Как проверять: измерить напряжение питания на выходе VD3, убедиться, что +оно там есть, после чего замерить напряжение на аноде HL1. Раз напряжение +там значительно ниже необходимого для зажигания светодиодов, то измерить +напряжение на верхнем по схеме выводе R16. Убедиться, что напряжение в +этой точке выше необходимого для зажигания светодиодов, сделать вывод, что +R16 неисправен или имеет увеличенное сопротивление. После этого +прозвонить этот резистор мультиметром в ОБЫЧНОМ режиме и убедиться, +что он исправен, но сопротивление в сотни раз больше указанного на схеме. + + + + + 24 + 9. Короткое замыкание под (или над) конденсатором C6. В результате +светодиоды HL1, HL2 светятся постоянно, а HL4 – не мигает. + +Как проверять: в данном случае необходимо ЛОГИЧЕСКИ сделать вывод, что +процессор не запускается, затем прочитать пункт 3.1 (см. далее раздел +“последовательность проверки плат”), убедиться, что напряжения на выводах +кварца не соответствуют указанным там, внимательно рассмотреть плату и +найти или путем осмотра, или путем прозвонки мультиметром, что под (или +над) конденсатором С6 имеется короткое замыкание. +10. У микросхемы U9 замкнуты выводы 30 и 31. В результате после подачи +напряжения будут одновременно вспыхивать светодиоды HL3 и HL4. + +Как проверять: в данном случае необходимо ЛОГИЧЕСКИ сделать вывод, что, +раз эти светодиоды вспыхивают строго (!) одновременно, а должен вспыхивать +только один из них, то их цепи ошибочно замкнуты. Следует внимательно +изучить пайку платы и найти короткое замыкание между выводами 30 и 31 +микросхемы U9. + + + Последовательность проверки плат (контрольная проверка плат). +1. Проверка напряжений питания. +1.1. Проверка наличия напряжения примерно 11,5 В на катоде диода VD3. Если +его нет, то данный диод неисправен, не припаян или установлен наоборот +(перепутаны катод и анод). Необходимо выяснить конкретную причину. +1.2. Проверка наличия напряжения +5 В на выходе стабилизатора U6 (удобнее +всего контролировать его на положительном выводе конденсатора С10). Если +его там нет, то возможны такие варианты -- короткое замыкание на землю в +данной цепи (проверяется омметром), установка неверной модели +стабилизатора или непропай самой микросхемы стабилизатора. Необходимо +выяснить конкретную причину. +1.3. Проверка наличия напряжения +3,3 В на выходе стабилизатора U5 +(удобнее всего контролировать его на верхнем по схеме выводе конденсатора +С15). Если его там нет, то возможны такие варианты -- короткое замыкание +на землю в данной цепи (проверяется омметром), установка неверной модели +стабилизатора или непропай самой микросхемы стабилизатора. Необходимо +выяснить конкретную причину. + + + 25 + 2. Проверка подачи основных рабочих напряжений питания на микросхемы. +2.1. Процессор U9. Напряжение +5 В должно присутствовать на его выводах +4,6,18. +2.2. Преобразователь интерфейса USB U11. Напряжение +5 В должно +присутствовать на выводе 16 этой микросхемы. +2.3. Операционный усилитель DA1. Напряжение +5 В должно присутствовать +на его выводе 8. +3. Проверка напряжений, напрямую влияющих на функционирование схемы. +3.1. Процессор U9. На выводах 7 и 8 (для подключения кварцевого резонатора) +должно быть напряжение в пределах 0,4...0,8 В. Если это не так, то, возможно, +неисправен кварцевый резонатор или он не припаян, также может быть +проблема в конденсаторах C5, C6. +3.2. Процессор U9. На выводе 29 (сигнал reset) должна быть логическая "1" +(напряжение +4,5…+5,0 В). Если напряжение в данной точке близко к нулю, то +процессор находится в режиме "сброса". Возможные причины -- короткое +замыкание в данной цепи, неисправность процессора. + + + Модуль Б. Разработка и настройка навигационных алгоритмов для +РМК (инвариант) + Время на выполнение модуля: 6 часов + Задания: + Время на выполнение модуля: 6 часов + + Этап 1. Этап 2. Этап 3. Выгрузка Этап 4. Зачетные + Проектирование Тестирование решений попытки + + 1 3.5 0.5 1 + + + + Этап 1. Проектирование. + Длится 1 час, в это время конкурсанты работают на своих рабочих +местах (рабочее место конкурсанта) (разработка решения в симуляторе). +Доступа к зачетному рабочему месту и РМК на соревновательном поле нет. + Этап 2. Тестирование. + + 26 + Длится 3.5 часа, в это время конкурсанты в порядке очереди +(определенной жеребьевкой) имеют доступ к зачетному рабочему месту и +РМК на соревновательном поле. Будет два круга по 12 и 9 минут +соответственно. Во время своей тестовой попытки конкурсант имеет доступ +к зачетному рабочему месту, имеет право выгружать туда свое решение, +вносить правки в код, выгружать его на свой гит и взаимодействовать с РМК +(с согласования с главным экспертом). Во время своей тестовой попытки +конкурсант вправе попросить экспертов расставить стеллажи, полки и +динамические препятствия по усмотрению конкурсанта. По окончании своей +попытки конкурсант обязан покинуть зачетное рабочее место. В остальное +время конкурсант может продолжать работу за своим рабочим местом. В +момент окончания этого этапа у конкурсанта должна быть актуальная версия +решения на локальном репозитории. + Этап 3. Выгрузка решений. + Длится 0.5 часа, в этом время конкурсанты не имеют права вносить +правки в решение, они обязаны выгрузить все свои решения на ПК зачетного +рабочего места, подготовить их к запуску. Доступ к рабочему зачетному месту +в порядке очереди (по 3 минуты на конкурсанта). Во время этого этапа +участники покидают свои рабочие места. + Этап 4. Зачетные попытки. + Длится 1 час. В это время конкурсанты не имеют права находиться на +своих рабочих местах, вносить правки в решения. В самом начале этого этапа +эксперт с помощью генератора случайных чисел выбирает целевой aruco- +маркер (для всех конкурсантов один и тот же). В порядке очереди конкурсанты +имеют доступ к зачетному рабочему месту, презентуют свое решение +экспертам, запускают код. Во время работы решения эксперты проводят +оценку. Конкурсант имеет право перезапускать свое решение, но с начала +конкурсного задания. Зачетные попытки идут в порядке очереди по 6 минут +на конкурсанта. По окончанию своей зачетной попытки конкурсант покидает +зачетное рабочее место. + + 27 + Конкурсное задание модуля Б. + + + Конкурсантам необходимо разработать и протестировать алгоритмы +навигации и локализации РМК-2 по Aruco-маркерам. + РМК-2 будет обладать готовым пакетом для распознавания Aruco- +маркеров — а именно их уникального номера (ID), положения и ориентации +(TF2) относительно камеры робота. Соревновательное поле будет заранее +подготовлено путем расположения aruco-маркеров сеткой с регулярным +шагом 50-150см (в зависимости от размеров поля). Конкурсантам будет выдан +заранее построенный граф aruco-маркеров. + + + Обращаем внимание, что задание модуля Б нужно выполнять +максимум двумя скриптами. В случае, если решение конкурсанта +потребовало запуска более чем двух скриптов (взаимодействий с ПК +зачетного рабочего места), то баллы, набранные за такую попытку, не +будут засчитаны. + + + Задача модуля Б делится на 2 этапа: + 1.Перемещение РМК-2 от точки старта до целевой точки по + кратчайшему маршруту. + 2. Перемещение РМК-2 от целевой точки до точки старта по + кратчайшему маршруту с учетом динамического препятствия. + + + Оцениваемое задание этого модуля: + 1. РМК-2 стоит на точке старта. Конкурсант запускает свое решение. +Допустим, целевой маркер 22. + 1.1 Вывод в терминал ПК зачетного рабочего места и лог-файл +построенный РМК-2 маршрут. + + + + 28 + (Например, [0, 1, 2, 7, 12, 17, 22], формат может меняться, но он +должен отражать построенный маршрут). + Эксперт должен зафиксировать данный маршрут, чтобы впоследствии +сверяться с ним. + 1.2 После фиксации экспертом, конкурсант должен отправить РМК-2 +команду на движение к целевому aruco-маркеру. + (Например, вызвать сервис, запушить данные в топик, запустить +отдельную ноду или скрипт или нажать соответствующую клавишу + + + + +клавиатуры). + + + После этого РМК-2 может начинать движение к целевому маркеру, при +этом начало и конец движения алгоритм должен явно обозначать путем +вывода соответствующих сообщений в терминал и лог-файл + (Например, «movement_start», «movement_stop»). + 2. РМК-2 находится на целевой точке, он должен вернуться в точку +старта, однако в этот раз эксперт выставит на поле препятствие, которое +РМК-2 должен обнаружить и объехать. Запуск решения конкурсанта. + + + + 29 + 2.1 Вывод в терминал ПК зачетного рабочего места и лог-файл +построенный РМК-2 маршрут. + (Например, [22, 17, 16, 15, 10, 5, 0], формат может меняться, но он +должен отражать построенный маршрут). + Эксперт должен зафиксировать данный маршрут, чтобы впоследствии +сверяться с ним. + 2.2 После фиксации экспертом, конкурсант должен отправить РМК-2 +команду на движение к стартовому aruco-маркеру. + (Например, вызвать сервис, запушить данные в топик, запустить +отдельную ноду или скрипт или нажать соответствующую клавишу + + + + +клавиатуры). + + + После этого РМК-2 может начинать движение к целевому маркеру, при +этом начало и конец движения алгоритм должен явно обозначать путем +вывода соответствующих сообщений в терминал и лог-файл + (Например, «movement_start», «movement_stop»). + + + + 30 + Время перемещения РМК-2 в рамках данного модуля измеряется одним +из экспертов в зависимости от выводов сообщений о старте и окончании +движения в терминал. Время между запусками алгоритмов и время фиксации +маршрута экспертами не учитывается. Учитывается суммарное время для двух +этапов движения РМК-2. + + + Оценивается: + - Добрался ли робот до каждой из точек (целевая, стартовая)? + - Следовал ли робот пути, рассчитанным алгоритмом навигации? + - Скорость выполнения перемещений по полю. + - Врезался ли робот в границы соревновательного поля и + динамические препятствия? + - Логирование + + + Во время зачетной попытки конкурсанты должны: + - Продемонстрировать разработанные навигационные алгоритмы, + объяснить логику их работы. + - Продемонстрировать выводом в терминал и лог-файл маршрут, + построенный РМК-2 до целевой и стартовой точек. + - Алгоритм должен явно выводить моменты старта и окончания + движения. + - РМК-2 должен успешно переместиться из стартовой точки в целевую + и обратно, избежав столкновений с границами поля и препятствиями. + + + Примеры ошибок: + — РМК-2 выехал на ячейку, не представленную на маршруте движения. + + + + + 31 + — РМК-2 столкнулся с динамическим препятствием + + + + + Таблица №4 + Б Алгоритм выполнения задания + + Задача Входные данные Ожидаемый результат + +Построение ID целевого aruco- Вывод в терминал и лог-файл массива +маршрута по графу маркера ID aruco-маркеров, в том порядке, в +aruco-маркеров каком их должен проехать РМК-2 + +Движение по Массив ID aruco- Движение РМК-2 по массиву aruco- +массиву aruco- маркеров маркеров +маркеров + +Реализация ID целевого aruco- Объезд динамического препятствия, +системы маркера выставленного судьей на маршруте до +безопасности начала движения. + +Ведение версии Локальный Репозиторий с именем +кода и репозиторий для chvt2026_Фамилия_Имя_номер Для +документации в конкурсанта в Git выполнения конкретного модуля +системе контроля создавать отдельную ветку с именем +версий (Git) moduleX, где X должен быть цифрой + (2-5) + +Тестирование РМК-2, ID целевого Тестовые запуски работы системы + aruco-маркера + + + + 32 + Контрольная сдача ID целевого aruco- Сценарий: + модуля маркера 1. Презентация решения + конкурсантом. + 2. Выдача экспертом ID целевого + маркера. + 3. Выдача конкурсантом массива + маркеров. + 4. Движение к целевому маркеру + 5. Выставление на поле судьей + препятствия + 6. Выдача конкурсантом массива + маркеров. + 7. Движение к стартовому маркеру. + + + + + Необходимое оборудование для модуля Б: + - РМК-2. + - Соревновательное поле. Динамические препятствия. + - Рабочий стол конкурсантов. Рабочее место конкурсантов + - Рабочий ПК конкурсантов. Зачетное рабочее место + + + Модуль В. Системы технического зрения с использованием +инструментов искусственного интеллекта (инвариант) + Время на выполнение модуля: 5 часов + Задания: + Время на выполнение модуля: 5 часов + + Этап 1. Этап 2. Этап 3. Выгрузка Этап 4. Зачетные + Проектирование Тестирование решений попытки + + 0.5 3 0.5 1 + + + + Этап 1. Проектирование. + + + 33 + Длится 30 минут, в это время конкурсанты работают на своих рабочих +местах (рабочее место конкурсанта). Есть доступ к симулятору, а также доступ +к выданной камере и набору деталей. Доступа к зачетному рабочему месту и +РМК на соревновательном поле нет. + Этап 2. Тестирование. + Длится 3 часа, в это время конкурсанты в порядке очереди +(определенной жеребьевкой) имеют доступ к зачетному рабочему месту и +РМК на соревновательном поле. Будет два круга по 6 и 12 минут +соответственно. Во время своей тестовой попытки конкурсант имеет доступ +к зачетному рабочему месту, имеет право собирать данные для датасета, +выгружать туда свое решение, вносить правки в код, выгружать его на свой +гит и взаимодействовать с РМК (с согласования с главным экспертом). По +окончании своей попытки конкурсант обязан покинуть зачетное рабочее +место. В остальное время конкурсант может продолжать работу за своим +рабочим местом. В момент окончания этого этапа у конкурсанта должна быть +актуальная версия решения на локальном репозитории. + Этап 3. Выгрузка решений. + Длится 0.5 часа, в этом время конкурсанты не имеют права вносить +правки в решение, они обязаны выгрузить все свои решения на ПК зачетного +рабочего места, подготовить их к запуску. Доступ к рабочему зачетному месту +в порядке очереди (по 3 минуты на конкурсанта). Во время этого этапа +участники покидают свои рабочие места. + Этап 4. Зачетные попытки. + Длится 1 час. В это время конкурсанты не имеют права находиться на +своих рабочих местах, вносить правки в решения. В самом начале этого этапа +эксперт с помощью генератора случайных чисел выбирает целевую деталь +(для всех конкурсантов одна и та же). Эксперт может поменять местами детали +на соревновательном поле. В порядке очереди конкурсанты имеют доступ к +зачетному рабочему месту, презентуют свое решение экспертам, запускают +код. Во время работы решения эксперты проводят оценку. Конкурсант имеет + + 34 + право перезапускать свое решение, но с начала конкурсного задания. Зачетные +попытки идут в порядке очереди по 6 минут на конкурсанта. По окончанию +своей зачетной попытки конкурсант покидает зачетное рабочее место. + + + Модуль направлен на обучение и интеграцию нейросетевой модели для +автоматического распознавания деталей. Конкурсанты должны +самостоятельно собрать и разметить датасет, выбрать подходящую +архитектуру нейросети, обучить ее и интегрировать в систему управления +манипулятором. + + + + + Обращаем внимание, что задание модуля В нужно выполнять +максимум одним скриптом. В случае, если решение конкурсанта +потребовало запуска более чем одного скрипта (взаимодействий с ПК +зачетного рабочего места), то баллы, набранные за такую попытку, не +будут засчитаны. + + + Каждому конкурсанту в рамках этого модуля будет выдан комплект +деталей для распознавания, модуль СТЗ (камера), блок питания, провод +ethernet для подключения камеры к ПК на рабочем месте конкурсанта. + Детали будут представлены в 3х вариантах – 3 коробки одинакового +размера с различным рисунком сверху и снизу. + + + Во время тестирования и на этапе проектирования конкурсанты могут +фотографировать и снимать видео (выданной камерой, другими средствами в +том числе мобильными телефонами нельзя) свои детали со всех ракурсов и с +разным освещения и таким образом собирать датасет. + Производить разметку датасета можно как вручную, так и с помощью +сторонних инструментов и сервисов в сети интернет (например, RoboFlow). + + + + 35 + Эксперт может попросить продемонстрировать датасет для его +фиксации и оценки во время этапа «выгрузка решений». + Детали расположены в одной плоскости на полке на соревновательном +поле и не могут быть перекрыты друг другом. + Формат сохранения обученной модели остается на усмотрение +конкурсанта (ONNX, TensorFlow, PyTorch и др.). + + + Конкурсное задание модуля В. + + + РМК-1 стоит у полки с деталями. РМК-1 должен распознать целевую +деталь, определить ее координаты, совершить захват манипулятором целевой +детали, вернуть манипулятор в исходное положение, затем положить деталь +обратно на полку, и вернуть манипулятор в исходное положение без детали в +схвате. + + + На полке на соревновательном поле будут лежать N >= 3 деталей. РМК-1 +с манипулятором (манипулятор в исходном положении) около полки +перпендикулярно ей (камера на манипуляторе смотрит вертикально вниз) +смотрит на эту полку сверху. + 1. С помощью генератора случайных чисел эксперт выбирает класс + детали, необходимой для захвата манипулятором и сообщает класс + конкурсанту. + 2. Конкурсант запускает свое решение. Конкурсант показывает +обработанный нейросетью видеопоток с камеры для оценки экспертами. + + + 3. После фиксации видеопотока экспертом, конкурсант отправляет +команду РМК-1 на захват целевой детали. Манипулятор должен совершить +захват детали и вернуться в исходное положение с деталью. + 4. Затем манипулятор возвращает деталь на пустое место на полке и +возвращается в исходное положение без детали в схвате. + + 36 + Пример видеопотока, обработанного нейросетью: + — Bounding box + — Принадлежность детали к классу + + + + + — Процент уверенности распознавания + + + Таблица №5 + В Алгоритм выполнения задания + + Задача Входные данные Ожидаемый результат + +Сбор и разметка Набор различных - Сбор датасета +датасета деталей - Разметка данных + +Обучение Размеченный - Выбор архитектуры модели +нейросетевой конкурсантами - Тестирование результатов обучения +модели датасет - Дообучение/обучение выбранной + модели + + +Распознавание ID детали - Выдача координат искомой детали +требуемой детали относительно базы манипулятора + +Взаимодействие с Координаты - Перемещение схвата манипулятора к +манипулятором искомой детали. искомой детали, ее подъем и + возвращение на свободное место на + полке + + + 37 + Тестирование РМК-1, ID детали Тестовые запуски работы системы + + + Ведение версии Локальный Репозиторий с именем + кода и репозиторий для chvt2026_Фамилия_Имя_номер Для + документации в конкурсанта в Git выполнения конкретного модуля + системе контроля создавать отдельную ветку с именем + версий (Git) moduleX, где X должен быть цифрой (2-5) + + + + Зачетные попытки РМК-1, ID детали + Сценарий: + 1. Презентация решения конкурсантами + 2. Запуск алгоритма конкурсантов + 3. Проверка экспертом вывода + видеопотока конкурсантов. + 4. Указание экспертом ID целевой + детали. + 5. Движение манипулятора к детали, ее + подъем и возвращение на свободное + место на полке. + + + + + Модуль Г. Разработка и тестирование графического интерфейса +(FMS-системы) для управления и визуализации работы РМК и их группы +(вариатив) + Время на выполнение модуля: 4 часа + Задания: + Время на выполнение модуля: 4 часа + + Этап 1. Проектирование Этап 3. Зачетные попытки + + 3 1 + + + + Этап 1. Проектирование. + Длится 3 часа, в это время конкурсанты работают на своих рабочих +местах (рабочее место конкурсанта). Доступа к зачетному рабочему месту и +РМК на соревновательном поле нет. В конце этого этапа у конкурсанта должно + + 38 + быть выгружено решение на его локальный репозиторий. После окончания +этапа конкурсанты покидают свои рабочие места. + Этап 2. Зачетные попытки. + Длится 1 час. Оценка будет проводиться на рабочих местах +конкурсантов с использованием симулятора. В порядке очереди +(определяемой жеребьевкой) эксперты будут подходить к рабочему месту +конкурсанта (вместе с ним) и проводить фиксацию и оценку решения. + + + + Модуль направлен на разработку функционального графического +интерфейса для управления и отслеживания состояния как отдельно взятого +РМК, так и их группы. Конкурсанты должны интегрировать API управления +РМК-1 и РМК-2, обеспечить возможность ручного управления каждым +роботом, визуализировать данные с роботов, а также реализовать отображение +карты занятости, графа aruco-маркеров, указание текущего местоположения +РМК и целевой точки. + + + + + Конкурсное задание модуля Г. + Разработанный интерфейс должен обеспечивать + 1) Графическое окно. + 39 + Разработанное решение должно открываться либо как отдельное +приложение, либо как веб-страница в браузере. Весь разработанный +инструментарий должен быть доступен для взаимодействия через данное +графическое окно. + 2) Карта занятости. + Разработанное решение должно визуализировать карту занятости для +РМК-1. + + + 3) Граф aruco-маркеров. + Разработанное решение должно визуализировать граф aruco-маркеров с +учетом их координат как относительно друг друга, так и относительно +соревновательного поля. + + + + + 4) + + + + +Выбор конкретного РМК. + Разработанное решение должно давать выбор, с каким именно РМК идет +взаимодействие в данный момент. Реализованные инструменты применяются +не ко всем РМК сразу, а к одному, который был выбран. В дальнейшем такой +РМК в рамках документации будет называться конкретным РМК. + 5) Ручное управление + Разработанное решение должно иметь инструмент для управления +конкретным РМК в ручном режиме. Например, джойстик, ползунки, + + + + 40 + управление с клавиатуры нажатиями клавиш и т.д. Управление через терминал +(командную строку) не засчитывается. + 6) Задание текущего местоположения. + Разработанное решение должно иметь возможность сменить текущее +местоположение РМК на карте не прибегая к физическому перемещению РМК +на поле. + 7) Задание целевой точки. + Разработанное решение должно иметь возможность задать конкретному +РМК целевую точку, в которую РМК переместится в автономном режиме. + 8) Текущее местоположение РМК. + Разработанное решение должно визуализировать текущее положение +РМК на соревновательном поле в соответствии реальным расположением на +поле. + 9) Визуализация точек лидара. + Разработанное решение должно визуализировать облако точек +конкретного РМК. Облако точек должно быть привязано к текущему +местоположению конкретного РМК, учитывая его ориентацию на поле, и +перемещаться вместе с ним. + 10) Заряд аккумулятора. + Разработанное решение должно отобрать информацию о вольтаже +конкреного РМК в вольтах. + 11) Визуализация траекторий. + Разработанное решение должно визуализировать спланированный +маршрут движения конкретного РМК при автономном перемещении. + 12) Экстренная остановка + Разработанное решение должно иметь возможность экстренно +остановить конкретный РМК вне зависимости от ручного или автономного +перемещения. + 13) Работа с рабочим инструментом + + + + 41 + Разработанное решение должно иметь возможность управлять рабочим +инструментом на конкретном РМК. Для РМК-2 — подъем/опускание лифта, +для РМК-1 — открытие/закрытие схвата манипулятора. + + + Должна быть создана пользовательская инструкция по эксплуатации в +формате файла README. Разработка ведётся в отдельной ветке локального +репозитория Git, все изменения фиксируются коммитами. + Эксперты могут попросить продемонстрировать любой функционал +системы управления. + Обновление данных в графическом интерфейса должно производиться с +частотой не менее 1 Гц. + + + Таблица №6 + Г Алгоритм выполнения задания + + Задача Входные данные Ожидаемый результат + +Проектирование Техническое задание Разработанный графический интерфейс, +графического к функционалу отвечающий обязательному +интерфейса техническому заданию + + + + +Интеграция интерфейса Техническая Реализация функционала для +с API РМК. документация API управления РМК через интерфейс + РМК + + + + +Реализация Поток данных о Отображение данных в графическом +визуализации данных состоянии РМК интерфейсе +Конкретного РМК в +реальном времени + + + + +Ведение версии кода и Локальный Репозиторий с именем + + 42 + документации в системе репозиторий для chvt2026_Фамилия_Имя_номер Для +контроля версий (Git) конкурсанта в Git выполнения конкретного модуля + создавать отдельную ветку с именем + moduleX, где X должен быть цифрой (2- + 5) + + +Контрольная сдача РМК-1, РМК-2 Сценарий: +модуля 1. Презентация решения конкурсантами + 2. Проверка всего функционала + экспертами + 3. Управление в ручном режиме. + 4. Проверка рабочего инструмента + 5. Отправка РМК в целевые точки + 6. Проверка экстренной остановки + + + + + Необходимое оборудование для модуля Г: + - Рабочий стол конкурсантов + - Рабочий ПК конкурсантов. + + + Модуль Д. Решение складского кейса гетерогенной группой РМК +(инвариант) + Время на выполнение модуля:6 часов + Задания: + Время на выполнение модуля: 6 часов + + Этап 1. Этап 2. Этап 3. Выгрузка Этап 4. Зачетные + Проектирование Тестирование решений попытки + + 2 2.5 0.5 1 + + + Этап 1. Проектирование. + 43 + Длится 2 часа, в это время конкурсанты работают на своих рабочих +местах (рабочее место конкурсанта) (разработка решения в симуляторе). +Доступа к зачетному рабочему месту и РМК на соревновательном поле нет. + Этап 2. Тестирование. + Длится 2.5 часа, в это время конкурсанты в порядке очереди +(определенной жеребьевкой) имеют доступ к зачетному рабочему месту и +РМК на соревновательном поле. Будет один круг по 15 минут. Во время своей +тестовой попытки конкурсант имеет доступ к зачетному рабочему месту, +имеет право выгружать туда свое решение, вносить правки в код, выгружать +его на свой гит и взаимодействовать с РМК (с согласования с главным +экспертом). По окончании своей попытки конкурсант обязан покинуть +зачетное рабочее место. В остальное время конкурсант может продолжать +работу за своим рабочим местом. В момент окончания этого этапа у +конкурсанта должна быть актуальная версия решения на локальном +репозитории. + Этап 3. Выгрузка решений. + Длится 0.5 часа, в этом время конкурсанты не имеют права вносить +правки в решение, они обязаны выгрузить все свои решения на ПК зачетного +рабочего места, подготовить их к запуску. Доступ к рабочему зачетному месту +в порядке очереди (по 3 минуты на конкурсанта). Во время этого этапа +участники покидают свои рабочие места. + Этап 4. Зачетные попытки. + Длится 1 час. В это время конкурсанты не имеют права находиться на +своих рабочих местах, вносить правки в решения. В самом начале этого этапа +эксперт с помощью генератора случайных чисел выбирает целевую деталь +(для всех конкурсантов одна и та же). В порядке очереди конкурсанты имеют +доступ к зачетному рабочему месту, презентуют свое решение экспертам, +запускают код. Во время работы решения эксперты проводят оценку. +Конкурсант имеет право перезапускать свое решение, но с начала конкурсного +задания. Зачетные попытки идут в порядке очереди по 6 минут на конкурсанта. + + 44 + По окончанию своей зачетной попытки конкурсант покидает зачетное рабочее +место. + Модуль направлен на комплексную демонстрацию компетенций +конкурсантов в области координации гетерогенной группы РМК для решения +типовой складской задачи. Конкурсанты должны обеспечить взаимодействие +РМК-1 и РМК-2 для выполнения последовательных (или параллельных) +операций по транспортировке стеллажа и перемещению деталей. В рамках +данного модуля на соревновательном поле вводится несколько новых точек: + - Точка старта РМК-1 – ячейка, где начинает выполнение модуля + РМК-1 + - Точка старта РМК-2 – ячейка, где начинает выполнение модуля + РМК-2 + - Точка хранения стеллажа – ячейка, где находится стеллаж с начала + модуля. На стеллаже будет находиться N >= 3 деталей. + - Точка комплектации (К) – ячейка, куда должен быть доставлен + стеллаж. + - Точка сдачи – полка, куда должна попасть целевая деталь. + + + + + 45 + Обращаем внимание, что задание модуля Д нужно выполнять +максимум четырьмя скриптами. В случае, если решение конкурсанта +потребовало запуска более чем четыре скрипта (взаимодействий с ПК +зачетного рабочего места), то баллы, набранные за такую попытку, не +будут засчитаны. + + + Конкурсное задание модуля Д. + Сценарий модуля включает в себя несколько этапов: + 1.Конкурсант запускает свое решение. В терминал выводится + сообщение о старте. РМК-2 выполняет перемещение от точки старта РМК-2 + к точке хранения стеллажа. Выравнивается под ним и поднимает стеллаж. + 2. РМК-2 выполняет транспортировку стеллажа из точки хранения в +точку комплектации. Выравнивается и опускает стеллаж. + 3. РМК-1 выполняет перемещение от точки старта РМК-1 к точке точке +комплектации. Выравнивается рядом со стеллажом. + 4. РМК-1 выполняет захват требуемой детали со стеллажа. + 5. РМК-1 выполняет перемещение от точки комплектации до точки +сдачи с деталью в схвате. Выравнивается рядом с полкой. + 6. РМК-1 помещает деталь на полку. + 7. РМК-2 выполняет транспортировку стеллажа из точки комплектации +в точку хранения. Выравнивается, опускает стеллаж. + 8. РМК-1 выполняет перемещение от точки сдачи до точки старта +РМК-1 + 9. РМК-2 выполняет перемещение от точки хранения стеллажа до точки +старта РМК-2. + После достижения РМК-1 и РМК-2 своих точек старта, в терминал +должно вывестись сообщение об окончании выполнения задания. + + + Во время начала зачетных попыток конкурсантам предоставляется +информация о: + + 46 + ● Точках старта РМК-1 и РМК-2 + ● Точках хранения стеллажей + ● Точке комплектации + ● Точки сдачи + ● ID целевой детали + + + Завершением выполнения модуля считается выполнение следующих +критериев: + 1) Целевая деталь находится на полке в точке сдачи. + 2) Оба РМК находятся на своих стартовых позициях. + 3) Решение конкурсанта выводит в терминал сообщение о конце + выполнения. + + + Ошибки: + — Столкновение РМК с элементами поля + — Столкновение РМК друг с другом + + + + + Таблица №7 + + 47 + Д Алгоритм выполнения задания + + Задача Входные данные Ожидаемый результат + +Разработка Техническая 1) Целевая деталь находится на +алгоритма документация РМК-1 и полке в точке сдачи. +решения модуля РМК-2, сценарий + 2) Оба РМК находятся на своих +гетерогенной выполнения складского +группой РМК кейса, карта занятости и стартовых позициях. + граф aruco-маркеров. 3) Решение конкурсанта выводит + в терминал сообщение о конце + выполнения. + +Ведение версии Локальный репозиторий Репозиторий с именем +кода и для конкурсанта в Git chvt2026_Фамилия_Имя_номер +документации в Для выполнения конкретного +системе контроля модуля создавать отдельную ветку +версий (Git) с именем moduleX, где X должен + быть цифрой (2-5) + + + +Тестирование и РМК-1, РМК-2. Тестовые запуски работы системы +отладка работы +системы + +Контрольная сдача РМК-1, РМК-2 Сценарий: +модуля 1. Презентация своего решения + конкурсантом + 2. Озвучивание экспертами + целевой детали. + 3. Выполнение конкурсного + задания + + + + Необходимое оборудование для модуля Д: + - РМК-1 РМК-2 + - Соревновательное поле + - Набор различных деталей + - Стеллаж + - Полка + - Рабочий стол конкурсантов + + 48 + - Рабочий ПК конкурсантов. + + + + + 2. СПЕЦИАЛЬНЫЕ ПРАВИЛА КОМПЕТЕНЦИИ2 + Время выполнения конкурсного задания не должно превышать 8 часов в +день. + + + 2.1. Личный инструмент конкурсанта + Конкурсант может взять с собой индивидуальное периферийное +оборудование по списку: мышь компьютерная, клавиатура. + + + 2.2. Материалы, оборудование и инструменты, запрещенные на +площадке + Список материалов, оборудования и инструментов, которые запрещены +на соревнованиях по различным причинам: + Таблица №8 + Общие допуски и ограничения + + Разрешенные действия Запрещенные действия + + +2 Указываются особенности компетенции, которые относятся ко всем возрастным категориям и чемпионатным +линейкам без исключения. + + 49 + Использование технических Использование сторонней помощи +материалов соревнований, +подготовленных командой +разработки компетенции + +Использование готовых Самостоятельная эксплуатация оборудования без +моделей для обучения уведомления эксперта + +Использование документации Использование программ-заготовок +и форумов в интернете + +Запрос обратной связи Запрещено использование языковых моделей для +экспертов после окончания поиска информации и для генерации кода +конкурсных попыток + +Устанавливать Использование телефонов, ноутбуков, смарт-часов и +дополнительные библиотеки других индивидуальных носителей информации + +Использование Вход в мессенджеры, почту и соц. сети +установленного программного +обеспечения + + Взаимодействие с роботизированной ячейкой + самостоятельно, без участия эксперта + + Порча оборудования + + Установка несанкционированного ПО + + Агрессия в адрес экспертов или других + конкурсантов + + Плагиат (копирование чужих решений) + + Запрещены комиты на гит пользователя со + сторонних аккаунтов + + Нарушение тайминга + + +В целом на чемпионате запрещены действия, которые нарушают принципы честности, +безопасности и профессиональной этики. +Штраф: В порядке, предусмотренном правилами компетенциями: +1. За посещение ограниченных в модуле интернет-ресурсов баллы, набранные + конкурсантом за данный модуль, обнуляются. При ошибочном переходе по ссылке, + она должна быть закрыта в течение 15 секунд. + + + + 50 + 3. ПРИЛОЖЕНИЯ +Приложение 1. Инструкция по заполнению матрицы конкурсного задания +Приложение 2. Матрица конкурсного задания +Приложение 3. Инструкция по охране труда +Приложение 4. Руководство по оцениванию +Приложение 5. Размещение Aruco маркеров + + + + + 51 + \ No newline at end of file diff --git a/materials/pdf/5. Практика выполнения конкурсного задания (датасет + модели).pdf b/materials/pdf/5. Практика выполнения конкурсного задания (датасет + модели).pdf new file mode 100644 index 0000000..2aedeb5 Binary files /dev/null and b/materials/pdf/5. Практика выполнения конкурсного задания (датасет + модели).pdf differ diff --git a/materials/pdf/Расписание Оператор-техник складских роботов.pdf b/materials/pdf/Расписание Оператор-техник складских роботов.pdf new file mode 100644 index 0000000..0dbf711 Binary files /dev/null and b/materials/pdf/Расписание Оператор-техник складских роботов.pdf differ diff --git a/materials/presentations/1. Введение в компетенцию.pptx b/materials/presentations/1. Введение в компетенцию.pptx new file mode 100644 index 0000000..b0d8445 Binary files /dev/null and b/materials/presentations/1. Введение в компетенцию.pptx differ diff --git a/materials/presentations/2. Документация компетенции.pptx b/materials/presentations/2. Документация компетенции.pptx new file mode 100644 index 0000000..c458273 Binary files /dev/null and b/materials/presentations/2. Документация компетенции.pptx differ diff --git a/materials/presentations/3. Разбор выполнения конкурсного задания (введение в питон + рос + робототехника).pptx b/materials/presentations/3. Разбор выполнения конкурсного задания (введение в питон + рос + робототехника).pptx new file mode 100644 index 0000000..40ed1eb Binary files /dev/null and b/materials/presentations/3. Разбор выполнения конкурсного задания (введение в питон + рос + робототехника).pptx differ diff --git a/materials/presentations/4. Практика выполнения конкрусного задания (симулятор).pptx b/materials/presentations/4. Практика выполнения конкрусного задания (симулятор).pptx new file mode 100644 index 0000000..456dc88 Binary files /dev/null and b/materials/presentations/4. Практика выполнения конкрусного задания (симулятор).pptx differ diff --git a/materials/presentations/6. Перспективы развития компетенций.pptx b/materials/presentations/6. Перспективы развития компетенций.pptx new file mode 100644 index 0000000..1839ad6 Binary files /dev/null and b/materials/presentations/6. Перспективы развития компетенций.pptx differ diff --git a/materials/tasks/04-Конкурсное задание.docx b/materials/tasks/04-Конкурсное задание.docx new file mode 100644 index 0000000..1b07c39 Binary files /dev/null and b/materials/tasks/04-Конкурсное задание.docx differ diff --git a/materials/tasks/05-Критерии_оценки.xlsx b/materials/tasks/05-Критерии_оценки.xlsx new file mode 100644 index 0000000..9dcc379 Binary files /dev/null and b/materials/tasks/05-Критерии_оценки.xlsx differ diff --git a/setup/COMMANDS.md b/setup/COMMANDS.md new file mode 100644 index 0000000..e4f752f --- /dev/null +++ b/setup/COMMANDS.md @@ -0,0 +1,215 @@ +# Команды установки + +Краткая шпаргалка без пояснений. Подробности и ограничения: [`FROM_ZERO.md`](FROM_ZERO.md). + +## Windows PowerShell (администратор) + +```powershell +winget install --id Microsoft.WindowsTerminal -e +winget install --id Microsoft.PowerShell -e +winget install --id Git.Git -e +winget install --id Microsoft.VisualStudioCode -e +winget install --id OpenJS.NodeJS.LTS -e + +git --version +code --version +node --version +npm --version + +wsl --install -d Ubuntu-24.04 +``` + +## VS Code extensions + +```bash +code --install-extension ms-python.python +code --install-extension ms-python.vscode-pylance +code --install-extension ms-iot.vscode-ros +code --install-extension ms-vscode.cpptools +code --install-extension ms-vscode.cmake-tools +code --install-extension redhat.vscode-yaml +code --install-extension bradlc.vscode-tailwindcss +code --install-extension dbaeumer.vscode-eslint +code --install-extension esbenp.prettier-vscode +code --install-extension ms-vscode-remote.remote-wsl +code --install-extension ms-vscode-remote.remote-ssh +``` + +## Ubuntu 24.04: база и VS Code + +```bash +sudo apt update +sudo apt install -y \ + git curl wget unzip ca-certificates gnupg locales software-properties-common \ + build-essential python3 python3-pip python3-venv python3-dev \ + mesa-utils libxcb-cursor0 libxcb-xinerama0 +sudo snap install --classic code + +git --version +python3 --version +code --version +glxinfo -B +``` + +## Git и SSH + +```bash +git config --global user.name "Nikita Shilov" +git config --global user.email "YOUR_EMAIL" +git config --global init.defaultBranch main +ssh-keygen -t ed25519 -C "chvt-2026" +eval "$(ssh-agent -s)" +ssh-add ~/.ssh/id_ed25519 +cat ~/.ssh/id_ed25519.pub + +mkdir -p ~/scripts +git clone git@github.com:mavxa/mvch.git ~/scripts/mvch +git clone git@github.com:mavxa/mvch-docs.git ~/scripts/mvch-docs + +git -C ~/scripts/mvch remote add gitea ssh://git@GITEA_HOST/USER/mvch.git +git -C ~/scripts/mvch push gitea --all +git -C ~/scripts/mvch push gitea --tags +git -C ~/scripts/mvch-docs remote add gitea ssh://git@GITEA_HOST/USER/mvch-docs.git +git -C ~/scripts/mvch-docs push gitea --all +git -C ~/scripts/mvch-docs push gitea --tags +``` + +## ROS 2 Jazzy + +```bash +sudo locale-gen en_US en_US.UTF-8 +sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 +export LANG=en_US.UTF-8 + +sudo add-apt-repository universe +sudo apt update + +export ROS_APT_SOURCE_VERSION="$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F 'tag_name' | awk -F\" '{print $4}')" +curl -L -o /tmp/ros2-apt-source.deb \ + "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb" +sudo dpkg -i /tmp/ros2-apt-source.deb + +sudo apt update +sudo apt install -y ros-jazzy-desktop ros-dev-tools \ + ros-jazzy-rmw-fastrtps-cpp python3-colcon-common-extensions python3-rosdep + +sudo rosdep init +rosdep update +source /opt/ros/jazzy/setup.bash +export RMW_IMPLEMENTATION=rmw_fastrtps_cpp +``` + +## Webots + +```bash +sudo mkdir -p /etc/apt/keyrings +sudo wget -q https://cyberbotics.com/Cyberbotics.asc \ + -O /etc/apt/keyrings/Cyberbotics.asc +echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/Cyberbotics.asc] https://cyberbotics.com/debian binary-amd64/" \ + | sudo tee /etc/apt/sources.list.d/Cyberbotics.list +sudo apt update +sudo apt install -y webots +which webots +readlink -f "$(command -v webots)" +webots --version +``` + +## ROS-пакеты ЧВТ + +```bash +mkdir -p ~/ros2_ws/src +cd ~/ros2_ws/src +git clone https://gitlab.mobird.dev/fms_group/ar_webots_fms_ros2.git +git clone https://gitlab.mobird.dev/fms_group/ar_arm95_moveit_config.git +git clone https://gitlab.mobird.dev/fms_group/ar_aruco_detect_ros2.git +git clone https://gitlab.mobird.dev/fms_group/ar_dual_lidar_merge_ros2.git +git clone https://gitlab.mobird.dev/fms_group/ar_nav_ros2.git + +cd ~/ros2_ws +source /opt/ros/jazzy/setup.bash +rosdep install --from-paths src -y --ignore-src --rosdistro jazzy +colcon build --symlink-install +source ~/ros2_ws/install/setup.bash +``` + +## Python/YOLO + +```bash +cd ~/scripts/mvch/module3 +python3 -m venv --system-site-packages .venv +.venv/bin/python -m pip install -U pip +.venv/bin/pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu +.venv/bin/pip install -r requirements.txt tqdm ultralytics-thop +.venv/bin/pip install --force-reinstall \ + "numpy<2" "opencv-python<4.12" lark transforms3d + +source /opt/ros/jazzy/setup.bash +source ~/ros2_ws/install/setup.bash +.venv/bin/python -c \ + "import rclpy, cv_bridge, numpy, torch, ultralytics; print('Python/ROS/YOLO OK')" +``` + +## Bun, module4 и Node.js + +```bash +curl -fsSL https://bun.com/install | bash +export BUN_INSTALL="$HOME/.bun" +export PATH="$BUN_INSTALL/bin:$PATH" +bun --version + +cd ~/scripts/mvch/module4 +bun install +bun run check +bun run build + +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.7/install.sh | bash +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" +nvm install --lts +node --version +npm --version +``` + +## OpenCode (необязательно) + +Ubuntu/Linux: + +```bash +curl -fsSL https://opencode.ai/install | bash +source ~/.bashrc +opencode --version +``` + +Windows PowerShell: + +```powershell +npm install -g opencode-ai +opencode --version +``` + +## Проверка окружения и топиков + +```bash +cd ~/scripts/mvch-docs +./setup/check_environment.sh + +source /opt/ros/jazzy/setup.bash +source ~/ros2_ws/install/setup.bash +export RMW_IMPLEMENTATION=rmw_fastrtps_cpp + +ros2 node list +ros2 topic list | sort +ros2 topic echo /RMC1/odometry --once +ros2 topic echo /RMC2/odometry --once +ros2 topic echo /RMC2/scan_front --once +``` + +## Git bundle на флешку + +```bash +mkdir -p ~/chvt-backup +git -C ~/scripts/mvch bundle create ~/chvt-backup/mvch.bundle --all +git -C ~/scripts/mvch-docs bundle create ~/chvt-backup/mvch-docs.bundle --all +git bundle verify ~/chvt-backup/mvch.bundle +git bundle verify ~/chvt-backup/mvch-docs.bundle +``` diff --git a/setup/FROM_ZERO.md b/setup/FROM_ZERO.md new file mode 100644 index 0000000..50188b0 --- /dev/null +++ b/setup/FROM_ZERO.md @@ -0,0 +1,327 @@ +# Подготовка рабочего места с нуля + +Цель — за день настройки получить воспроизводимое рабочее место для физических РМК и Webots. Основная среда проекта: **Ubuntu 24.04 x86-64, ROS 2 Jazzy, Webots, Fast DDS, Python 3 и Git**. + +Все команды без объяснений продублированы в [`COMMANDS.md`](COMMANDS.md). + +## Сначала уточнить у эксперта + +До установки и обновлений зафиксируйте: + +1. Какая ОС и что уже установлено. +2. Нужно ли использовать готовый образ организаторов. +3. Какую версию Webots требует выданный пакет. +4. Адреса GitLab/локального Git, логин и доступ к интернету. +5. `ROS_DOMAIN_ID`, RMW и схему сети физических РМК. +6. Разрешённые программы, сайты и LLM. + +Не обновляйте целиком уже работающее окружение непосредственно перед попыткой. + +## Если выдали Windows + +Windows используем как хост для редактора, Git и резервного доступа. Конкурсный ROS-стек из материалов рассчитан на Ubuntu 24.04. Нативную сборку всех пакетов под Windows нельзя считать равноценной без подтверждения организаторов. + +Откройте PowerShell от администратора: + +```powershell +winget install --id Microsoft.WindowsTerminal -e +winget install --id Microsoft.PowerShell -e +winget install --id Git.Git -e +winget install --id Microsoft.VisualStudioCode -e +winget install --id OpenJS.NodeJS.LTS -e +``` + +После установки закройте и снова откройте терминал: + +```powershell +git --version +code --version +node --version +npm --version +``` + +Для вспомогательной Linux-среды можно установить Ubuntu 24.04 в WSL: + +```powershell +wsl --install -d Ubuntu-24.04 +``` + +После команды требуется перезапуск Windows. WSL подходит для Git, Python, Bun и редактирования, но DDS discovery, multicast, USB-камера и графический Webots могут отличаться от обычного Ubuntu. Для физического заезда предпочтительны нативный Ubuntu либо выданная Ubuntu VM с bridged-сетью и проверенным OpenGL. + +Если используется Ubuntu VM, выделите не менее 4 CPU, 8 ГБ RAM и 50 ГБ диска. Включайте 3D-ускорение только после проверки стабильности конкретного гипервизора. + +## Если выдали Ubuntu 24.04 + +### Базовые программы + +```bash +sudo apt update +sudo apt install -y \ + git curl wget unzip ca-certificates gnupg locales software-properties-common \ + build-essential python3 python3-pip python3-venv python3-dev \ + mesa-utils libxcb-cursor0 libxcb-xinerama0 +``` + +Проверка GPU: + +```bash +glxinfo -B +``` + +В `OpenGL renderer` не должно быть `llvmpipe`, если Webots должен работать с аппаратным ускорением. + +### Visual Studio Code + +Короткий официальный вариант для Ubuntu: + +```bash +sudo snap install --classic code +code --version +``` + +Snap здесь используется только для VS Code. Webots устанавливайте через `.deb`/APT: Snap-версия Webots уже создавала проблемы с ROS и Qt. + +Минимальные расширения: + +```bash +code --install-extension ms-python.python +code --install-extension ms-python.vscode-pylance +code --install-extension ms-iot.vscode-ros +code --install-extension ms-vscode.cpptools +code --install-extension ms-vscode.cmake-tools +code --install-extension redhat.vscode-yaml +code --install-extension bradlc.vscode-tailwindcss +code --install-extension dbaeumer.vscode-eslint +code --install-extension esbenp.prettier-vscode +``` + +Для Windows/WSL дополнительно: + +```powershell +code --install-extension ms-vscode-remote.remote-wsl +code --install-extension ms-vscode-remote.remote-ssh +``` + +### Git и доступ к репозиториям + +```bash +git config --global user.name "Nikita Shilov" +git config --global user.email "YOUR_EMAIL" +git config --global init.defaultBranch main + +ssh-keygen -t ed25519 -C "chvt-2026" +eval "$(ssh-agent -s)" +ssh-add ~/.ssh/id_ed25519 +cat ~/.ssh/id_ed25519.pub +``` + +Добавьте **публичный** ключ в GitHub/Gitea. Приватный `~/.ssh/id_ed25519` никуда не отправляйте и не коммитьте. + +```bash +mkdir -p ~/scripts +git clone git@github.com:mavxa/mvch.git ~/scripts/mvch +git clone git@github.com:mavxa/mvch-docs.git ~/scripts/mvch-docs +``` + +Если GitHub недоступен, замените URL на зеркало Gitea. После клонирования код полностью локален; интернет для `git status`, веток и коммитов не нужен. + +Добавление зеркала к уже клонированному репозиторию: + +```bash +git remote add gitea ssh://git@GITEA_HOST/USER/mvch.git +git push gitea --all +git push gitea --tags +``` + +Для `mvch-docs` повторите команды в его каталоге с URL репозитория `mvch-docs`. + +### ROS 2 Jazzy + +```bash +sudo locale-gen en_US en_US.UTF-8 +sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 +export LANG=en_US.UTF-8 + +sudo add-apt-repository universe +sudo apt update + +export ROS_APT_SOURCE_VERSION="$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F 'tag_name' | awk -F\" '{print $4}')" +curl -L -o /tmp/ros2-apt-source.deb \ + "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb" +sudo dpkg -i /tmp/ros2-apt-source.deb + +sudo apt update +sudo apt install -y ros-jazzy-desktop ros-dev-tools \ + ros-jazzy-rmw-fastrtps-cpp python3-colcon-common-extensions python3-rosdep +``` + +Инициализация `rosdep` выполняется один раз: + +```bash +sudo rosdep init +rosdep update +``` + +Если `rosdep init` пишет, что файл источников уже существует, повторять команду не нужно. + +```bash +source /opt/ros/jazzy/setup.bash +export RMW_IMPLEMENTATION=rmw_fastrtps_cpp +ros2 --help +``` + +### Webots + +```bash +sudo mkdir -p /etc/apt/keyrings +sudo wget -q https://cyberbotics.com/Cyberbotics.asc \ + -O /etc/apt/keyrings/Cyberbotics.asc +echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/Cyberbotics.asc] https://cyberbotics.com/debian binary-amd64/" \ + | sudo tee /etc/apt/sources.list.d/Cyberbotics.list +sudo apt update +sudo apt install -y webots + +which webots +readlink -f "$(command -v webots)" +webots --version +``` + +Не задавайте `WEBOTS_HOME=/snap/webots/...` для APT-версии. Сначала проверьте реальный путь. + +### Пакеты симулятора и управления + +```bash +mkdir -p ~/ros2_ws/src +cd ~/ros2_ws/src + +git clone https://gitlab.mobird.dev/fms_group/ar_webots_fms_ros2.git +git clone https://gitlab.mobird.dev/fms_group/ar_arm95_moveit_config.git +git clone https://gitlab.mobird.dev/fms_group/ar_aruco_detect_ros2.git +git clone https://gitlab.mobird.dev/fms_group/ar_dual_lidar_merge_ros2.git +git clone https://gitlab.mobird.dev/fms_group/ar_nav_ros2.git + +cd ~/ros2_ws +source /opt/ros/jazzy/setup.bash +rosdep install --from-paths src -y --ignore-src --rosdistro jazzy +colcon build --symlink-install +source ~/ros2_ws/install/setup.bash +``` + +Если закрытый GitLab не открывается, это вопрос доступа организаторов. Не подменяйте пакеты случайными форками. + +Добавить окружение в Bash можно после успешной ручной проверки: + +```bash +printf '%s\n' \ + 'source /opt/ros/jazzy/setup.bash' \ + 'source ~/ros2_ws/install/setup.bash' \ + 'export RMW_IMPLEMENTATION=rmw_fastrtps_cpp' \ + >> ~/.bashrc +``` + +### Python, YOLO и ROS + +```bash +cd ~/scripts/mvch/module3 +python3 -m venv --system-site-packages .venv +.venv/bin/python -m pip install -U pip +.venv/bin/pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu +.venv/bin/pip install -r requirements.txt tqdm ultralytics-thop +.venv/bin/pip install --force-reinstall \ + "numpy<2" "opencv-python<4.12" lark transforms3d +``` + +Проверка: + +```bash +source /opt/ros/jazzy/setup.bash +source ~/ros2_ws/install/setup.bash +~/scripts/mvch/module3/.venv/bin/python -c \ + "import rclpy, cv_bridge, numpy, torch, ultralytics; print('Python/ROS/YOLO OK')" +``` + +CPU-сборки достаточно для запуска и короткой проверки. CUDA/ROCm устанавливайте только под фактическую видеокарту по официальному селектору PyTorch. + +### Bun и Node.js + +Для `module4` нужен Bun: + +```bash +sudo apt install -y unzip +curl -fsSL https://bun.com/install | bash +export BUN_INSTALL="$HOME/.bun" +export PATH="$BUN_INSTALL/bin:$PATH" +bun --version + +cd ~/scripts/mvch/module4 +bun install +bun run check +bun run build +``` + +Node.js для этого проекта не обязателен, но полезен как запасной runtime и для npm-инструментов: + +```bash +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.7/install.sh | bash +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" +nvm install --lts +node --version +npm --version +``` + +### OpenCode — только если разрешён и нужен + +Linux/Ubuntu: + +```bash +curl -fsSL https://opencode.ai/install | bash +opencode --version +``` + +Windows после установки Node.js: + +```powershell +npm install -g opencode-ai +opencode --version +``` + +Не записывайте API-ключи в репозитории, README или историю терминала. Способ авторизации выбирайте по правилам площадки. + +## День настройки физического оборудования + +Делайте проверки по слоям: + +1. `ip addr`, `ip route`, доступность адресов РМК. +2. `ROS_DOMAIN_ID` и `RMW_IMPLEMENTATION` по данным эксперта. +3. `ros2 topic list | sort` и `ros2 node list`. +4. Отдельно проверить `/RMC1/odometry`, `/RMC2/odometry`, лидары, камеры и TF. +5. На вывешенных колёсах кратко подать малую скорость и немедленно STOP. +6. Проверить лифт RMC2 без стеллажа. +7. Проверить ARM95 сначала без детали и на безопасной высоте. +8. Собрать датасет только выданной/разрешённой камерой и сделать dry-run детектора. +9. Зафиксировать реальные топики, фреймы, размеры, точки и параметры в отдельном локальном коммите. +10. Сделать контрольный прогон и офлайн-бэкап. + +Не начинайте с полного модуля Д: сначала независимо подтвердите каждую платформу, лифт, камеру, детектор и манипулятор. + +## Защита от блокировки GitHub + +Основной вариант — зеркало на доступной Gitea. Дополнительно сделайте Git bundle обоих репозиториев: + +```bash +mkdir -p ~/chvt-backup +git -C ~/scripts/mvch bundle create ~/chvt-backup/mvch.bundle --all +git -C ~/scripts/mvch-docs bundle create ~/chvt-backup/mvch-docs.bundle --all +git bundle verify ~/chvt-backup/mvch.bundle +git bundle verify ~/chvt-backup/mvch-docs.bundle +``` + +Проверка восстановления: + +```bash +git clone ~/chvt-backup/mvch.bundle /tmp/mvch-restore-test +git -C /tmp/mvch-restore-test log -1 --oneline +``` + +Bundle содержит историю Git и отслеживаемые веса модели, но не содержит `.venv`, `node_modules`, системные пакеты и секреты. На флешку отдельно сохраните установщик/образ Ubuntu, нужную версию Webots, экспорт датасета и при необходимости wheel/cache зависимостей. diff --git a/setup/check_environment.sh b/setup/check_environment.sh new file mode 100755 index 0000000..02481cd --- /dev/null +++ b/setup/check_environment.sh @@ -0,0 +1,87 @@ +#!/usr/bin/env bash +set -u + +warnings=0 + +check_command() { + if command -v "$1" >/dev/null 2>&1; then + printf '[OK] %s: %s\n' "$1" "$(command -v "$1")" + else + printf '[WARN] команда %s не найдена\n' "$1" + warnings=$((warnings + 1)) + fi +} + +if [[ -r /etc/os-release ]]; then + # shellcheck disable=SC1091 + source /etc/os-release + printf '[INFO] OS: %s %s\n' "${NAME:-unknown}" "${VERSION_ID:-unknown}" + if [[ "${ID:-}" == ubuntu && "${VERSION_ID:-}" == 24.04 ]]; then + : + else + printf '[WARN] официальное окружение задания рассчитано на Ubuntu 24.04\n' + warnings=$((warnings + 1)) + fi +fi + +for command_name in git python3 code ros2 colcon webots bun; do + check_command "$command_name" +done + +for optional_name in node npm opencode; do + if command -v "$optional_name" >/dev/null 2>&1; then + printf '[OK] необязательная команда %s: %s\n' "$optional_name" "$(command -v "$optional_name")" + else + printf '[INFO] необязательная команда %s не установлена\n' "$optional_name" + fi +done + +printf '[INFO] RMW_IMPLEMENTATION=%s\n' "${RMW_IMPLEMENTATION:-не задано}" +printf '[INFO] ROS_DOMAIN_ID=%s\n' "${ROS_DOMAIN_ID:-не задано}" + +if [[ -r /opt/ros/jazzy/setup.bash ]]; then + set +u + # shellcheck disable=SC1091 + source /opt/ros/jazzy/setup.bash + set -u + printf '[OK] ROS 2 Jazzy setup найден\n' +else + printf '[WARN] /opt/ros/jazzy/setup.bash не найден\n' + warnings=$((warnings + 1)) +fi + +workspace_path="${ROS_WORKSPACE:-$HOME/ros2_ws}" +if [[ -r "$workspace_path/install/setup.bash" ]]; then + set +u + # shellcheck disable=SC1090 + source "$workspace_path/install/setup.bash" + set -u + printf '[OK] workspace: %s\n' "$workspace_path" +else + printf '[WARN] workspace не собран: %s\n' "$workspace_path" + warnings=$((warnings + 1)) +fi + +if command -v ros2 >/dev/null 2>&1; then + for package_name in ar_webots_fms_ros2 ar_arm95_moveit_config ar_aruco_detect_ros2; do + if ros2 pkg prefix "$package_name" >/dev/null 2>&1; then + printf '[OK] ROS-пакет: %s\n' "$package_name" + else + printf '[WARN] ROS-пакет не найден: %s\n' "$package_name" + warnings=$((warnings + 1)) + fi + done +fi + +if python3 -c 'import rclpy, cv_bridge' >/dev/null 2>&1; then + printf '[OK] Python: rclpy и cv_bridge импортируются\n' +else + printf '[WARN] Python не импортирует rclpy/cv_bridge\n' + warnings=$((warnings + 1)) +fi + +if command -v glxinfo >/dev/null 2>&1; then + glxinfo -B 2>/dev/null | sed -n '/OpenGL vendor/p;/OpenGL renderer/p' +fi + +printf '\nИтог: %d предупреждений. WARN не всегда означает поломку, но проверьте его до заезда.\n' "$warnings"