ROS2 launch 파일에 대해서 알아보자 ExecuteProcess() 리턴 방식 #ROS2 launch 1편

By qsp , Created on 16th Mar 2022

ROS2에서는 런치파일이 python 로 되어 있는데 이에 대해서 알아보고
간단하게 튜토리얼 처럼 런치파일 만드는 법을 소개한다

ROS launch 에서는 xml, ROS2에서는 python

ROS와 ROS2에서 (melodic과 foxy)의 런치파일 형태가 다른 점이 눈에 띄었다

ROS에서는 xml을 사용을 했는데 예를 들면 launch 파일이 아래처럼 구성이 되었다

<launch>
    <node pkg="pointcloud_to_laserscan" type="pointcloud_to_laserscan_node" name="pointcloud_to_laserscan_node">
    </node>
</launch>

그러나 ROS2에서는 파이썬 코드를 사용하는 것이 큰 차이점으로 보인다

먼저 ROS2에서 런치파일을 실행을 하는 방식은 크게 다르지 않고
ros2 launch {패키지이름} {런치파일명} 형태로 사용한다

런치파일을 만들려면 패키지안에 launch 디렉토리를 만들어 주고,
그 안에 런치파일명.launch.py로 파이썬 파일로 만들어 주게 된다
ROS2가 파이썬으로만 런치파일을 만들 수 있는 것은 아니고
XML과 YAML 파일로도 런치 파일을 만들 수 있다고 한다


ROS2 런치파일 만들기 - 튜토리얼

먼저 자신의 workspace를 만들어 준다 (디렉토리), 그리고 이동해준다

cd
mkdir -p test_ws/src
cd test_ws/src

이제 패키지를 만들어 준다. test_launch 부분은 자신이 만들고 싶은 패키지명을 적으면 된다

ros2 pkg create --build-type ament_cmake test_launch --dependencies rclcpp

test_launch 패키지가 만들어졌고 이동을 해서 launch 디렉토리를 만든 후 이동해서 런치파일을 만들어보자

cd test_launch
mkdir launch
cd launch
gedit rviz_test.launch.py

gedit 또는 code (vscode) 를 입력한 후 파일명을 적어주면 바로 파일이 만들어지면서 에디터가 열린다
또는 touch rviz_test.launch.py 처럼 파일만 만들어 준 후 원하는 에디터로 열어서 편집을 하면 된다

이제 런치파일을 작성하자

#!/usr/bin/env python3

import os

from launch import LaunchDescription
from launch.actions import ExecuteProcess, IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration

from launch_ros.actions import Node

# this is the function launch  system will look for
def generate_launch_description():

    # create and return launch description object
    return LaunchDescription(
        [
            ExecuteProcess(
                cmd=["ros2", "run", "rviz2", "rviz2"], output="screen"
            ),
        ]
    )

그리고 저장 후 나온다

이제 런치 파일의 디렉토리를 지정을 해주기 위해서 패키지의 CMakeLists.txt 파일에 추가를 해줘야한다

여기에 추가를 안해주면 ros2 launch 명령어로 열 때 런치파일의 위치를 못 찾는 것 같다

gedit ~/test_ws/test_launch/CMakeLists.txt

파일을 열어서 제일 아래로 이동 한 후 아래와 같이 추가해준다

#install the launch directory
install(DIRECTORY
  launch
  DESTINATION share/${PROJECT_NAME}/
 )

위에 PROJECT_NAME은 말그대로 PROJECT_NAME이고 똑같이 복붙 하면된다

이제 자신의 workspace로 이동한 후 빌드를 해준다

cd ~/test_ws
colcon build --symlink-install

이런 결과와 함께 빌드가 완료 된다

Starting >>> test_launch
Finished <<< test_launch [1.19s]  

이제는 workspace의 변경사항을 알 수 있게 setup.bash파일을 실행한다

cd ~/test_ws
source install/setup.bash

아무런 표시가 나지 않는다. 이제 런치파일을 실행할 차례
ros2 launch {패키지명} {런치파일명.py}

ros2 launch test_launch rviz_test.launch.py
rivz 프로그램이 실행이 되었다

이번에는 다른 노드를 추가해서 여러개의 노드가 실행될 수 있게 해보자 먼저 다시 launch파일을 수정해준다

cd ~/test_ws/test_launch/launch
gedit rviz_test.launch.py

파일이 열리면 ExecuteProcess() 부분을 추가해준다

ExecuteProcess(
                cmd=["ros2", "run", "turtlesim", "turtlesim_node"], output="screen"
            ),

cmd 커맨드 그대로 넘겨주는 것을 알 수 있다, ros2 run 패키지명 노드명

추가가 된다면 아래와 같은 모습이 된다

 return LaunchDescription(
        [
            ExecuteProcess(
                cmd=["ros2", "run", "rviz2", "rviz2"], output="screen"
            ),
            ExecuteProcess(
                cmd=["ros2", "run", "turtlesim", "turtlesim_node"], output="screen"
            ),
        ]
    )

저장 후 런치파일을 다시 실행해보자. 이번에는 source를 할 필요는 없다

ros2 launch test_launch rviz_test.launch.py
rviz2노드와 turtlesim노드가 실행이 된 것을 볼 수 있다


런치파일에서 ExecuteProcess 방식

위에서 했던 런치파일의 내용을 살펴보자
ExecuteProcess 함수 부분을 보면
cmd 변수를 이용해서 (리스트로) 사용하는 것을 알 수 있다

생략
ExecuteProcess(
    cmd=["ros2", "run", "rviz2", "rviz2", "-d", rviz],
    output="screen"
)

cmd 부분에는 마치 터미널에 커맨드로 입력하는 것과 비슷하고
output을 screen으로 지정하면 터미널에 결과물이 나오게 된다

generate_launch_description() 함수는 launch파일을 실행했을 때 이 함수를 실행하게 된다
이 함수는 모든 런치파일에는 있어야하는 함수이다

return 부분에서 LaunchDescription() 에서 어떤 노드를 실행하게 된다. (반드시 있어야 함)
LaunchDescription()내에서 위의 ExecuteProcess()로 리턴해서 노드를 실행할 수 있게 된다
만약 여러개의 노드를 실행하려면 여러개의 ExecuteProcess()을 넣어주면 된다

댓글

댓글이 없습니다.