Last update:
개요
ROS2에서 Python launch파일 작성 시 launch_ros.actions.Node 클래스를 초기화할 때 전달하는 arguments, parameters, ros_arguments, remappings, namespace 파라미터에 대해 설명한다.
arguments
아래와 같은 커맨드라인 명령어가 있다고 치자.
ros2 run my_package my_node \
arg1 \
--ros-args \
-r __ns:=/my_robot \
-r /tf:=tf \
-p param1:=value1 \
--params-file /path/to/params1.yaml \
--params-file /path/to/params2.yaml
Shell
복사
위 명령어는 python launch 파일에서 아래처럼 arguments 파라미터만으로 작성할 수 있다.
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
my_node = Node(
package='my_package',
executable='my_node',
arguments=[
'arg1',
'--ros-args',
'-r',
'__ns:=/my_robot',
'-r',
'/tf:=tf',
'-p',
'param1:=value1',
'--params-file',
'/path/to/params.yaml'
],
)
return LaunchDescription(my_node)
Python
복사
arguments의 값으로 넘어간 배열들은 한 칸씩 띄어쓰기가 되어 들어간다. 즉, arguments 파라미터는 ros2 run my_package 이후에 입력하는 모든 인자들을 날것으로 전달할 수 있는 기본적인 파라미터이다.
그리고 나머지 parameters, ros_arguments, remappings, namespace 파라미터는 이 arguments 파라미터를 편리하게 쓸 수 있도록 만든 편의성 파라미터에 불과하다.
ros_arguments
ros_arguments는 --ros-args 옵션을 생략하고 인자를 넘길 수 있다.
# arguments 사용 시
arguments=[
'--ros-args',
'--params-file',
'/path/to/params1.yaml',
]
# ros_arguments 사용 시
ros_arguments=[
'--params-file',
'/path/to/params1.yaml',
]
Python
복사
remappings
remappings는 --ros-args -r 옵션을 생략하고 인자를 넘길 수 있다.
# arguments 사용 시
arguments=[
'--ros-args',
'-r',
'/tf:=tf',
]
# remappings 사용 시
remappings=[
('/tf', 'tf')
]
Python
복사
namespace
namespace는 --ros-args -r __ns:=/ 옵션을 생략하고 인자를 넘길 수 있다.
# arguments 사용 시
arguments=[
'--ros-args',
'-r',
'__ns:=/my_robot',
]
# remappings 사용 시
namespace='my_robot'
Python
복사
단, --ros-args -r __ns:=/my_robot으로 namespace를 지정할 경우에는 맨 앞에 /가 와야하지만 namespace 파라미터 사용 시에는 그냥 넘겨도 맨 앞에 /가 알아서 붙는 차이점이 있다.
parameters
parameters는 --ros-args --params-file 옵션을 생략하고 파라미터 파일 경로를 넘길 수 있다.
# arguments 사용 시
arguments=[
'--ros-args',
'--params-file',
'/path/to/params1.yaml',
'--params-file',
'/path/to/params2.yaml'
]
# parameters 사용 시
parameters=[
'/path/to/params1.yaml',
'/path/to/params2.yaml'
]
# PathJoinSubstitution 사용 시
parameters=[
PathJoinSubstitution(
[ FindPackageShare("my_package"), "config", "config.yaml"]
)
]
Python
복사
parameters 파라미터에 dictionary도 넘길 수 있다.
my_node = Node(
package='my_package',
executable='my_node',
parameters=[
{'param1': 'value1'},
{'param2': 'value2'}
],
)
Python
복사
이 dictionary는 내부적으로 .yaml 파일로 변환된 후 /tmp 디렉터리에 저장되며, 마찬가지로 --params-file 옵션을 통해 .yaml 파일의 경로가 전달된다.
참고로 --params-file로 넘겨지는 모든 파일은 /tmp 경로에 랜덤한 이름으로 복사되어 넘겨진다. 만약 파일 간 충돌하는(중복되는) 파라미터가 있을 경우, 순서 상 뒤쪽에 넘겨진 파라미터가 이전 파라미터를 override한다. 예를 들어보자. 아래와 같은 my_config.yaml이 있다.
my_node:
ros__parameters:
param1: 'value1'
YAML
복사
아래처럼 launch할 경우
my_config_file = PathJoinSubstitution([
FindPackageShare("my_package"),
"config",
"my_config.yaml"
])
my_node = Node(
package='my_package',
executable='my_node',
parameters=[
{"param1": "value from dictionary"},
my_config_file,
],
)
Python
복사
결과는 아래와 같다.
[my_node-1] [INFO] [1744078825.248312005] [my_node]: param1: value from yaml
Shell
복사
parameters 배열의 순서를 뒤집을 경우
my_node = Node(
package='my_package',
executable='my_node',
parameters=[
my_config_file,
{"param1": "value from dictionary"},
],
)
Python
복사
결과는 아래와 같다.
[my_node-1] [INFO] [1744078873.322746678] [my_node]: param1: value from dictionary
Shell
복사