1317.5 PlanSys2의 전체 시스템 아키텍처
1. 아키텍처 개요
PlanSys2의 전체 시스템 아키텍처는 네 가지 핵심 노드(Domain Expert, Problem Expert, Planner, Executor)와 이들을 연결하는 ROS2 통신 인터페이스, 그리고 외부 시스템(플래너 엔진, 액션 수행기 노드)으로 구성된다.
2. 대 핵심 노드
┌─────────────────────────────────────────────────────┐
│ PlanSys2 Core │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Domain Expert │ │Problem Expert│ │
│ │ │ │ │ │
│ │ PDDL 도메인 │←──→│ 세계 상태 │ │
│ │ 타입, 술어, │ │ 객체, 술어, │ │
│ │ 액션 스키마 │ │ 함수, 목표 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └────────┬──────────┘ │
│ ↓ │
│ ┌──────────────┐ │
│ │ Planner │ │
│ │ │ │
│ │ 외부 플래너 │ │
│ │ (POPF, FD등) │ │
│ └──────┬───────┘ │
│ ↓ │
│ ┌──────────────┐ │
│ │ Executor │ │
│ │ │ │
│ │ 행동 트리 │ │
│ │ 기반 실행 │ │
│ └──────┬───────┘ │
└────────────────┼────────────────────────────────────┘
↓
┌───────────┼───────────┐
↓ ↓ ↓
┌────────┐ ┌────────┐ ┌────────┐
│ move │ │ pick │ │ place │
│ action │ │ action │ │ action │
│ node │ │ node │ │ node │
└────────┘ └────────┘ └────────┘
2.1 Domain Expert
PDDL 도메인 파일을 관리하는 노드이다. 도메인 파일을 파싱하여 타입 계층, 술어 시그니처, 액션 스키마 등의 메타데이터를 내부적으로 저장하고, ROS2 서비스를 통해 다른 노드에 이 정보를 제공한다.
2.2 Problem Expert
현재 세계 상태(객체, 술어 인스턴스, 함수 값)와 목표 조건을 관리하는 노드이다. 외부 노드가 ROS2 서비스를 통해 세계 상태를 동적으로 갱신할 수 있다.
2.3 Planner
Domain Expert와 Problem Expert로부터 도메인과 문제 정보를 수집하여, 외부 플래너 엔진(POPF, Fast Downward 등)에 전달하고 생성된 계획을 반환하는 노드이다. 플래너 엔진은 플러그인 방식으로 교체 가능하다.
2.4 Executor
Planner가 생성한 계획을 행동 트리(Behavior Tree)로 변환하여 실행하는 노드이다. 각 PDDL 액션을 대응하는 ROS2 액션 노드(ActionExecutorClient)에 위임하고, 실행 상태를 모니터링한다.
3. 노드 간 통신 흐름
3.1 계획 생성 흐름
1. 사용자/응용 → Problem Expert: 객체, 술어, 목표 설정
2. Planner → Domain Expert: 도메인 정보 요청
3. Planner → Problem Expert: 문제 정보 요청
4. Planner → 외부 플래너: PDDL 도메인+문제 전송
5. 외부 플래너 → Planner: 계획 반환
6. Planner → Executor: 계획 전달
3.2 계획 실행 흐름
1. Executor: 계획을 행동 트리로 변환
2. Executor → 액션 노드: 각 액션 실행 요청
3. 액션 노드 → Executor: 피드백 및 완료 통보
4. Executor → Problem Expert: 액션 효과에 의한 세계 상태 갱신
5. (실패 시) Executor → Planner: 재계획 요청
4. 클라이언트 라이브러리
PlanSys2는 C++ 클라이언트 라이브러리를 제공하여, 외부 ROS2 노드에서 PlanSys2의 기능에 프로그래밍적으로 접근할 수 있다:
#include "plansys2_domain_expert/DomainExpertClient.hpp"
#include "plansys2_problem_expert/ProblemExpertClient.hpp"
#include "plansys2_planner/PlannerClient.hpp"
#include "plansys2_executor/ExecutorClient.hpp"
auto domain_client = std::make_shared<plansys2::DomainExpertClient>();
auto problem_client = std::make_shared<plansys2::ProblemExpertClient>();
auto planner_client = std::make_shared<plansys2::PlannerClient>();
auto executor_client = std::make_shared<plansys2::ExecutorClient>();
5. 참고 문헌
- Gonzalez, F., Martin, F., Matellán, V., & Rodriguez, F. J. (2021). “PlanSys2: A Planning System Framework for ROS2.” IEEE ICARSC.
- Macenski, S., Foote, T., Gerkey, B., Lalancette, C., & Woodall, W. (2022). “Robot Operating System 2: Design, Architecture, and Uses in the Wild.” Science Robotics, 7(66), eabm6074.