1293.67 Tick과 ROS2 통신의 상호작용
1. ROS2 통신과 행동 트리의 결합
ROS2 기반 로봇 시스템에서 행동 트리는 ROS2의 통신 메커니즘(토픽, 서비스, 액션)을 통해 로봇의 센서, 액추에이터, 외부 시스템과 상호작용한다. Tick 메커니즘과 ROS2 통신은 근본적으로 다른 실행 모델을 가진다. Tick은 주기적이고 폴링 기반인 반면, ROS2 통신은 이벤트 기반이며 콜백을 통해 데이터를 전달한다. 이 두 모델의 효율적 결합이 행동 트리 기반 로봇 시스템의 설계에서 핵심적 과제이다(Macenski et al., 2020).
2. ROS2 통신 유형과 Tick의 관계
2.1 토픽(Topic)
토픽은 발행-구독(publish-subscribe) 패턴의 비동기 단방향 통신이다. 센서 데이터 수신, 명령 발행 등에 사용된다.
발행자 노드 → 토픽 → 구독 콜백 → 노드 멤버 변수/블랙보드
↑
Tick에서 getInput()으로 읽기
토픽 데이터는 콜백에 의해 비동기적으로 수신되며, Tick에서는 가장 최근에 수신된 데이터를 읽는다. Tick과 콜백의 실행 시점이 독립적이므로, Tick이 읽는 데이터의 신선도는 토픽 발행 주기와 Tick 주기의 관계에 의해 결정된다.
2.2 서비스(Service)
서비스는 요청-응답(request-response) 패턴의 동기적 양방향 통신이다. 파라미터 조회, 설정 변경 등의 경량 요청에 사용된다.
Tick 내:
서비스 요청 전송 → 응답 대기(차단) → 응답 수신 → 결과 반환
서비스 호출은 응답을 대기하므로 Tick 스레드를 차단할 수 있다. 비차단 방식으로 서비스를 호출하려면 비동기 서비스 클라이언트를 사용해야 한다.
2.3 액션(Action)
액션은 장시간 실행되는 목표 지향적 작업을 위한 통신이다. 네비게이션, 매니퓰레이션 등에 사용된다.
Tick 1 (onStart):
목표 전송 → RUNNING 반환
Tick 2~N (onRunning):
피드백 확인 → RUNNING 반환
Tick N+1 (onRunning):
결과 수신 → SUCCESS/FAILURE 반환
액션은 비동기 노드(StatefulActionNode)의 자연스러운 대응이다. 목표 전송과 결과 확인이 서로 다른 Tick에서 수행되므로, Tick 스레드가 차단되지 않는다.
3. 통신 유형별 Tick 영향 비교
| 통신 유형 | 방향 | Tick 차단 | 결과 반환 시점 | 권장 노드 유형 |
|---|---|---|---|---|
| 토픽 구독 | 수신 | 없음 (콜백 기반) | 콜백 시 즉시 | ConditionNode |
| 토픽 발행 | 송신 | 없음 (비차단) | 즉시 | SyncActionNode |
| 서비스 동기 호출 | 양방향 | 있음 | 응답 시 | SyncActionNode (경량) |
| 서비스 비동기 호출 | 양방향 | 없음 | 콜백 시 | StatefulActionNode |
| 액션 목표 전송 | 양방향 | 없음 | 다수 Tick 후 | StatefulActionNode |
4. Tick 루프와 ROS2 실행기의 통합 패턴
4.1 인터리빙 패턴
가장 일반적인 통합 패턴으로, spinSome()과 tickOnce()를 교대로 호출한다.
void run() {
rclcpp::executors::SingleThreadedExecutor executor;
executor.add_node(ros_node_);
rclcpp::Rate rate(10); // 10 Hz
while (rclcpp::ok()) {
// 1. ROS2 콜백 처리 (토픽 수신, 서비스 응답, 액션 피드백)
executor.spin_some();
// 2. Tick 실행 (콜백에서 갱신된 데이터 사용)
tree_.tickOnce();
// 3. 다음 주기까지 대기
rate.sleep();
}
}
이 패턴에서의 시간 분할:
│← spinSome →│← tickOnce →│← sleep →│← spinSome →│← tickOnce →│
│ 콜백 처리 │ 트리 Tick │ 대기 │ 콜백 처리 │ 트리 Tick │
4.2 타이머 콜백 패턴
ROS2 타이머를 사용하여 Tick을 주기적으로 실행하는 패턴이다.
class BehaviorTreeNode : public rclcpp::Node {
public:
BehaviorTreeNode() : Node("bt_node") {
tick_timer_ = create_wall_timer(
std::chrono::milliseconds(100),
std::bind(&BehaviorTreeNode::tickCallback, this)
);
}
private:
void tickCallback() {
auto status = tree_.tickOnce();
if (status == BT::NodeStatus::SUCCESS ||
status == BT::NodeStatus::FAILURE) {
tick_timer_->cancel();
}
}
rclcpp::TimerBase::SharedPtr tick_timer_;
BT::Tree tree_;
};
이 패턴에서 Tick은 타이머 콜백으로 실행되므로, 다른 ROS2 콜백과 실행기에 의해 관리된다. SingleThreadedExecutor를 사용하면 모든 콜백(토픽, 서비스, 타이머)이 순차적으로 실행되어 스레드 안전성이 보장된다.
5. 통신 지연과 Tick 주기의 관계
ROS2 통신의 지연(latency)은 Tick 메커니즘에 영향을 미친다.
T_{data\_age} = T_{publish} + T_{transport} + T_{callback\_wait} + T_{tick\_wait}
여기서 T_{publish}는 발행 시점, T_{transport}는 전송 지연, T_{callback\_wait}는 spinSome() 호출까지의 대기 시간, T_{tick\_wait}는 다음 Tick까지의 대기 시간이다.
Tick 주기가 T_{tick}이면, 최악의 경우 데이터 연령은 약 2T_{tick}에 달할 수 있다.
T_{data\_age}^{worst} \approx T_{transport} + 2T_{tick}
이는 데이터가 Tick 직후에 도착하면, 다음 spinSome()에서 콜백이 처리되고 그 다음 Tick에서 읽히기 때문이다.
6. QoS 설정과 Tick의 관계
ROS2의 QoS(Quality of Service) 설정은 Tick에서 읽는 토픽 데이터의 특성에 영향을 미친다.
| QoS 정책 | Tick에 대한 영향 |
|---|---|
| Reliability: RELIABLE | 메시지 손실 방지, 재전송 지연 가능 |
| Reliability: BEST_EFFORT | 지연 최소화, 메시지 손실 가능 |
| Durability: TRANSIENT_LOCAL | 구독 시점 이전 메시지 수신, 초기 Tick에서 유효 데이터 보장 |
| History: KEEP_LAST(1) | 최신 메시지만 유지, Tick에서 항상 최신 데이터 읽기 |
| History: KEEP_ALL | 모든 메시지 유지, 콜백 처리 지연 가능 |
행동 트리에서 센서 데이터를 사용하는 조건 노드는 BEST_EFFORT + KEEP_LAST(1) 조합이 적합하며, 명령 전달에 사용되는 토픽은 RELIABLE + KEEP_LAST(1) 조합이 적합하다.
7. 노드 핸들의 공유
행동 트리의 복수 노드가 ROS2 통신을 사용하는 경우, ROS2 노드 핸들(rclcpp::Node)을 공유하여 구독, 발행, 서비스 클라이언트, 액션 클라이언트를 생성한다.
// 트리 생성 시 ROS2 노드를 블랙보드에 등록
auto blackboard = BT::Blackboard::create();
blackboard->set("node", ros_node);
// 행동 트리 노드에서 ROS2 노드 참조
BT::NodeStatus onStart() override {
auto node = config().blackboard->get<rclcpp::Node::SharedPtr>("node");
action_client_ = rclcpp_action::create_client<NavigateToPose>(node, "navigate");
// ...
}
이 패턴은 Nav2에서 채택하는 표준 방식으로, 모든 행동 트리 노드가 동일한 ROS2 노드를 통해 통신한다(Macenski et al., 2020).
참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D. (2022). BehaviorTree.CPP documentation and API reference. https://www.behaviortree.dev/
- Macenski, S., et al. (2020). The Marathon 2: A Navigation System. arXiv preprint arXiv:2003.00368.