1317.7 도메인 전문가 노드의 아키텍처
1. Domain Expert 노드의 역할
Domain Expert 노드는 PlanSys2에서 PDDL 도메인 모델의 관리, 파싱, 조회를 전담하는 핵심 노드이다. 이 노드는 도메인 파일을 로드하여 내부 자료 구조로 변환하고, ROS2 서비스 인터페이스를 통해 다른 노드와 외부 클라이언트에 도메인 정보를 제공한다.
2. 내부 구조
Domain Expert Node
├── PDDL Parser
│ ├── 도메인 파일 파싱
│ └── 구문 검증
├── Domain Model
│ ├── 타입 계층 구조
│ ├── 상수 목록
│ ├── 술어 시그니처
│ ├── 함수 시그니처
│ ├── 액션 스키마 (순간적)
│ └── 듀레이티브 액션 스키마
└── ROS2 Service Server
├── get_domain
├── get_domain_name
├── get_domain_types
├── get_domain_predicates
├── get_domain_actions
├── get_domain_action_details
├── get_domain_durative_action_details
└── get_domain_constants
3. 도메인 파일 로딩
Domain Expert는 ROS2 파라미터 model_file로 지정된 PDDL 도메인 파일을 라이프사이클의 on_configure 단계에서 로드한다:
CallbackReturn DomainExpertNode::on_configure(const rclcpp_lifecycle::State &) {
std::string model_file = get_parameter("model_file").as_string();
domain_expert_ = std::make_shared<DomainExpert>(model_file);
// 서비스 서버 생성
return CallbackReturn::SUCCESS;
}
4. 파싱 결과의 내부 표현
PDDL 도메인 파일의 각 구성 요소가 내부 자료 구조로 변환된다:
| PDDL 구성 요소 | 내부 표현 |
|---|---|
(define (domain ...)) | 도메인 이름 (문자열) |
(:requirements ...) | 요구사항 플래그 집합 |
(:types ...) | 타입 트리 자료 구조 |
(:constants ...) | 타입 부여 상수 목록 |
(:predicates ...) | 술어 시그니처 목록 (이름 + 매개변수 타입) |
(:functions ...) | 함수 시그니처 목록 |
(:action ...) | 액션 스키마 (이름, 매개변수, 전제 조건, 효과) |
(:durative-action ...) | 듀레이티브 액션 스키마 (지속 시간, 시간 조건/효과 포함) |
5. ROS2 서비스 인터페이스
5.1 도메인 전체 조회
// 클라이언트 사용 예시
auto domain_client = std::make_shared<plansys2::DomainExpertClient>();
std::string domain_text = domain_client->getDomain();
5.2 타입 목록 조회
auto types = domain_client->getTypes();
// {"robot", "waypoint", "object", "ground_robot", "aerial_robot", ...}
5.3 액션 상세 조회
auto action = domain_client->getAction("move");
if (action.has_value()) {
// action->name, action->parameters, action->preconditions, action->effects
}
auto durative_action = domain_client->getDurativeAction("navigate");
if (durative_action.has_value()) {
// durative_action->at_start_requirements, durative_action->over_all_requirements, ...
}
5.4 술어 목록 조회
auto predicates = domain_client->getPredicates();
// {"robot_at ?r - robot ?w - waypoint", "holding ?r - robot ?obj - object", ...}
6. Problem Expert와의 상호 작용
Problem Expert가 객체를 추가하거나 술어를 설정할 때, Domain Expert의 정보를 참조하여 유효성을 검증한다:
- 객체 추가 시: 해당 타입이 도메인에 선언되어 있는지 확인
- 술어 추가 시: 술어 이름이 도메인에 선언되어 있고, 매개변수 타입이 호환되는지 확인
- 함수 설정 시: 함수 이름이 도메인에 선언되어 있는지 확인
7. 라이프사이클 관리
Domain Expert는 ROS2 관리형 노드로서 다음의 상태 전이를 지원한다:
| 전이 | 수행 작업 |
|---|---|
on_configure | 도메인 파일 로드, 파싱, 서비스 서버 생성 |
on_activate | 서비스 서버 활성화 |
on_deactivate | 서비스 서버 비활성화 |
on_cleanup | 내부 자원 해제 |
on_shutdown | 노드 종료 |
8. 참고 문헌
- Gonzalez, F., Martin, F., Matellán, V., & Rodriguez, F. J. (2021). “PlanSys2: A Planning System Framework for ROS2.” IEEE ICARSC.