8.1 KiB
Модуль В: датасет и YOLO
Камера: /RMC1/arm95/camera_gripper/image_color (1600x1200).
Основной зачетный скрипт: module3.py. Он показывает обработанный видеопоток,
определяет координаты выбранной детали относительно Base_link, захватывает ее,
возвращает ARM95 в исходное положение с деталью, кладет деталь обратно на
освободившееся место и снова возвращает руку в исходное положение.
После первого безопасного подхода координаты повторно уточняются по близкому
кадру, поэтому рука не едет к детали только по одному дальнему измерению.
Если в кадре несколько деталей одного класса, скрипт выбирает ближайшую к базе.
Запуск задания
В VM один раз создайте окружение с доступом к системным пакетам ROS:
cd ~/scripts/mvch/module3
sudo apt install python3-venv
python3 -m venv --system-site-packages .venv
.venv/bin/pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
.venv/bin/pip install -r requirements.txt tqdm ultralytics-thop
Если окружение уже обновило NumPy до 2.x и cv_bridge ругается на ABI:
.venv/bin/pip install --force-reinstall "numpy<2" "opencv-python<4.12" lark
lark — зависимость ROS 2 Launch/MoveIt, а не часть алгоритма распознавания.
Ограничение numpy<2 нужно потому, что бинарный cv_bridge в этом образе ROS
собран с NumPy 1.x.
Если venv уже был создан без --system-site-packages, пересоздавать его не
нужно. Включите системные зависимости ROS и заново активируйте окружение:
sed -i 's/include-system-site-packages = false/include-system-site-packages = true/' .venv/pyvenv.cfg
deactivate
source .venv/bin/activate
Запустите симулятор модуля В, затем в новом терминале:
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
cd ~/scripts/mvch
module3/.venv/bin/python module3/module3.py --target 1
Цели: 1/hammer, 2/wrench, 3/pliers. После того как эксперт зафиксировал
видеопоток, нажмите G или Space в окне либо введите g и
нажмите Enter в терминале. Esc останавливает скрипт до начала движения.
Сначала обязательно проверьте только координаты:
module3/.venv/bin/python module3/module3.py --target hammer --dry-run
В режиме --dry-run подтверждать запуск клавишей не нужно: скрипт завершится
после первой валидной детекции и вывода рассчитанных координат.
Для проверки через SSH без окна:
module3/.venv/bin/python module3/module3.py --target hammer --dry-run --no-window
Геометрию реального стенда нельзя брать из симулятора вслепую. Перед зачетом
измерьте и подстройте --plane-z, --pick-z и --approach-z. По умолчанию
деталь возвращается туда, откуда была взята; другую свободную точку можно задать
через --drop-x X --drop-y Y.
События распознавания, координаты, построение движений и состояния схвата
одновременно выводятся в терминал и сохраняются в module3/logs/*.log.
Туда же пишутся контрольные кадры *_gripped.jpg, *_with_detail.jpg и
*_finished.jpg.
Что размечать
Классы строго в таком написании:
hammer
pliers
wrench
Рамкой выделяйте изображение инструмента на карточке, а класс задавайте по
картинке. Используйте одинаковый стиль разметки в симуляторе и на реальном поле.
Размечайте каждый видимый экземпляр: в штатной сцене две карточки pliers, одна
hammer и одна wrench. Классы box и background не создавайте.
В Roboflow создайте Object Detection project, загрузите dataset/raw/*.jpg,
разметьте кадры, сделайте split 70/20/10 и экспортируйте в формате YOLO11.
Распакуйте экспорт в module3/training: там должны появиться data.yaml и
каталоги train, valid, test. Не переставляйте номера классов в data.yaml:
они назначаются Roboflow и должны совпадать с ID внутри label-файлов.
Локально в dataset/raw могут лежать собранные кадры, но Git их намеренно
игнорирует: после клонирования датасет нужно перенести отдельно или собрать
заново. Расположение объектов менять не требуется: дополнительные повороты и
сдвиги выполняются аугментациями во время обучения.
Сбор кадров из симулятора
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
python3 module3/capture_dataset.py --count 30
Во время сбора плавно меняйте положение RMC1/манипулятора. Скрипт пропускает почти
одинаковые кадры. Для одиночного снимка используйте --count 1 --min-change 0.
Установка для обучения
cd module3
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
pip install -r requirements.txt
Ultralytics ставит PyTorch как зависимость. Для конкретной NVIDIA CUDA или AMD
ROCm лучше сначала установить подходящую сборку PyTorch, затем requirements.txt.
Обучение
Если часть объектов была размечена полигонами, один раз приведите экспорт к обычным bounding boxes:
python prepare_dataset.py
Для теста используются максимум 30 эпох и early stopping после 7 эпох без улучшения validation metrics.
Автовыбор: NVIDIA CUDA / AMD ROCm, а если GPU недоступен — CPU:
python train.py --device auto
Только CPU (подойдёт на AMD без настроенного ROCm):
python train.py --device cpu --batch 4 --workers 2
Принудительно NVIDIA CUDA или настроенный AMD ROCm:
python train.py --device cuda
Лучшие веса сохраняются в training/runs/tools_yolo11n/weights/best.pt и
автоматически копируются в models/latest.pt для простого запуска проверки.
Проверка на фотографии
python test_model.py training/test/images/example.jpg --device cpu
С --show откроется окно. Независимо от окна размеченная фотография сохраняется
в predictions/: на ней видны bbox, названия классов и confidence.