런치 프로그래밍

Hyuna·2024년 10월 22일

ROS2

목록 보기
10/15
post-thumbnail

📕 참고: ROS2로 시작하는 로봇 프로그래밍, topic_service_action_rclpy_example




Launch system


Launch는 하나 이상의 노드를 실행시킬 수 있다. 또한, 노드를 실행할 때 패키지의 매개변수, 노드 이름 변경, 네임스페이스 설정, 환경 변수 변경 등 다양한 옵션을 사용할 수 있다.


launch 작성

ex_calculator/param/arithmetic_config.yaml

여러 개의 파라미터를 저장하고 싶을 때에는 파라미터 파일(*.yaml)을 작성하고 이를 런치파일로 불러오는 방법을 사용한다.

/**: # namespace and node name
  ros__parameters:
      qos_depth: 30
      min_random_num: 0
      max_random_num: 9
         
  • / : 루트 네임 스페이스
  • ** : 모든 노드 이름에 적용

setup.py

(share_dir + '/launch', glob.glob(os.path.join('launch', '*.launch.py'))),
(share_dir + '/param', glob.glob(os.path.join('param', '*.yaml'))),

새롭게 지정된 *.yaml 파일 및 .launch.py파일을 ROS 파일 시스템에 맞추어 설치하게 하려면 파이썬 패키지 설정 파일 setup.py에 옵션을 추가해줘야 한다.

from setuptools import find_packages, setup
import glob
import os

package_name = 'ex_calculator'

setup(
    name=package_name,
    version='0.0.0',
    packages=find_packages(exclude=['test']),
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        ('share/' + package_name + '/launch', glob.glob(os.path.join('launch', '*.launch.py'))),
        ('share/' + package_name + '/param', glob.glob(os.path.join('param', '*.yaml'))),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='sparkx',
    maintainer_email='---@gmail.com',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            'argument = ex_calculator.arithmetic.argument:main',
            'operator = ex_calculator.arithmetic.operator:main',
            'calculator = ex_calculator.calculator.main:main',
            'checker = ex_calculator.checker.main:main',
        ],
    },
)

ex_calculator/launch/arithmetic.launch.py

ex_calculatorargumentcalculator 노드를 실행시키는 런치파일을 만들어보자.
런치 파일을 사용하기 위해서는 해당 패키지에 launch 폴더를 있어야하고 이 폴더에 launch.py 을 만들어 사용한다.

#!/usr/bin/env python3

import os

from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
  • #! : 어떤 인터프리터를 사용하는지 알려준다
  • /usr/bin/env python3: 주어진 환경에서 python3 인터프리터를 찾아 실행한다.

generate_launch_description : 런치 파일 실행 내용 정의

def generate_launch_description():
    param_dir = LaunchConfiguration(
        'param_dir',
        default=os.path.join(
            get_package_share_directory('ex_calculator'),
            'param',
            'arithmetic_config.yaml'))
  • LaunchConfiguration을 사용하여 param_dir이라는 실행인자를 정의
  • ex_calculator 패키지의 param 디렉토리에 있는 arithmetic_config.yaml 파일의 경로에서 런치 파일을 참조한다

return LaunchDescription : 런치 파일에서 실행할 액션들을 포함한 리스트 생성

 return LaunchDescription([
        DeclareLaunchArgument(
            'param_dir',
            default_value=param_dir,
            description='Full path of parameter file'),
  • DeclareLaunchArgument 에서 param_dir 이라는 실행 인자 선언
  • default_value=param_dir : 인자의 기본값은 위에서 정의한 param_dir로 설정
  • description : 인자에 대한 설명, 런치 파일 실행 때 참고

✔ 노드 정의


        Node(
            package='ex_calculator',
            executable='argument',
            name='argument',
            parameters=[param_dir],
            output='screen'),

        Node(
            package='ex_calculator',
            executable='calculator',
            name='calculator',
            parameters=[param_dir],
            output='screen'),
    ])
  • executable : 실행할 노드 이름
  • name : 지정한 노드를 실행할 때 사용할 이름, 본래 노드 이름이 아닌 다른 이름으로 설정 가능
  • parameters : 특정 파라미터 or 지정한 파라미터 파일을 설정값을 사용
  • output : 로깅 정보를 터미널에 출력
          

전체 코드

#!/usr/bin/env python3

import os

from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node


def generate_launch_description():
    param_dir = LaunchConfiguration(
        'param_dir',
        default=os.path.join(
            get_package_share_directory('ex_calculator'),
            'param',
            'arithmetic_config.yaml'))

    return LaunchDescription([
        DeclareLaunchArgument(
            'param_dir',
            default_value=param_dir,
            description='Full path of parameter file'),

        Node(
            package='ex_calculator',
            executable='argument',
            name='argument',
            parameters=[param_dir],
            output='screen'),

        Node(
            package='ex_calculator',
            executable='calculator',
            name='calculator',
            parameters=[param_dir],
            output='screen'),
    ])


실행


  1. 런치 실행

ros2 launch ex_calculator arithmetic.launch.py

  1. operator 실행

ros2 run ex_calculator operator

  1. 실행인자

ros2 run ex_calculator checker -g 100

실행인자로 설정된 누적합계 100을 넘자 액션이 종료되었다.

0개의 댓글