1. launch 파일에서 실행 인자 사용하기
ROS 2 launch 파일은 단순히 노드를 실행하는 용도만 있는 것이 아닙니다.
실행할 때 값을 외부에서 받아서 launch 파일 내부에서 사용할 수도 있습니다.
예를 들어 turtlesim의 배경색을 launch 실행 시점에 바꾸고 싶다고 가정해 보겠습니다.
ros2 launch my_first_package turtlesim_arg.launch.py background_r:=0 background_g:=0 background_b:=255
이렇게 실행하면 launch 파일 안에서 background_r, background_g, background_b 값을 받아 사용할 수 있습니다.
launch 파일은 다음처럼 작성할 수 있습니다.
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
def generate_launch_description():
background_r = LaunchConfiguration('background_r')
background_g = LaunchConfiguration('background_g')
background_b = LaunchConfiguration('background_b')
return LaunchDescription([
DeclareLaunchArgument(
'background_r',
default_value='255',
description='Turtlesim background red value'
),
DeclareLaunchArgument(
'background_g',
default_value='255',
description='Turtlesim background green value'
),
DeclareLaunchArgument(
'background_b',
default_value='255',
description='Turtlesim background blue value'
),
Node(
package='turtlesim',
executable='turtlesim_node',
output='screen',
parameters=[
{
'background_r': background_r,
'background_g': background_g,
'background_b': background_b,
}
]
)
])
여기서 중요한 부분은 다음입니다.
DeclareLaunchArgument()
이 함수는 launch 실행 시 외부에서 받을 인자를 선언합니다.
LaunchConfiguration()
이 함수는 선언된 launch 인자 값을 실제로 가져와서 사용합니다.
즉, launch 파일을 수정하지 않고 실행 명령어만 바꿔서 노드 설정을 변경할 수 있습니다.
실무에서는 이 방식이 매우 중요합니다.
예를 들어 모바일 로봇 시스템에서는 다음 값들을 launch 인자로 받을 수 있습니다.
use_sim_time
robot_id
namespace
map_file
navigation_enable
lidar_enable
camera_enable
rviz_enable
log_level
이렇게 구성하면 같은 launch 파일 하나로 시뮬레이션, 실제 로봇, 센서 테스트 환경을 구분해서 실행할 수 있습니다.
2. launch 파일에서 YAML 파라미터 파일 사용하기
노드 파라미터가 많아지면 launch 파일 안에 직접 쓰는 방식은 깔끔하지 않습니다.
예를 들어 다음처럼 파라미터가 많아질 수 있습니다.
parameters=[
{'max_speed': 1.0},
{'min_speed': 0.1},
{'goal_tolerance': 0.2},
{'use_filter': True},
{'control_rate': 50},
]
이런 경우에는 YAML 파일로 분리하는 것이 좋습니다.
패키지 구조는 다음처럼 만들 수 있습니다.
my_first_package/
├── config/
│ └── turtlesim_params.yaml
├── launch/
│ └── turtlesim_with_yaml.launch.py
├── my_first_package/
├── package.xml
└── setup.py
먼저 config 폴더를 만듭니다.
cd ~/ros2_study/src/my_first_package
mkdir config
touch config/turtlesim_params.yaml
turtlesim_params.yaml 파일을 다음처럼 작성합니다.
turtlesim:
ros__parameters:
background_r: 0
background_g: 0
background_b: 255
여기서 주의할 점은 ros__parameters입니다.
밑줄이 두 개입니다.
ros__parameters
이 부분을 잘못 쓰면 파라미터가 적용되지 않습니다.
launch 파일은 다음처럼 작성합니다.
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
config = os.path.join(
get_package_share_directory('my_first_package'),
'config',
'turtlesim_params.yaml'
)
turtlesim_node = Node(
package='turtlesim',
executable='turtlesim_node',
namespace='turtlesim',
output='screen',
parameters=[config]
)
return LaunchDescription([
turtlesim_node
])
여기서 핵심은 다음입니다.
get_package_share_directory('my_first_package')
이 함수는 설치된 패키지의 share 경로를 찾아줍니다.
launch 파일은 빌드 후 install 폴더 기준으로 실행되기 때문에, 상대 경로를 대충 쓰면 파일을 못 찾는 경우가 많습니다.
따라서 실무에서는 get_package_share_directory()를 사용하는 습관이 좋습니다.
3. setup.py에 config 폴더 등록하기
YAML 파일을 launch에서 사용하려면 setup.py에도 config 폴더를 설치 대상으로 등록해야 합니다.
기존에 launch 파일을 등록했던 것처럼 config 파일도 추가합니다.
import os
import glob
from setuptools import setup
package_name = 'my_first_package'
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']
),
(
'share/' + package_name + '/launch',
glob.glob(os.path.join('launch', '*.launch.py'))
),
(
'share/' + package_name + '/config',
glob.glob(os.path.join('config', '*.yaml'))
),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='pw',
maintainer_email='pw@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'my_first_node = my_first_package.my_first_node:main',
'my_subscriber = my_first_package.my_subscriber:main',
'my_publisher = my_first_package.my_publisher:main',
'dist_turtle_action_server = my_first_package.dist_turtle_action_server:main',
],
},
)
추가된 부분은 다음입니다.
(
'share/' + package_name + '/config',
glob.glob(os.path.join('config', '*.yaml'))
),
이 설정이 없으면 빌드 후 launch 파일은 실행되지만 YAML 파일을 찾지 못할 수 있습니다.
수정 후 다시 빌드합니다.
cd ~/ros2_study
colcon build --packages-select my_first_package --symlink-install
source install/setup.bash
실행합니다.
ros2 launch my_first_package turtlesim_with_yaml.launch.py
'강좌 > ROS2' 카테고리의 다른 글
| 서비스 서버 만들기 (0) | 2026.05.21 |
|---|---|
| 서비스 정의 만들기 (0) | 2026.05.21 |
| ROS2 launch 작성 (0) | 2026.05.10 |
| 소스에서 파라미터 사용하기 (0) | 2026.05.10 |
| ROS 2 MultiThreadedExecutor와 Action Server로 Turtlesim 거리 이동 구현하기 (0) | 2026.05.10 |