ROS에서 로봇 구조를 정의하는 XML 포맷으로 로봇의 관절(joint), 링크(link), 형상(geometrt), 관성(inertia), 충돌 (collision) 속성 등을 설정한다.
turtlebot3 waffle urdf를 기반으로 로봇을 정의하는데 필요한 속성들을 알아보자.
<robot><robot name="turtlebot3_waffle" xmlns:xacro="http://ros.org/wiki/xacro">
</roobt>
URDF에서 로봇을 정의하는 최상위 태그로, 로봇의 이름을 정의한다.
<link>로봇의 개별적인 부품(부분)을 나타내는 요소이다.
외부의 힘을 받아도 원형이 변하지 않는 강체로 구성되어 있다.
로봇의 특정 요소의 위치와 뱡향을 정의한다.
<origin xyz="-0.064 0 0.0" rpy="0 0 0"/>
▫ xyz = "x y z" : x,y,z값의 위치 좌표 (m)
▫ rpy = "roll pitch yaw" : x,y,z의 회전 각도 (라디안)
로봇이 화면에서 어떻게 보일지 정의하며, 2가지 방법으로 표현할 수 있다.
<visual>
<geometry>
<mesh filename="package://turtlebot3_description/meshes/bases/waffle_base.stl" scale="0.001 0.001 0.001"/>
</geometry>
<material name="light_black"/>
</visual>
▫ geometry : 3D 형상(로봇의 실제 형상)을 정의하는 기본 틀
▫ mesh : 외부 3D 모델을 로드하여 형상을 정의할 수 있어 정밀한 로봇 모델 표현 가능하나, 계산 비용이 큼
로봇이 충돌 감지를 어떻게 할지 정의한다. 충돌감지는 geometry 에 정의된 형태 내에서 이루어진다.
<collision>
<origin xyz="-0.064 0 0.047" rpy="0 0 0"/>
<geometry>
<box size="0.266 0.266 0.094"/>
</geometry>
</collision>
로봇의 질량(mass)과 관성(inertial)을 정의힌다.
<inertial>
<mass value="1.3729096"/>
<inertia ixx="8.7002718e-03" ixy="-4.7576583e-05" ixz="1.1160499e-04"
iyy="8.6195418e-03" iyz="-3.5422299e-06"
izz="1.4612727e-02" />
</inertial>
▫ mass : 로봇의 질량 (kg)
▫ inertia : 회전 저항을 행렬값으로 정의하여 로봇의 회전 특성에 영향
<joint>로봇이 움질일 수 있도록 두 개의 link를 연결하는 관절을 의미한다.

조인트는 parent와 child를 사용하여 두개의 링크를 연결한다.
parent는 고정된 부분(기준점), child는 움직이는 부분으로 정의된다.
조인트의 유형 중 revolute를 사용하면 조인트 간 회전이 가능하다.
<joint name="arm_joint" type="revolute">
<parent link="base_link"/>
<child link="arm_link"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1"/>
</joint>
▫ limit : 회전 범위(rad)와 최대 속도 제한
▫ 회전축(axis) : 어느 축을 기준으로 회전할것인지 설정
ROS에서 로봇 상태를 관리, URDF 모델 처리 및 Rviz2에서 로봇 시각화를 위해 필수적으로 사용되는 패키지들이 있다.
xacro는 URDF파일을 더 효율적으로 작성할 수 있도록 도와주는 매크로 언어이다.
xacro를 사용하면 URDF의 반복적인 코드 구조를 매크로로 정의하여 로봇의 크기, 센서, 조인트 등을 동적으로 변경할 수 있게 된다. 특히, 네임스페이스 별로 로봇을 관리해야 하는 멀티 로봇에서 xacro 사용은 필수이다.
로봇의 모든 조인트 상태를 /joint_states 토픽으로 퍼블리시하여, 조인트의 위치, 속도, 가속도 정보를 전송한다.
Gazebo에서 조인트 상태를 가져와야 하므로 Gazebo 플러그인을 추가해줘야한다.
URDF 모델의 TF를 퍼블리시하여 TF트리를 생성한다. 하지만, URDF는 조인트의 움직임(회전 각도, 위치)은 반영하지 않기 때문에 joint_state_publisher가 퍼블리시하는 /joint_state 데이터를 받아야 실시간으로 TF를 업데이트 할 수 있다.

joint_state_publisher와 robot_state_publisher는 로봇의 TF트리 유지를 위해 반드시 필요하다. SLAM, Nav2, AMCL, 오도메트리 계산 등의 모든 자율 주행 알고리즘이 TF 트리를 기반으로 동작하기 때문❗
URDF에는 기본적인 로봇 구조만 정의되어 있기 때문에 Gazebo 플러그인을 추가하여 센서 데이터 출력, 물리 엔진 설정 등이 필요하다.
자주 사용되는 주요 플러그인은 다음과 같다.
차륜형 이동(differential drive) 로봇 주행을 구현하기 위해 사용되는 플러그인이다.
<plugin name="diff_drive" filename="libgazebo_ros_diff_drive.so">
<ros>
<namespace>robot</namespace>
</ros>
<update_rate>50</update_rate>
<left_joint>wheel_left_joint</left_joint>
<right_joint>wheel_right_joint</right_joint>
<command_topic>cmd_vel</command_topic>
<odometry_topic>odom</odometry_topic>
<publish_odom>true</publish_odom>
<publish_odom_tf>true</publish_odom_tf>
<publish_wheel_tf>true</publish_wheel_tf>
<odometry_frame>odom</odometry_frame>
<robot_base_frame>base_link</robot_base_frame>
<odometry_source>1</odometry_source>
</plugin>
▫ 속도/cmd_vel 토픽 발행 및 바퀴 회전
▫ 오도메트리/odom을 퍼블리시하여 로봇 이동 상태 추적
▫ /odom → /base_link TF 퍼블리시
관성을 측정하여 각속도, 가속도 등의 데이터를 생성하기 위해 사용하는 플러그인이다.
<plugin name="imu" filename="libgazebo_ros_imu_sensor.so">
<ros>
<namespace>robot</namespace>
<remapping>~/out:=imu</remapping>
</ros>
<update_rate>100</update_rate>
<frameName>imu_link</frameName>
<imu>
<angular_velocity>
<x>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>0.0002</stddev>
</noise>
</x>
</angular_velocity>
</imu>
</plugin>
▫ 센서 데이터를 /imu 토픽 발행
▫ 로봇 자세 추정, 카메라 보정 등에 사용
LIDAR센서 동작을 시뮬레이션하기 위한 플러그인이다.
<plugin name="scan" filename="libgazebo_ros_ray_sensor.so">
<ros>
<namespace>robot</namespace>
<remapping>~/out:=scan</remapping>
</ros>
<update_rate>10</update_rate>
<ray>
<scan>
<horizontal>
<samples>360</samples>
<resolution>1</resolution>
<min_angle>-3.14159</min_angle>
<max_angle>3.14159</max_angle>
</horizontal>
</scan>
</ray>
</plugin>
▫ LIDAR 센서 데이터를 /scan 토픽으로 발행하여 거리 측정
Gazebo에서 로봇의 조인트 상태를 읽어 ROS2로 퍼블리시하는 플러그인이다.
<plugin name="joint_state" filename="libgazebo_ros_joint_state_publisher.so">
<ros>
<namespace>robot</namespace>
<remapping>~/out:=joint_states</remapping>
</ros>
<update_rate>30</update_rate>
</plugin>
▫로봇의 각 조인트 데이터를 읽어서 /joint_states 토픽 발행
▫ robot_state_publisher가 이를 사용하여 TF 트리 업데이트
Gazebo 시뮬레이션에서 로봇 및 환경을 정의하는 XML 포맷이다. Gazebo가 동작하는데 필요한 모든 물리적 정보 포함하여 센서(LIDAR, 카메라, IMU), 월드까지 포함해야 할 때 사용된다.
ROS에서 URDF는 로봇 구조와 동작을 정의하는 TF 트리를 생성하고, SDF는 Gazebo에서 시뮬레이션을 위한 전체 환경을 정의하는데 사용된다. 이 차이는 멀티 로봇 환경에서 더욱 중요하게 작용한다.
한 대의 로봇을 spawn할 때 .sdf를 직접 로드하는 방식을 사용한다.
spawn_turtlebot3 = Node(
package='gazebo_ros',
executable='spawn_entity.py',
arguments=[
'-file', sdf_file,
'-entity', robot['name'],
'-robot_namespace', robot['name'],
'-x', robot['x_pose'], '-y', robot['y_pose'],
'-z', '0.01', '-Y', '0.0',
'-unpause',
],
)
▫ -file 옵션으로 sdf 파일 경로를 직접 지정
여러 대의 로봇을 spawn할 때는 robtot_description 토픽을 받아서 로봇을 로드한다.
spawn_tb3_1_cmd = Node(
package='gazebo_ros',
namespace='tb3_1',
executable='spawn_entity.py',
arguments=[
'-entity', tb3_1_model,
'-topic', '/tb3_1/robot_description',
'-x', tb3_1_spawn_x_val,
'-y', tb3_1_spawn_y_val,
'-z', tb3_1_spawn_z_val,
'-Y', tb3_1_spawn_yaw_val
],
output='screen',
parameters=[{'use_sim_time': use_sim_time}],
remappings=[
("/tf", "tf")
]
)
▫ .urdf를 ROS토픽으로 로드

SDF에서도 Gazebo 내부에서 특정 요소에 대해 네임스페이스를 설정할 수 있지만, TF tree나 센서 데이터 퍼블리싱과 연동되지 않는다. 즉, SDF 기반으로 여러 대의 로봇을 spawn하면 Gazebo에서 구별되지만 ROS에서는 모든 로봇이 같은 /tf를 사용하여 충돌이 발생한다.
URDF는 로봇의 뼈대(링크, 조인트, 센서 등)를 만드는 파일이기 때문에 멀티 로봇 환경에서는 네임스페이스와 TF Tree 분리를 위해 URDF를 사용하는 것 적합하다.
| 항목 | URDF | SDF |
|---|---|---|
| 사용 목적 | 로봇의 프레임 및 구조를 정의 | Gazebo에서 로봇 및 환경을 정의 |
| 주 사용처 | ROS (RViz, MoveIt, Nav2 등) | Gazebo 시뮬레이션 |
| 좌표계(TF 트리) | TF 프레임을 생성하여 ROS에서 활용 | Gazebo에서 직접 위치를 관리 |
| 멀티 로봇 지원 | 네임스페이스를 활용하여 여러 로봇을 구분 가능 | 단일 로봇 시뮬레이션은 가능하지만, 네임스페이스 관리가 어려움 |
◾ URDF는 로봇의 프레임과 TF 트리를 정의하고, ROS에서 로봇의 구조를 관리하는 데 사용된다.
◾ SDF는 Gazebo에서 사용되며 로봇뿐만 아니라 시뮬레이션 환경(지형, 조명 등)을 정의할 수 있다.
◾ 단일 로봇 환경에서는 SDF만 사용해도 되지만, 멀티 로봇 환경에서는 URDF를 사용하여 네임스페이스와 TF 트리를 관리해야 한다.
https://www.globhy.com/article/brazil-bamboo-flooring-market-reviews-suppliers
https://www.globhy.com/article/wellmade-bamboo-flooring-reviews-product-highlights
https://www.globhy.com/article/canadian-bamboo-flooring-vancouver-ottawa-and-toronto
https://yamap.com/users/4784209
https://forum.iscev2024.ca/member.php?action=profile&uid=1357
https://my.usaflag.org/members/bothbest/profile/
https://myliveroom.com/bothbest
https://forum.geckos.ink/member.php?action=profile&uid=642
https://competitorcalendar.com/members/bothbest/profile/
https://www.fruitpickingjobs.com.au/forums/users/bothbest/
https://thefwa.com/profiles/bamboo-flooring
https://chanylib.ru/ru/forum/user/9508/
https://greenteam.app/bothbest
http://www.v0795.com/home.php?mod=space&uid=2304271
https://wearedevs.net/profile?uid=201358
https://www.templepurohit.com/forums/users/chinahousehold/
https://eu.renshuu.org/me/1687780&profile
https://tutorialslink.com/member/FlooringBamboo/68089
https://www.tkaraoke.com/forums/profile/bothbest/
https://www.aipictors.com/users/bothbest
https://forum.index.hu/User/UserDescription?u=2129081
http://programujte.com/profil/75582-chinabamboo/
https://lamsn.com/home.php?mod=space&uid=1290622
https://nexusstem.co.uk/community/profile/chinabamboo/
https://brain-market.com/u/chinabamboo
https://malt-orden.info/userinfo.php?uid=414545
https://www.halaltrip.com/user/profile/255692/chinabamboo/
https://goodgame.ru/user/1698091
https://vcook.jp/users/42177
https://library.zortrax.com/members/china-bamboo/
https://aprenderfotografia.online/usuarios/chinabamboo/profile/
https://plaza.rakuten.co.jp/chinabamboo/
https://plaza.rakuten.co.jp/chinabamboo/diary/202508270000/
https://plaza.rakuten.co.jp/chinabamboo/diary/202508270001/
https://eternagame.org/players/538402
https://www.slmath.org/people/82724
https://www.aipictors.com/users/chinabambooflooring
https://vocal.media/authors/china-bamboo-bfc
https://www.giantbomb.com/profile/chinabamboo/
https://www.keedkean.com/member/44724.html?type=profile