Using Xacro to clean up your code — ROS 2 Documentation: Jazzy documentation
Using Xacro to clean up your code — ROS 2 Documentation: Jazzy documentation
By now, if you’re following all these steps at home with your own robot design, you might be sick of doing all sorts of math to get very simple robot descriptions to parse correctly. Fortunately, you can use the xacro package to make your life simpler. I
docs.ros.org
Xacro
- 로봇 모델을 효율적으로 작성하기 위해서 사용되는 XML 기반 매크로 언어이다.
복잡한 로봇 모델을 더 간결하고 재사용 가능하게 해준다. - 사용하는 이유
- URDF 파일은 로봇의 link , joint , sensor 등을 정의하는 데 사용하지만, 복잡한 구조를 가진 로봇의 경우에는 많은 중복되는 코드가 생긴다. 이때 Xacro를 사용하면, 매크로 기능으로 중복을 줄이고 유지보수가 용이하게 할 수 있다.
Goal
- URDF 코드안에서 중복되는 부분을 줄이기 위해서 Xacro를 사용해볼 것 이다.
- 앞의 URDF의 예제를 보면 간단한 로봇을 만들기 위해서 수많은 수학 계산을 하였다.
다행히도, Xacro를 사용하면 이러한 작업을 더 간단하게 할수있다.
Xacro는 아래 3가지의 유용한 기능을 제공한다.- 1. constants 상수
- 2. simple math 간단한 수학 연산
- 3. macros 매크로
- 이번 튜토리얼에서는 이러한 기능들을 살펴보면 URDF 파일의 크기를 줄이고, 읽기와 유지 보수를 더 쉽게 만들어보자.
Using Xacro
- 이름에서도 알수있듯이, Xacro는 XML을 위한 매크로 언어이다.
Xacro 프로그램은 모든 매크로를 실행한 후 결과를 출력한다. - 아래의 코드는 기본적인 사용법이다.
xacro model.xacro > model.urdf
- 또한, Launch 파일 내에서도 URDF를 자동으로 생성하는 것이 가능하다.
이렇게 한다면 항상 최신 상태를 유지할 수 있으며 디스크 공간도 절약하는 것이 가능하다.- 대신에 URDF를 생성하는데 시간이 소요되니, Launch파일 시작이 약간 지연 될수도 있다.
- Launch 파일에서 Xacro를 실행하려면 아래와 같은 형식으로 입력하면 된다.
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.substitutions import Command
from launch_ros.substitutions import FindPackageShare
from launch_ros.parameter_descriptions import ParameterValue
# urdf 파일의 경로를 정의
# turtlebot_3_burger 패키지의 urdf 폴더안의 turtlebot3_burger.urdf를 가르킨다.
# FindPackageShare은 패키지의 경로를 찾는것
path_to_urdf = FindPackageShare('turtlebot3_description') / 'urdf' / 'turtlebot3_burger.urdf'
# robot_state_publisher 노드를 생성
# 해당 노드는 URDF파일을 읽고 로봇의 상태 정보를 publish하는 역할을 한다.
robot_state_publisher_node = Node(
package='robot_state_publisher', # 사용하려는 패키지
executable='robot_state_publisher', # 실행할 노드 이름
parameters=[{ # 노드에 전달한 매개 변수 설정
'robot_description': ParameterValue( # URDF을 담는 매개변수 이름
Command(['xacro ', str(path_to_urdf)]), value_type=str
)
}]
)
- 간편하게 load하는 방법: urdf_launch 패키지를 사용하면 Xacro/URDF를 자동으로 불러올 수 있다.
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.substitutions import PathJoinSubstitution
from launch_ros.substitutions import FindPackageShare
def generate_launch_description():
ld = LaunchDescription()
ld.add_action(IncludeLaunchDescription(
PathJoinSubstitution([FindPackageShare('urdf_launch'), 'launch', 'display.launch.py']),
launch_arguments={
'urdf_package': 'turtlebot3_description',
'urdf_package_path': PathJoinSubstitution(['urdf', 'turtlebot3_burger.urdf'])
}.items()
))
return ld
- Xacro 파일의 기본 구조
- URDF 파일의 상단에는 namespace를 지정해야 파일이 올바르게 parsing된다.
아래는 예시...
- URDF 파일의 상단에는 namespace를 지정해야 파일이 올바르게 parsing된다.
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="firefighter">
Constants 상수
- URDF는 아래와 같이 같은 값을 여러번 반복해야 할수도있다.
- 아래 코드는 length와 radius를 2번 정의하였다.

- 아래 코드를 보면 위에서 반복한 부분을 <xacro:property name="width" value="0.2" />와 <xacro:property name="bodylen" value="0.6" />을 사용하여 코드를 개선하였다.
- ${}를 사용하여 정의된 속성의 값을 사용한다.

Math 수학연산
- Xacro는 기본적인 수학 연산(+,-,*,/)을 지원한다.
- 삼각함수도 사용 가능

Macros 매크로
- 이는 코드의 재사용성을 높여준다.
- 아래는 간단한 매크로이다.

- 아래는 파라미터 매크로이다. 이렇게 하면 좀 더 유연하게 구성하는 것이 가능하다.
- <xacro:default_inertial mass="10" /> 과 같은 형식으로 사용한다.

- 이렇게도 사용가능
<xacro:macro name="leg" params="prefix reflect">
<link name="${prefix}_leg">
<visual>
<geometry>
<box size="${leglen} 0.1 0.2"/>
</geometry>
<origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
<material name="white"/>
</visual>
<collision>
<geometry>
<box size="${leglen} 0.1 0.2"/>
</geometry>
<origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
</collision>
<xacro:default_inertial mass="10"/>
</link>
<joint name="base_to_${prefix}_leg" type="fixed">
<parent link="base_link"/>
<child link="${prefix}_leg"/>
<origin xyz="0 ${reflect*(width+0.02)} 0.25" />
</joint>
</xacro:macro>
<xacro:leg prefix="right" reflect="1" />
<xacro:leg prefix="left" reflect="-1" />'ROS 2' 카테고리의 다른 글
| URDF : Using URDF with robot_state_publisher (1) | 2025.02.04 |
|---|---|
| tf2 : Introducing tf2 (0) | 2025.02.04 |
| URDF : Adding physical and collision properties (0) | 2025.02.04 |
| URDF : Building a movable robot model (0) | 2025.02.03 |
| URDF :Building a visual robot model from scratch (0) | 2025.02.03 |