monotics 2022. 3. 12. 18:16

URDF는 Unified Robot Description Format의 약자로 직역하자면 “통합 로봇 표현 규칙” 정도가 되겠다. URDF는 로봇의 조인트와 링크들 간의 관계를 표현하기 위해 xml 포맷을 사용한다.

URDF는 RViz, Moveit! 그리고 Gazebo에서 모두 사용하기 때문에 알아두면 유용하다.

RViz, Moveit!, Gazebo와 URDF의 관계


Frame

기준 좌표를 흔히 Frame이라고 하는데, URDF에서는 조인트에 이 Frame을 둔다. Frame을 기준으로 조인트 사이의 위치 관계를 상대적인 값들로 설정하거나 링크를 표현하는 여러 태그들의 중심 위치를 설정한다.

URDF에서는 <origin> 태그가 자주 등장하는데, 링크와 조인트에서 사용하는 의미가 조금 다르다.

<link>

link의 origin

link의 origin이 기준 좌표(Frame)가 되는데, 바로 앞에 연결되어있는 조인트의 좌표를 사용한다.

<link>는 <collision>, <visual>, <inertial> 태그들을 가질 수 있다. 이 태그들은 link origin으로부터 각각의 상대 위치를 <origin> 값으로 설정한다. 즉, 그 값은 link origin으로부터의 상대적 이동(xyz 속성)과 회전(rpy 속성)한 위치이다.

* rpy: roll, pitch, yaw

<geometry>는 기하학 값들을 설정하는데, box(x, y, z), cylinder(radius, length), sphere(radius), mesh(filename)들을 통해 표현된다. 특히, mesh에는 3D 모델링 된 stl 파일을 지정할 수 있다. <geometry>의 여러 속성 값들은 <origin>에서 설정한 위치 값을 중심으로 대칭된다.

cylinder에서 radius, length, center 그리고 &lt;origin&gt;

아래 URDF에서 <visual> 태그 예를 살펴보자. 앞 조인트로부터 z 축으로 25cm 떨어진 지점(xyz="0 0 0.25")에 중심점을 위치시킨다. 방향은 변화가 없다(rpy="0 0 0"). 이 중심점을 기준으로 대칭되도록 너비와 폭은 10cm로 되고 길이는 50cm가 되는 box 형태의 링크를 표현한다(box size="0.1 0.1 0.5").

<link name="link2">
    <collision>
      <origin xyz="0 0 0.25" rpy="0 0 0"/>
      <geometry>
        <box size="0.1 0.1 0.5"/>
      </geometry>
    </collision>
    <visual>
      <origin xyz="0 0 0.25" rpy="0 0 0"/>
      <geometry>
        <box size="0.1 0.1 0.5"/>
      </geometry>
      <material name="orange"/>
    </visual>
    <inertial>
      <origin xyz="0 0 0.25" rpy="0 0 0"/>
      <mass value="1"/>
      <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
    </inertial>
  </link>

참고: http://wiki.ros.org/urdf/XML/link

<joint>

<origin>: 현재 조인트 frame이 이전 조인트 frame으로부터 이동(xyz) 및 회전(rpy)한 상대 위치를 설정한다.

이동 및 회전 값들은 이전 프레임을 기준한 값들이다.

<axis>: 회전축, 병진 축을 설정한다.

<limit>

  • effort: 힘 (N)
  • lower, upper: 최소, 최대 각도(radian)
  • velocity: 속도(rad/s)

  • 회전 축이다. (revolute)
  • 이전 조인트("joint1")로부터 z 축으로 50cm 지점에 동일한 방향으로 이 조인트가 위치한다.
  • y 축을 기준으로 회전한다.
  • 힘: 30 [N]
  • 최소 각도: -2.617 [rad] = -150도
  • 최대 각도: 2.617 [rad] = 150도
  • 속도: 1.571 [rad/s] = 90도/초
  • Radians to Degrees conversion calculator: https://www.rapidtables.com/convert/number/radians-to-degrees.html
<joint name="joint2" type="revolute">
  <parent link="link2"/>
  <child link="link3"/>
  <origin xyz="0 0 0.5" rpy="0 0 0"/>
  <axis xyz="0 1 0"/>
  <limit effort="30" lower="-2.617" upper="2.617" velocity="1.571"/>
</joint>

참고: http://wiki.ros.org/urdf/XML/joint


URDF 파일 작성 및 빌드

create urdf file

ROS1 activated
user:/mnt/c/Users/windy$ cd ~/catkin_ws/src/
user:~/catkin_ws/src$ catkin_create_pkg testbot_description urdf
Created file testbot_description/package.xml
Created file testbot_description/CMakeLists.txt
Successfully created files in /home/andy/catkin_ws/src/testbot_description. Please adjust the values in package.xml.
user:~/catkin_ws/src$ cd testbot_description/
user:~/catkin_ws/src/testbot_description$ mkdir urdf
user:~/catkin_ws/src/testbot_description$ cd urdf/​

urdf 작성(참고: ros_tutorials/testbot.urdf at master · ROBOTIS-GIT/ros_tutorials · GitHub)

 

user:~/catkin_ws/src/testbot_description/urdf$ vi testbot.urdf

install urdf tools (참고: urdf_tools - ROS Wiki)

user:~/catkin_ws/src/testbot_description/urdf$ sudo apt-get install liburdfdom-tools

작성한 urdf에 문제가 없는지 확인하기 위해 check_urdf를 실행한다.

user:~/catkin_ws/src/testbot_description/urdf$ check_urdf testbot.urdf
robot name is: testbot
---------- Successfully Parsed XML ---------------
root Link: base has 1 child(ren)
    child(1):  link1
        child(1):  link2
            child(1):  link3
                child(1):  link4

그래프 형태로 보기 위해 urdf_to_graphiz 실행한다.

user:~/catkin_ws/src/testbot_description/urdf$ urdf_to_graphiz testbot.urdf
Created file testbot.gv
Created file testbot.pdf

생성된 testbot.pdf를 c:\Downloads로 복사하여 확인한다.

user:~/catkin_ws/src/testbot_description/urdf$ ls
testbot.gv  testbot.pdf  testbot.urdf
user:~/catkin_ws/src/testbot_description/urdf$ cp testbot.pdf /mnt/c/Users/windy/Downloads/

testbot.pdf

testbot.launch를 작성한다. 참고로 launch의 내용은 이전 버전 기준이라 아래쪽에서 수정된다.

$ cd ~/catkin_ws/src/testbot_description
$ mkdir launch
$ cd launch
$ vi testbot.launch
<launch>
	<arg name="model" default="$(find testbot_description)/urdf/testbot.urdf" />
	<arg name="gui" default="True" />
	<param name="robot_description" textfile="$(arg model)" />
	<param name="use_gui" value="$(arg gui)"/>
	<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
	<node pkg="robot_state_publisher" type="state_publisher" name="robot_state_publisher" />
</launch>

catkin_make를 통해 빌드한다.

 

$ cd ~/catkin_ws/
$ catkin_make

catkin_make에서 에러 발생 시

가끔 catkin_make를 하면 아래와 같이 에러가 발생하는데, 해결해보자.
user:~/catkin_ws$ catkin_make
Base path: /home/andy/catkin_ws
Source space: /home/andy/catkin_ws/src
Build space: /home/andy/catkin_ws/build
The build space at '/home/andy/catkin_ws/build' was previously built by 'catkin build'. Please remove the build space or pick a different build space.​

해결: “catkin clean -y”를 사용하여 build devel 디렉토리를 삭제하면 해결된다.

user:~/catkin_ws$ catkin clean -y
user:~/catkin_ws$ catkin_make​
실행 전 몇몇 이슈 해결

작성한 launch 파일은 이전 버전 기준이라 경고와 에러가 발생한다. 이 문제들을 해결해보자.

  • state_publisher가 deprecated 되었다는 경고 발생
⚠️ [ WARN] [1646789432.515838035]: The 'state_publisher' executable is deprecated. Please use 'robot_state_publisher' instead
해결: testbot.launch의 robot_state_publisher 패키지 부분의 type 속성의 값을 “robot_state_publisher”로 수정
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />​
  • 'use_gui' 파라메터가 deprecated 되었다는 경고 발생
⚠️ [WARN] [1646789432.787375]: The 'use_gui' parameter was specified, which is deprecated. We'll attempt to find and run the GUI, but if this fails you should install the 'joint_state_publisher_gui' package instead and run that. This backwards compatibility option will be removed in Noetic.
- “gui” <arg> 태그 삭제
- “use_gui” <param> 태그 삭제
- <node> 태그 중 joint_state_publisher 패키지의 pkg와 type을 “joint_state_publisher”에서 “joint_state_publisher**_gui**”로 변경한다.
- name 속성은 그대로 둬도 된다.
<launch>
	<arg name="model" default="$(find testbot_description)/urdf/testbot.urdf" />
삭제->  <arg name="gui" default="True" />
	<param name="robot_description" textfile="$(arg model)" />
삭제->  <param name="use_gui" value="$(arg gui)"/>
수정->  <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher" />
	<node pkg="robot_state_publisher" type="state_publisher" name="robot_state_publisher" />
</launch>

참고: https://youtu.be/6PhOHv0T1Gg?t=1130

  • “joint_state_publisher_gui” 패키지가 없다는 에러 발생
roslaunch를 실행하면 아래와 같은 에러가 발생한다.
🚫 [ERROR] [1646788902.128559]: Could not find the GUI, install the 'joint_state_publisher_gui' package [joint_state_publisher-2] process has died [pid 899, exit code 1, cmd /opt/ros/melodic/lib/joint_state_publisher/joint_state_publisher __name:=joint_state_publisher __log:=/home/andy/.ros/log/464d22fc-9f47-11ec-a636-00155df32e94/joint_state_publisher-2.log]. log file: /home/andy/.ros/log/464d22fc-9f47-11ec-a636-00155df32e94/joint_state_publisher-2*.log
ros-melodic-joint-state-publisher-gui를 설치한다.
$ sudo apt update
$ sudo apt install ros-melodic-joint-state-publisher-gui​

 

참고: https://answers.ros.org/question/344992/missing-joint_state_publisher_gui-when-l-run-displaylaunch/

최종적으로 수정된 testbot.launch 파일이다. (ROS Melodic 버전 기준)

<launch>
  <arg name="model" default="$(find testbot_description)/urdf/testbot.urdf" />
  <param name="robot_description" textfile="$(arg model)" />
  <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher" />
  <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
</launch>

실행

새 터미널을 띄우고 roslaunch를 실행한다.

user:/mnt/c/Users/windy$ roslaunch testbot_description testbot.launch

joint_state_publisher_gui 툴이 띄워진다.

joint_state_publisher_gui 툴

새 터미널을 띄우고 rviz를 실행한다.

rviz

"Global Status: Error"가 발생하는데, 해결해 보자.

Display > Global Options > Fixed Frame > “base” 선택

Fixed Frame: base

RobotModel을 추가한다.

RobotModel 추가

URDF로 표현한 매니퓰레이터가 화면에 표시된다.

매니퓰레이터

TF를 추가해보자.

Add > TF 선택

TF 추가

TF가 추가되면 로봇의 각 조인트의 축이 색깔로 표시된다.

알파값: 0.7

R: x, G: y, B: z

조인트 조절

rqt_graph를 통해 노드들의 관계와 메시지를 살펴본다.

$ rqt_graph

‘ROS 로봇 프로그래밍’ 도서의 432 page 내용을 참조하였다.

joint_state_publisher 노드 (http://wiki.ros.org/joint_state_publisher)

- URDF로 만들어진 로봇의 관절 상태를 sensor_msgs/JointState 메시지 형태를 통해 퍼블리시 한다.

- 관절에 명령을주는 GUI 툴을 제공한다. (http://wiki.ros.org/joint_state_publisher_gui)

robot_state_publisher 노드 (http://wiki.ros.org/robot_state_publisher)

- URDF에 설정된 로봇 정보와 sensor_msgs/JointState 토픽 정보를 가지고 계산한 forward kinematics 결과를 tf 메시지로 퍼블리시 하는 역할을 한다.

rqt_graph