ROS2 첫걸음 (7) - launch

2 minute read

launch란 뭘하는 것일까

지금까지는 노드를 한땀한땀 새 터미널에서 실행했습니다. 하지만 이제 launch 파일을 사용하면 여러 노드를 한번에 실행할 수 있습니다. 파이썬 쉘에서 한줄씩 실행하다가 스크립트로 만들어버리는 느낌이랄까요? 한번 알아보도록 합시다.

ROS2에서의 launch

이번에는 ros를 ros2를 만들면 됩니다~~~말고도 할 말이 많습니다. 물론 roslaunchros2 launch가 된건 맞지만 새로운 launch 파일 작성법이 생겼습니다. 바로 파이썬을 이용한 launch파일 작성입니다. 원래는 html 문법이었는데 배우기 쉽고 많이 사용하는 파이썬으로 이주를 시도하는 모습입니다. 자세한 설명은 밑에서 하고 터틀심을 실행해 줍시다.

launch 파일 작성방법

1. launch 파이썬 파일 생성

우선 launch 폴더를 만들고 그 안에 launch 내용을 담을 파이썬 파일을 만들어 줍니다.

$ mkdir launch
$ cd launch
$ touch turtlesim_mimic_launch.py

파이썬 코드를 담을 파일이 만들어졌으니 열어서 작성해 줍시다. 여기선 지금까지와는 다르게 버전의 경계가 Eloquent네요. 지금까지는 dashing이었는데… 아무튼 일단 버전에 맞는 소스를 붙여줍니다.
ROS2 Foxy and newer:

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'),
            ]
        )
    ])

ROS2 Eloquent and older:

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'),
            ]
        )
    ])

저는 dashing이므로 Eloquent and newer 버전의 소스를 사용했습니다.

2. launch 파일 소스 분석

launch 파이썬 소스에서는 launch 모듈을 사용합니다.

from launch import LaunchDescription
from launch_ros.actions import Node

generate_launch_description 함수는 launch파일 본문이라고 보면 될 듯 합니다. C언어의 main문과는 조금 다르지만 느낌적으로 비슷하기도 한 듯 합니다.

def generate_launch_description():
   return LaunchDescription([

   ])

launch 파일의 본문은 실행할 노드들입니다. 필요한 정보는 다음의 4가지입니다.

  1. (노드가 포함된) 패키지 이름
  2. namespace
  3. 실행할 노드 이름
  4. 실행 중일때 쓸 노드 이름 이 설명만 보면 이해가 잘 안될테니 조금 이따 실행 결과와 함께 ros2 node list를 실행해 보겠습니다.
    또다시 버전 분기점입니다. generate_launch_description 함수의 내용물 표현 방식 역시 Eloquent를 기점으로 바뀝니다. ROS2 Foxy and newer:
    Node(
     package='turtlesim',
     namespace='turtlesim1',
     executable='turtlesim_node',
     name='sim'
    ),
    Node(
     package='turtlesim',
     namespace='turtlesim2',
     executable='turtlesim_node',
     name='sim'
    ),
    

    ROS2 Eloquent and older:

    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-1. launch remapping

    remapping은 다른 노드에서 실행되고 있는 토픽을 베껴오는 것입니다. launch 파일에서도 사용할 수 있습니다. 터틀심 패키지의 mimic 노드를 사용해 봅시다. ROS2 Foxy and newer:

    Node(
     package='turtlesim',
     executable='mimic',
     name='mimic',
     remappings=[
       ('/input/pose', '/turtlesim1/turtle1/pose'),
       ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
     ]
    )
    

    ROS2 Eloquent and older:

    Node(
     package='turtlesim',
     node_executable='mimic',
     node_name='mimic',
     remappings=[
       ('/input/pose', '/turtlesim1/turtle1/pose'),
       ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
     ]
    )
    

    다른 노드들의 토픽들을 따라하게 하는 노드입니다.

3. ros2 launch

이제 ros2 launch 명령어로 실행해 봅시다. 파이썬 launch 파일은 그 파일이 있는 디렉토리에서 실행해 줍시다.

$ cd launch
$ ros2 launch turtlesim_mimic_launch.py
[INFO] [launch]: All log files can be found below /home/bhbhchoi/.ros/log/2021-01-13-01-29-43-022804-bhbhchoi-900X3L-19273
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [turtlesim_node-1]: process started with pid [19286]
[INFO] [turtlesim_node-2]: process started with pid [19287]
[INFO] [mimic-3]: process started with pid [19288]

같은 터틀심 창이 두개 열립니다. mimic은 단지 토픽을 복사해 주는 역할인 듯 합니다.

다른 터미널을 열어 다음의 명령어를 실행해 봅시다.

$ 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}}"

터틀심 두개가 똑같이 움직이는 것을 볼 수 있습니다.

이제 launch 파일은 파이썬으로 작성해야 하나요? 원래 형식으로는 못쓰나요?

아닙니다. 패키지에 들어있는 launch 파일은 여전히(?) ros2 launch <패키지 이름> <launch 파일 이름> 으로 실행합니다. 아직 ROS2 패키지를 배우지 않았으니 나중에 배우도록 합시다.

마무리

launch 파일의 새로운 면을 볼 수 있어 좋았습니다. ROS1과 바뀐 부분이 조금씩 보이기 시작하네요. 다음 게시글은 rosbag 기능에 대해서 정리하겠습니다.

참고 사이트

ROS Index-ROS2 튜토리얼 launch편

Refstop

Refstop

Deep Learning 및 SLAM을 공부하고 있습니다.

Comments

  Write a comment ...