로봇/ROS

URDF를 이용한 간단한 로봇 만들기 (1)

with-RL 2023. 7. 15. 01:29

URDF(Unified Robot Description Format)는 실제 물리적인 로봇이 아닌 가상환경에서 로봇의 규격을 정의할 수 있는 규칙이라 할 수 있습니다.

 

URDF는 XML 형식으로 구성되며 ROS 및 Gazebo와 연동하여 가상환경에서 다양한 동작을 실험할 수 있습니다.

 

이번 포스팅에서는 간단한 URDF를 제작하고 ROS와 연동해서 Rviz에서 확인해 보는 과정입니다.

 

이 포스트는 다음 영상의 내용을 기반으로 개발하고자 하는 로봇에 적합하게 수정했습니다.

 

Creating a rough 3D model of our robot with URDF

 

이 포스트는 다음 과정을 완료한 후에 참고하시길 바랍니다.

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) 생성된 것을 확인할 수 있습니다.