URDF, или Unified Robotics Description Format, - спецификация XML, используемая в научных и промышленных кругах для моделирования многофюзеляжных систем, таких как роботизированные манипуляторы для изготовления сборочных линий и аниматронные роботы для парков развлечений. URDF особенно популярен у пользователей ROS, или Robotics Operating System - инфраструктуры, которая предлагает стандартную поддержку моделей URDF. Можно импортировать модели URDF в среду Simscape™ Multibody™, например, для моделирования, анализа и управления задачами проектирования. Простой пример использования см. в примере Humanoid Robot.
Модель URDF робота-гуманоида

Как и другие типы XML-файлов, файлы URDF содержат различные элементы XML, такие как <robot>, <link>, <joint>, вложенный в иерархические структуры, известные как XML-деревья. Например, <link> и <joint> элементы, о которых говорят, что они являются детьми <robot> элемент и, соответственно, <robot> элемент, являющийся родительским элементом <link> и <joint> элементы.
<robot> <link> ... </link> <link> ... </link> <joint> ... </joint> </robot>
Дочерние элементы, такие как <link> и <joint> под <robot>, может, в свою очередь, иметь собственные дочерние элементы. Например, <link> элемент имеет дочерние элементы <inertial> и <visual>. <visual> элемент имеет дочерние элементы <geometry> и <material>. И <material> элемент имеет дочерний элемент <color>. Такие цепочки дочерних элементов необходимы для определения свойств и поведения родительских элементов.
<robot> <link> <inertial> ... </inertial> <visual> <geometry> ... </geometry> <material> <color /> </material> </visual> </link> ... </robot>
Помимо дочерних элементов, XML-элементы в модели URDF могут иметь атрибуты. Например, <robot>, <link>, и <joint> все элементы имеют атрибут <name>- строка, служащая для идентификации элемента. <color> элемент имеет атрибут rgba- числовой массив с красным, зеленым, синим и альфа-значениями (или непрозрачностью) цвета ссылки. Такие атрибуты помогают полностью определить элементы в модели.
<robot name = "linkage"> <link name = "root link"> <inertial> ... </inertial> <visual> <geometry> ... </geometry> <material> <color rgba = "1 0 0 1" /> </material> </visual> </link> ... </robot>
Связи URDF соединяются через соединения в иерархических структурах, отличных от структур, сформированных вложением XML-элементов в файл URDF. <joint> элементы усиливают эти иерархии через <parent> и <child> элементы, которые идентифицируют одну связь как родительскую, а другую как дочернюю. Родительские связи сами по себе могут быть дочерними - и дочерними связями родителей - других связей в модели.
<parent> и <child> Совместные элементы
<robot name = "linkage"> <joint name = "joint A ... > <parent link = "link A" /> <child link = "link B" /> </joint> <joint name = "joint B ... > <parent link = "link A" /> <child link = "link C" /> </joint> <joint name = "joint C ... > <parent link = "link C" /> <child link = "link D" /> </joint> </robot>
Соединения между связями можно визуализировать с помощью схемы, известной как график связности. На рисунке показан пример. Окружности обозначают звенья, а стрелки - соединения. Корни стрелок определяют родительские узлы, а стрелки указывают на дочерние узлы. Граф связности показывает топологию базовой модели - здесь простое кинематическое дерево с двумя ветвями.
График связности кинематического дерева

Топология модели важна в URDF. Граф связности модели может принимать форму только кинематического дерева - кинематической цепи, разветвлённой или неразветвлённой, то есть всегда открытой. Кинематические петли, каждая из которых представляет собой замкнутую цепь, образованную соединением концов иначе открытой цепи, не допускаются. Это ограничение влияет на то, как<link> элементы могут соединяться в модели URDF.
Ограничение преобразуется в следующее правило: нет <link> элемент может служить дочерним узлом в нескольких <joint> элемент. По-другому, нет <link> элемент может иметь более одного родительского элемента в графике связности модели. Только корневая связь, которая находится в начале графа связности, может иметь число родительских узлов, отличное от одного (нуля). В модели допускается только одно корневое звено.
Пример URDF кинематического контура
<robot name = "linkage"> <joint name = "joint A ... > <parent link = "link A" /> <child link = "link B" /> </joint> <joint name = "joint B ... > <parent link = "link A" /> <child link = "link C" /> </joint> <joint name = "joint C ... > <parent link = "link C" /> <child link = "link D" /> </joint> <joint name = "joint D ... > <parent link = "link B" /> <child link = "link D" /> </joint> </robot>
Код объявляет ссылку, link D, как дочерний узел в двух <joint> элементы, joint C и joint D. link D элемент имеет два родителя и образует кинематическую петлю. Модель нарушает правила подключения URDF и является недопустимой. На рисунке показан график связности модели.
График связности кинематического контура

Не все элементы и атрибуты, перечисленные в спецификации URDF, являются обязательными. Некоторые, как <inertial> под <link>, являются необязательными. Следующий код показывает различные элементы и атрибуты, которые можно использовать, с теми, которые являются необязательными зелеными.
Элементы и атрибуты, отображаемые как обязательные внутри необязательных элементов, являются таковыми только в том случае, если используются необязательные элементы. Значения необязательных атрибутов по умолчанию показаны в скобках и курсивом. Обратите внимание, что этот код включен только в качестве ссылки и не представляет допустимую модель URDF. Эллипсы (... «») недопустимы в моделях URDF и используются просто для разрыва длинных строк кода для удобства просмотра .
<robot name> <link name> <inertial> <origin xyz("0 0 0") rpy("0 0 0") /> <mass value /> <inertia ixx iyy izz ixy ixz iyz /> </inertial> <visual name> <origin xyz("0 0 0") rpy("0 0 0") /> <geometry> <box size /> <cylinder radius length /> <sphere radius /> <mesh filename scale("1") /> </geometry> <material name> <color rgba("0.5 0.5 0.5 1") /> <texture filename /> </material> </visual> <collision name> <origin xyz("0 0 0") rpy("0 0 0") /> <geometry> <box size /> <cylinder radius length /> <sphere radius /> <mesh filename scale("1") /> </geometry> </collision> </link> <joint name type> <origin xyz("0 0 0") rpy("0 0 0") /> <parent link /> <child link /> <axis xyz("1 0 0") /> <calibration rising /> <calibration falling /> <dynamics damping("0") friction("0") /> <limit† lower† upper† effort velocity /> <mimic joint multiplier("1") offset("0") /> <safety_controller soft_lower_limit("0") ... ... soft_upper_limit("0") k_position("0") k_velocity("0") /> </joint> </robot>
† Требуется для<joint> элементы type prismatic и revolute только.
В качестве примера создайте модель URDF двойного маятника. В выбранном текстовом редакторе создайте файл с кодом, показанным ниже, и сохраните файл как double_pendulum.urdf в удобной папке. Включите расширение файла в имя файла. В отдельном примере показано, как импортировать эту модель в среду Simscape Multibody (см. Импорт простой модели URDF).
<robot name = "linkage"> <!-- links section -->> <link name = "link A"> <inertial> <origin xyz = "0 0 0" /> <mass value = "0.5" /> <inertia ixx = "0.5" iyy = "0.5" izz = "0.5" ixy = "0" ixz = "0" iyz = "0" /> </inertial> <visual> <origin xyz = "0 0 0" /> <geometry> <box size = "0.5 0.5 0.1" /> </geometry> <material name = "gray A"> <color rgba = "0.1 0.1 0.1 1" /> </material> </visual> </link> <link name = "link B"> <inertial> <origin xyz = "0 0 -0.5" /> <mass value = "0.5" /> <inertia ixx = "0.5" iyy = "0.5" izz = "0.5" ixy = "0" ixz = "0" iyz = "0" /> </inertial> <visual> <origin xyz = "0 0 -0.5" /> <geometry> <cylinder radius = "0.05" length = "1" /> </geometry> <material name = "gray B"> <color rgba = "0.3 0.3 0.3 1" /> </material> </visual> </link> <link name = "link C"> <inertial> <origin xyz = "0 0 -0.5" /> <mass value = "0.5" /> <inertia ixx = "0.5" iyy = "0.5" izz = "0.5" ixy = "0" ixz = "0" iyz = "0" /> </inertial> <visual> <origin xyz = "0 0 -0.5" /> <geometry> <cylinder radius = "0.05" length = "1" /> </geometry> <material name = "gray C"> <color rgba = "0.5 0.5 0.5 1" /> </material> </visual> </link> <!-- joints section -->> <joint name = "joint A" type = "continuous"> <parent link = "link A" /> <child link = "link B" /> <origin xyz = "0 0 -0.05" /> <axis xyz = "0 1 0" /> </joint> <joint name = "joint B" type = "continuous"> <parent link = "link B" /> <child link = "link C" /> <origin xyz = "0 0 -1" /> <axis xyz = "0 1 0" /> <dynamics damping ="0.002" /> </joint> </robot>
Код определяет модель с несколькими телами с именем linkage. Модель содержит три связи с именем link A, link B и link C, которые соединяются через два соединения, с именем joint A и joint B. <parent> и <child> элементы соединений определяют, как звенья соединяются друг с другом: link A подключается к link B и link B подключается к link C. link A не имеет родительской ссылки - то есть она отображается в<joint> элементы только как дочерний элемент - и, следовательно, является корневым звеном.
<inertial> элемент link A определяет массу и моменты инерции (ixx, iyy, izz) канала. Продукты инерции (ixy, ixz, и iyz) не указаны и имеют нулевое значение URDF по умолчанию. visual элемент link A определяет тип геометрии и цвет материала для использования в визуализации модели. Геометрия в этом случае является рамкой с шириной и толщиной 0.5 м и высота 0.1 М. <origin> элементы ссылки <inertial> и <visual> задание преобразований из опорного кадра связи в инерционный и визуальный опорные кадры. Аналогичные элементы применяются к link B и link C.
type атрибут <joint> элементы определяют соединения как непрерывные - тип поворотного соединения без пределов перемещения. <origin> элемент определяет местоположение соединения относительно опорной рамки родительского элемента связи. Например, <origin> элемент joint A смещает соединение 0.05 м вдоль -Z оси относительно начала координат link A ОПОРНАЯ РАМКА. axis элемент вложен внутри каждого joint элемент определяет ось вращения соединения как декартовый вектор [0, 1, 0], или +Y.
На рисунке показаны компоненты модели - звенья и соединения - и различные рамки, которые они содержат. R обозначает опорный кадр линии связи, I - инерционный кадр линии связи и V - визуальный кадр линии связи. J обозначает совместную опорную рамку - по определению, совпадающую с опорной рамкой дочернего звена. Инерционные и визуальные рамки смещены к центрам звеньев, а соединительные рамки - к их нижним краям.
Компоненты модели с двойным маятником

Можно вручную создать собственные файлы URDF, но обычно это не требуется. Для более сложных моделей может быть предпочтительным получение файлов URDF из других источников. Производители робототехники и консультанты часто предоставляют модели URDF для своих роботизированных систем. CAD-приложения, такие как SolidWorks ® и PTC ® Creo™, поддерживают экспортеры URDF, которые преобразуют CAD-сборки в модели URDF. Рассмотрим эти варианты при работе со сложными моделями робототехники, которые могут быть несложными при создании вручную.