IncludeLaunchDescription

런치 파일 안에서 다른 런치 파일을 부를 수 있을까?

나누기

작은 런치를 위에서 모읍니다

로봇 하나에도 노드와 설정이 수십 개입니다. 관련된 노드끼리 작은 런치 파일로 나누고, 맨 위 런치 파일은 그것들을 불러 모으기만 합니다. 바꿀 일이 생기면 그 조각만 갈아 끼우면 됩니다.

공식 튜토리얼 "Managing large projects"의 구성입니다. 파일 이름은 짧게 바꿨습니다.

Include

다른 런치 파일을 통째로 넣습니다

IncludeLaunchDescription은 다른 런치 파일을 읽어, 그 안의 액션을 이 자리에 그대로 넣는 액션입니다. 괄호 안에는 넣을 런치 파일의 경로를 줍니다.

PathJoinSubstitution은 launch.substitutions에서, FindPackageShare는 launch_ros.substitutions에서 가져옵니다.

경로 찾기

패키지의 설치 폴더를 찾습니다

FindPackageShare('my_turtle')는 그 패키지가 설치된 share 폴더를 찾아 줍니다. PathJoinSubstitution은 조각들을 /로 이어 경로 하나로 만듭니다. 어느 컴퓨터에 깔렸든 같은 코드로 찾습니다.

apt로 깐 패키지는 /opt/ros/jazzy/share 아래에 있습니다. 내 런치 파일을 share에 넣는 법은 8편에서 봅니다.

인자 넘기기

launch_arguments로 값을 건넵니다

넣을 런치 파일이 인자를 받는다면(5편), launch_arguments에 {인자 이름: 값}을 담아 .items()로 넘깁니다. 명령줄에서 turtlesim_ns:=turtlesim2를 준 것과 같습니다.

묶어서

넣은 것 전체에 네임스페이스를

GroupAction으로 묶고 맨 앞에 PushROSNamespace를 두면, 묶음 안의 모든 노드에 네임스페이스가 붙습니다. 2편의 square_launch.py를 고치지 않고 /robot1 아래로 띄웁니다.

PushROSNamespace는 적용할 액션보다 앞에(보통 맨 앞에) 둡니다. GroupAction은 launch.actions, PushROSNamespace는 launch_ros.actions에 있습니다.

읽어 보기

TurtleBot3 런치도 이 모양입니다

14강에서 띄울 turtlebot3_world.launch.py도 Include로 런치 파일들을 모은 맨 위 파일입니다. 거기서는 경로를 os.path.join과 get_package_share_directory로 만들고 PythonLaunchDescriptionSource로 감싸지만, 하는 일은 같습니다.

turtlebot3_simulations 저장소 jazzy 브랜치 기준입니다. Gazebo 서버와 화면을 따로 띄우려고 같은 파일을 두 번 넣습니다.

다음 편

내 런치 파일을 패키지 이름으로 부르려면?

8편패키지에 넣기 10강 목록