Files

122 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Базовые примеры для реального ROS 2
Это короткие учебные скрипты, которые работают через штатные ROS 2 интерфейсы
роверов: `cmd_vel`, `odometry`, `scan_front`, `aruco_id`, TF и `lift`. Имена
сверены с выданной документацией физических РМК от 08.09.2026. В них нет
прямого управления моторами и нет подмены симулятора. Один и тот же 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 info /RMC2/camera_bottom/aruco_id -v
ros2 topic echo /RMC2/camera_bottom/aruco_id --once
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 --sim --target 14
# Закрытые клетки и уменьшенная реальная скорость
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
```
## Первый запуск на физическом RMC2
Сначала выберите соседнюю с текущей целевую метку и оставьте низкие скорости:
```bash
TARGET_ID=1
python3 basic/drive_to_aruco.py \
--target "$TARGET_ID" \
--spacing 1.0 \
--max-speed 0.04 \
--max-angular 0.12 \
--stop-distance 0.70 \
--tolerance 0.10 \
--ready-timeout 30 \
--waypoint-timeout 90
```
Флаги `drive_to_aruco.py`:
- `TARGET` или `--target TARGET` — ID целевой ArUco-метки; укажите только одним способом.
- `--robot` — имя робота; физический проезд по ArUco поддерживается только для `RMC2`.
- `--rows`, `--columns` — размеры сетки; по умолчанию 5×5 для реального поля и 6×6 с `--sim`.
- `--spacing` — измеренное расстояние между центрами соседних ArUco в метрах.
- `--blocked` — ID закрытых клеток. Возле крупного препятствия закройте и соседнюю клетку, если корпусу не хватает зазора.
- `--max-speed` — линейная скорость. Первый реальный тест: 0.03–0.05 м/с, после проверки: 0.08–0.12 м/с.
- `--max-angular` — угловая скорость. Первый реальный тест: 0.10–0.15 рад/с.
- `--stop-distance` — расстояние аварийной остановки по лидару. Оно измеряется от датчика, а не от центра ровера; начните с 0.70 м.
- `--tolerance` — допустимая ошибка центрирования над меткой. `0.10` означает 10 см; после настройки уменьшите до `0.06`.
- `--ready-timeout` — сколько секунд ждать odometry, lidar, ArUco и TF перед отказом.
- `--waypoint-timeout` — максимальное время движения к одной следующей метке.
- `--scan-topic` — другое имя топика переднего лидара, если оно отличается от `/RMC2/scan_front`.
- `--sim` — использовать Webots: симуляторное время, сетку 6×6 и симуляторный топик ArUco.
- `--yes` — начать без подтверждения Enter; не используйте при первом физическом запуске.
`drive_to_aruco.py` по умолчанию использует реальную сетку 5×5: `0=(0,0)`,
`1=(0,+1 м)`, `5=(-1 м,0)`. С `--sim` выбирается сетка Webots 6×6, где
`6=(-1 м,0)`. Ровер должен стартовать центром над видимой меткой.
Скрипт сам определяет старт, строит BFS-маршрут, печатает его до движения, затем
едет по odometry и уточняет положение через TF каждой ArUco. Без свежих odometry,
лидара, метки на финише или при препятствии ближе `--stop-distance` он отправляет
нулевой `Twist` и завершает работу.
На реальном поле сначала измерьте шаг сетки и при необходимости задайте
`--spacing`. Если организаторы используют другой топик лидара, передайте
`--scan-topic /нужный/топик`. Не используйте `--yes` в первом физическом заезде.
По выданной документации нижняя камера и `aruco_id` есть у RMC2. Поэтому реальный
запуск `drive_to_aruco.py` разрешён только для RMC2. Подъём лифта публикует `0.05`,
опускание — `0.0`, а статус читается с обязательным QoS `Transient Local`.
У RMC1 доступно боковое движение (`linear.y`), у RMC2 оно принудительно запрещено
в `move_rmc.py`. Режим `--no-lidar` предназначен только для вывешенного стенда,
где колёса не могут переместить робот.
`grid_route.py` оставлен как офлайн-проверка графа. Он ничего не публикует в ROS.
Для реального поля используется его дефолт `--size 5`, для Webots добавьте
`--size 6`.