2024.10.31 - [ROS/ROS2] - [ROS2] 006 : ROS2 QT GUI C++ 패키지, 노드 작성
[ROS2] 006 : ROS2 QT GUI C++ 패키지, 노드 작성
서론이전 글에서 C++을 사용하여 ROS2 패키지를 간단하게 작성해 보았다.2024.10.29 - [ROS/ROS2] - [ROS2] 005 : ROS2 C++ 패키지, 노드 작성 가이드 [ROS2] 005 : ROS2 C++ 패키지, 노드 작성 가이드서론이전 글에서
menggu1234.tistory.com
서론
ROS2는 이전에 설명한 바와 같이 로봇 어플리캐이션의 구조를 더욱 모듈화하고 효율적으로 관리할 수 있다. 이러한 특징들을 위해서 launch 파일 시스템을 제공한다. launch 파일을 사용하면 여러 노드와 관련 설정들을 한 번에 로드할 수 있어 ROS를 사용할 때 매우 유용하다. 해당 포스트에서는 Python, XML을 이용하는 방식 두 가지를 설명하겠다.
launch 파일은 기본적으로 패키지의 launch 폴더 내에 위치한다.
1. Python 사용(.py) Launch 파일
Python 방식의 launch 파일의 경우 .py 확장자를 가지며, python 스크립트를 사용하여 유연하게 설정을 정의할 수 있다. 이를 통해 조건문이나 반복문 등 python 문법을 사용할 수 있어 기존에 python을 통해 개발을 하였던 사용자들은 조금 더 편리함을 느낄 수 있다.
python을 사용한 launch 파일의 기본 구조는 아래와 같다.
# launch/your_launch_file.py
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='your_package_name',
executable='your_node_name',
name='your_custom_node_name',
output='screen',
parameters=[{'param_name': 'param_value'}]
),
])
내용을 요약하자면 아래와 같다.
- Node : ROS2에서 노드를 시작하기 위해 사용하는 클래스. 여기서 패키지 이름, 실행 파일(executable) 이름, 노드 이름 및 파라미터를 설정할 수 있다.
- output='screen' : 노드의 출력을 터미널에 출력할 지 여부
여러 노드를 동시에 실행하려면 Node 클래스를 여러번 정의하여 LaunchDescription에 추가해 주면 된다.
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='your_package_name',
executable='node1',
name='node1_name',
output='screen',
),
Node(
package='your_package_name',
executable='node2',
name='node2_name',
output='screen',
parameters=[{'example_param': 'example_value'}]
),
])
2. XML 사용(.launch.xml) Launch 파일
xml 방식의 launch 파일은 .launch.xml 확장자를 가지며, xml 태그를 사용하여 노드와 설정을 정의한다. xml 방식은 구조가 직관적이고 단순하지만, Python과 다르게 조건문 등을 사용하기에는 조금 부족하다. 다만, 개인적으로 조금 더 선호하는 launch 파일 방식이다.
기본 구조는 아래와 같다.
<!-- launch/your_launch_file.launch.xml -->
<launch>
<node pkg="your_package_name" exec="your_node_name" name="your_custom_node_name" output="screen">
<param name="param_name" value="param_value" />
</node>
</launch>
- <node> : ROS2 노드를 정의하는 태그로, pkg, exec, name, output 등의 속성을 설정한다.
- <param> : 노드에 전달할 파라미터를 설정할 대 사용한다.
여러 노드를 실행하는 경우
<launch>
<node pkg="your_package_name" exec="node1" name="node1_name" output="screen" />
<node pkg="your_package_name" exec="node2" name="node2_name" output="screen">
<param name="example_param" value="example_value" />
</node>
</launch>
3. 추가 옵션 및 고급 설정
파라미터 파일 사용하기
Python 및 XML 방식 모두에서 파라미터 파일을 사용해 노드 설정을 보다 쉽게 관리할 수 있다.
- Python 방식에선 parameters 키에 파일 경로를 전달할 수 있다.
Node(
package='your_package_name',
executable='your_node_name',
parameters=['path/to/params.yaml']
)
<node pkg="your_package_name" exec="your_node_name" name="your_custom_node_name" output="screen">
<rosparam file="path/to/params.yaml" />
</node>
조건부 실행 (Python)
Python 방식에서는 조건문을 사용하여 특정 상황에서만 노드를 실행하는 것이 가능하다.
from launch import LaunchDescription
from launch.conditions import IfCondition
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
def generate_launch_description():
return LaunchDescription([
Node(
package='your_package_name',
executable='node_name',
condition=IfCondition(LaunchConfiguration('enable_node')),
output='screen'
),
])
결론
ROS2에서 launch 파일을 사용하는 것은 시스템의 노드와 파라미터를 손쉽게 제어할 수 있는 매우 유용한 도구이다. Python 방식은 조건문과 같은 논리적 설정이 가능하여 복잡한 설정을 할 경우에 적합하며, XML 방식은 구조가 단순하고 읽기 쉬워 간단한 설정에 유리하다.
'ROS > ROS2' 카테고리의 다른 글
[ROS2] 008 : ROS2 카메라 이미지 데이터 사용하기 (0) | 2024.10.31 |
---|---|
[ROS2] 006 : ROS2 QT GUI C++ 패키지, 노드 작성 (2) | 2024.10.31 |
[ROS2] 005 : ROS2 C++ 패키지, 노드 작성 가이드 (1) | 2024.10.29 |
[ROS2] 004 : ROS2 노드(Node)와 데이터 (0) | 2024.10.29 |
[ROS2] 002 : ROS2 예제 (demo_nodes, turtlesim) (0) | 2024.10.29 |