ROS2 5일차(1) URDF

2024. 9. 26. 15:31ROS2/URDF

복잡한 urdf를 작성하기에 앞서 미리 간단한 것들로 urdf문법에 익숙해지려 한다.

 

https://with-rl.tistory.com/entry/URDF%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-%EB%A1%9C%EB%B4%87-%EB%A7%8C%EB%93%A4%EA%B8%B0-1

 

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

URDF(Unified Robot Description Format)는 실제 물리적인 로봇이 아닌 가상환경에서 로봇의 규격을 정의할 수 있는 규칙이라 할 수 있습니다. URDF는 XML 형식으로 구성되며 ROS 및 Gazebo와 연동하여 가상환경

with-rl.tistory.com

참고

 

먼저 워크스페이스를 만들어주었다

mkdir ~/ch2_ws && cd ch2_ws
mkdir src && cd src

 

그 다음 패키지를 만듬

cd ~/ch2_ws/src
ros2 pkg create --build-type ament_python urdf_tutorial

 

vscode를 키고

launch라는 폴더와 urdf라는 폴더를 만들어준다.

그 다음 각각 파일 생성

robot_1.xacro

<?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>

1. <?xml version="1.0"?>

  • XML 파일의 버전 정보를 나타냅니다.

2. <robot xmlns:xacro="http://ros.org/wiki/xacro" name="urdf_test">

  • robot 태그는 로봇 모델을 정의하는 시작점입니다.
  • xmlns:xacro="http://ros.org/wiki/xacro"는 Xacro 확장 XML 네임스페이스를 선언합니다.
  • name="urdf_test"는 이 로봇의 이름을 "urdf_test"로 설정합니다.

3. <!-- BASE -->

  • 주석으로, "BASE"라고 명시되어 로봇의 베이스 링크가 시작됨을 알립니다.

4. <link name="base_link"> </link>

  • link 태그는 로봇의 구성 요소(링크)를 정의합니다.
  • name="base_link"는 링크의 이름을 "base_link"로 지정합니다.
  • 이 링크는 로봇의 베이스, 즉 중심 링크 역할을 합니다. 안에 정의된 내용이 없으므로, 현재는 이 링크는 시각적 또는 물리적 형상이 없습니다.

5. <!-- BODY LINK -->

  • 주석으로 "BODY LINK" 부분을 설명합니다. 이는 로봇 본체를 연결하는 부분을 설명합니다.

6. <joint name="body_joint" type="fixed">

  • joint 태그는 두 링크를 연결하는 조인트(관절)를 정의합니다.
  • name="body_joint"는 조인트의 이름을 "body_joint"로 설정합니다.
  • type="fixed"는 이 조인트가 고정된 조인트임을 의미합니다. 즉, 두 링크 사이에 상대적인 움직임이 없음을 나타냅니다.

7. <parent link="base_link"/>

  • parent 태그는 부모 링크를 정의합니다.
  • 이 경우, "base_link"는 부모 링크로 설정됩니다.

8. <child link="body"/>

  • child 태그는 자식 링크를 정의합니다.
  • 이 경우, "body"는 자식 링크로 설정됩니다.

9. <link name="body">

  • link 태그는 "body"라는 이름을 가진 링크를 정의합니다.
  • 이 링크는 로봇의 본체를 나타냅니다.

10. <visual>

  • visual 태그는 로봇의 시각적 표현을 정의합니다.

11. <geometry>

  • geometry 태그는 시각적 형상의 구체적인 형태를 정의합니다.

12. <box size="1 1 1"/>

  • box 태그는 이 링크가 1m x 1m x 1m 크기의 박스 모양임을 정의합니다.
  • "1 1 1"은 x, y, z 방향의 크기를 의미합니다.

13. </robot>

  • 로봇 모델 정의의 끝을 나타냅니다.

요약:

  • 이 URDF 모델은 간단한 로봇을 정의하고 있으며, 이 로봇은 두 개의 링크로 구성되어 있습니다.
  • base_link는 로봇의 베이스 역할을 하며, body는 로봇의 본체로 1m x 1m x 1m 크기의 박스 모양입니다.
  • 두 링크는 고정된 조인트 (body_joint)로 연결되어 있어, 움직이지 않는 구조를 가집니다.

 

robot_1.launch.py

 
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],
            ),
        ]
    )

1. import os

  • os 모듈을 가져옵니다. 파일 경로를 다루기 위한 함수들이 들어있습니다.

2. from ament_index_python.packages import get_package_share_directory

  • ROS 2의 ament_index 라이브러리에서 get_package_share_directory를 가져옵니다.
  • 이 함수는 특정 패키지의 공유 디렉터리 경로를 찾는 데 사용됩니다.

3. from launch import LaunchDescription

  • LaunchDescription 클래스를 가져옵니다. 이 클래스는 launch 파일의 구조를 정의하는데 사용됩니다. 어떤 노드를 실행할지, 어떤 파라미터를 사용할지 등을 이 객체로 설정합니다.

4. from launch.substitutions import LaunchConfiguration

  • LaunchConfiguration을 가져옵니다.
  • 이는 launch 파일에서 런타임에 값을 설정할 수 있는 변수를 선언할 때 사용됩니다. 예를 들어, use_sim_time처럼 설정된 변수를 런타임에 변경할 수 있습니다.

5. from launch.actions import DeclareLaunchArgument

  • DeclareLaunchArgument는 launch 파일에서 인수를 선언할 때 사용됩니다.
  • 이 인수는 사용자가 launch 파일을 실행할 때 특정 값들을 설정할 수 있도록 합니다.

6. from launch_ros.actions import Node

  • Node는 ROS 2 노드를 launch 파일 내에서 정의하고 실행할 수 있는 객체입니다.
  • 여기에 패키지 이름, 실행 파일, 파라미터 등을 설정할 수 있습니다.

7. import xacro

  • xacro는 Xacro 파일을 처리할 수 있는 ROS 2 라이브러리입니다.
  • 이를 통해 Xacro 파일을 XML로 변환하고 URDF를 생성할 수 있습니다.

8. use_sim_time = LaunchConfiguration("use_sim_time")

  • use_sim_time이라는 런치 설정 변수를 정의합니다.
  • 이 변수는 시뮬레이션 시간을 사용할지 여부를 설정하는 데 사용됩니다.

9. pkg_path = os.path.join(get_package_share_directory("urdf_tutorial"))

  • urdf_tutorial 패키지의 공유 디렉터리 경로를 가져와 pkg_path 변수에 저장합니다.
  • 이 경로는 패키지 내 파일을 찾는 데 사용됩니다.

10. xacro_file = os.path.join(pkg_path, "urdf", "robot_1.xacro")

  • pkg_path 디렉터리에서 urdf/robot_1.xacro 파일 경로를 생성하여 xacro_file에 저장합니다.
  • 이 경로는 로봇 모델을 설명하는 Xacro 파일의 경로입니다.

11. robot_description = xacro.process_file(xacro_file)

  • xacro_file 경로에서 Xacro 파일을 처리하여 XML로 변환합니다.
  • robot_description은 변환된 URDF 데이터를 담고 있습니다.

12. params = {"robot_description": robot_description.toxml(), "use_sim_time": use_sim_time}

  • 로봇의 URDF 모델 (robot_description)과 시뮬레이션 시간을 사용할지 여부 (use_sim_time)를 딕셔너리 형식으로 정의합니다.
  • 이 파라미터들은 이후에 robot_state_publisher 노드에 전달됩니다.

13. return LaunchDescription([ ... ])

  • LaunchDescription 객체를 반환합니다. 이 객체는 launch 파일에서 실행할 내용을 담고 있습니다.

14. DeclareLaunchArgument("use_sim_time", default_value="false", description="use sim time")

  • use_sim_time이라는 인수를 선언합니다.
  • 기본값은 "false"로 설정되어 있으며, 사용자가 launch 명령어를 통해 이 값을 변경할 수 있습니다.
  • 이 인수는 시뮬레이션 시간과 관련된 설정입니다.

15. Node(package="robot_state_publisher", executable="robot_state_publisher", output="screen", parameters=[params])

  • robot_state_publisher라는 노드를 실행하도록 정의합니다.
  • 이 노드는 로봇의 URDF 모델을 해석하여 각 링크의 상태를 퍼블리시합니다.
  • parameters=[params]는 이전에 정의한 URDF 모델과 use_sim_time 파라미터를 노드에 전달합니다.
  • output="screen"은 노드의 실행 결과를 화면에 출력하게 합니다.

만들어낸 결과물을 확인하기 위해 robot_1.launch.py 파일 실행

$ cd ch2_ws
$ colcon build --symlink-install
$ source install/setup.bash
$ ros2 launch urdf_tutorial robot_1.launch.py
  • --symlink-install : 이 구문이 들어가게 되면 빌드된 결과물이 워크스페이스의 설치경로로 복사되지않고 소스 경로에 대한 심볼릭 링크가 생성된다. 즉 빌드된 파일 자체가 복사되는 것이 아닌 소스코드의 위치를 가리키는 링크가 설치 디렉토리에 만들어지기 때문에 소스 코드를 수정할 때마다 재빌드 하지않아도 된다.

 

블럭 색깔 바꾸기

<?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>

위에 material 부분을 추가해서 흰색으로 만듬

 

  • Red (R): 빨간색의 강도 (0.0에서 1.0까지의 값).
  • Green (G): 초록색의 강도 (0.0에서 1.0까지의 값).
  • Blue (B): 파란색의 강도 (0.0에서 1.0까지의 값).
  • Alpha (A): 투명도 (0.0에서 1.0까지의 값으로, 0은 완전히 투명하고 1은 불투명함을 의미).

박스에서 원통으로 바꾸기

<?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>

 

 

원통이 아닌 구로 만들기

<?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>

'ROS2 > URDF' 카테고리의 다른 글

ROS2 URDF(4)  (0) 2024.10.04
ROS2 URDF(3)  (0) 2024.09.30
ROS2 6일차(2) URDF  (0) 2024.09.27
ROS2 6일차(1) URDF  (0) 2024.09.27
ROS2 5일차(2) URDF  (0) 2024.09.26