Skip to content

ПР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>проверка одной связи дерева

Что сделать

  1. Запустите robot_state_publisher, разверните Xacro в URDF и откройте модель в RViz. Модель должна соответствовать единицам СИ.
  2. Параметризуйте базу, колею и радиус колеса (Xacro-переменные, не магические числа). Добавьте base_link, системы координат камеры, лидара и IMU; задайте геометрию отображения и столкновений отдельно.
  3. В исходной модели сенсор прикреплён не к тому звену, а один тензор инерции физически невозможен. Исправьте обе ошибки и добавьте структурные тесты — сначала показывающие сбой, затем зелёные.

Порядок диагностики:

  1. В RViz прочитать Global Status и status конкретных Displays, не менять offset вручную.
  2. Сравнить результат для Fixed Frame=map и Fixed Frame=odom: смена frame помогает локализовать разрыв, но не исправляет его.
  3. Проверить одну связь через tf2_echo, затем всё дерево через view_frames.
  4. Сопоставить timestamp исходного сообщения с доступным tf-буфером.
  5. Найти единственного владельца каждого меняющегося преобразования.

Сохраните .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.

Если использовался ИИ, применяются правила курса.

Официальные источники

Учебные материалы: CC BY 4.0 · Код: Apache-2.0