[Dashing][CLI Tools] 9. Creating a launch file
이 글은 아래의 자료를 참고로 만들어졌습니다.
https://docs.ros.org/en/dashing/Tutorials/Launch-Files/Creating-Launch-Files.html
Creating a launch file
Goal: Create a launch file to run a complex ROS 2 system.
Tutorial level: Beginner
Background
이전까지의 튜토리얼에서는 실행하려는 새 node마다 새 터미널을 열어 실행하였습니다.
수 많은 nodes가 동시에 실행하는 복잡한 시스템에서는,
새로운 터미널들을 열고 각각에 configuration을 입력하여 실행하는 것은 힘든 일이 될 수 있습니다.
Launch files은 환경을 설정하고 nodes를 동시에 실행할 수 있게 해줍니다.
ros2 launch 명령으로 하나의 launch file을 실행하면
전체의 시스템(모든 nodes와 각각의 configurations)이 한 번에 실행됩니다.
Prerequisites
이번 튜토리얼에서는 rqt_graph와 turtlesim packages를 사용합니다.
text editor가 필요합니다(저는 nano를 사용하겠습니다).
항상 새로운 터미널에 설정파일을 소싱하는 것을 잊지 마세요.
Tasks
1 Setup
launch file을 저장할 새로운 디렉토리를 만듭니다.
$ mkdir launch
아래의 명령을 통해 turtlesim_mimic_launch.py라는 lauch file을 만듭니다.
$ touch launch/turtlesim_mimic_launch.py
또는 시스템의 GUI를 통하여 새로운 파일을 만들 수도 있습니다.
2 Write the launch file
nano를 이용하여
아래의 내용을 turtlesim_mimic_launch.py에 복사, 붙여넣기하고 저장합니다.
$ nano launch/turtlesim_mimic_launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
node_namespace='turtlesim1',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_namespace='turtlesim2',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_executable='mimic',
node_name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
])
2.1 Examine the launch file
import 명령문을 사용하여 python의 luanch modules의 일부를 끌어옵니다.
from launch import LaunchDescription
from launch_ros.actions import Node
그리고 launch description을 실행합니다.
def generate_launch_description():
return LaunchDescription([
])
turtlesim package에 포함되어 있는 세 개의 nodes를 LaunchDescription안에 넣습니다.
이 시스템의 목표는 2개의 turtlesim windows를 실행하고,
그 중 한 turtle이 다른 turtle의 움직임을 따라하는 것입니다.
lanch description에서 2개의 turtlesim windows를 실행합니다.
Node(
package='turtlesim',
node_namespace='turtlesim1',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_namespace='turtlesim2',
node_executable='turtlesim_node',
node_name='sim'
),
2개의 nodes가 다른 점은 namespace 값이 다르다는 것뿐입니다.
고유한 namespaces는 node 이름과 topic 이름의 충돌없이 2개의 시뮬레이터를 실행하게 해줍니다.
두 turtles는
같은 topic으로부터 명령을 receive하고,
같은 topic으로 자세를 publish합니다.
마지막 node는 turtlesim package에 있는 mimic을 실행합니다.
Node(
package='turtlesim',
node_executable='mimic',
node_name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
이 node는 remappings 형식의 세부 정보가 추가되었습니다.
/input/pose topic이 /turtlesim1/turtle1/pose으로 remapped하였고,
/output/cmd_vel topic이 /turtlesim2/turtle1/cmd_vel로 remapped하였습니다.
따라서, mimic은
/turtlesim1/sim의 자세를 subscribe하고,
/turtlesim2/sim의 제어 명령을 republish합니다.
즉, turtlesim2가 turtlesim1의 움직임을 따라합니다.
3 ros2 launch
turtlesim_mimic_launch.py를 실행하기 위해서,
해당 디렉토리로 들어가서, launch file을 실행합니다.
$ cd launch
$ ros2 launch turtlesim_mimic_launch.py
[INFO] [launch]: All log files can be found below /home/ros/.ros/log/2021-05-14-15-27-25-244479-robotv-9807
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [turtlesim_node-1]: process started with pid [9817]
[INFO] [turtlesim_node-2]: process started with pid [9818]
[INFO] [mimic-3]: process started with pid [9819]
<Note> 만약 package에서 launch file을 제공한다면, 아래의 구문으로 실행이 가능합니다. 좀 더 자세한 내용은 package에 대한 튜토리얼에서 다룹니다. $ ros2 launch <package_name> <launch_file_name> |
시스템이 작동하는 것을 보기 위해서,
새로운 터미널을 열고,
/turtlesim1/turtle1/cmd_vel topic을
ros2 topic pub 명령을 실행하여 /turtlesim1/sim을 움직입니다.
$ 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 Introspect the system with rqt_graph
시스템이 실행하고 있는 동안,
새로운 터미널을 열어
nodes의 관계를 살펴보기위해 rqt_graph를 실행합니다.
$ rqt_graph
ros2 topic pub 명령을 사용하여 실행한
/_ros2cli_publisher_geometry_msgs_msg_Twist node는 /turtlesim1/turtle1/cmd_vel topic을 통해 데이터를 publish하고,
/turtlesim1/sim node는 /turtlesim1/turtle1/cmd_vel topic을 subscribe합니다.
/turtlesim1/sim node가 /mimic node로 /turtlesim1/turtle1/pose topic을 보내고,
/mimic node가 /turtlesim2/sim node로 /turtlesim2/turtle1/cmd_vel topic을 보냅니다.