URDF: описание робота

Чтобы ROS знал форму и устройство робота, его описывают в формате URDF.

URDF (Unified Robot Description Format) — XML-формат описания робота: из каких звеньев он состоит, как они соединены сочленениями, какие у них размеры и где датчики.

Зачем описывать робота

Многие вещи в ROS требуют знать геометрию робота. TF2 должен знать, что лидар стоит на 20 см выше центра — иначе не свяжет кадры. RViz рисует робота — ему нужна форма. Gazebo симулирует физику — нужны массы и размеры. Вместо того чтобы зашивать это в каждый узел, робота описывают один раз в URDF, и все компоненты берут данные оттуда.

Звенья и сочленения

URDF строится из двух сущностей:

  • link (звено) — жёсткая часть робота: корпус, колесо, лидар. У звена есть форма (visual), область столкновений (collision) и масса (inertial).
  • joint (сочленение) — соединение двух звеньев. Оно задаёт, где дочернее звено относительно родителя и как оно может двигаться: fixed (жёстко), continuous (вращение без предела — колесо), revolute (поворот в пределах — сустав руки), prismatic (выдвижение).

Пример: корпус и колесо

URDF — это XML, помечаем language-text (внутри экранированы угловые скобки):

<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry><box size="0.3 0.3 0.1"/></geometry>
    </visual>
  </link>

  <link name="left_wheel">
    <visual>
      <geometry><cylinder radius="0.05" length="0.02"/></geometry>
    </visual>
  </link>

  <joint name="left_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel"/>
    <origin xyz="0 0.16 0"/>
    <axis xyz="0 1 0"/>
  </joint>
</robot>

Здесь корпус — коробка 30×30×10 см, левое колесо — цилиндр, прикреплённый сочленением со смещением 16 см вбок и осью вращения по Y.

Связь URDF и TF

Каждое сочленение URDF превращается в преобразование TF. Узел robot_state_publisher читает URDF и публикует все статические преобразования (например, base_link -> laser) в /tf_static, а для подвижных сочленений берёт углы из топика /joint_states и публикует динамические преобразования. Так URDF автоматически наполняет дерево TF — вам не нужно вручную считать, где что находится.

Xacro — макросы для URDF

Чистый URDF многословен: два одинаковых колеса описываются дважды. Поэтому на практике используют xacro — надстройку с макросами и переменными. Один макрос «колесо» с параметром стороны разворачивается в полный URDF при сборке. Для робота с шестью одинаковыми ногами это экономит сотни строк.

Как работает под капотом

URDF загружается в параметр robot_description. Любой узел, которому нужна модель (RViz, Gazebo, robot_state_publisher), читает этот параметр. Xacro-файлы сначала «разворачиваются» командой в обычный URDF-XML, и только потом загружаются. Геометрия collision (для физики) часто упрощается относительно visual (для красоты): сложную модель корпуса в симуляции заменяют простым ящиком — так физика считается быстрее.

Частые ошибки

  • Неэкранированный XML или незакрытый тег. URDF не распарсится; проверяйте парность тегов.
  • Неверная ось joint. Колесо «вращается не туда» — перепутана axis xyz.
  • Звено без inertial для Gazebo. Без массы и инерции физический движок ведёт себя странно или роняет робота.

Итоги

  • URDF — XML-описание робота: звенья (link) и сочленения (joint).
  • Типы joint: fixed, continuous, revolute, prismatic.
  • robot_state_publisher превращает URDF в преобразования TF.
  • Xacro добавляет макросы и переменные, сокращая URDF.
Проверьте себя
1. Что описывает URDF?
AМаршрут робота
BУстройство робота: звенья и сочленения, их геометрию и связи
CСписок топиков
DПараметры сети
2. Какой тип joint подходит для колеса?
Afixed
Bcontinuous
Cprismatic
DНикакой
3. Какой узел превращает URDF в преобразования TF?
Arqt_graph
Brobot_state_publisher
Ccolcon
Dtf2_echo