URDF (Unified Robot Description Format)은 직역하면 통합 로봇 설명 형식으로 로봇의 3D 형상 및 외관, 관성 등 물리적 특성 등을 XML 언어로 정의한 로봇 모델링 언어이다. URDF로 정의된 로봇은 RVIZ 및 Gazebo에서 물리 시뮬레이션을 할 수 있다.
URDF 는 아래의 그림과 같이 x
, y
, z
축을 사용한다.
회전을 표현하기위해 오일러 각도 roll
, pitch
, yaw
를 사용한다.
단위는 아래의 표와 같이 사용된다.
- 길이 : 미터 m
- 각도 : 라디안 radian
- 질량 : kg
- 속도 : m/s
- 각속도 : radian /s
cylinder : 원통
box : 상자
sphere : 공
RGB 3원색과 투과율(0~1) 을 정의하여 사용한다.
기구의 속성을 부여하여 동작을 제어할 수 있다.
Base: 고정부분(grounded)
Link: 관절에 연결되는 로봇 팔의 부분
Joint: 링크를 연결하는 부위로 보통 모터의 회전을 통해 움직임을 만듦
Joint 의 경우 아래의 속성을 부여하여 제어 할 수 있다.
fixed: 고정
revolution : 작동 범위 제한
continuous : 연속회전
🤖pan_tilt.urdf
<?xml version="1.0"?>
<robot name="ex_urdf_pan_tilt">
<link name="base_link"> ## link : base_link
<visual>
<geometry>
<cylinder length="0.01" radius="0.2"/> ## 형태 (길이, 각도)
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/> ## x,y,z 좌표 및 영점조절
<material name="yellow">
<color rgba="1 1 0 1"/> ## 색상값
</material>
</visual>
<collision>
<geometry>
<cylinder length="0.03" radius="0.2"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="pan_joint" type="revolute"> ## joint : pan_joint
<parent link="base_link"/>
<child link="pan_link"/>
<origin xyz="0 0 0.1"/>
<axis xyz="0 0 1" />
<limit effort="300" velocity="0.1" lower="-3.14" upper="3.14"/>
<dynamics damping="50" friction="1"/>
</joint>
<link name="pan_link"> ## link : pan_link
<visual>
<geometry>
<cylinder length="0.4" radius="0.04"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.09"/>
<material name="red">
<color rgba="0 0 1 1"/>
</material>
</visual>
<collision>
<geometry>
<cylinder length="0.4" radius="0.06"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.09"/>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="tilt_joint" type="revolute"> ## joint : tilt_joint
<parent link="pan_link"/>
<child link="tilt_link"/>
<origin xyz="0 0 0.2"/>
<axis xyz="0 1 0" />
<limit effort="300" velocity="0.1" lower="-4.71239" upper="-1.570796"/>
<dynamics damping="50" friction="1"/>
</joint>
<link name="tilt_link"> ## link : tilt_link
<visual>
<geometry>
<cylinder length="0.4" radius="0.04"/>
</geometry>
<origin rpy="0 1.570796 0" xyz="0 0 0"/>
<material name="green">
<color rgba="1 0 0 1"/>
</material>
</visual>
<collision>
<geometry>
<cylinder length="0.4" radius="0.06"/>
</geometry>
<origin rpy="0 1.570796 0" xyz="0 0 0"/>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
</robot>
여기서 아래의 명령어를 터미널 창에 입력하면 Link와 Joint 관계도를 PDF파일로 만들어준다.
🖥️terminal
$urdf_to_graphiz pan_tilt.urdf
🖥️terminal
$sudo apt-get install liburdfdom-tools
만약 찾을수 없는 명령이라고 나오면 위의 명령어를 터미널에 입력해줘야 한다.
🚀pan_tilt_urdf.launch
<launch>
<arg name="model" />
<param name="robot_description" textfile="$(find ex_urdf)/urdf/pan_tilt.urdf" />
<!-- Setting gui parameter to true for display joint slider -->
<param name="use_gui" value="true"/>
<!-- Starting Joint state publisher node which will publish the joint values -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- Starting robot state publish which will publish tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- Launch visualization in rviz -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find ex_urdf)/urdf.rviz" required="True" />
</launch>
Joint state 변경 gui 설치
🖥️terminal
$sudo apt install ros-melodic-joint-state-publisher-gui
해당 명령어를 터미널에 입력하여 Joint state 변경 gui를 설치해준다. 아래에서 어떤식으로 동작하는지 알아보자.
이제 코드를 모드 작성하였으니 launch 파일을 실행시켜 나타나는 화면을 확인하자.
위와 같은 기둥형태의 로봇을 확인 할 수 있다.
아까 터미널을 통해 ros-melodic-joint-state-publisher-gui
를 설치하였다면 위 화면을 확인 할 수 있다.
이 창은 Joint의 각도를 조절하는 gui이다. 아래 영상에서 버튼을 이용하여 Joint를 조절하는 모습을 볼 수 있다.
Randomize
버튼을 통해 랜덤으로 조절할 수도 있다.