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.