Robot Operating System/Tutorial 따라하기

[Dashing][CLI Tools] 9. Creating a launch file

jstar0525 2021. 5. 14. 16:24
반응형

이 글은 아래의 자료를 참고로 만들어졌습니다.

 

https://docs.ros.org/en/dashing/Tutorials/Launch-Files/Creating-Launch-Files.html

 

Creating a launch file — ROS 2 Documentation: Dashing documentation

Goal: Create a launch file to run a complex ROS 2 system. In the tutorials up until now, you have been opening new terminals for every new node you run. As you create more complex systems with more and more nodes running simultaneously, opening terminals a

docs.ros.org


 

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_graphturtlesim 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합니다.

즉, turtlesim2turtlesim1의 움직임을 따라합니다.

 

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을 보냅니다.

 

반응형