ROS2 launch 파일에 대해서 알아보자 Node() 리턴 방식 ROS2 launch 2편

By qsp , Created on 16th Mar 2022

이전 포스팅에서 다뤘던 ROS2 런치 파일에 대해서 추가로 더 포스팅을 하는데
이번에는 조금 다른 방식으로 사용할 수 있는 것을 정리해본다

런치파일에서 node 방식으로 런치파일 만들어 보기

앞서서 정리했던 런치파일 만들기에서
ros2 launch파일 만들기 -1편 보러가기

ExecuteProcess()를 이용한 방식이 아닌 이번에는 Node() 클래스를 이용한 방식을 정리해본다

먼저 다시 워크 스페이스로 이동을 한 후 자신의 패키지의 런치 디렉토리까지 이동한다
그리고 node_launch.py 파일을 만든다 (원하는 파일명으로 만들면 됨)

cd ~/test_ws/src/test_launch/launch/
touch node_launch.py
gedit node_launch.py

이제 파일에 아래의 내용을 넣어준다. 이번에는 rqt_graph 패키지의 rqt_graph노드 넣어준다 총 3개의 노드를 실행하는 런치파일이다

#!/usr/bin/env python3

import os

from launch import LaunchDescription
from launch_ros.actions import Node

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

    rviz2_node = Node(
        package='rviz2', executable='rviz2', output='screen'
    )
    turtlesim_node = Node(
        package='turtlesim', executable='turtlesim_node', output='screen'
    )
    rqt_graph_node = Node(
        package='rqt_graph', executable='rqt_graph', output='screen'
    )

    # create and return launch description object
    return LaunchDescription(
        [
            rviz2_node, turtlesim_node, rqt_graph_node
        ]
    )

저장한 후 나와서 빌드를 해주자

cd ~/test_ws
colcon build --symlink-install

그리고 나서

source install/setup.bash 

이제 새로운 런치파일이 인식이 잘 될 것이다 실행을 해보자
ros2 launch 패키지명 런치파일.py

ros2 launch test_launch node_launch.py
만약 런치파일이 자동완성이 안되고 위치를 찾지 못한다면
패키지 내의 CmakeLists.txt 파일을 확인하자

gedit ~/test_ws/test_launch/CMakeLists.txt

아래 내용이 없다면 추가해준다

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


런치파일에서 Node() 방식

Node()라는 클래스를 이용해서 객체를 만들고 이를 리턴해주는 방법으로 사용하는 방식이다
package, executable, output 등을 미리 지정해서 만들어주고

리턴값으로 LaunchDescription() 에서 리스트로 [노드1, 노드2] 로 작성이 되게 된다
위에서 객체를 만들면서 미리 지정을 해놓은 것이 된다
예:

return LaunchDescription([
    turtlesim_node,
    turtlesim_teleop_node,
])

위의 turtlesim_node, turtlesim_teleop_node는 클래스를 통해서 만들어진것으로
노드 방식으로 런치파일을 만들게 되면 더 깔끔하게 사용할 수 있다는 장점이 있다고 한다

위 방식에서 객체를 안 만들고 (윗부분을 제거) 아래와 같은 방식도 가능하다고 한다
네임스페이스를 이용해서 같은 노드를 2개 실행도 가능

from launch import LaunchDescription
import launch_ros.actions

def generate_launch_description():
    return LaunchDescription([
        launch_ros.actions.Node(
            namespace= "turtlesim1", package='turtlesim', executable='turtlesim_node', output='screen'),
        launch_ros.actions.Node(
            namespace= "turtlesim2", package='turtlesim', executable='turtlesim_node', output='screen'),
    ])

참고 유투브: Roadlalance.com ROS2강의
참고: docs.ros.org


parameters

여러 매개변수는 .yaml파일로 정리가 되어 있고
:으로 구분하여 값들을 지정한다

예:

frame_id: 'camera_optical_frame',
camera:
    width: 1280
    height: 720

패키지 디렉토리에서 주로 param 또는 config 디렉토리 안에 들어가 있는데
그 안에 들어가서 살펴보면 매개변수(파라미터) 파일들을 확인할 수가 있다

이 파일을 (파라미터) launch파일에서는 import를 할 수가 있는데
parameters=[...] 지정을 해서 사용하게 된다

이 파라미터 값들은 실제 노드안에 코드로 들어가져 있는데, 즉 frame_id 라고 변수로 지정되어있음
만약 코드안에서 frame_id를 수정하려한다면 노드의 코드를 수정하는 것이 아니라
yaml파일의 파라미터 값들만 변경을 해주면 되는 것.

댓글

댓글이 없습니다.