URDF(Unified Robot Description Format) 개념
URDF의 배경
URDF(Unified Robot Description Format)은 로봇의 물리적 구조와 물리 특성, 시각화 및 충돌 정보 등을 표현하기 위한 XML 기반 포맷이다. ROS(특히 ROS 1)에서부터 사용되며, ROS2에서도 동일하게 지원된다. URDF는 로봇 모델링을 표준화하여 협업과 유지보수를 용이하게 만든다. URDF를 이용하면 로봇의 연결 구조, 조인트 특성, 링크의 형상과 관성 등을 명확히 기술할 수 있다.
URDF의 필요성
로봇을 시뮬레이션하거나 실제 로봇에서 동작시키려면 다음과 같은 정보가 필요하다.
링크(link)의 형상(geometry), 질량, 관성
조인트(joint)의 타입, 제한 범위(limit), 마찰, 감속비, 동작 범위
좌표계 변환 정보(기준 좌표계와 하위 요소의 상대적 위치 및 자세)
이 정보를 일관되게 정의하는 문서가 없으면, 시뮬레이터나 실제 구동 프로그램 간의 불일치가 발생할 수 있다. URDF는 이 불일치를 방지하기 위해 만들어졌으며, 다음과 같은 장점을 가진다.
표준화된 XML 구조
로봇 모델링 정보가 일관된 스키마(schema)를 통해 관리된다.
유연한 확장
매크로나 XACRO 등을 통해 반복되는 부분을 효율적으로 작성할 수 있다.
플러그인 형태로 추가 정보를 삽입하여 확장하기 쉽다.
시각화와 충돌 모델 통합
시각화용 메쉬(mesh) 정보와 물리 시뮬레이션용 충돌(collision) 모델을 함께 제공한다.
URDF의 기본 구조
URDF 파일은 <robot> 태그로 시작하며, 그 안에 <link>와 <joint> 태그들이 계층적으로 포함된다. 각 태그는 XML 문법을 따른다. 아래는 매우 간단화된 URDF 구조 예시이다.
위 예시에서 <robot> 태그의 name 속성은 로봇의 이름을 지정하며, <link> 태그는 로봇의 몸체 부분을 정의한다. <joint> 태그는 링크를 어떻게 연결할지를 정의한다. <visual> 태그, <collision> 태그를 통해 시각화와 충돌 모델을 별도로 지정할 수 있다.
URDF의 주요 태그
<robot>로봇 전체 구조를 감싸는 루트 태그이다. 일반적으로name속성을 사용한다.<link>로봇을 구성하는 단일 몸체 부위를 나타낸다. 물리적 형상, 관성, 질량 등을 정의하는<inertial>태그와 시각화용<visual>, 충돌용<collision>등이 들어간다.<joint>두 링크를 연결하는 조인트를 정의한다. 조인트 종류(revolute, prismatic, continuous 등), 움직임 범위, 감속비나 마찰 등을 명시할 수 있다.<material>시각적 효과를 위해 재질이나 색상을 설정할 수 있다.<transmission>실제 로봇의 모터 구동 방식(감속기, 구동비 등)을 명시한다. 이는 ROS Control과 연계되어 활용된다.
링크(Link) 태그와 관성(Inertial) 정보
로봇 동역학에서 가장 중요한 것 중 하나가 링크의 질량과 관성(관성 텐서)이다. URDF에서는 <inertial> 태그를 통해 이를 설정한다. 예를 들어,
<origin>: 질량중심(센터 오브 마스, COM) 위치와 관성 텐서를 적용할 좌표계의 회전(rpy)을 지정한다.<mass>: 질량(kg)을 나타낸다.<inertia>: 관성 텐서를 나타내며, URDF에서는 대칭 행렬의 항목을 직관적으로 표현하기 위해 $I_{xx}, I_{xy}, \dots, I_{zz}$ 형태로 명시한다.
만약 링크가 단순한 기하학으로 이루어져 있다면(예: 육면체, 원기둥, 구 등), 해당 링크의 관성은 이론적으로도 계산 가능하다. 예를 들어, 밀도가 균질한 박스(box)의 관성 텐서는 다음처럼 표현할 수 있다.
여기서 $m$은 질량, $w, h, d$는 직육면체의 폭(width), 높이(height), 깊이(depth)에 해당한다.
조인트(Joint) 태그와 좌표계
URDF의 <joint> 태그는 두 링크를 어떻게 연결할지를 설명한다. 조인트의 타입에 따라 회전, 직선운동 등이 결정된다. 예를 들어,
revolute: 일정 각도 범위 내에서 회전하는 조인트continuous: 무한 회전prismatic: 직선 왕복 운동fixed: 두 링크가 고정된 상태
<origin> 태그는 부모 링크 좌표계에서 조인트의 기준점을 정의한다. xyz는 3차원 위치, rpy(roll, pitch, yaw)는 회전 각도를 의미한다. <axis> 태그는 조인트의 회전 또는 직선 운동 방향 벡터를 명시한다. 3차원 벡터 $\mathbf{a} = [x, y, z]^T$ 형태로 주어지며, 일반적으로 단위벡터를 사용한다.
URDF 구조 시각화
URDF를 한눈에 파악하기 위해 간단한 다이어그램을 예로 들 수 있다.
위 구조는 <robot> 태그 아래에 두 개의 <link>가 있고, 하나의 <joint>가 두 링크를 연결한다는 것을 시각적으로 표현한다.
URDF에서의 시각화(Visual) vs. 충돌(Collision) 요소
로봇을 모델링할 때, 물리 엔진에서의 시뮬레이션 충돌 검출을 위한 형상과 실제 사용자가 보게 될 3D 시각화용 형상을 구분하여 작성하는 것은 매우 중요하다. 이를 위해 URDF에서는 <visual> 태그와 <collision> 태그를 통해 서로 다른 용도의 모델을 지정할 수 있다.
<visual>: 사용자가 볼 수 있는 3D 모델, 재질(Material) 또는 메시(Mesh) 정보를 정의한다.<collision>: 물리 시뮬레이터가 사용하는 간단화된 형태의 충돌 모델(박스, 원기둥, 단순화된 메쉬 등)을 정의한다.
아래는 하나의 <link> 안에서 시각화와 충돌 모델을 동시에 지정한 예시이다.
이렇게 분리함으로써, 시뮬레이터 입장에서는 충돌 모델을 단순화하여 효율적인 물리 연산이 가능하고, 사용자는 고품질의 메시로 렌더링된 시각적 효과를 얻을 수 있다.
URDF에서의 <material> 태그
<material> 태그URDF에서는 <material> 태그를 이용해 색상이나 텍스처 등의 시각적 속성을 지정할 수 있다.
<color>는 RGBA(Red, Green, Blue, Alpha) 형식으로 값을 지정하며, 1.0은 최대 세기, 0.0은 최소 세기이다. 로봇 내에서 여러 곳에서 동일한 색상을 반복해서 사용해야 한다면, 로봇의 상위 구조(예: <robot> 바로 안)에서 <material>을 정의하고, 하위 링크에서 material="red_material"와 같이 재참조하는 형태가 가능하다.
URDF에서의 <transmission> 태그
<transmission> 태그ROS Control을 통해 실제 하드웨어와 소프트웨어를 연결하기 위해서는 조인트에 대한 액추에이터 정보를 URDF에 추가로 명시해야 한다. 이를 위해 <transmission> 태그를 사용한다.
예시:
<type>: 전송(Transmission)의 타입을 명시한다. (예: SimpleTransmission, DifferentialTransmission 등)<mechanicalReduction>: 모터 회전과 조인트의 회전 비율을 의미한다.<hardwareInterface>: Effort, Velocity, Position 등 특정 구동 인터페이스를 지정한다.
이 정보를 바탕으로 ROS Control 레이어가 실제 하드웨어(모터)와 소프트웨어 간의 제어 신호를 매핑할 수 있다.
고급 기능: XACRO를 활용한 URDF의 재사용성 극대화
URDF는 XML 구조이기 때문에, 복잡한 로봇 모델을 정의하는 경우 같은 패턴이 반복되는 문제가 생길 수 있다. 이를 해결하기 위해 ROS에서 제안한 방법이 XACRO(XML Macros)이다. URDF 파일을 직접 작성하는 대신, XACRO 문법을 사용하면 매크로(매개변수화된 템플릿)를 정의하고, 이를 여러 곳에서 재사용할 수 있다.
예를 들어, 같은 형상의 링크를 반복해서 생성해야 한다면 다음과 같은 XACRO 매크로를 정의할 수 있다.
이제 필요한 곳에서 다음과 같이 호출하면 된다.
이와 같이 XACRO를 사용하면 반복되는 요소를 간결하게 표현할 수 있고, 변수화된 파라미터를 통해 로봇 모델을 동적으로 생성할 수도 있다. 결과적으로 유지보수와 재사용성이 크게 향상된다.
ROS2에서의 URDF 활용
ROS2 환경에서 URDF를 활용하려면, 먼저 로봇 모델을 URDF(혹은 XACRO) 형태로 준비하고, 이를 노드나 Launch 파일 등을 통해 파싱(parse) 및 파라미터로 전달해야 한다. 핵심은 로봇 상태 퍼블리셔(robot_state_publisher) 노드에 URDF를 올바르게 전달하는 것이다. 이후 RViz나 Gazebo(또는 Ignition) 등에서 로봇 모델을 시각화하고 시뮬레이션할 수 있다.
ROS2에서는 패키지 구조가 크게 바뀌지는 않았지만, Launch 파일을 Python 스크립트로 작성한다는 점에서 차이가 있다. 일반적인 사용 흐름은 다음과 비슷하다.
URDF/XACRO 파일 준비:
my_robot_description/urdf/my_robot.urdf또는my_robot_description/urdf/my_robot.xacro로봇 모델 파싱: XACRO를 사용했다면, ROS2 패키지에서
xacro명령어를 사용해 실제 URDF로 변환할 수 있다.robot_state_publisher에 파라미터 전달**: Launch 파일 혹은 명령줄에서
robot_description이라는 이름의 파라미터에 URDF 내용을 담아 전달한다.RViz에서 시각화: RViz 구성 파일(
.rviz) 또는 Launch 파일 내에서robot_description파라미터를 참조하고, TF 트리 변화를 모니터링하여 로봇 모양을 렌더링한다.
예시로, ROS2 Launch 파일에서 XACRO를 파싱하고 이를 robot_state_publisher에 전달하는 간단한 구조는 아래와 유사하다.
위 예시에서 xacro.process_file(urdf_file)를 통해 my_robot.xacro 파일을 불러온 뒤, 이를 XML 문자열(즉, URDF로 변환된 텍스트)로 만들어 파라미터(robot_description)에 담아 robot_state_publisher 노드에 전달한다. 이렇게 하면 ROS2 내에서 TF 트리가 구성되고, RViz나 Gazebo 등에서 해당 로봇을 시각화·시뮬레이션할 수 있게 된다.
robot_state_publisher와 joint_state_publisher
robot_state_publisher URDF에 정의된 로봇의 조인트 정보를 이용하여 TF 트리를 퍼블리시한다. 이는 ROS의 여러 노드들이 서로 다른 좌표계를 일관성 있게 공유하도록 해준다.
joint_state_publisher 및 joint_state_publisher_gui 로봇 조인트 상태(Joint State) 토픽을 퍼블리시하는 노드다. 실제 하드웨어가 없을 때, 슬라이더 GUI를 통해 가상의 조인트 각도를 조절하고, 그 변화를 RViz 등에서 확인할 수 있다.
URDF 검증 도구
ROS1 시절에는 check_urdf 나 urdf_to_graphiz 같은 명령어가 존재했다. ROS2에서도 유사한 방법으로 URDF를 확인할 수 있지만, 일부 도구는 ROS2로 포팅되지 않았거나, 다른 형태로 바뀌었다. 다음은 몇 가지 일반적인 검증 방법이다.
XACRO 직접 변환
변환된 my_robot.urdf가 XML 구조로서 유효한지, XML 파서나 에디터로 확인한다.
RViz에서 확인 RViz에서 robot_description 파라미터로 로드했을 때 에러 로그가 없는지 확인한다.
Launch 파일 실행 시 에러가 없다면 대체로 URDF 문법이 정상이다.
Gazebo/ign-gazebo 로드 Gazebo(또는 Ignition)를 실행하고 URDF를 Import 스크립트나 명령어를 통해 불러와 확인한다.
에러 없이 스폰(spawn)되면 로봇 모델에 큰 문제는 없는 것이다.
Gazebo에서의 URDF 사용
Gazebo(혹은 Ignition Gazebo)에서 로봇을 시뮬레이션하려면, URDF 또는 SDF 포맷이 필요하다. Gazebo는 기본적으로 SDF를 내부 포맷으로 사용하지만, ROS2 환경에선 URDF를 바로 변환하여 로드할 수도 있다. URDF 내부에 필요한 Gazebo용 플러그인 태그(<gazebo> 태그 내부)를 삽입해두면, 로봇 제어 시뮬레이션과 센서 플러그인 등을 활용할 수 있다.
예시로, URDF에 <gazebo> 태그를 추가하는 형태는 다음과 비슷하다.
이를 통해 Gazebo 시뮬레이션 환경에서 ROS Control 플러그인을 사용할 수 있게 된다. 센서가 있다면 <sensor> 태그를 <gazebo> 하위에 추가해 시뮬레이션 가능한 형태로 구성할 수도 있다.
URDF와 다자유도(Joint) 확장
URDF에서 기본적으로 지원하는 조인트 타입은 revolute, continuous, prismatic, fixed, floating, planar 등이 있다. 이 중 floating, planar 조인트는 특수한 경우로, 6자유도 혹은 3자유도 평면 이동 등을 표현한다. 실제로 floating 조인트는 로봇의 베이스 링크를 월드(World) 프레임에 연결할 때 주로 사용한다.
floating: 6자유도(3개 평행 이동 + 3개 회전)을 모두 허용한다.
planar: 2D 평면 상에서 움직임만 허용한다(평행 이동 + 회전).
URDF는 각 조인트별로 1축 운동(회전 또는 직선)을 가정한다는 점에서, 다축 회전을 하나의 조인트로 표현하는 것은 제한적이다. 이러한 경우에는 SDF(Simulation Description Format)를 고려하거나, URDF 상에서 여러 조인트를 이어서 6자유도를 구현할 수 있다.
센서 모델링
URDF는 주로 링크와 조인트를 정의하는 데 집중되어 있으나, 센서(카메라, LiDAR, IMU 등)에 대한 표준화된 태그는 상대적으로 미비하다. 센서를 URDF에 포함하기 위해서는 다음과 같은 방법들을 사용할 수 있다.
센서를 링크처럼 간주 센서를 하나의 링크로 간주하고, 해당 링크에 센서 플러그인(예: Gazebo 플러그인)을 삽입한다.
확장 태그 사용
<gazebo>내에<sensor>태그를 직접 추가하여, 실제 시뮬레이션 엔진에서 센서를 인식하게 구성한다.
예시:
이는 URDF의 표준 스펙을 넘어서는 확장이므로, 시뮬레이터별 호환성을 주의해야 한다.
URDF의 확장: Mimic Joint
ROS에서 멀티 조인트 로봇팔을 모델링하다 보면, 특정 조인트가 다른 조인트를 ‘모방(mimic)’해야 하는 상황이 생긴다. 예컨대, 로봇 그리퍼(집게)에서 두 핑거(finger)가 동일한 각도로 서로 반대 방향으로 움직여야 하는 경우다. URDF에서는 <mimic> 태그를 통해 이를 표현할 수 있다.
위 예시에서 finger_joint2는 finger_joint1의 움직임을 따라가되, 회전 각도를 multiplier="-1.0"을 통해 반대 방향으로 적용한다. 이처럼 <mimic> 태그를 활용하면, 하나의 조인트 조작만으로 관련 조인트가 자동으로 연동되도록 설정할 수 있어, 복수의 조인트를 일괄적으로 제어해야 하는 상황에서 매우 유용하다.
URDF에서 STL, Collada 등의 3D 메쉬 활용
URDF로 모델링할 때, 링크의 시각화나 충돌 요소를 단순 기하학(박스, 실린더, 스피어 등)으로만 구성하기에는 현실성이나 정확도가 떨어질 수 있다. 복잡한 로봇 부품, 디자인 요소 등을 표현하려면 3D 모델링 소프트웨어(Blender, SolidWorks, Fusion 360 등)에서 내보낸 STL(Binary/ASCII), Collada(.dae) 파일을 활용한다.
filename속성은 해당 메쉬 파일의 경로를 의미하며, ROS 패키지 내 파일 구조일 때는package://스킴을 사용한다.scale속성으로 메쉬의 크기를 조정할 수 있다.메쉬 파일은 크게 STL, Collada(DAE), OBJ 등이 자주 사용되며, Gazebo 및 RViz에서 모두 호환된다.
URDF vs. SDF
URDF ROS(특히 ROS 1)에서 표준으로 채택된 로봇 묘사 포맷이다. 링크와 조인트 중심으로 구조가 직관적이며, ROS 생태계의 다양한 툴과 연동이 쉽게 되어 있다. 다만, 로봇 외부 환경이나 복잡한 센서, 플러그인 등을 표현하는 데에는 직접적인 지원이 부족해 확장 태그 혹은 별도의 SDF 사용이 필요한 경우가 많다.
SDF(Simulation Description Format) Gazebo나 Ignition과 같은 로봇 시뮬레이터에서 사용하는 포맷이다. URDF보다 풍부한 요소를 지원하며(환경, 조명, 센서, 플러그인 등), 시뮬레이션에 특화되어 있다. ROS2에서는 URDF로 작성된 모델을 내부적으로 SDF 형태로 변환하여 Gazebo에서 사용하는 방식이 일반적이다. 복잡한 시뮬레이션 환경(예: 지형, 건물 등)은 SDF 월드 파일을 직접 활용하는 경우가 많다.
DH(Denavit-Hartenberg) 파라미터와 URDF의 관계
로봇 공학에서 조인트 변환을 정의할 때 자주 쓰는 방법으로 Denavit-Hartenberg 파라미터(이하 DH 파라미터)가 있다. DH 파라미터는 링크 길이, 트위스트(twist), 오프셋(offset), 조인트 각도 등 4개의 변수를 이용하여 인접한 조인트 간 변환행렬을 간단히 표현한다. 그러나 URDF는 링크-조인트 구조의 직관적인 3차원 좌표계를 기반으로 하므로, DH 파라미터와 직접적으로 호환되진 않는다.
만약 DH 파라미터로 구성된 로봇팔의 URDF를 작성하려면, DH 파라미터로부터 인접 조인트 간 좌표 변환($\mathbf{T}$)을 추출하고, 그 결과를 <joint>의 <origin> 또는 링크 좌표계에 반영해줘야 한다. 예컨대, 기본 DH 표준에서 두 조인트 사이의 변환행렬이
와 같다면, 이를 URDF의
에 맞춰 변환하여 기입해준다.
이처럼 DH 파라미터 방식에 익숙한 사용자가 URDF로 전환하려면, 각 축의 배치와 오프셋 등을 명시적으로 해석해야 하므로, 단계별 매핑 과정에서 주의를 요한다.
MoveIt과 URDF 연동
ROS 환경에서 로봇 매니퓰레이터(Arm)를 제어하거나 경로 계획(Path Planning)을 수행하기 위해 자주 사용되는 도구가 MoveIt이다. MoveIt은 로봇의 URDF를 기반으로 로봇 구성(링크, 조인트, 조인트 한계, 관성, 충돌 모델 등)을 해석하고, 이를 Rviz 플러그인과 연동하여 작업 공간 내에서의 경로 생성, 충돌 감지, IK(Inverse Kinematics) 계산 등을 수행한다.
SRDF(Semantic Robot Description Format) MoveIt은 URDF와 함께 SRDF(Semantic Robot Description Format) 파일을 사용한다. URDF가 물리적 구조와 속성을 기술한다면, SRDF는 그룹(Group) 설정(어떤 조인트가 함께 움직이는지), 엔드이펙터 정의, 충돌에민(자체 충돌 무시 설정) 등을 기술한다.
MoveIt Setup Assistant ROS 패키지인 MoveIt Setup Assistant(MSA)를 사용하면, URDF를 입력으로 주고 GUI 상에서 각종 매니퓰레이터 설정(Planning Group, end-effector, Virtual Joints 등)을 쉽게 구성할 수 있다. 이 과정에서 자동으로 SRDF를 생성해주므로 복잡한 수작업을 줄일 수 있다.
MoveIt과 올바르게 연동하기 위해서는 URDF 내에 각 조인트의 limit 태그(특히 upper, lower, velocity, effort)가 올바르게 기재되어야 하며, 이 정보가 MoveIt의 경로 계획에 직결된다. 또한 충돌 검사를 위해 <collision> 요소가 정확히 지정되어야 한다.
URDF 작성 시 주의사항
링크와 관성 정보 불일치 주의 링크의 실제 형상(geometry)과 관성 텐서가 지나치게 불일치하면 시뮬레이션 오차나 역학 계산에서의 문제를 일으킬 수 있다. 실제 로봇이라면 CAD 모델 기반으로 관성을 추정하거나, 단순 기하학 공식을 사용하되 실제 질량·크기에 최대한 맞춰주는 것이 중요하다.
축 정의(Axis) 정확성 조인트마다
<axis xyz="..."/>를 적절히 지정해야 한다. 예컨대 회전 조인트(revolute)이라면 회전축을 제대로 설정하지 않으면 로봇이 기괴하게 동작할 수 있다.조인트 리미트(각도, 속도, 힘) 설정
<limit>태그 내upper와lower가 역전되거나(upper < lower) 비현실적인 값을 지정하면 MoveIt이나 제어 알고리즘이 이상 동작할 수 있다. 실제 하드웨어 제원을 참고해야 한다.좌표계 일관성 URDF는 계층적 구조로,
<origin>태그를 통해 부모 링크와 자식 링크 간 좌표 변환을 지정한다. 여기서의 회전(RPY) 순서는 ROS 표준(Roll-Pitch-Yaw, intrinsic rotation)에 준수해야 하며, 변환 행렬 계산 시 주의가 필요하다.시뮬레이션 단순화 실제 로봇보다 단순화된 모델(예: 작은 링크나 케이블 등은 무시)을 사용해도 되는 경우가 있다. 그러나 조인트 구조가 바뀌지 않는 이상, 충돌이나 관성 계산에 직접적 영향을 주는 요소를 무시해서는 안 된다.
실전 예시: 간단한 2조인트 로봇팔
예시로, 2개 조인트를 갖는 간단한 로봇팔의 URDF 구조를 살펴보자. (XACRO가 아닌 순수 XML로 적는다.)
위 URDF는 단순히 2개의 회전 조인트를 갖는 로봇팔을 표현한다. base_link에 joint1으로 link1이 연결되고, link1에 joint2로 link2가 연결되는 구조다. 각 링크의 관성 텐서는 예시로 아주 작은 값으로 지정했으나, 실제로는 설계나 CAD 소프트웨어를 통한 정확한 계산 결과를 사용해야 한다.
고정 조인트 vs. 베이스 링크
ROS에서 흔히 베이스 링크(base_link)는 월드(world) 좌표계에 연결된(혹은 가까운) 최초 링크를 의미한다. 만약 로봇 베이스가 이동형(모바일 로봇)이라면, URDF 상에서 base_link를 floating 조인트로 두어도 되고, ROS TF 체인 상에서 odom → base_link → 나머지 구조로 연결하기도 한다. 고정 조인트(fixed)을 사용할 수도 있으나, 보통 이동 로봇의 베이스 프레임은 TF 브로드캐스트로 위치가 갱신된다.
URDF Best Practices
파일 구성 분리: 하나의 거대한 URDF 파일 대신, 링크별·부위별로 파일을 나누고 XACRO 매크로를 사용하면 유지보수가 수월하다.
일관된 좌표계 사용: 특히 RPY 정의와 축 방향 설정을 통일해야 한다. 모듈별로 관습이 다르면 혼선이 생긴다.
시뮬레이션용 모델과 실제 모델 분리: 실제 로봇에선 센서/케이블 등 복잡한 부분이 있어도, 시뮬레이션에서는 단순화가 가능하다. 필요하다면
*_description_sim.xacro와*_description_real.xacro식으로 분리하여 관리할 수 있다.문서화: URDF는 명시적 XML이므로, 주석 등을 통해 각 링크나 조인트의 역할, 실제 하드웨어 스펙 등을 남겨두면 협업에 도움이 된다.
URDF 디버깅 및 문제 해결
URDF를 작성하거나 시뮬레이션에 적용할 때, 일반적으로 다음과 같은 문제가 발생할 수 있다.
링크 간 좌표 변환 오류
증상: RViz에서 로봇 형상이 뒤틀려 보이거나, 일부 조인트가 의도치 않은 방향으로 회전한다.
확인 방법:
<origin rpy="..." xyz="...">가 올바른지 확인하고, 회전 순서(Roll-Pitch-Yaw)와 각 축 방향을 재점검한다.
Collision 요소 누락 또는 과도하게 큰 충돌 박스
증상: Gazebo 등의 시뮬레이터에서 충돌 판정이 이상하게 동작하거나, 로봇이 갑자기 튀어오르는(Explosive) 현상이 발생한다.
확인 방법:
<collision>내부의 기하학이 실제 링크와 비슷한 스케일인지, 링크 간 충돌이 과도하게 발생하지 않는지 점검한다.
조인트 한계(limit) 설정 문제
증상: MoveIt이나 다른 경로 계획 툴에서 조인트가 움직이지 않거나, 일부 조인트가 너무 쉽게 충돌 상태가 된다.
확인 방법:
lower,upper각도 범위가 합리적인지 다시 살펴보고,effort,velocity가 실제 로봇 사양과 맞는지 확인한다.
메시 파일 경로 불일치
증상: RViz나 시뮬레이터에서 로봇이 투명하게 보이거나, 에러 로그에 “Could not load model mesh: package://...”와 같은 메시지가 뜬다.
확인 방법:
package://경로가 실제 파일 위치와 일치하는지, 패키지명이나 파일명이 잘못 기재되지 않았는지 확인한다.
관성 텐서(Inertia) 설정 오류
증상: 물리 시뮬레이션에서 로봇이 비정상적으로 기울거나, 극단적으로 회전하는 현상이 나타난다.
확인 방법:
<mass>값이 0 또는 매우 작게 설정되지 않았는지, $\mathbf{I}$ 행렬(대각선 요소)이 0에 가깝거나 비현실적인 값인지 체크한다.
XACRO 매크로 파싱 오류
증상: Launch 파일 실행 시 “XML parsing error” 혹은 “undefined macro” 등의 에러가 발생한다.
확인 방법: XACRO 문법(
xacro:네임스페이스, 매크로 정의/호출 방식 등)을 재점검하고, 오탈자나 스펠링이 맞는지 확인한다.
협업 시 버전관리
URDF/XACRO 파일은 단순 텍스트이므로, Git 등 버전관리 시스템에서 협업하기 좋다. 다만, 다음과 같은 규칙을 두면 충돌을 줄일 수 있다.
파일 분할: 큰 로봇의 경우 링크 단위로 XACRO를 나누어 작성하고 상위 XACRO에서 include한다.
일관된 네이밍 규칙: 링크명, 조인트명, 매테리얼명 등에 일관된 접두어/접미어를 사용한다. 예)
link_arm_1,link_arm_2등주석(코멘트) 추가: CAD 소프트웨어에서 산출된 질량·관성값이라면, 몇 번째 리비전의 CAD에서 가져온 것인지 기록해 두면 이후 수정이 용이하다.
추가 자료
ROS2 공식 문서: ROS2 문서(https://docs.ros.org)에서 URDF 사용법, robot_state_publisher, XACRO 등에 대한 최신 정보를 확인할 수 있다.
Gazebo/Ignition 문서: Gazebo(https://gazebosim.org) 또는 Ignition Robotics 문서에서 URDF/SDF 변환, 플러그인 삽입, 센서 모델링 등에 대한 예시를 볼 수 있다.
MoveIt Tutorials: MoveIt(https://moveit.ros.org) 공식 튜토리얼에서 URDF와 SRDF를 함께 이용하는 구체적인 예시가 제공된다.
Last updated