1317.18 PlanSys2의 런치 시스템 통합

1. ROS2 런치 시스템의 개요

ROS2의 런치(Launch) 시스템은 다수의 노드를 조율하여 시작하고, 파라미터를 설정하며, 이벤트 기반 조건부 실행을 관리하는 도구이다. PlanSys2는 런치 시스템과 긴밀히 통합되어, 핵심 노드, 플래너 설정, 액션 수행기 노드를 하나의 런치 파일로 관리할 수 있다.

2. PlanSys2 기본 런치

PlanSys2는 plansys2_bringup 패키지를 통해 모든 핵심 노드를 한 번에 시작하는 런치 파일을 제공한다:

from launch import LaunchDescription
from launch_ros.actions import Node
import os
from ament_index_python.packages import get_package_share_directory

def generate_launch_description():
    pkg_dir = get_package_share_directory('my_robot_planning')
    domain_file = os.path.join(pkg_dir, 'pddl', 'robot_domain.pddl')

    return LaunchDescription([
        # PlanSys2 핵심 노드 (4대 노드를 하나의 프로세스로 실행)
        Node(
            package='plansys2_bringup',
            executable='plansys2_node',
            name='plansys2',
            namespace='',
            output='screen',
            parameters=[{
                'model_file': domain_file
            }]
        ),

        # 액션 수행기 노드들
        Node(
            package='my_robot_planning',
            executable='move_action_node',
            name='move_action',
            output='screen'
        ),
        Node(
            package='my_robot_planning',
            executable='pick_action_node',
            name='pick_action',
            output='screen'
        ),
        Node(
            package='my_robot_planning',
            executable='place_action_node',
            name='place_action',
            output='screen'
        ),
    ])

3. 분리된 노드 런치

각 핵심 노드를 별도의 프로세스로 실행할 수도 있다:

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='plansys2_domain_expert',
            executable='domain_expert_node',
            parameters=[{'model_file': domain_file}]
        ),
        Node(
            package='plansys2_problem_expert',
            executable='problem_expert_node'
        ),
        Node(
            package='plansys2_planner',
            executable='planner_node',
            parameters=[{'plugin': 'plansys2/POPFPlanSolver'}]
        ),
        Node(
            package='plansys2_executor',
            executable='executor_node'
        ),
    ])

4. 조건부 런치와 이벤트 처리

from launch.actions import RegisterEventHandler, EmitEvent
from launch.event_handlers import OnProcessExit

def generate_launch_description():
    plansys2_node = Node(
        package='plansys2_bringup',
        executable='plansys2_node',
        parameters=[{'model_file': domain_file}]
    )

    return LaunchDescription([
        plansys2_node,
        # PlanSys2 종료 시 이벤트 처리
        RegisterEventHandler(
            OnProcessExit(
                target_action=plansys2_node,
                on_exit=[LogInfo(msg='PlanSys2 terminated')]
            )
        ),
    ])

5. 다중 로봇 런치

네임스페이스를 활용하여 다중 로봇의 PlanSys2 인스턴스를 독립적으로 실행한다:

def generate_launch_description():
    robots = ['robot1', 'robot2', 'robot3']
    nodes = []
    
    for robot in robots:
        nodes.append(Node(
            package='plansys2_bringup',
            executable='plansys2_node',
            namespace=robot,
            parameters=[{'model_file': domain_file}]
        ))
        # 각 로봇의 액션 노드도 네임스페이스에 포함
        nodes.append(Node(
            package='my_robot_planning',
            executable='move_action_node',
            namespace=robot
        ))
    
    return LaunchDescription(nodes)

6. Nav2와의 통합 런치

def generate_launch_description():
    return LaunchDescription([
        # Nav2 런치
        IncludeLaunchDescription(
            PythonLaunchDescriptionSource(nav2_launch_file)
        ),
        # PlanSys2 런치
        Node(
            package='plansys2_bringup',
            executable='plansys2_node',
            parameters=[{'model_file': domain_file}]
        ),
        # 액션 노드 (Nav2와 PlanSys2를 연결)
        Node(
            package='my_robot_planning',
            executable='navigate_action_node'
        ),
    ])

7. 참고 문헌

  • Gonzalez, F., Martin, F., Matellán, V., & Rodriguez, F. J. (2021). “PlanSys2: A Planning System Framework for ROS2.” IEEE ICARSC.