CS
ROS 2에서 카메라 노드 제어: Inactive vs Subprocess
codevil
2025. 9. 3. 01:55
ROS 2에서 카메라 노드 제어: Inactive vs Subprocess
로봇 시스템을 개발하다 보면, 센서나 카메라 노드를 켰다 껐다(on/off) 해야 하는 경우가 많습니다. 예를 들어, 카메라를 계속 켜두면 전력이나 리소스를 많이 차지할 수 있고, 다른 프로세스에서 카메라 장치를 접근해야 하는 경우도 있죠. 이때 ROS 2에서는 크게 두 가지 접근 방식이 있습니다:
- Lifecycle Node의 inactive 상태 활용
- 프로세스(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 Nodeinactive사용도 가능.
결론
- USB/MIPI 카메라처럼 장치 리소스를 독점하는 하드웨어라면 → 프로세스 종료/재실행
- 단순히 토픽 퍼블리시만 잠시 멈추고 싶을 때라면 → Lifecycle inactive