# Базовые примеры для реального 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.