URDF(Unified Robot Description Format)는 실제 물리적인 로봇이 아닌 가상환경에서 로봇의 규격을 정의할 수 있는 규칙이라 할 수 있습니다.
URDF는 XML 형식으로 구성되며 ROS 및 Gazebo와 연동하여 가상환경에서 다양한 동작을 실험할 수 있습니다.
이번 포스팅에서는 간단한 URDF를 제작하고 ROS와 연동해서 Rviz에서 확인해 보는 과정입니다.
이 포스트는 다음 영상의 내용을 기반으로 개발하고자 하는 로봇에 적합하게 수정했습니다.
Creating a rough 3D model of our robot with URDF
이 포스트는 다음 과정을 완료한 후에 참고하시길 바랍니다.
- ROS2 Minimal Tutorial - Basic
- ROS2 Minimal Tutorial - Topic
- ROS2 Minimal Tutorial - Service
- ROS2 Minimal Tutorial - Action
1. URDF Package 생성하기
- URDF를 정의하고 결과를 확인하기 위해서 ROS 프로젝트를 생성하는 과정입니다.
- 아래 명령을 실행해서 URDF를 실험할 ‘urdf_tutorial’ package를 만듭니다.
$ cd ~/Workspace/ros_ws/src
$ ros2 pkg create --build-type ament_python urdf_tutorial
- VSCode를 이용해 'ros_ws' 폴더를 열어봅니다. 아래와 같이 'ros_ws/src' 폴더 아래 'urdf_tutorial' Package 관련 파일들이 생성된 것을 확인할 수 있습니다.
2. Simple URDF 만들기
- 아주 간단한 URDF를 만들어 보고 그것을 RVIZ를 이용해 확인해 보는 과정입니다.
- ‘src/urdf_tutorial’ 폴더 아래 다음 두 폴더를 추가합니다.
◦ urdf: URDF 파일을 저장할 폴더입니다.
◦ launch: ROS2 실행 launch 스크립트를 저장할 폴더입니다. - 위에서 만든 두 폴더가 컴파일에 포함될 수 있도록 'src/urdf_tutorial/setup.py'를 아래와 같이 편집합니다.
import os
from glob import glob
from setuptools import setup
package_name = 'urdf_tutorial'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
(os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
(os.path.join('share', package_name, 'urdf'), glob('urdf/*.xacro')),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='cchyun',
maintainer_email='cchyun@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
],
},
)
- 다음은 ‘src/urdf_tutorial/urdf/robot_1.xacro’ 파일을 만들고 아래와 같이 편집합니다. 파일의 내용을 간단히 설명하면 다음과 같습니다.
◦ base_link: 가상의 링크입니다.
◦ body: 가로, 세로, 높이 각각 1m인 상자입니다.
◦ body_joint: base_link와 body를 연결하는 joint입니다.
<?xml version="1.0"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro" name="urdf_test" >
<!-- BASE -->
<link name="base_link">
</link>
<!-- BODY LINK -->
<joint name="body_joint" type="fixed">
<parent link="base_link"/>
<child link="body"/>
</joint>
<link name="body">
<visual>
<geometry>
<box size="1 1 1"/>
</geometry>
</visual>
</link>
</robot>
- 다음은 ‘src/urdf_tutorial/launch/robot_1.launch.py’ 파일을 만들고 아래와 같이 편집합니다. 파일의 내용을 간단히 설명하면 다음과 같습니다.
◦ ‘robot.urdf’ 파일을 ‘robot_description’으로 하는 ‘robot_state_publisher’ 노드를 생성합니다.
◦ 자세한 내용은 ROS wiki의 robot_state_publisher를 참고하세요.
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.substitutions import LaunchConfiguration
from launch.actions import DeclareLaunchArgument
from launch_ros.actions import Node
import xacro
def generate_launch_description():
use_sim_time = LaunchConfiguration("use_sim_time")
pkg_path = os.path.join(get_package_share_directory("urdf_tutorial"))
xacro_file = os.path.join(pkg_path, "urdf", "robot_1.xacro")
robot_description = xacro.process_file(xacro_file)
params = {"robot_description": robot_description.toxml(), "use_sim_time": use_sim_time}
return LaunchDescription(
[
DeclareLaunchArgument(
"use_sim_time", default_value="false", description="use sim time"
),
Node(
package="robot_state_publisher",
executable="robot_state_publisher",
output="screen",
parameters=[params],
),
]
)
- 첫 번째 터미널에서 아래 명령을 실행해서 컴파일 및 ‘robot_1.launch.py’ 파일을 실행합니다. 아래 그림과 같이 실행결과를 확인할 수 있습니다.
$ cd ~/Workspace/ros_ws
$ colcon build --symlink-install
$ source install/setup.bash
$ ros2 launch urdf_tutorial robot_1.launch.py
- 두 번째 터미널에서 아래 명령을 실행해서 Rviz를 실행합니다. 아래 그림과 같이 Rviz가 실행됩니다.
$ cd ~/Workspace/ros_ws
$ source install/setup.bash
$ rviz2
- 실행된 RViz 창에서 ‘Fixed Frame’을 ‘base_link’로 변경합니다.
- 왼쪽 하단의 ‘Add’ 버튼을 누르면 실행되는 팝업창에서 ‘TF’를 선택하고 ‘Ok’ 버튼을 누릅니다.
- 좌측 Tree에 TF가 추가된 것을 확인할 수 있습니다. TF의 하위 항목 중 ‘Show Names’를 선택합니다. 중앙에 ‘base_link’와 ‘body’가 겹쳐진 상태로 보이는 것은 확인할 수 있습니다.
- 다시 한번 왼쪽 하단의 ‘Add’ 버튼을 누르면 실행되는 팝업창에서 ‘RobotModel’을 선택하고 ‘Ok’ 버튼을 누릅니다.
- RobotModel이 추가된 것을 확인할 수 있습니다. RobotModel의 하위 항목 중 ‘Description Topic’을 ‘/robot_description’으로 변경합니다. 중앙에 가로, 세로, 높이 1m의 정 육면체가 나타난 것을 확인할 수 있습니다. 정육면체가 위에서 지정한 ‘body’ link입니다.
- 지금까지 진행한 Rviz 설정을 저장을 해 놓으면 다음에 다시 설정하지 않고 저장된 설정을 읽어올 수 있습니다. 'File' 메뉴에서 'Save Config As'를 선택합니다.
- 아래 그림과 같이 'src/urdf_tutorial/config/robot.rviz'에 저장을 합니다. 이제 다음에는 저장된 'robot.rviz'를 읽어오면 현재 설정을 그대로 로딩할 수 있습니다.
- 다음은 세 번째 터미널에서 아래 명령을 실행해서 rqt_graph를 실행합니다.
$ rqt_graph
- rqt_grqph 창에서 상단 툴바의 ‘Refresh’ 버튼을 누릅니다. 아래 그림과 같이 실행 중인 Node를 확인할 수 있습니다. 정보는 아래와 같습니다.
◦ /robot_state_publisher: ‘robot.launch.py’를 이용해서 실행한 Node입니다.
◦ /transform_listner_Impl: rviz2에서 실행한 Node입니다.
◦ ‘/robot_state_publisher’ Node는 ‘/transform_listner_Impl’ Node에게 ‘/tf’, ‘/tf_static’ 두 개의 topic을 전달하고 있습니다.
- 정육면체의 색을 바꾸기 위해서 ‘src/urdf_tutorial/urdf/robot_1.xacro’ 파일을 아래와 같이 수정합니다. 수정내용은 아래와 같습니다.
◦ material white: 위쪽에 흰색을 표현하는 white material을 선언했습니다. 색상은 rgba모두 1로 지정했습니다. 색상의 범위는 0부터 1 사이로 0이 가장 어둡고 1이 가장 밝은 값입니다.
◦ body link material: body link에 위에서 지정한 white material을 지정했습니다.
<?xml version="1.0"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro" name="urdf_test" >
<!-- COLOR -->
<material name="white">
<color rgba="1 1 1 1" />
</material>
<!-- BASE -->
<link name="base_link">
</link>
<!-- BODY LINK -->
<joint name="body_joint" type="fixed">
<parent link="base_link"/>
<child link="body"/>
</joint>
<link name="body">
<visual>
<geometry>
<box size="1 1 1"/>
</geometry>
<material name="white"/>
</visual>
</link>
</robot>
- 변경된 값을 반영하기 위해 첫 번째 터미널에서 ‘CTRL+C’ 키를 입력해서 ROS2를 종료한 후 명령을 수행해서 ROS2를 다시 실행합니다.
$ cd ~/Worksapce/ros_ws
$ colcon build --symlink-install
$ source install/setup.bash
$ ros2 launch urdf_tutorial robot_1.launch.py
- 아래 그림과 같이 body가 흰색으로 변경된 것을 확인할 수 있습니다.
- 정육면체 대신 원통(cylinder)을 넣어보기 위해서 ‘src/urdf_tutorial/urdf/robot_1.xacro' 파일을 아래와 같이 수정합니다.
<?xml version="1.0"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro" name="urdf_test" >
<!-- COLOR -->
<material name="white">
<color rgba="1 1 1 1" />
</material>
<!-- BASE -->
<link name="base_link">
</link>
<!-- BODY LINK -->
<joint name="body_joint" type="fixed">
<parent link="base_link"/>
<child link="body"/>
</joint>
<link name="body">
<visual>
<geometry>
<!-- <box size="1 1 1"/> -->
<cylinder radius="1" length="0.5"/>
</geometry>
<material name="white"/>
</visual>
</link>
</robot>
- 변경된 값을 반영하기 위해 첫 번째 터미널에서 ‘CTRL+C’ 키를 입력해서 ROS2를 종료한 후 명령을 수행해서 ROS2를 다시 실행합니다.
$ cd ~/Worksapce/ros_ws
$ colcon build --symlink-install
$ source install/setup.bash
$ ros2 launch urdf_tutorial robot_1.launch.py
- 아래 그림과 같이 반지름이 1m이고 높이가 0.5m인 원통이 생성된 것을 확인할 수 있습니다.
- 원통(cylinder) 대신 구(sphere)를 넣어보기 위해서 ‘src/urdf_tutorial/urdf/robot_1.xacro’ 파일을 아래와 같이 수정합니다.
<?xml version="1.0"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro" name="urdf_test" >
<!-- COLOR -->
<material name="white">
<color rgba="1 1 1 1" />
</material>
<!-- BASE -->
<link name="base_link">
</link>
<!-- BODY LINK -->
<joint name="body_joint" type="fixed">
<parent link="base_link"/>
<child link="body"/>
</joint>
<link name="body">
<visual>
<geometry>
<!-- <box size="1 1 1"/> -->
<!-- <cylinder radius="1" length="0.5"/> -->
<sphere radius="1.0"/>
</geometry>
<material name="white"/>
</visual>
</link>
</robot>
- 변경된 값을 반영하기 위해 첫 번째 터미널에서 ‘CTRL+C’ 키를 입력해서 ROS2를 종료한 후 명령을 수행해서 ROS2를 다시 실행합니다.
$ cd ~/Worksapce/ros_ws
$ colcon build --symlink-install
$ source install/setup.bash
$ ros2 launch urdf_tutorial robot_1.launch.py
- 아래 그림과 같이 반지름이 1m인 구(sphere) 생성된 것을 확인할 수 있습니다.
'로봇 > ROS' 카테고리의 다른 글
URDF를 이용한 간단한 로봇 만들기 (3) (1) | 2023.07.18 |
---|---|
URDF를 이용한 간단한 로봇 만들기 (2) (0) | 2023.07.16 |
ROS2 Minimal Tutorial - Action (0) | 2023.07.14 |
ROS2 Minimal Tutorial - Service (0) | 2023.07.14 |
ROS2 Minimal Tutorial - Topic (0) | 2023.07.14 |