URDF 와 XACRO 이해하기
저작권: 쿼드(QUAD) 드론연구소 https://www.youtube.com/@quad-robotics
로봇 시스템을 만들 때 로봇의 물리적 특성에 대해 알아야 하는 다양한 소프트웨어 구성 요소가 있을 수 있습니다. 일관성과 단순성을 위해 이 모든 정보를 모든 코드에서 참조할 수 있는 하나의 공통 위치에 보관하는 것이 좋습니다.
ROS에서는 이것을 로봇 설명이라고 부르며 정보는 URDF(Unified Robot Description Format) 파일에 저장됩니다. 지난 튜토리얼에서 URDF 파일을 간략하게 접했고 이번 튜토리얼에서는 직접 작성하는 방법에 대해 자세히 알아볼 것입니다.
완전한 URDF 파일을 열면 정말 혼란스러워 보일 수 있습니다. 일반적으로 길고 많은 기호와 단어가 포함되어 있어 압도적일 수 있습니다. 하지만 좀 더 자세히 살펴보고 분해하면 몇 가지 간단한 구조가 계속해서 반복되어 구성되어 있음을 알 수 있습니다. 이러한 구조를 살펴본 다음 예제 파일을 살펴보겠습니다.
URDF는 로봇을 관절 로 연결된 링크 트리로 설명합니다 . 링크는 로봇의 물리적 구성 요소를 나타내고 관절은 한 링크가 다른 링크에 대해 상대적으로 이동하는 방법을 나타내며 공간에서 링크의 위치를 효과적으로 정의합니다.

URDF 파일을 작성할 때 로봇을 링크(및 관절)로 현명하게 분할하는 방법을 알아내야 합니다. 링크/조인트를 지정하는 두 가지 주요 이유가 있습니다.
로봇의 일부가 다른 부분(예: 로봇 팔의 각 세그먼트)에 대해 상대적으로 움직입니다.
다른 부분에 대해 상대적으로 움직이지 않지만 자체 기준점과 변형이 있으면 편리한 부분(일반적인 예는 카메라나 라이더와 같은 센서의 위치일 것입니다)
이러한 시나리오를 다루기 위해 조인트(두 링크 사이의 연결)를 정의할 때 조인트 유형 을 선택해야 합니다 . 몇 가지 유형이 있지만 가장 일반적인 유형은 다음과 같습니다.
Revolute - 최소/최대 각도 제한이 있는 회전 동작입니다.
Continuous - 제한이 없는 회전 운동(예: 바퀴).
Prismatic - 최소/최대 위치 제한이 있는 선형 슬라이딩 동작입니다.
Fixed - 하위 링크가 상위 링크에 견고하게 연결되어 있습니다.

이를 좀 더 잘 이해하기 위해 URDF의 실제 형식을 살펴보겠습니다.
URDF 구문
URDF는 XML을 기반으로 하므로 모든 것이 중첩될 수 있는 일련의 태그로 표시됩니다. 우리가 사용할 수 있는 많은 다른 태그가 있지만 알아야 할 세 가지 주요 태그가 있습니다.
로봇 태그 및 XML 선언
적절한 XML 파일은 첫 번째 줄에 XML 선언/프롤로그가 있어야 하며 그 다음에는 다른 모든 태그가 내부에 있는 단일 태그(루트 태그라고 함)가 있어야 합니다. URDF 파일의 경우 이 루트 태그가 태그가 되며 robot
지금 여기서 주목해야 할 유일한 사항은 name
(당연히) 로봇의 이름을 지정할 수 있는 속성을 설정할 수 있다는 것입니다.
<?xml version="1.0"?>
<robot name="my_robot">
...
all the rest of the tags
...
</robot>
link 태그
링크 태그를 사용하면 먼저 링크의 이름과 몇 가지 추가 특성 visual, collision, inertial
을 지정할 수 있습니다 . 이러한 추가 태그는 일반적으로 선택 사항이지만 시뮬레이션과 같은 특정 상황에서는 필요합니다(이후 자습서에서 다룰 예정).
Visual - 이것이 RViz 및 Gazebo에서 볼 수 있는 것입니다. 세 가지 측면을 지정할 수 있습니다.
Geometry(외형) -
box
/cylinder
/sphere
크기 매개변수 포함 또는mesh
Origin(원점) - 링크 원점을 중심으로 할 필요가 없도록 지오메트리에 대한 오프셋
Material(재질) - 기본적으로 색상입니다. 선언된 재료의 이름을 지정하거나 색상을 직접 설명할 수 있습니다. (이렇게 하면 RViz에서는 색상이 설정되지만 Gazebo에서는 설정되지 않습니다. 이에 대해서는 다음 튜토리얼에서 자세히 설명합니다.)
Collision(충돌) - 물리 충돌 계산에 사용됩니다. 다음을 설정할 수 있습니다.
Geometry 및 Origin - 비주얼과 동일한 옵션입니다. 이것은 종종 Visual 태그에서 복사하여 붙여넣지만 계산상의 이유로 더 간단한 충돌 지오메트리가 필요할 수 있습니다.
Inertial(관성) - 물리 계산에도 사용되지만 링크가 힘에 반응하는 방식을 결정합니다. 관성 속성은 다음과 같습니다.
Mass(질량) - 링크의 질량
Origin(원점) - 질량 중심 (일명 무게 중심). 이것은 링크가 "균형을 잡을" 수 있는 지점입니다(3D에서 약간 더 혼란스러운 개념). 대부분의 간단한 경우에 이것은 단지 중심일 것입니다(시각/충돌과 동일한 원점).
매우 정밀한 컨트롤러를 설계하지 않는 한 이러한 매개변수, 특히 관성 매개변수에 약간의 흔들림이 있을 수 있습니다. 그리고 모든 링크에 이 모든 것이 필요한 것은 아닙니다! 또한 원하는 경우 단일 링크에 대해 여러 시각적 및 충돌 태그를 가질 수 있으므로 이를 결합하여 더 복잡한 모양을 만들 수 있습니다.
이 이미지는 링크 태그의 전체 구조를 보여줍니다. 자습서의 마지막 부분에서 작업 예제를 자세히 살펴보겠습니다.

Joint 태그
우리는 일반적으로 로봇이 링크로 구성되어 있다고 생각하지만 실제로 Joint(관절)은 링크 위치를 정의하고 서로 상대적으로 움직이는 방식을 정의하므로 로봇의 구조 측면에서 모든 세부 사항이 있는 곳입니다. 이것은 TF 시스템에 대한 이전 튜토리얼과 유사합니다. 여기서 우리는 궁극적으로 프레임과 상호 작용하기를 원하지만 실제로는 프레임이 있는 위치를 정의하는 변환 이므로 프레임을 올바르게 설정하는 것이 중요합니다.
각 관절에는 다음이 지정되어야 합니다.
Name(이름) - 관절의 이름입니다. 이것이 없으면 일부는 여전히 작동하지만 다른 것들은 작동하지 않습니다. 만일을 대비하여 모두 이름을 지정하는 것이 좋습니다.
Type(유형) - 앞에서 언급한 조인트 유형(가장 많이 사용되는 네 가지 유형은
fixed
,prismatic
,revolute
및continuous
)입니다.Parent(상위) 및 Child(하위) 링크 - 조인트 사이의 관계를 정의하는 링크
Origin(원점) - 동작이 적용되기 전의 두 링크 간의 관계
fixed
조인트 의 경우 이러한 매개변수로 충분하지만 고정되지 않은 조인트의 경우 일반적으로 다른 특성을 지정하려고 합니다. 선택할 수 있는 몇 가지가 있지만 가장 일반적인 두 가지는 다음과 같습니다.
Axis - 따라가거나 움직일 축
Limit - 시스템의 다른 부분에서 예상할 수 있는 물리적 작동 제한입니다. 여기에는 다음이 포함될 수 있습니다.
Upper 및 Lower 포지션 제한 - 미터/라디안
Velocity 한계 - m/s 또는 rad/s
Effort 한계 - N 또는 Nm
아래는 마지막 예에서 살펴볼 조인트 중 하나의 스니펫입니다.

기타 태그들
robot, link, joint
태그는 URDF 파일을 구성하는 주요 태그이지만 여기에 국한되지 않습니다! URDF 사양의 일부인 몇 가지 다른 태그가 있지만 원하는 다른 태그도 추가할 수 있으며 필요하지 않은 경우 무시됩니다. 특정 노드는 이러한 추가 태그를 예상하고 사용할 수 있습니다.
접할 수 있는 몇 가지 일반적인 추가 태그는 다음과 같습니다.
material
- 색상에 "이름"을 한 번 지정한 다음 원하는 만큼 많은 링크에서 해당 이름을 재사용할 수 있습니다.gazebo
- Gazebo 시뮬레이션 환경에서 사용되는 특정 매개변수를 지정할 수 있습니다(자세한 내용은 다음 튜토리얼에서!).transmission
- 조인트가 물리적 액추에이터에 의해 구동되는 방식에 대한 자세한 정보를 제공합니다.
명명 규칙
작업하려면 모든 링크에 이름을 지정해야 하지만 모든 관절(joint)에도 이름을 지정하는 것이 좋습니다. 또한 ROS에서 설정한 규칙이든 우리만의 규칙이든 관계없이 규칙을 따라 명명 내에서 일관성을 유지하는 것이 좋습니다. 따를 수 있는 명명 규칙의 몇 가지 예는 다음과 같습니다.
링크/조인트를 쌍으로 유지하고 접미사
_link
및_joint
사용 (예arm_link
: 및arm_joint
)휴머노이드 로봇에 대한 ROS 규칙 을 따릅니다.
모바일 플랫폼용 ROS 규칙을 따릅니다.
XACRO
URDF의 예를 살펴보기 전에 ROS가 제공하는 도구( XML macro :xacro
의 줄임말 )에 대해 알아보는 것이 좋습니다. Xacro를 사용하면 다양한 방법으로 URDF 파일을 조작할 수 있지만 우리가 살펴볼 두 가지 주요 항목은 코드를 여러 파일로 분할하고 중복 코드를 피하는 것입니다.
robot
파일에서 xacro
를 사용하려면 태그에 아래와 같이 추가 비트가 포함되어 있는지 확인하기만 하면 됩니다. (이 특정 로봇 태그에는 이름이 없다는 것을 알 수 있습니다. 자세한 내용은 아래에 있습니다!) 원하는 경우 항상 xacro를 사용할 수 있도록 모든 로봇 태그에 이것을 넣는 것이 가장 쉽습니다.
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
그런 다음 실제로 URDF를 사용하고 싶을 때 마다 먼저 파일에 대해 xacro
소프트웨어를 실행해야 합니다 . 그러면 파일이 하나의 완전한 URDF "파일"(임시 메모리에 저장)로 처리됩니다. 이는여러 개의 파일이 들어가더라도 robot_description
토픽에 대한 하나의 메시지로 게시됩니다. 일반적으로 우리는 이와 같은 launch 파일을 사용하여 이 모든 작업을 수행합니다.

Xacro를 이용하여 코드 분할
URDF를 여러 파일로 분할할 수 있다는 것은 매우 크고 다루기 힘들 수 있기 때문에 유용합니다. 서로 다른 구성 요소를 분리하면 항목을 더 쉽게 찾고 변경할 수 있으며 버전 제어 소프트웨어(예: Git)를 사용할 때 변경된 내용을 빠르게 알 수 있습니다.
URDF를 분할하는 방법은 개별 개발자와 해당 하드웨어에 따라 다르지만 다른 파일의 한 예는 다음과 같습니다.
코어 로봇(링크 및 관절)
디스플레이에 사용할 재료(색상) 목록
센서 링크/조인트 및 해당 Gazebo 태그
매크로(다음 섹션에서 자세히 설명)
어떻게 작동할까요?
우선 로봇을 나타내는 하나의 "main" 파일이 있습니다. 평소와 같이 해당 robot
태그에는 name(위에서 언급한 xmlns:xacro
비트도 포함 )이 있습니다. 이 파일 안에 다른 파일을 "include"할 수 있습니다. 포함된 파일의 태그를 기본 파일에 복사하여 붙여넣는 것과 같습니다. 다른 파일을 포함하려면 다음과 같은 xacro:include
태그를 사용합니다 .
<xacro:include filename="first_file.xacro" />
이것이 작동하려면 포함된 파일도 약간 특별해야 합니다. 기본 파일과 마찬가지로 robot
태그 ( xmlns:xacro
비트 포함)가 있지만 이름을 지정할 필요는 없습니다. 그런 다음 로봇 태그 안에 포함하려는 모든 태그를 넣을 수 있습니다.
이름을 지정하면 포함된 파일을 독립 실행형 URDF로 처리할 수 있으며 이는 때때로 유용할 수 있습니다.
원하는 만큼(중첩 또는 연속) URDF/xacro 파일을 포함할 수 있으며 일반 태그뿐만 아니라 포함도 사용할 수 있습니다.
일반적으로 "main" URDF/xacro의 확장자는 .urdf .xacro
이지만 "included" 확장자는 약간 다를 수 있습니다. 때때로 그들은 단지 .xacro
를 사용하고, 때로는 .urdf .xacro
때로는 다른 확장자를 가질 수 있습니다.
Xacro를 이용하여 중복 코드 방지
프로그래밍에서 중요한 원칙은 DRY(Don't Repeat Yourself)입니다. 여러 곳에 동일한 절차나 정보가 있는 것은 다음과 같은 몇 가지 이유로 문제가 됩니다.
작성해야 하는 횟수가 많을수록 잘못 작성하게 될 가능성이 높아집니다.
프로세스 또는 데이터 일부를 변경해야 하는 경우 여러 위치에서 변경해야 하는 것이 번거롭습니다.
모든 위치를 변경하는 것을 기억하지 않으면 일관성 없는 시스템으로 끝나게 되어 재앙적인 결과를 초래할 수 있습니다(예: 코드의 한 부분이 100% 속도가 0.1m/s라고 생각하고 100% 속도를 요청합니다. 하지만 모터 컨트롤러 실제 100% 속도가 10m/s 이라면 곧 충돌이 발생합니다!)
Xacro가 URDF를 단순화하고 코드 반복이나 실수를 방지하는 데 도움이 되는 몇 가지 방법은 다음과 같습니다.
속성(property)
속성을 상수로 선언한 다음 나중에 사용할 수 있습니다.
<xacro:property name="arm_radius" value="0.5" />`
...
<cylinder radius="${arm_radius}" length="7" />
수학 연산
속성과 결합할 수도 있는 속성 내에서 수학 상수 및 연산자를 사용할 수 있습니다.
<cylinder length="${4*arm_radius + pi}">
매크로(Macro)
나중에 다시 사용할 수 있고 매개 변수에 따라 달라지는 템플릿인 매크로를 만들 수 있습니다. 아래 예는 상자의 관성 매개변수를 처리하는 매크로를 보여줍니다.
<xacro:macro name="inertial_box" params="mass x y z *origin">
<inertial>
<xacro:insert_block name="origin"/>
<mass value="${mass}" />
<inertia ixx="${(1/12) * mass * (y*y+z*z)}" ixy="0.0" ixz="0.0"
iyy="${(1/12) * mass * (x*x+z*z)}" iyz="0.0"
izz="${(1/12) * mass * (x*x+y*y)}" />
</inertial>
</xacro:macro>
...then ...
<xacro:inertial_box mass="12" x="2" y="3" z="4">
<origin xyz="0 2 4" rpy="0 0 0"/>
</xacro:inertial_box>
... will expand to ...
<inertial>
<origin xyz="0 2 4" rpy="0 0 0"/>
<mass value="12" />
<inertia ixx="25" ixy="0.0" ixz="0.0"
iyy="20" iyz="0.0"
izz="13" />
</inertial>
예제
아래는 URDF 파일과 포함된 파일의 예시입니다. 이것을 직접 실행하려면 이 저장소를 방문하십시오.

이제 자체 URDF 파일을 작성하는 방법을 알았으므로 로봇 시뮬레이터인 Gazebo를 사용할 준비가 되었습니다. 다음 자습서에서는 Gazebo를 사용하여 환경에서 로봇을 시뮬레이션하는 방법을 살
펴보겠습니다.
Last updated