Launch는 하나 이상의 노드를 실행시킬 수 있다. 또한, 노드를 실행할 때 패키지의 매개변수, 노드 이름 변경, 네임스페이스 설정, 환경 변수 변경 등 다양한 옵션을 사용할 수 있다.
여러 개의 파라미터를 저장하고 싶을 때에는 파라미터 파일(*.yaml)을 작성하고 이를 런치파일로 불러오는 방법을 사용한다.
/**: # namespace and node name
ros__parameters:
qos_depth: 30
min_random_num: 0
max_random_num: 9
/ : 루트 네임 스페이스** : 모든 노드 이름에 적용(share_dir + '/launch', glob.glob(os.path.join('launch', '*.launch.py'))),
(share_dir + '/param', glob.glob(os.path.join('param', '*.yaml'))),
새롭게 지정된 *.yaml 파일 및 .launch.py파일을 ROS 파일 시스템에 맞추어 설치하게 하려면 파이썬 패키지 설정 파일 setup.py에 옵션을 추가해줘야 한다.
from setuptools import find_packages, setup
import glob
import os
package_name = 'ex_calculator'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
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 + '/param', glob.glob(os.path.join('param', '*.yaml'))),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='sparkx',
maintainer_email='---@gmail.com',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'argument = ex_calculator.arithmetic.argument:main',
'operator = ex_calculator.arithmetic.operator:main',
'calculator = ex_calculator.calculator.main:main',
'checker = ex_calculator.checker.main:main',
],
},
)
ex_calculator의 argument 와 calculator 노드를 실행시키는 런치파일을 만들어보자.
런치 파일을 사용하기 위해서는 해당 패키지에 launch 폴더를 있어야하고 이 폴더에 launch.py 을 만들어 사용한다.
#!/usr/bin/env python3
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
#! : 어떤 인터프리터를 사용하는지 알려준다/usr/bin/env python3: 주어진 환경에서 python3 인터프리터를 찾아 실행한다.✔ generate_launch_description : 런치 파일 실행 내용 정의
def generate_launch_description():
param_dir = LaunchConfiguration(
'param_dir',
default=os.path.join(
get_package_share_directory('ex_calculator'),
'param',
'arithmetic_config.yaml'))
LaunchConfiguration을 사용하여 param_dir이라는 실행인자를 정의ex_calculator 패키지의 param 디렉토리에 있는 arithmetic_config.yaml 파일의 경로에서 런치 파일을 참조한다✔ return LaunchDescription : 런치 파일에서 실행할 액션들을 포함한 리스트 생성
return LaunchDescription([
DeclareLaunchArgument(
'param_dir',
default_value=param_dir,
description='Full path of parameter file'),
DeclareLaunchArgument 에서 param_dir 이라는 실행 인자 선언default_value=param_dir : 인자의 기본값은 위에서 정의한 param_dir로 설정description : 인자에 대한 설명, 런치 파일 실행 때 참고 ✔ 노드 정의
Node(
package='ex_calculator',
executable='argument',
name='argument',
parameters=[param_dir],
output='screen'),
Node(
package='ex_calculator',
executable='calculator',
name='calculator',
parameters=[param_dir],
output='screen'),
])
executable : 실행할 노드 이름name : 지정한 노드를 실행할 때 사용할 이름, 본래 노드 이름이 아닌 다른 이름으로 설정 가능parameters : 특정 파라미터 or 지정한 파라미터 파일을 설정값을 사용output : 로깅 정보를 터미널에 출력 #!/usr/bin/env python3
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
def generate_launch_description():
param_dir = LaunchConfiguration(
'param_dir',
default=os.path.join(
get_package_share_directory('ex_calculator'),
'param',
'arithmetic_config.yaml'))
return LaunchDescription([
DeclareLaunchArgument(
'param_dir',
default_value=param_dir,
description='Full path of parameter file'),
Node(
package='ex_calculator',
executable='argument',
name='argument',
parameters=[param_dir],
output='screen'),
Node(
package='ex_calculator',
executable='calculator',
name='calculator',
parameters=[param_dir],
output='screen'),
])
ros2 launch ex_calculator arithmetic.launch.py

ros2 run ex_calculator operator

ros2 run ex_calculator checker -g 100

실행인자로 설정된 누적합계 100을 넘자 액션이 종료되었다.