런치파일 생성하기
목표: 복잡한 ROS 2 시스템을 실행할 런치 파일 생성하기.
필수 사항
이 튜토리얼은 rqt_graph와 turtlesim 패키지를 사용합니다.
또한 선호하는 텍스트 편집기를 사용해야 합니다.
언제나 새로운 터미널을 열 때마다 ROS 2를 소스화하는 것을 잊지 마십시오. 새로운 터미널 열기.
배경
ROS 2의 런치 시스템은 사용자가 시스템의 구성을 설명하고 설명대로 실행할 수 있도록 돕는 것이 주요 역할입니다. 시스템의 구성에는 어떤 프로그램을 실행할지, 어디서 실행할지, 어떤 인수를 전달할지, 그리고 ROS에 특화된 규칙이 포함되어 있어 각 구성 요소에 서로 다른 구성을 부여하여 시스템 전체에서 구성 요소를 재사용하기 쉽게 만듭니다. 또한 실행된 프로세스의 상태를 모니터링하고 그 상태가 변경되면 보고하거나 반응합니다.
Python, XML 또는 YAML로 작성된 런치 파일은 다양한 노드를 시작하고 중지하고 다양한 이벤트를 트리거하고 처리할 수 있습니다.
다양한 형식에 대한 설명은 이 사이트 에서 확인할 수 있습니다.
이 프레임워크를 제공하는 패키지는 launch_ros 이며, non-ROS-specific launch 프레임워크를 사용합니다.
디자인 문서 에서 ROS 2 런치 시스템의 디자인 목표를 자세히 설명하고 있습니다(모든 기능이 현재 사용 가능하지는 않음).
작업
2 런치 파일 작성
turtlesim 패키지와 해당 실행 파일을 사용하여 ROS 2 런치 파일을 만들어 봅시다.
앞에서 언급한 대로 Python, XML 또는 YAML로 작성할 수 있습니다.
전체 코드를 launch/turtlesim_mimic_launch.py 파일에 복사하여 붙여넣습니다:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
])
전체 코드를 launch/turtlesim_mimic_launch.xml 파일에 복사하여 붙여넣습니다:
<launch>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2"/>
<node pkg="turtlesim" exec="mimic" name="mimic">
<remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
<remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
</node>
</launch>
전체 코드를 launch/turtlesim_mimic_launch.yaml 파일에 복사하여 붙여넣습니다:
launch:
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim1"
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim2"
- node:
pkg: "turtlesim"
exec: "mimic"
name: "mimic"
remap:
-
from: "/input/pose"
to: "/turtlesim1/turtle1/pose"
-
from: "/output/cmd_vel"
to: "/turtlesim2/turtle1/cmd_vel"
2.1 런치 파일 검토
위의 모든 런치 파일은 turtlesim 패키지에서 세 개의 노드를 시작합니다.
이 시스템의 목표는 두 개의 turtlesim 창을 시작하고 한 터틀이 다른 터틀의 움직임을 모방하도록 하는 것입니다.
두 turtlesim 노드를 시작할 때 그들 사이의 유일한 차이점은 namespace 값입니다. 고유한 네임스페이스를 사용하면 노드 이름 또는 토픽 이름 충돌 없이 두 노드를 시작할 수 있습니다. 이 시스템의 두 turtles는 동일한 토픽을 통해 명령을 받고 동일한 토픽을 통해 자신의 위치를 게시합니다. 고유한 네임스페이스를 사용하면 다른 터틀을 위한 메시지를 구별할 수 있습니다.
마지막 노드는 turtlesim 패키지의 다른 실행 파일인 mimic 입니다.
이 노드는 리매핑 형식의 추가 구성 세부 정보가 있습니다.
mimic 의 /input/pose 토픽은 /turtlesim1/turtle1/pose 로 리매핑되고, /output/cmd_vel 토픽은 /turtlesim2/turtle1/cmd_vel 로 리매핑됩니다.
즉, mimic 은 turtlesim1 의 움직임을 모방하기 위해 turtlesim1/sim 의 위치 토픽을 구독하고 turtlesim2/sim 의 속도 명령 토픽을 구독합니다.
이러한 import 문은 일부 Python launch 모듈을 가져옵니다.
from launch import LaunchDescription
from launch_ros.actions import Node
그 다음 런치 설명 자체가 시작됩니다:
def generate_launch_description():
return LaunchDescription([
])
런치 설명의 첫 두 작업은 두 turtlesim 창을 시작합니다:
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
마지막 작업은 리매핑을 포함하는 mimic 노드를 시작합니다:
Node(
package='turtlesim',
executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
첫 두 작업은 두 turtlesim 창을 시작합니다:
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2"/>
마지막 작업은 리매핑을 포함하는 mimic 노드를 시작합니다:
<node pkg="turtlesim" exec="mimic" name="mimic">
<remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
<remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
</node>
첫 두 작업은 두 turtlesim 창을 시작합니다:
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim1"
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim2"
마지막 작업은 리매핑을 포함하는 mimic 노드를 시작합니다:
- node:
pkg: "turtlesim"
exec: "mimic"
name: "mimic"
remap:
-
from: "/input/pose"
to: "/turtlesim1/turtle1/pose"
-
from: "/output/cmd_vel"
to: "/turtlesim2/turtle1/cmd_vel"
3 ros2 launch
위에서 만든 런치 파일을 실행하려면 이전에 만든 디렉토리로 이동하고 다음 명령을 실행하십시오:
cd launch
ros2 launch turtlesim_mimic_launch.py
cd launch
ros2 launch turtlesim_mimic_launch.xml
cd launch
ros2 launch turtlesim_mimic_launch.yaml
Note
런치 파일은 직접 실행할 수도 있습니다(위에서와 같이), 또는 패키지에서 제공될 수 있습니다. 패키지에서 제공될 때 구문은 다음과 같습니다:
ros2 launch <package_name> <launch_file_name>
Note
패키지에 런치 파일이 있는 경우 패키지의 package.xml 에 ros2launch 패키지에 대한 exec_depend 의존성을 추가하는 것이 좋습니다:
<exec_depend>ros2launch</exec_depend>
이렇게 하면 패키지를 빌드한 후에 ros2 launch 명령이 사용 가능하게 됩니다.
또한 모든 런치 파일 형식 이 인식됩니다.
두 개의 turtlesim 창이 열리며 런치 파일이 시작한 노드를 알리는 다음과 같은 [INFO] 메시지가 표시됩니다:
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [turtlesim_node-1]: process started with pid [11714]
[INFO] [turtlesim_node-2]: process started with pid [11715]
[INFO] [mimic-3]: process started with pid [11716]
시스템을 작동 중에 보려면 새 터미널을 열고 /turtlesim1/turtle1/cmd_vel 토픽에 대한 ros2 topic pub 명령을 실행하여 첫 번째 터틀을 이동시킵니다:
ros2 topic pub -r 1 /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"
두 터틀이 동일한 경로를 따르는 것을 볼 수 있습니다.
4 rqt_graph를 사용하여 시스템 검토
시스템이 여전히 실행 중인 동안 새 터미널을 열고 rqt_graph 를 실행하여 런치 파일에서 노드 간의 관계를 더 잘 이해할 수 있습니다.
다음 명령을 실행합니다:
rqt_graph
숨겨진 노드(실행한 ros2 topic pub 명령)는 왼쪽에 있는 /turtlesim1/turtle1/cmd_vel 토픽에 데이터를 게시하며, /turtlesim1/sim 노드가 이를 구독합니다.
그래프의 나머지 부분은 이전에 설명한 내용을 보여줍니다: mimic 은 /turtlesim1/sim 의 위치 토픽을 구독하고 /turtlesim2/sim 의 속도 명령 토픽으로 게시합니다.
요약
런치 파일은 다수의 노드와 특정 구성 세부 정보를 실행하는 것을 단순화합니다.
Python, XML 또는 YAML을 사용하여 런치 파일을 생성하고 ros2 launch 명령을 사용하여 실행할 수 있습니다.