From 19d08523eba12b7c03e3f63cc3c3a349bd6fcf61 Mon Sep 17 00:00:00 2001 From: mavxa Date: Wed, 9 Sep 2026 16:37:09 +0300 Subject: [PATCH] docs: add real ROS hardware fallback guide --- README.md | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/README.md b/README.md index be18476..56aa5e3 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,21 @@ cd ~/scripts/mvch-docs ./setup/check_environment.sh ``` +Если на площадке недоступен GitHub, подготовлены отдельные зеркала на Gitea: + +- код модулей: [`mavxa/chvt-bak`](https://git.vihrev.com/mavxa/chvt-bak); +- документация: [`mavxa/chvt-docs`](https://git.vihrev.com/mavxa/chvt-docs). + +```bash +mkdir -p ~/scripts +git clone ssh://git@git.vihrev.com:2222/mavxa/chvt-bak.git ~/scripts/mvch +git clone ssh://git@git.vihrev.com:2222/mavxa/chvt-docs.git ~/scripts/mvch-docs +``` + +SSH-доступ к обоим серверам проверьте заранее. Помимо удалённых репозиториев, +держите готовые копии каталогов на флешке: блокировка сети может затронуть и +GitHub, и внешний Gitea. + В каждом новом ROS-терминале: ```bash @@ -162,6 +177,82 @@ ros2 topic echo /RMC2/scan_front --once Точный список топиков зависит от активного launch-файла. Если `scan_front` отсутствует, сначала посмотрите `ros2 topic list | sort`, а не меняйте код вслепую. +## Если на реальном ровере другие датчики или ROS API + +Успешный запуск Python-процесса ещё не означает, что ровер готов ехать. Текущие +решения специально не начинают движение без обратной связи: + +- нет `odometry` — ROS-нода запустится, но навигация останется в ожидании датчиков + или завершит предварительную проверку с ошибкой; +- нет `scan`/`scan_front` — движение блокируется, потому что невозможно проверить + препятствие и тормозной путь; +- нет `aruco_id` или TF `aruco_` — невозможно привязать odometry к полю и + подтвердить точное прибытие на маркер; +- нет подписчика на `cmd_vel` — программа будет публиковать команды, но платформа + не поедет; +- имя совпало, но тип сообщения или QoS отличается — publisher и subscriber не + соединятся. + +Это безопасное поведение. Не отключайте проверки датчиков и не заменяйте odometry +движением «скорость × несколько секунд» на физическом роботе. + +### Что снять в день настройки оборудования + +Сначала сохраните фактический ROS API, пока ничего не движется: + +```bash +mkdir -p ~/equipment-audit + +ros2 node list | tee ~/equipment-audit/nodes.txt +ros2 topic list -t | tee ~/equipment-audit/topics.txt +ros2 topic info /RMC2/cmd_vel -v | tee ~/equipment-audit/cmd_vel.txt +ros2 topic info /RMC2/odometry -v | tee ~/equipment-audit/odometry.txt +ros2 topic info /RMC2/scan_front -v | tee ~/equipment-audit/scan_front.txt +ros2 topic info /RMC2/aruco_id -v | tee ~/equipment-audit/aruco_id.txt + +timeout 5 ros2 topic hz /RMC2/odometry +timeout 5 ros2 topic hz /RMC2/scan_front +ros2 topic echo /RMC2/odometry --once +ros2 topic echo /RMC2/aruco_id --once + +ros2 run tf2_ros tf2_echo RMC2/odom RMC2/base_link +ros2 run tf2_ros tf2_echo RMC2/odom aruco_0 +ros2 run tf2_tools view_frames +mv frames.pdf ~/equipment-audit/ 2>/dev/null || true +``` + +Для RMC1 повторите команды с пространством имён `RMC1`. Номер в `aruco_0` +замените меткой, над которой реально стоит робот. Если ожидаемого топика нет, +сначала найдите аналог через `ros2 topic list -t`, а не создавайте пустой топик с +нужным названием. + +### Как адаптировать решение + +| Ситуация | Что делать | +| --- | --- | +| Данные те же, отличается только имя топика | Заменить имя в конфигурации/константах до контрольной попытки. В `basic/drive_to_aruco.py` для лидара есть `--scan-topic`. | +| Топик есть, но сообщения не приходят | Проверить активный launch, namespace, `ROS_DOMAIN_ID`, `RMW_IMPLEMENTATION`, сеть и QoS через `ros2 topic info -v`. | +| Вместо `LaserScan` выдаётся другой `LaserScan`-топик | Подставить его имя и проверить `frame_id`, направление нулевого угла, `range_min/max` и сектор перед роботом. | +| Вместо `LaserScan` доступен только `PointCloud2` | Нужен штатный преобразователь облака в scan или отдельная обработка `PointCloud2`; простой rename топика не поможет. | +| `aruco_id` имеет другой формат | Исправить тип подписки и callback. Если публикуется только изображение, сначала нужен штатный ArUco-детектор. | +| ID метки есть, но нет её относительной позы/TF | Одного ID недостаточно для точного центрирования. Найти топик позы метки либо настроить TF из штатного детектора. | +| Нет `/RMC2/odometry`, но есть TF `RMC2/odom -> RMC2/base_link` | Положение можно читать из TF вместо сообщения `Odometry`; потребуется небольшая замена источника позы в скрипте. | +| Есть только энкодеры колёс | Использовать штатный драйвер/локализатор, который формирует odometry и TF. Самостоятельное интегрирование допустимо только после проверки кинематики и масштаба. | +| Нет ни odometry, ни TF, ни позы относительно меток | Безопасная координатная навигация текущим алгоритмом невозможна. Зафиксировать отсутствие интерфейса и сразу сообщить эксперту. | +| Команды движения имеют другой тип, сервис или action | Нужен адаптер к реальному драйверу; публикация `Twist` в новый топик проблему не решит. | + +После подключения данных сначала запустите только наблюдение: + +```bash +python3 basic/watch_robot.py --robot RMC2 +``` + +Затем проверьте аппаратный STOP и короткую команду на минимальной скорости. Только +после этого запускайте движение между соседними ArUco. До контрольной попытки +также измерьте шаг сетки, направления осей, габариты корпуса, безопасную скорость, +тормозной путь и реальные положения lidar. Во время самой контрольной попытки код +и интерфейс уже нельзя исправлять. + ## Запуск модулей | Модуль | Решение | Основной запуск |