Bleeding edge

ROS 2에서 카메라 노드 제어: Inactive vs Subprocess 본문

CS

ROS 2에서 카메라 노드 제어: Inactive vs Subprocess

codevil 2025. 9. 3. 01:55

ROS 2에서 카메라 노드 제어: Inactive vs Subprocess

로봇 시스템을 개발하다 보면, 센서나 카메라 노드를 켰다 껐다(on/off) 해야 하는 경우가 많습니다. 예를 들어, 카메라를 계속 켜두면 전력이나 리소스를 많이 차지할 수 있고, 다른 프로세스에서 카메라 장치를 접근해야 하는 경우도 있죠. 이때 ROS 2에서는 크게 두 가지 접근 방식이 있습니다:

  1. Lifecycle Node의 inactive 상태 활용
  2. 프로세스(subprocess) 단위로 노드를 완전히 종료 후 재실행

1. Lifecycle Node의 inactive 상태

ROS 2에는 Managed Lifecycle Node라는 개념이 있습니다.
Lifecycle Node는 노드가 여러 상태(unconfigured → inactive → active → finalized)를 가지며, 필요에 따라 상태 전환을 할 수 있습니다.

  • active : 토픽 publish/subscription, 타이머, 서비스 등 모든 콜백이 동작
  • inactive : 파라미터 설정만 가능, 퍼블리시/콜백은 멈춤
  • deactivate() 호출 시 노드가 리소스를 잠시 놓고 대기하는 느낌

장점

  • 노드 프로세스를 유지한 채 빠르게 on/off 가능
  • 연속적인 토글이 필요한 경우 유리
  • ros2 lifecycle set /node_name deactivate 명령어나 서비스 호출로 제어 가능

단점

  • 디바이스 핸들을 해제하지 않을 수 있음 (카메라 드라이버 구현에 따라 다름)
  • 즉, inactive 상태여도 여전히 카메라 리소스를 독점할 수 있음
  • 전력 절감 효과가 제한적일 수 있음

2. Subprocess 기반 실행/종료

두 번째 방법은 아예 카메라 노드를 프로세스 단위로 실행/종료하는 방식입니다.
즉, 버튼 이벤트나 서비스 호출 시:

  • 시작ros2 launch my_pkg camera_launch.py 실행
  • 중지 → 해당 프로세스 terminate() 또는 kill

Python 예시:

import subprocess

process = None

def start_camera():
    global process
    process = subprocess.Popen(
        ["ros2", "launch", "my_camera_pkg", "camera_launch.py"]
    )

def stop_camera():
    global process
    if process:
        process.terminate()
        process = None

장점

  • 카메라 디바이스 핸들을 확실히 해제
  • 메모리, CPU, GPU 등 자원 완전 반환
  • 다른 노드나 프로그램이 카메라를 다시 사용할 수 있음

단점

  • 다시 실행할 때 초기화 시간이 걸림 (드라이버 로드, 장치 open)
  • 토글이 잦을 경우 지연 발생

어떤 방식을 선택해야 할까?

  • 리소스 독점이 중요한 센서(카메라, LiDAR 등)
    Subprocess 방식이 더 적합합니다.
    → 프로세스를 종료하면 디바이스 핸들이 완전히 닫혀 충돌이 방지됩니다.

  • 빠른 전환만 필요하고 리소스 충돌 위험이 적은 경우
    Lifecycle Node inactive 사용도 가능.


결론

  • USB/MIPI 카메라처럼 장치 리소스를 독점하는 하드웨어라면 → 프로세스 종료/재실행
  • 단순히 토픽 퍼블리시만 잠시 멈추고 싶을 때라면 → Lifecycle inactive