Appearance
ПР05. Описание робота: tf2, URDF и Xacro
Работа обязательна для обеих траекторий. Рассчитывайте на одну лабораторную пару и примерно 2 часа самостоятельной доработки.
Цель
Собрать параметризованную модель Ackermann-робота в URDF/Xacro, связать корпус, камеру, лидар и IMU в одном дереве tf2 и доказать корректность геометрии, столкновений и инерции структурными проверками.
Критерии зачтено
Работа зачтена, когда выполнены все три стадии и прошла автопроверка:
| Стадия | Что требуется |
|---|---|
| 1 · Собрать | robot_state_publisher + развёрнутый Xacro, модель открывается в RViz, дерево связно |
| 2 · Сломать | сенсор прикреплён не к тому звену и один тензор инерции физически невозможен |
| 3 · Доказать | обе ошибки исправлены, frames.md фиксирует владельцев, check_urdf и тесты зелёные |
| Автопроверка | check_practice.py PR05 проверит src/**/*.urdf.xacro, evidence/pr05/{frames.md,model-check.txt} и заявления public_tests_passed, defect_reproduced, defect_fixed |
Что получится
Вы соберёте параметризованную модель Ackermann-робота, свяжете корпус, камеру, лидар и IMU в одном дереве tf2 и проверите геометрию, столкновения и инерцию разными инструментами.
Пакеты и понятия
course_description— пакет описания робота; основной файл —urdf/vehicle.urdf.xacro(Xacro-макросы разворачиваются в URDF командойxacroперед проверкой).base_link, камера, лидар, IMU — звенья с собственными системами координат (frame); фреймы связываются преобразованиями (joint), и каждое преобразование публикует ровно один участник.visual— геометрия для отображения,collision— для столкновений,inertial— масса и тензор инерции (должен быть физически возможным).
| Понятие | Что означает |
|---|---|
robot_state_publisher | нода, которая по robot_description + joint_states публикует /tf и /tf_static |
view_frames | инструмент: сохраняет всю картину дерева преобразований |
tf2_echo <parent> <child> | проверка одной связи дерева |
Что сделать
- Запустите
robot_state_publisher, разверните Xacro в URDF и откройте модель в RViz. Модель должна соответствовать единицам СИ. - Параметризуйте базу, колею и радиус колеса (Xacro-переменные, не магические числа). Добавьте
base_link, системы координат камеры, лидара и IMU; задайте геометрию отображения и столкновений отдельно. - В исходной модели сенсор прикреплён не к тому звену, а один тензор инерции физически невозможен. Исправьте обе ошибки и добавьте структурные тесты — сначала показывающие сбой, затем зелёные.
Порядок диагностики:
- В RViz прочитать
Global Statusи status конкретных Displays, не менять offset вручную. - Сравнить результат для
Fixed Frame=mapиFixed Frame=odom: смена frame помогает локализовать разрыв, но не исправляет его. - Проверить одну связь через
tf2_echo, затем всё дерево черезview_frames. - Сопоставить timestamp исходного сообщения с доступным tf-буфером.
- Найти единственного владельца каждого меняющегося преобразования.
Сохраните .urdf.xacro и evidence/pr05/{frames.md,model-check.txt,report.json}. frames.md фиксирует родительское и дочернее звенья каждой связи, ожидаемое преобразование и владельца публикации.
Проверка
bash
xacro src/course_description/urdf/vehicle.urdf.xacro > /tmp/vehicle.urdf
check_urdf /tmp/vehicle.urdf
colcon test --packages-select course_description
python3 /path/to/course/tools/check_practice.py PR05 --submission .Готово, если дерево связно и ациклично, используются единицы СИ, а меняющиеся преобразования не публикуются двумя нодами. Дополнительно: вынесите общие геометрические параметры URDF и SDF в одну конфигурацию или проверяйте их тестом.
Для воспроизводимого отчёта сохраните команды и результаты до/после:
bash
ros2 run tf2_ros tf2_echo base_link lidar_link
ros2 run tf2_tools view_frames
ros2 topic echo /tf_static --onceКак работаем на лабораторной
После разбора QoS найдите разорванную связь через view_frames. Затем исправьте Xacro-макрос или начните таблицу систем координат сенсоров.
Общий порядок: runbook · troubleshooting.
Если использовался ИИ, применяются правила курса.