1317.14 ROS2 토픽을 통한 상태 모니터링
1. ROS2 토픽의 역할
ROS2 토픽(Topic)은 발행-구독(publish-subscribe) 패턴의 비동기적 통신 메커니즘이다. PlanSys2에서 토픽은 계획 실행의 진행 상황, 세계 상태의 변경 이벤트, 노드의 헬스 상태 등을 지속적으로 방송하는 데 사용된다.
2. PlanSys2의 토픽 기반 모니터링
2.1 실행 상태 모니터링
Executor 노드가 계획 실행 중 각 액션의 상태를 토픽으로 발행한다:
토픽: /executor/action_execution_info
메시지 유형: plansys2_msgs/msg/ActionExecutionInfo[]
각 항목:
- action: "(move robot1 wp1 wp2)"
- status: "EXECUTING" | "COMPLETED" | "FAILED" | "CANCELLED"
- completion: 0.75 (0.0 ~ 1.0)
- message: "Moving to wp2"
- start_time: ROS time
2.2 모니터링 코드 예시
// 실행 상태 구독
auto subscription = node->create_subscription<plansys2_msgs::msg::ActionExecutionInfo>(
"/executor/action_execution_info",
10,
[](const%20plansys2_msgs::msg::ActionExecutionInfo::SharedPtr%20msg) {
for (const auto & action_info : msg->action_execution_status) {
RCLCPP_INFO(rclcpp::get_logger("monitor"),
"Action: %s | Status: %s | Progress: %.0f%%",
action_info.action.c_str(),
action_info.status.c_str(),
action_info.completion * 100);
}
});
2.3 ExecutorClient를 통한 간편 모니터링
PlanSys2의 클라이언트 라이브러리는 토픽 구독을 추상화한다:
auto executor_client = std::make_shared<plansys2::ExecutorClient>();
executor_client->start(plan);
// 주기적 상태 확인
while (rclcpp::ok()) {
auto feedback = executor_client->getFeedBack();
for (const auto & action_status : feedback.action_execution_status) {
if (action_status.status == "EXECUTING") {
// 실행 중인 액션 정보 표시
} else if (action_status.status == "FAILED") {
// 실패 처리
}
}
auto result = executor_client->getResult();
if (result.has_value()) {
if (result.value().success) {
// 계획 성공
} else {
// 계획 실패 → 재계획 필요
}
break;
}
rclcpp::spin_some(node);
}
3. 세계 상태 변경 모니터링
Problem Expert의 상태 변경을 토픽으로 모니터링할 수 있다:
토픽: /problem_expert/update_notify
메시지: 변경 유형과 변경 내용
이를 통해 외부 노드가 세계 상태의 변경을 감지하고 반응할 수 있다.
4. 시각화 도구와의 연동
PlanSys2의 토픽 데이터는 ROS2의 표준 시각화 도구(RViz2, rqt 등)와 연동하여 실행 상태를 시각적으로 모니터링할 수 있다:
- rqt_graph: 노드 간 토픽 연결 관계 시각화
- rqt_topic: 토픽 메시지의 실시간 모니터링
- 커스텀 GUI: Qt 기반 대시보드에서 실행 상태 표시
5. QoS 설정
모니터링 토픽의 QoS 설정:
auto qos = rclcpp::QoS(rclcpp::KeepLast(1))
.reliability(rclcpp::ReliabilityPolicy::BestEffort)
.durability(rclcpp::DurabilityPolicy::Volatile);
모니터링 데이터는 최신 정보가 중요하므로 BestEffort와 KeepLast(1) 정책을 사용하여 레이턴시를 최소화한다.
6. 참고 문헌
- 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.