Chapter 1318. PlanSys2 도메인 전문가 노드 (PlanSys2 Domain Expert Nodes)

Chapter 1318. PlanSys2 도메인 전문가 노드 (PlanSys2 Domain Expert Nodes)

1. 개요

PlanSys2(Planning System 2)의 4대 핵심 노드 가운데 도메인 전문가 노드(Domain Expert Node)는 PDDL 도메인 모델의 관리와 제공을 전담하는 구성 요소이다. PDDL 기반 태스크 플래닝에서 도메인 모델은 로봇이 수행할 수 있는 액션(action), 각 액션의 전제 조건(precondition)과 효과(effect), 타입(type) 체계, 술어(predicate), 함수(function) 등을 정의하는 핵심 명세서에 해당한다. 도메인 전문가 노드는 이러한 도메인 모델을 파싱(parsing)하고, 내부 자료구조로 변환하며, 다른 노드들의 질의에 응답하는 역할을 수행한다.

본 장에서는 PlanSys2 도메인 전문가 노드의 아키텍처, 내부 동작 메커니즘, ROS2 인터페이스, 그리고 도메인 모델의 동적 관리 기법을 체계적으로 다룬다.

2. 도메인 전문가 노드의 역할과 책임

2.1 PDDL 도메인 모델의 중앙 관리

도메인 전문가 노드는 PlanSys2 시스템 내에서 PDDL 도메인 모델에 대한 단일 진실 공급원(single source of truth)으로 기능한다. 시스템 내의 모든 노드가 동일한 도메인 정보를 참조하도록 보장함으로써, 도메인 정의의 불일치로 인한 플래닝 오류를 원천적으로 방지한다.

도메인 전문가 노드가 담당하는 주요 책임은 다음과 같다.

  • 도메인 모델의 로딩: PDDL 도메인 파일(.pddl)을 파일 시스템 또는 ROS2 파라미터로부터 읽어들인다.
  • 도메인 모델의 파싱 및 검증: PDDL 구문을 분석하여 내부 자료구조로 변환하며, 구문 오류 및 의미 오류를 검출한다.
  • 도메인 정보의 제공: ROS2 서비스를 통해 다른 노드들이 도메인의 타입, 술어, 액션, 함수 등을 질의할 수 있도록 한다.
  • 다중 도메인 지원: 복수의 PDDL 도메인 파일을 로딩하여 통합된 도메인 모델을 구성하는 기능을 제공한다.

2.2 다른 핵심 노드와의 관계

도메인 전문가 노드는 PlanSys2의 나머지 3개 핵심 노드와 다음과 같은 관계를 형성한다.

  • 문제 전문가 노드(Problem Expert Node): 문제 전문가 노드는 도메인 전문가 노드로부터 타입 계층, 술어 정의, 함수 정의 등을 참조하여, 사용자가 설정한 객체(object), 초기 상태(init), 목표(goal)의 유효성을 검증한다.
  • 플래너 노드(Planner Node): 플래너 노드는 계획 수립 시 도메인 전문가 노드로부터 전체 도메인 모델을 요청하여, 외부 플래너(예: POPF)에 전달한다.
  • 실행기 노드(Executor Node): 실행기 노드는 계획의 실행 과정에서 액션의 정의를 참조하기 위해 도메인 전문가 노드와 통신한다.

3. 내부 아키텍처

3.1 라이프사이클 관리형 노드

도메인 전문가 노드는 ROS2의 관리형 노드(managed node, lifecycle node) 패턴을 따른다. rclcpp_lifecycle::LifecycleNode를 상속하여 구현되며, 다음의 상태 전이(state transition) 모델을 따른다.

상태설명
Unconfigured노드가 생성되었으나 아직 구성되지 않은 초기 상태
Inactive구성이 완료되었으나 아직 활성화되지 않은 상태. 도메인 파일이 로딩 및 파싱됨
Active노드가 활성화되어 서비스 요청에 응답하는 상태
Finalized노드가 정리(cleanup)되어 종료된 상태

on_configure() 콜백에서 PDDL 도메인 파일의 로딩과 파싱이 수행되며, on_activate() 콜백에서 ROS2 서비스 서버가 활성화된다. 이러한 라이프사이클 관리를 통해, 도메인 모델이 완전히 준비되기 전에 다른 노드로부터의 서비스 요청이 처리되는 상황을 방지한다.

3.2 PDDL 파서 구조

도메인 전문가 노드의 내부에는 PDDL 도메인 파일을 분석하는 파서(parser)가 포함되어 있다. PlanSys2의 PDDL 파서는 다음의 구성 요소를 순차적으로 처리한다.

  1. 어휘 분석(Lexical Analysis): PDDL 파일의 텍스트를 토큰(token) 단위로 분할한다. 괄호, 키워드(:requirements, :types, :predicates, :action 등), 식별자(identifier) 등이 토큰으로 인식된다.
  2. 구문 분석(Syntax Analysis): 토큰 열(token stream)을 PDDL 문법 규칙에 따라 구문 트리(syntax tree)로 변환한다.
  3. 의미 분석(Semantic Analysis): 타입 계층의 일관성, 술어와 액션에서 사용된 변수의 타입 정합성, 요구사항(requirements)과 실제 사용된 기능 간의 호환성 등을 검증한다.

파싱 결과는 내부 자료구조인 도메인 모델 객체로 저장되며, 이 객체는 타입 맵, 술어 목록, 액션 목록, 함수 목록, 파생 술어 목록 등의 데이터를 포함한다.

3.3 내부 자료구조

도메인 전문가 노드의 내부 자료구조는 PDDL 도메인의 각 구성 요소를 객체 지향적으로 모델링한다.

타입 계층(Type Hierarchy): PDDL의 :types 정의는 트리 구조(tree structure)로 표현된다. 각 타입 노드는 부모 타입(parent type)에 대한 참조를 유지하며, 타입 간의 상속 관계를 반영한다. 최상위 타입은 PDDL 표준에 따라 object이다.

object
├── robot
├── location
│   ├── room
│   └── corridor
└── item

술어(Predicate): 각 술어는 이름과 매개변수 목록(typed parameter list)으로 구성된다. 매개변수는 타입 계층에 정의된 타입으로 제한된다.

액션(Action): 각 액션은 이름, 매개변수 목록, 전제 조건(precondition) 표현식, 효과(effect) 표현식으로 구성된다. 전제 조건과 효과는 논리식(logical expression)의 트리 형태로 표현되며, and, or, not, forall, exists, when 등의 논리 연결자를 포함할 수 있다.

함수(Function): PDDL의 :functions 정의는 수치적 유창문(numeric fluent)을 나타내며, 각 함수는 이름, 매개변수 목록, 그리고 반환 타입(일반적으로 number)으로 구성된다.

4. ROS2 서비스 인터페이스

4.1 도메인 정보 질의 서비스

도메인 전문가 노드는 다음의 ROS2 서비스를 통해 도메인 정보에 대한 질의를 처리한다.

서비스명서비스 타입기능
domain_expert/get_domainplansys2_msgs/srv/GetDomain전체 PDDL 도메인 문자열을 반환
domain_expert/get_domain_typesplansys2_msgs/srv/GetDomainTypes도메인에 정의된 모든 타입 목록을 반환
domain_expert/get_domain_predicatesplansys2_msgs/srv/GetDomainPredicates도메인에 정의된 모든 술어 목록을 반환
domain_expert/get_domain_actionsplansys2_msgs/srv/GetDomainActions도메인에 정의된 모든 액션 목록을 반환
domain_expert/get_domain_action_detailsplansys2_msgs/srv/GetDomainActionDetails특정 액션의 상세 정보를 반환
domain_expert/get_domain_functionsplansys2_msgs/srv/GetDomainFunctions도메인에 정의된 모든 함수 목록을 반환
domain_expert/get_domain_durative_actionsplansys2_msgs/srv/GetDomainDurativeActionDetails지속적 액션의 상세 정보를 반환

이러한 서비스 인터페이스를 통해, 시스템 내의 임의의 ROS2 노드가 도메인 정보에 접근할 수 있다. 서비스 호출은 동기적(synchronous)으로 처리되므로, 호출 노드는 응답을 수신할 때까지 대기한다.

4.2 도메인 모델 갱신 서비스

도메인 전문가 노드는 런타임에 도메인 모델을 동적으로 갱신하기 위한 서비스도 제공한다.

서비스명기능
domain_expert/add_domain새로운 PDDL 도메인 정의를 추가

도메인의 동적 갱신은 다중 도메인 파일의 병합(merge)이나, 런타임에 새로운 액션 정의를 추가하는 시나리오에서 활용된다. 다만, 도메인의 런타임 변경은 기존 계획의 무효화를 유발할 수 있으므로, 변경 후에는 플래너 노드에 재계획(replanning)을 요청해야 한다.

5. 도메인 파일의 로딩 절차

5.1 파라미터 기반 도메인 로딩

도메인 전문가 노드는 ROS2 파라미터를 통해 PDDL 도메인 파일의 경로를 지정받는다. 런치 파일(launch file)에서 다음과 같이 도메인 파일 경로를 파라미터로 전달한다.

# launch 파일 예시 (Python)
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='plansys2_domain_expert',
            executable='domain_expert_node',
            name='domain_expert',
            parameters=[{
                'model_file': '/path/to/domain.pddl'
            }]
        )
    ])

model_file 파라미터에 지정된 경로의 PDDL 파일이 on_configure() 콜백 시점에 로딩된다.

5.2 다중 도메인 파일의 로딩

PlanSys2는 복수의 PDDL 도메인 파일을 동시에 로딩하여 하나의 통합된 도메인 모델로 병합하는 기능을 지원한다. 이는 대규모 도메인을 모듈화(modularization)하여 관리하고자 할 때 유용하다.

parameters=[{
    'model_file': '/path/to/domain_navigation.pddl'
                  ':/path/to/domain_manipulation.pddl'
}]

복수의 도메인 파일은 콜론(:)으로 구분하여 지정한다. 병합 과정에서 동일한 이름의 타입, 술어, 액션 등이 충돌하는 경우, 도메인 전문가 노드는 오류를 보고하거나 우선순위 규칙에 따라 처리한다.

6. 도메인 모델의 검증 메커니즘

6.1 구문 오류 검출

PDDL 파서는 다음과 같은 구문 오류를 검출한다.

  • 괄호 불일치: PDDL의 S-표현식(S-expression) 구조에서 여는 괄호와 닫는 괄호의 수가 일치하지 않는 경우
  • 미인식 키워드: PDDL 표준에 정의되지 않은 키워드가 사용된 경우
  • 매개변수 선언 오류: 액션이나 술어의 매개변수에 타입이 지정되지 않거나, 잘못된 형식으로 선언된 경우

6.2 의미 오류 검출

구문 분석을 통과한 도메인 모델에 대해 다음의 의미적 검증이 수행된다.

  • 타입 참조 무결성: 술어, 액션의 매개변수에 사용된 타입이 :types 섹션에 정의되어 있는지 검증한다.
  • 요구사항 일관성: :requirements 섹션에 선언된 PDDL 기능(예: :durative-actions, :numeric-fluents)과 실제 도메인에서 사용된 기능이 일치하는지 검증한다.
  • 변수 범위 검증: 액션의 전제 조건 및 효과에서 사용된 변수가 해당 액션의 매개변수 목록에 선언되어 있는지 확인한다.

7. 도메인 전문가 클라이언트 API

7.1 C++ 클라이언트 라이브러리

PlanSys2는 사용자 코드에서 도메인 전문가 노드와 편리하게 상호작용할 수 있도록 C++ 클라이언트 라이브러리(plansys2::DomainExpertClient)를 제공한다. 이 클라이언트는 ROS2 서비스 호출의 복잡성을 캡슐화하며, 다음과 같은 API를 제공한다.

#include "plansys2_domain_expert/DomainExpertClient.hpp"

auto domain_client = 
    std::make_shared<plansys2::DomainExpertClient>();

// 전체 도메인 문자열 획득
std::string domain = domain_client->getDomain();

// 도메인에 정의된 타입 목록 획득
std::vector<std::string> types = domain_client->getTypes();

// 도메인에 정의된 술어 목록 획득
std::vector<plansys2_msgs::msg::Node> predicates = 
    domain_client->getPredicates();

// 특정 액션의 상세 정보 획득
std::optional<plansys2_msgs::msg::Action> action = 
    domain_client->getAction("move");

// 지속적 액션(durative action)의 상세 정보 획득
std::optional<plansys2_msgs::msg::DurativeAction> durative = 
    domain_client->getDurativeAction("navigate");

클라이언트 라이브러리의 모든 메서드는 내부적으로 ROS2 서비스 호출을 수행하며, 도메인 전문가 노드가 비활성 상태이거나 서비스 호출이 시간 초과(timeout)되면 적절한 오류를 반환한다.

7.2 Python 클라이언트

PlanSys2는 Python 사용자를 위한 plansys2_tools 패키지를 통해 CLI(Command Line Interface) 도구를 제공한다. CLI에서 도메인 정보를 조회하는 명령은 다음과 같다.

ros2 run plansys2_terminal plansys2_terminal
> get domain
> get actions
> get predicates

이를 통해 사용자는 런타임에 현재 로딩된 도메인 모델의 내용을 실시간으로 확인할 수 있다.

8. 실용적 고려사항

8.1 도메인 모델의 모듈화 전략

대규모 로봇 시스템에서는 단일 PDDL 도메인 파일이 매우 방대해질 수 있다. 이러한 경우 도메인 모델을 기능 영역별로 분할하여 관리하는 것이 유지보수성을 향상시킨다.

  • 내비게이션 도메인: 이동, 위치 변경, 경로 추종 관련 액션
  • 매니퓰레이션 도메인: 물체 파지(grasp), 배치(place), 운반(carry) 관련 액션
  • 인식 도메인: 객체 탐지, 환경 스캔 관련 액션

각 도메인 파일은 독립적으로 테스트 및 검증할 수 있으며, 도메인 전문가 노드의 다중 도메인 로딩 기능을 통해 런타임에 통합된다.

8.2 오류 진단과 디버깅

도메인 전문가 노드의 로딩 실패 시, ROS2 로깅 시스템을 통해 상세한 오류 메시지가 출력된다. 일반적인 오류 원인과 대응 방법은 다음과 같다.

  • 파일 경로 오류: model_file 파라미터에 지정된 경로가 존재하지 않거나 읽기 권한이 없는 경우 발생한다. 절대 경로를 사용하거나, ament_index_python을 통해 패키지 경로를 동적으로 해석하여 지정한다.
  • PDDL 구문 오류: 파서가 PDDL 구문을 인식하지 못하는 경우 발생한다. 오류 메시지에 포함된 행 번호와 토큰 정보를 참조하여 도메인 파일을 수정한다.
  • 타입 불일치: 술어나 액션에서 참조하는 타입이 :types 섹션에 정의되지 않은 경우 발생한다. 타입 계층을 점검하여 누락된 타입을 추가한다.

9. 요약

PlanSys2 도메인 전문가 노드는 PDDL 도메인 모델의 로딩, 파싱, 검증, 그리고 ROS2 서비스를 통한 도메인 정보 제공을 담당하는 핵심 구성 요소이다. ROS2 라이프사이클 관리형 노드로서 체계적인 상태 전이를 따르며, 다중 도메인 파일의 병합, 런타임 도메인 갱신, 그리고 포괄적인 오류 검출 기능을 제공한다. 도메인 전문가 클라이언트 라이브러리를 통해 사용자 코드에서 도메인 정보에 편리하게 접근할 수 있으며, 이는 PlanSys2 기반 태스크 플래닝 시스템의 구축에 있어 필수적인 기반을 형성한다.