397.81 ROS2 PlanSys2 기반 임무 계획기 아키텍처
1. 개요
ROS2(Robot Operating System 2) 생태계 내에서 고전적 인공지능 계획(Classical AI Planning)을 실무적으로 구현하기 위한 핵심 프레임워크로서, PlanSys2(Planning System 2)는 PDDL(Planning Domain Definition Language) 기반의 자동화된 임무 계획 수립 및 실행 파이프라인을 제공한다. PlanSys2는 ROS2의 분산 통신 아키텍처, 생명주기 관리(Lifecycle Management), 그리고 액션 서버 인터페이스와 긴밀하게 통합되어, 자율 로봇 시스템의 고수준 임무 계획을 체계적으로 수립하고 실행할 수 있는 소프트웨어 기반을 마련한다.
PlanSys2는 기존 ROS1 환경에서 활용되던 ROSPlan(Cashmore et al., 2015)의 한계를 극복하고, ROS2의 설계 철학에 부합하도록 재설계된 프레임워크이다. 특히, ROS2의 DDS(Data Distribution Service) 기반 통신, 노드 생명주기(Node Lifecycle), 그리고 컴포넌트 기반 아키텍처를 완전히 활용함으로써, 실시간성과 확장성이 요구되는 현대 자율 로봇 시스템에 적합한 임무 계획 인프라를 구축한다.
2. PlanSys2의 아키텍처 구성
2.1 핵심 노드 구조
PlanSys2의 아키텍처는 네 개의 핵심 생명주기 관리 노드(Lifecycle Managed Node)로 구성된다. 각 노드는 ROS2의 LifecycleNode 인터페이스를 상속하며, Unconfigured → Inactive → Active → Finalized의 상태 전이 모델을 따른다.
2.1.1 도메인 전문가 노드(Domain Expert Node)
도메인 전문가 노드는 PDDL 도메인 정의를 관리하는 역할을 수행한다. 이 노드는 PDDL 도메인 파일을 파싱(Parsing)하여 내부 데이터 구조로 변환하고, 도메인에 정의된 타입(Type), 술어(Predicate), 함수(Function), 액션(Action), 그리고 듀레이티브 액션(Durative Action)의 메타데이터를 관리한다. 도메인 전문가 노드는 다른 노드들이 도메인 정보를 질의(Query)할 수 있도록 ROS2 서비스 인터페이스를 제공한다.
도메인 파일의 구문 분석(Syntactic Analysis)과 의미 분석(Semantic Analysis)을 수행하며, PDDL 2.1 수준의 듀레이티브 액션 및 수치 플루언트(Numeric Fluent)를 지원한다. 도메인 정의의 무결성 검증(Integrity Verification)을 통해 타입 계층 구조의 일관성, 술어 인자(Argument)의 타입 적합성, 그리고 액션 전제 조건과 효과의 논리적 정합성을 보장한다.
(define (domain robot-mission)
(:requirements :strips :typing :durative-actions)
(:types
robot location waypoint - object
aerial_robot ground_robot - robot
)
(:predicates
(at ?r - robot ?l - location)
(connected ?l1 - location ?l2 - location)
(visited ?l - location)
(charged ?r - robot)
)
(:durative-action navigate
:parameters (?r - robot ?from - location ?to - location)
:duration (= ?duration 10)
:condition (and
(at start (at ?r ?from))
(at start (connected ?from ?to))
(over all (charged ?r))
)
:effect (and
(at start (not (at ?r ?from)))
(at end (at ?r ?to))
(at end (visited ?to))
)
)
)
2.1.2 문제 전문가 노드(Problem Expert Node)
문제 전문가 노드는 PDDL 문제 인스턴스(Problem Instance)의 동적 관리를 담당한다. 이 노드는 현재 세계 상태(World State)를 나타내는 인스턴스(Instance), 술어(Predicate), 함수(Function) 값을 유지하며, 목표 조건(Goal Condition)을 설정하고 관리한다.
문제 전문가 노드의 핵심 기능은 다음과 같다:
- 인스턴스 관리: 로봇, 위치, 객체 등의 PDDL 인스턴스를 동적으로 추가, 제거, 조회한다.
- 술어 관리: 현재 세계 상태를 반영하는 술어 집합을 실시간으로 갱신한다.
- 함수 관리: 수치적 플루언트 값을 설정하고 갱신하며, 자원 소모량이나 거리 정보 등의 정량적 데이터를 관리한다.
- 목표 관리: 임무 목표를 논리적 수식으로 정의하고, 복합 목표의 구성(Composition)을 지원한다.
문제 전문가 노드는 ROS2 서비스를 통해 외부 노드로부터 상태 업데이트를 수신하고, 센서 데이터나 지각(Perception) 결과를 세계 상태에 반영하는 인터페이스를 제공한다. 이를 통해 환경 변화에 따른 동적 계획 수정의 기초를 마련한다.
2.1.3 계획기 노드(Planner Node)
계획기 노드는 PDDL 도메인과 문제 인스턴스를 외부 PDDL 플래너(Planner)에 전달하여 계획(Plan)을 생성하는 역할을 수행한다. PlanSys2의 계획기 노드는 플러그인(Plugin) 아키텍처를 채택하여, 다양한 PDDL 플래너를 교체 가능하게 통합할 수 있다.
지원되는 대표적 플래너는 다음과 같다:
| 플래너 | 특징 | PDDL 지원 수준 |
|---|---|---|
| POPF (Partial Order Planning Forward) | 시간적 계획(Temporal Planning) 지원, 듀레이티브 액션 처리 | PDDL 2.1 Level 3 |
| TFD (Temporal Fast Downward) | 수치 플루언트 및 시간 제약 최적화 | PDDL 2.1 Level 4 |
| OPTIC | 시간 및 수치 최적화 동시 지원 | PDDL 2.1 + Preferences |
| LAMA | 랜드마크 기반 최적화, 대규모 문제 효율적 처리 | PDDL 2.2 |
계획기 노드는 플래너 실행 결과로 생성된 계획을 파싱하여, 액션 시퀀스(Action Sequence)와 시간 정보를 포함하는 내부 계획 표현(Internal Plan Representation)으로 변환한다. 계획 생성 실패 시 적절한 오류 코드와 진단 정보를 반환하여, 상위 시스템이 대안적 계획 전략을 수립할 수 있도록 지원한다.
2.1.4 실행기 노드(Executor Node)
실행기 노드는 생성된 계획의 실제 실행을 관리하는 핵심 컴포넌트이다. 계획에 포함된 각 액션을 ROS2 액션 서버(Action Server)에 매핑하고, 액션의 시작, 실행, 완료, 취소를 조율(Orchestrate)한다.
실행기 노드의 주요 기능은 다음과 같다:
- 행동 트리(Behavior Tree) 기반 실행 제어: PlanSys2는 생성된 PDDL 계획을 BehaviorTree.CPP 라이브러리 기반의 행동 트리로 자동 변환한다. 이를 통해 병렬 액션 실행, 조건부 분기, 그리고 장애 복구(Fault Recovery) 로직을 체계적으로 구성한다.
- 액션 클라이언트 관리: 각 PDDL 액션에 대응하는 ROS2 액션 클라이언트를 생성하고, 액션 서버와의 통신을 관리한다.
- 실행 상태 모니터링: 각 액션의 진행 상태(피드백), 완료 결과, 그리고 오류 상태를 실시간으로 추적하고 보고한다.
- 계획 취소 및 중단: 외부 요청이나 실행 오류 발생 시 진행 중인 계획의 안전한 중단(Safe Abort)을 보장한다.
2.2 노드 간 통신 구조
PlanSys2의 네 핵심 노드는 ROS2의 서비스(Service), 토픽(Topic), 그리고 액션(Action) 인터페이스를 통해 상호 통신한다. 도메인 전문가와 문제 전문가 노드는 계획기 노드에 도메인 및 문제 정보를 제공하고, 계획기 노드는 생성된 계획을 실행기 노드에 전달한다. 실행기 노드는 액션 실행 결과를 문제 전문가 노드에 피드백하여 세계 상태를 갱신한다.
┌──────────────┐ ┌──────────────┐
│ Domain │ │ Problem │
│ Expert │────▶│ Expert │
│ Node │ │ Node │
└──────┬───────┘ └──────┬───────┘
│ │
│ Domain + Problem │
└────────┬───────────┘
│
▼
┌────────────────┐
│ Planner │
│ Node │
└────────┬───────┘
│
│ Plan
▼
┌────────────────┐
│ Executor │──────▶ ROS2 Action Servers
│ Node │◀────── Feedback / Result
└────────┬───────┘
│
│ State Update
▼
┌────────────────┐
│ Problem │
│ Expert │
└────────────────┘
3. 플러그인 기반 계획기 통합
3.1 플래너 플러그인 인터페이스
PlanSys2는 plansys2::PlannerInterface 추상 클래스를 정의하여, 다양한 PDDL 플래너를 동일한 인터페이스를 통해 통합할 수 있는 플러그인 아키텍처를 제공한다. 플러그인 인터페이스의 핵심 메서드는 다음과 같다:
class PlannerInterface : public rclcpp_lifecycle::LifecycleNode {
public:
virtual std::optional<plansys2_msgs::msg::Plan>
getPlan(
const std::string & domain,
const std::string & problem,
const std::string & node_namespace = "") = 0;
};
플래너 플러그인은 ROS2의 pluginlib를 활용하여 런타임에 동적으로 로딩(Dynamic Loading)되며, 설정 파일(Configuration File)을 통해 사용할 플래너를 지정할 수 있다. 이러한 설계는 특정 플래너에 대한 종속성(Dependency)을 제거하고, 임무 특성에 따라 최적의 플래너를 선택적으로 활용할 수 있도록 한다.
3.2 계획 결과의 표현
플래너가 생성한 계획은 plansys2_msgs::msg::Plan 메시지 타입으로 표현되며, 각 계획 항목(Plan Item)은 다음의 정보를 포함한다:
- 시간(Time): 액션의 시작 시점을 나타내는 시간 인덱스
- 액션(Action): PDDL 액션의 인스턴스화된 표현(Grounded Action)
- 지속 시간(Duration): 듀레이티브 액션의 실행 시간
계획 결과의 예시는 다음과 같다:
0.000: (navigate robot1 base waypoint1) [10.000]
0.000: (navigate robot2 base waypoint2) [10.000]
10.001: (inspect robot1 waypoint1) [5.000]
10.001: (inspect robot2 waypoint2) [5.000]
15.002: (navigate robot1 waypoint1 base) [10.000]
15.002: (navigate robot2 waypoint2 base) [10.000]
이 표현에서 동일 시간 인덱스를 가진 액션들은 병렬 실행이 가능함을 나타내며, 실행기 노드는 이러한 병렬성(Parallelism)을 행동 트리의 병렬 노드(Parallel Node)로 변환하여 처리한다.
4. 액션 실행 메커니즘
4.1 ActionExecutorClient 추상 클래스
PlanSys2에서 PDDL 액션의 실제 실행은 ActionExecutorClient를 상속하는 사용자 정의 노드를 통해 이루어진다. ActionExecutorClient는 ROS2 생명주기 노드이자 액션 서버로서, 다음의 콜백 메서드를 제공한다:
class ActionExecutorClient : public rclcpp_lifecycle::LifecycleNode {
protected:
virtual void do_work() = 0;
void finish(
bool success,
float completion,
const std::string & status);
std::vector<std::string> get_arguments();
};
do_work(): 주기적으로 호출되어 액션의 실제 작업을 수행하는 콜백 함수이다. 로봇의 내비게이션, 조작(Manipulation), 센서 데이터 수집 등의 물리적 행위를 이 메서드 내에서 구현한다.finish(): 액션의 완료를 보고하며, 성공 여부, 완료율, 상태 메시지를 전달한다.get_arguments(): PDDL 액션에 전달된 인자(파라미터)를 반환한다.
4.2 액션 실행의 생명주기
PlanSys2에서 각 액션의 실행은 다음의 생명주기를 따른다:
- 활성화(Activation): 실행기 노드가 계획에 따라 액션을 시작하면, 해당
ActionExecutorClient노드가configure→activate상태 전이를 수행한다. - 실행(Execution):
do_work()콜백이 설정된 주기(기본 100ms)로 반복 호출되며, 각 호출에서 액션의 진행 상태를 갱신한다. - 완료(Completion):
finish(true, ...)호출 시 액션이 성공적으로 완료되었음을 실행기 노드에 통보한다. - 실패(Failure):
finish(false, ...)호출 시 액션 실패를 통보하며, 실행기 노드는 계획 전체의 중단 또는 대안적 액션의 실행을 결정한다. - 비활성화(Deactivation): 액션 완료 또는 실패 후
deactivate→cleanup상태 전이를 수행하여 자원을 해제한다.
4.3 행동 트리 기반 실행 제어
PDDL 계획의 실행 제어에 행동 트리를 활용하는 것은 PlanSys2의 핵심 설계 결정 중 하나이다. PDDL 플래너가 생성한 시간적 계획(Temporal Plan)은 자동으로 BehaviorTree.CPP 호환 XML로 변환되며, 다음과 같은 행동 트리 노드 유형이 활용된다:
- 시퀀스 노드(Sequence Node): 순차적으로 실행되어야 하는 액션들의 연쇄를 표현한다.
- 병렬 노드(Parallel Node): 동시에 실행 가능한 액션들의 병렬 실행을 관리한다. 성공 임계값(Success Threshold)과 실패 정책(Failure Policy)을 설정할 수 있다.
- 액션 노드(Action Node): 개별 PDDL 액션에 대응하는
ActionExecutorClient를 호출한다. - 조건 노드(Condition Node): 액션의 전제 조건 또는 실행 중 조건을 검증한다.
이러한 행동 트리 기반 실행 제어는 단순한 선형 계획 실행을 넘어서, 복잡한 병렬 실행 패턴과 조건부 실행 로직을 체계적으로 관리할 수 있는 유연성을 제공한다.
5. 지식 기반 관리
5.1 세계 상태의 동적 갱신
PlanSys2에서의 세계 상태(World State) 관리는 문제 전문가 노드를 통해 이루어지며, 다음과 같은 ROS2 서비스를 통해 외부 노드가 세계 상태를 동적으로 갱신할 수 있다:
add_problem_instance: 새로운 PDDL 인스턴스를 추가한다.remove_problem_instance: 기존 인스턴스를 제거한다.add_problem_predicate: 세계 상태에 술어를 추가한다.remove_problem_predicate: 세계 상태에서 술어를 제거한다.add_problem_function: 수치 함수 값을 설정한다.update_problem_function: 수치 함수 값을 갱신한다.add_problem_goal: 임무 목표를 설정한다.remove_problem_goal: 임무 목표를 제거한다.
이러한 서비스 인터페이스를 통해, 센서 데이터 처리 노드, 환경 인식 노드, 또는 상위 임무 관리 시스템이 실시간으로 세계 상태를 갱신할 수 있다. 예를 들어, SLAM(Simultaneous Localization and Mapping) 노드가 새로운 장애물을 감지하면 해당 정보를 술어로 추가하여, 후속 계획 수립 시 반영될 수 있도록 한다.
5.2 지식 기반과 계획의 일관성 유지
세계 상태의 동적 갱신은 계획의 유효성에 영향을 미칠 수 있다. PlanSys2는 현재 실행 중인 계획의 전제 조건이 더 이상 충족되지 않는 상황을 감지하고, 계획의 재수립(Replanning)을 트리거(Trigger)하는 메커니즘을 포함한다. 이 과정은 다음과 같이 진행된다:
- 세계 상태 변경이 문제 전문가 노드에 반영된다.
- 실행기 노드가 현재 계획의 전제 조건을 주기적으로 검증한다.
- 전제 조건 위반이 감지되면 현재 계획의 실행을 안전하게 중단한다.
- 갱신된 세계 상태를 기반으로 새로운 계획을 수립한다.
- 새로운 계획의 실행을 개시한다.
6. 시스템 통합 및 설정
6.1 런치 시스템 구성
PlanSys2의 전체 시스템은 ROS2 런치(Launch) 시스템을 통해 구성된다. 런치 파일에서는 네 핵심 노드의 파라미터, 플래너 플러그인 선택, 그리고 도메인 파일 경로를 지정한다:
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',
output='screen',
parameters=[{
'model_file': '/path/to/domain.pddl'
}]
),
Node(
package='plansys2_problem_expert',
executable='problem_expert_node',
name='problem_expert',
output='screen',
),
Node(
package='plansys2_planner',
executable='planner_node',
name='planner',
output='screen',
parameters=[{
'plugin': 'plansys2/POPFPlannerPlugin'
}]
),
Node(
package='plansys2_executor',
executable='executor_node',
name='executor',
output='screen',
),
])
6.2 멀티 도메인 지원
PlanSys2는 네임스페이스(Namespace)를 활용하여 복수의 도메인을 동시에 관리할 수 있다. 이는 이기종 로봇 시스템(Heterogeneous Robot System)에서 각 로봇 유형에 적합한 도메인을 별도로 정의하고 독립적으로 계획을 수립해야 하는 시나리오에서 유용하다. 각 도메인은 독립된 네임스페이스 내에서 자신만의 도메인 전문가, 문제 전문가, 계획기, 실행기 노드를 보유한다.
7. 성능 특성 및 확장성
7.1 계획 생성 성능
PlanSys2의 계획 생성 성능은 사용되는 외부 플래너의 알고리즘적 효율성에 직접적으로 의존한다. POPF 플래너를 기준으로, 소규모 도메인(액션 수 < 10, 인스턴스 수 < 20)에서는 밀리초(ms) 단위의 계획 생성이 가능하며, 중규모 도메인(액션 수 < 50, 인스턴스 수 < 100)에서는 수 초 이내의 계획 생성이 일반적이다. 대규모 도메인에서는 계획 생성 시간이 급격하게 증가할 수 있으며, 이 경우 문제 분할(Problem Decomposition)이나 계층적 계획(Hierarchical Planning) 기법을 병행하는 것이 권장된다.
7.2 실행 오버헤드
행동 트리 기반 실행 제어의 오버헤드는 미미한 수준이다. BehaviorTree.CPP의 틱(Tick) 주기는 설정 가능하며, 기본값은 100ms이다. 액션 서버 통신의 지연은 DDS 미들웨어의 QoS(Quality of Service) 설정에 의존하며, 동일 호스트(Host) 내 통신에서는 마이크로초(μs) 수준의 지연을 보인다.
7.3 확장성 고려 사항
PlanSys2의 확장성은 다음의 요인에 의해 결정된다:
- PDDL 도메인 복잡도: 액션 수, 타입 계층 깊이, 술어 수가 증가할수록 계획 생성 시간이 비선형적으로 증가한다.
- 동시 실행 액션 수: 병렬 액션 수의 증가는 실행기 노드의 스레드 관리 및 자원 할당 복잡도를 증가시킨다.
- 세계 상태 크기: 대규모 인스턴스 및 술어 집합은 문제 전문가 노드의 메모리 사용량과 검색 시간에 영향을 미친다.
8. 실제 적용 사례
8.1 다중 로봇 탐사 임무
PlanSys2를 활용한 다중 로봇 탐사 임무의 전형적인 구현 패턴은 다음과 같다:
- 도메인 정의: 로봇 내비게이션, 센서 데이터 수집, 데이터 전송 등의 액션을 PDDL로 정의한다.
- 문제 인스턴스 설정: 탐사 영역의 웨이포인트, 로봇 초기 위치, 탐사 대상 지점을 인스턴스로 등록한다.
- 목표 설정: 모든 대상 지점의 탐사 완료를 목표로 설정한다.
- 계획 수립 및 실행: 플래너가 최적의 탐사 경로와 작업 할당을 계산하고, 실행기가 각 로봇에 대한 액션을 동시에 실행한다.
8.2 산업 환경 물류 자동화
물류 자동화 시스템에서 PlanSys2는 AGV(Automated Guided Vehicle) 군의 작업 할당과 경로 계획을 통합적으로 관리한다. 주문(Order) 정보를 PDDL 인스턴스로 변환하고, 적재(Loading), 이동(Transport), 하역(Unloading) 액션을 순서대로 계획하며, 병렬 처리가 가능한 주문에 대해서는 동시 실행을 조율한다.
9. 한계 및 향후 발전 방향
PlanSys2는 강력한 고전적 계획 프레임워크를 제공하지만, 다음과 같은 한계가 존재한다:
- 확률적 도메인 지원의 부재: 현재 PDDL의 결정론적 부분만을 지원하며, 확률적 효과(Probabilistic Effect)나 부분 관측(Partial Observability)을 자체적으로 처리하지 못한다.
- 온라인 계획의 제한: 실시간으로 변화하는 환경에서 연속적인 재계획(Continuous Replanning)의 효율성이 제한적이다.
- 대규모 문제의 확장성: 대규모 다중 로봇 시스템에서 PDDL 문제의 크기가 급격히 증가하여 계획 생성 시간이 비현실적으로 길어질 수 있다.
- 학습 기반 계획과의 통합 미흡: 강화학습이나 대규모 언어 모델 기반 계획 기법과의 통합 인터페이스가 아직 초기 단계이다.
향후 발전 방향으로는 선언적 임무 명세 언어와의 통합, 분산 계획(Distributed Planning) 지원, 학습 기반 도메인 모델 자동 생성, 그리고 ROS2 Nav2 및 MoveIt2와의 심층 통합이 기대된다.
10. 참고 문헌
- Cashmore, M., Fox, M., Long, D., Magazzeni, D., Ridder, B., Carrera, A., … & Carreras, M. (2015). “ROSPlan: Planning in the Robot Operating System.” Proceedings of the International Conference on Automated Planning and Scheduling (ICAPS).
- Martín, F., Cañas, J. M., Aguero, C., & González, R. (2021). “PlanSys2: A Planning System Framework for ROS2.” IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS).
- Colledanchise, M., & Ögren, P. (2018). “Behavior Trees in Robotics and AI: An Introduction.” CRC Press.
- Ghallab, M., Nau, D., & Traverso, P. (2016). “Automated Planning and Acting.” Cambridge University Press.
- 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).