ROS2 5일차(1) URDF
2024. 9. 26. 15:31ㆍROS2/URDF
복잡한 urdf를 작성하기에 앞서 미리 간단한 것들로 urdf문법에 익숙해지려 한다.
참고
먼저 워크스페이스를 만들어주었다
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 |