1296.71 센서 처리 관련 액션 노드 설계

1. 개요

센서 처리 관련 액션 노드는 로봇에 장착된 다양한 센서로부터 데이터를 획득하고 처리하는 동작을 행동 트리 내에서 수행하는 리프 노드 군(群)이다. 로봇 시스템에서 센서 데이터의 획득과 처리는 환경 인식, 장애물 탐지, 물체 인식 등 자율 의사 결정의 기반이 되며, 행동 트리를 통해 이러한 센서 처리 동작의 실행 시점과 순서를 체계적으로 제어할 수 있다.

센서 처리 액션 노드의 설계는 센서의 물리적 특성, 데이터 처리 시간, ROS2 통신 인터페이스의 선택에 따라 달라진다. 본 절에서는 센서 처리 액션 노드의 일반적인 설계 원칙과 아키텍처를 기술한다.

2. 센서 처리 액션 노드의 분류

2.1 처리 시간에 따른 분류

센서 처리 작업은 소요 시간에 따라 동기 처리와 비동기 처리로 분류된다.

분류소요 시간기반 클래스예시
동기 처리수 밀리초SyncActionNode센서 상태 확인, 단일 값 읽기
비동기 처리수십 밀리초 이상StatefulActionNode이미지 촬영, 포인트 클라우드 처리, 물체 탐지

동기 센서 처리 노드는 단일 tick 내에서 SUCCESS 또는 FAILURE를 즉시 반환하며, 비동기 센서 처리 노드는 RUNNING 상태를 유지하면서 처리 완료를 대기한다. 이미지 기반 물체 인식이나 3차원 포인트 클라우드 처리와 같이 연산 비용이 높은 작업은 반드시 비동기 방식으로 구현해야 한다.

2.2 센서 유형에 따른 분류

로봇 시스템에서 활용되는 주요 센서 유형과 이에 대응하는 액션 노드는 다음과 같이 분류할 수 있다.

센서 유형데이터 형태ROS2 메시지 타입대응 액션 노드
카메라2D 이미지sensor_msgs/ImageCaptureImage
깊이 카메라깊이 맵sensor_msgs/ImageCaptureDepthImage
라이다3D 포인트 클라우드sensor_msgs/PointCloud2ProcessPointCloud
레이더탐지 목록사용자 정의ProcessRadarDetections
IMU관성 데이터sensor_msgs/ImuReadIMU
GPS위치 데이터sensor_msgs/NavSatFixReadGPS

3. 설계 원칙

3.1 센서 추상화 계층

센서 처리 액션 노드는 특정 센서 하드웨어에 종속되지 않도록 추상화 계층을 통해 설계해야 한다. ROS2의 토픽 기반 통신 모델은 이러한 추상화를 자연스럽게 지원한다. 센서 드라이버가 표준 메시지 타입으로 데이터를 발행하면, 액션 노드는 메시지 타입에만 의존하고 특정 센서 제조사나 모델에는 의존하지 않는다.

[센서 하드웨어] → [센서 드라이버 노드] → [ROS2 토픽]
                                            ↓
                            [센서 처리 액션 노드 (행동 트리)]

3.2 데이터 흐름 설계

센서 처리 액션 노드의 데이터 흐름은 다음 세 단계로 구성된다.

  1. 데이터 획득(Acquisition): ROS2 토픽 구독, 서비스 호출, 또는 액션 클라이언트를 통해 센서 데이터를 수신한다.
  2. 데이터 처리(Processing): 수신된 원시 데이터에 대해 필터링, 변환, 특징 추출 등의 처리를 수행한다.
  3. 결과 출력(Output): 처리 결과를 블랙보드의 출력 포트에 기록하여 후속 노드에서 활용할 수 있도록 한다.

이 중 데이터 처리 단계는 액션 노드 내부에서 직접 수행하거나, 별도의 ROS2 처리 노드에 위임할 수 있다. 연산 집약적인 처리는 별도의 서비스 또는 액션 서버에 위임하는 것이 행동 트리의 tick 주기에 미치는 영향을 최소화하는 관점에서 바람직하다.

3.3 단일 책임 원칙의 적용

각 센서 처리 액션 노드는 하나의 센서 데이터 유형에 대한 하나의 처리 작업만을 담당해야 한다. 예를 들어, 이미지 촬영과 물체 탐지를 하나의 노드에서 수행하는 것은 단일 책임 원칙을 위반한다. 이를 CaptureImage와 DetectObject의 두 개 노드로 분리하면, 각 노드를 독립적으로 재사용하고 조합할 수 있다.

<!-- 단일 책임 원칙을 따르는 구성 -->
<Sequence>
    <CaptureImage camera_topic="/camera/image_raw"
                  image="{captured_image}" />
    <DetectObject image="{captured_image}"
                  detections="{detected_objects}" />
</Sequence>

3.4 블랙보드 포트 설계

센서 처리 액션 노드의 포트 설계에서는 다음 사항을 고려한다.

입력 포트:

  • 센서 토픽 이름 또는 서비스 이름
  • 처리 파라미터(임계값, 필터 계수, 검출 신뢰도 등)
  • 타임아웃 시간

출력 포트:

  • 처리 결과 데이터(검출 결과, 측정값 등)
  • 처리 성공 여부에 대한 부가 정보

센서 데이터 자체(이미지, 포인트 클라우드 등)를 블랙보드에 저장할 때는 데이터 크기를 고려해야 한다. 대용량 센서 데이터는 블랙보드에 직접 저장하는 대신 공유 메모리 또는 ROS2 토픽을 통해 전달하고, 블랙보드에는 데이터에 대한 참조(타임스탬프, 토픽 이름 등)만 저장하는 방식이 메모리 효율 측면에서 유리하다.

4. ROS2 통신 인터페이스 선택

4.1 토픽 구독 기반

센서 드라이버가 주기적으로 발행하는 토픽을 구독하여 최신 데이터를 획득하는 방식이다. 이 방식은 연속적으로 데이터를 생성하는 센서(카메라 스트림, 라이다 스캔 등)에 적합하다.

// 토픽 구독 기반 센서 데이터 획득
subscription_ = node_->create_subscription<sensor_msgs::msg::Image>(
    topic_name, rclcpp::SensorDataQoS(),
    [this](const%20sensor_msgs::msg::Image::SharedPtr%20msg)
    {
        latest_image_ = msg;
        data_received_ = true;
    });

rclcpp::SensorDataQoS()를 사용하여 센서 데이터에 적합한 QoS(Quality of Service) 프로파일을 적용한다. 이 프로파일은 BEST_EFFORT 신뢰도와 VOLATILE 내구성을 설정하여 데이터 전달의 지연을 최소화한다.

4.2 서비스 호출 기반

카메라 트리거와 같이 요청-응답 패턴으로 동작하는 센서 인터페이스에는 서비스를 사용한다.

// 서비스 호출 기반 센서 데이터 획득
auto request =
    std::make_shared<sensor_srvs::srv::CaptureImage::Request>();
request->exposure_time = exposure_time;

auto future = service_client_->async_send_request(request);

4.3 액션 클라이언트 기반

장시간 소요되는 센서 처리 작업(3D 맵 구성, 대규모 포인트 클라우드 정합 등)에는 피드백을 제공하는 액션 인터페이스를 사용한다.

5. 센서 데이터의 시간 동기화

5.1 타임스탬프 기반 동기화

복수의 센서 데이터를 결합하여 처리해야 하는 경우, 데이터의 시간 동기화가 필수적이다. ROS2에서는 message_filters 패키지의 ApproximateTimeSynchronizer를 활용하여 근사 시간 동기화를 수행할 수 있다.

#include <message_filters/subscriber.h>
#include <message_filters/sync_policies/approximate_time.h>

using SyncPolicy = message_filters::sync_policies::ApproximateTime<
    sensor_msgs::msg::Image,
    sensor_msgs::msg::PointCloud2>;

sync_ = std::make_shared<message_filters::Synchronizer<SyncPolicy>>(
    SyncPolicy(10), image_sub_, cloud_sub_);

sync_->registerCallback(
    std::bind(&SensorFusionAction::syncCallback, this,
              std::placeholders::_1,
              std::placeholders::_2));

5.2 TF2 좌표 변환

센서 데이터를 로봇의 기준 좌표계(base frame)로 변환하기 위해 TF2 라이브러리를 활용한다. 각 센서의 장착 위치와 방향은 로봇 모델(URDF)에 정의되며, TF2가 좌표 변환 트리를 관리한다.

6. 오류 처리 전략

센서 처리 액션 노드에서 발생할 수 있는 오류와 대응 방안은 다음과 같다.

  • 센서 데이터 미수신: 지정된 타임아웃 내에 센서 데이터가 수신되지 않으면 FAILURE를 반환한다. 이는 센서 연결 해제, 드라이버 장애, 토픽 이름 불일치 등의 원인에 기인할 수 있다.
  • 데이터 품질 저하: 센서 데이터의 품질 지표(SNR, 유효 측정점 수 등)가 임계값 이하이면 FAILURE를 반환하거나, 데이터 품질 정보를 출력 포트에 기록하여 후속 노드에서 판단하도록 한다.
  • 처리 알고리즘 실패: 물체 탐지 미검출, 특징점 추출 실패 등의 알고리즘 수준 실패는 FAILURE로 반환하되, 이는 환경 조건에 따른 정상적인 결과일 수 있으므로 상위 행동 트리에서 재시도 또는 대체 전략을 구성해야 한다.

7. XML 행동 트리에서의 활용 패턴

7.1 순차 센서 처리 파이프라인

<Sequence>
    <CaptureImage camera_topic="/camera/image_raw"
                  image="{raw_image}" />
    <ProcessPointCloud lidar_topic="/lidar/points"
                       cloud="{processed_cloud}" />
    <DetectObject image="{raw_image}"
                  cloud="{processed_cloud}"
                  detections="{objects}" />
</Sequence>

7.2 병렬 센서 데이터 획득

복수의 센서 데이터를 동시에 획득해야 하는 경우 Parallel 제어 노드를 활용한다.

<Parallel success_count="3" failure_count="1">
    <CaptureImage camera_topic="/front_camera/image"
                  image="{front_image}" />
    <CaptureImage camera_topic="/down_camera/image"
                  image="{down_image}" />
    <ProcessPointCloud lidar_topic="/lidar/points"
                       cloud="{cloud}" />
</Parallel>

7.3 조건부 센서 처리

환경 조건에 따라 사용할 센서를 동적으로 선택하는 행동 트리 구조이다.

<Fallback>
    <Sequence>
        <CheckVisibility min_visibility="100.0" />
        <CaptureImage camera_topic="/camera/image"
                      image="{image}" />
        <DetectObject image="{image}"
                      detections="{objects}" />
    </Sequence>
    <Sequence>
        <ProcessPointCloud lidar_topic="/lidar/points"
                           cloud="{cloud}" />
        <DetectObject cloud="{cloud}"
                      detections="{objects}" />
    </Sequence>
</Fallback>

이 구조에서 시정(visibility)이 충분하면 카메라 기반 탐지를 시도하고, 시정이 불량하면 라이다 기반 탐지로 전환한다.

8. 참고 문헌

  • Colledanchise, M. and Ögren, P., “Behavior Trees in Robotics and AI: An Introduction,” CRC Press, 2018.
  • Faconti, D. and Contributors, “BehaviorTree.CPP: A C++ library to build Behavior Trees,” GitHub Repository, https://github.com/BehaviorTree/BehaviorTree.CPP.
  • Macenski, S. et al., “Robot Operating System 2: Design, Architecture, and Uses in the Wild,” Science Robotics, vol. 7, no. 66, 2022.
  • Siegwart, R., Nourbakhsh, I. R., and Scaramuzza, D., “Introduction to Autonomous Mobile Robots,” 2nd ed., MIT Press, 2011.

버전: 2026-04-04