본문으로 건너뛰기

성능 모니터링

PLEM 모니터링 시스템은 1kHz 제어 루프의 성능을 ROS2 토픽으로 제공합니다. RT 루프를 절대 블록하지 않는 wait-free 설계입니다.

주요 토픽

토픽레이트QoS설명
/rt_raw1kHzBestEffort타이밍, 관절 상태, 제어 값
/rt_events이벤트 발생 시ReliableTransient폴트, 모드 변경, 안전 트리거
/rt_monitor_stats10HzReliable큐 상태, 오버플로 카운트
다중 로봇 환경

robot_id가 설정된 경우 /{robot_id}/rt_raw처럼 namespace가 자동 적용됩니다.

RtSample 주요 필드

필드타입설명
loop_exec_usfloat루프 처리 시간 [µs]
loop_jitter_usfloat목표 주기(1000µs)로부터의 편차 [µs]
deadline_missuint8데드라인 미스 여부 (0/1)
actual_pos[0..5]float관절 위치 [rad]
actual_vel[0..5]float관절 속도 [rad/s]
actual_torque[0..5]float관절 토크 [Nm]
cmd_torque[0..5]float명령 토크 [Nm]

전체 필드 목록: ros2 topic echo /rt_raw --once

타이밍 메트릭

  • loop_exec_us: 루프 깨우기부터 완료까지의 처리 시간. 정상: 30-60 µs
  • loop_jitter_us: 실제 주기 - 목표 주기. 양수면 늦은 깨우기 (커널 스케줄링 지연). 정상: 5-15 µs

PlotJuggler 시각화

# 설치
sudo apt install ros-humble-plotjuggler-ros

# 실행
ros2 run plotjuggler plotjuggler

설정:

  1. StreamingStart: ROS2 Topic Subscriber/rt_raw 체크 → OK
  2. 왼쪽 패널에서 필드를 플롯으로 드래그:
    • loop_jitter_us (타이밍 안정성)
    • loop_exec_us (계산 부하)
  3. 시간 윈도우를 10초로 설정

임계값 표시: 플롯 우클릭 → Custom Series로 경고선(50µs 노란색)과 에러선(200µs 빨간색) 추가.

레이아웃 저장: File → Save Layout As... → plem_rt_monitor.xml

성능 기준 및 임계값

성능 임계값

다음 임계값을 초과하면 즉시 조치가 필요합니다. 지속적인 경고 상태는 시스템 안정성에 영향을 줄 수 있습니다.

메트릭건강함경고에러조치
loop_jitter_us< 15 µs50-100 µs> 100 µs아래 진단 패턴 참조
loop_exec_us< 60 µs80-100 µs> 100 µs제어 매개변수 검토
deadline_miss0> 0> 10/초즉시 조사 필요
rt_overflow_delta0> 0> 100/초큐 크기 증가 고려

성능 저하 진단

높은 지터 패턴

패턴증상가능한 원인해결책
주기적 스파이크5초마다 180µs 스파이크커널 백그라운드 작업 (RCU, kworker)CPU 격리 및 커널 스레드 선호도 확인
점진적 증가시간 경과에 따라 10→80µs메모리 압박 (힙 단편화, 스와핑)메모리 잠금 설정 확인
무작위 대형 스파이크843µs, 1205µs 등 불규칙CPU 미격리 또는 RT 우선순위 미설정RT 우선순위 및 CPU 격리 확인

느린 실행 시간 패턴

패턴증상가능한 원인해결책
지속적 높은 실행계속 > 80µs비싼 제어 계산제어 매개변수 검토, 최적화 옵션 확인
갑작스러운 점프52µs → 153µs 단계 변화모드 변경 (TRAJECTORY 진입)예상 동작. exec_us < 100µs 유지 확인

진단 명령

# 지터 패턴 모니터링
ros2 topic echo /rt_raw --field loop_jitter_us

# 실행 시간 평균 (1000 샘플)
ros2 topic echo /rt_raw --field loop_exec_us | \
awk '{sum+=$1; count++} count==1000 {print "평균: " sum/count " µs"; exit}'

# 높은 지터 알림
ros2 topic echo /rt_raw --field loop_jitter_us | \
awk '$1 > 50 {print "경고: 지터 " $1 " µs"}'

# 이벤트와 상관관계 분석
ros2 topic echo /rt_events

큐 관리

RT 루프에서 ROS2 토픽으로의 데이터 전달은 wait-free 큐를 사용합니다. 큐가 가득 차면 새 샘플이 드롭됩니다.

# 오버플로 모니터링 (0이면 정상)
ros2 topic echo /rt_monitor_stats --field rt_overflow_delta
시나리오큐 크기근거
개발 (기본값)81928초 버퍼, 디버거 일시 중지 처리
프로덕션40964초 버퍼, 낮은 메모리 사용
Rosbag 녹화16384디스크 I/O 버스트를 위한 16초 버퍼
큐 크기 권장사항

RAM이 심각하게 제한되지 않는 한 기본값(8192) 사용을 권장합니다.

빠른 레퍼런스

# RT 성능
ros2 topic hz /rt_raw # 퍼블리싱 레이트 (~1kHz여야 함)
ros2 topic echo /rt_raw --field loop_jitter_us
ros2 topic echo /rt_raw --field loop_exec_us
ros2 topic echo /rt_monitor_stats

# 이벤트 모니터링
ros2 topic echo /rt_events

# 다중 로봇 환경
ros2 topic echo /arm_left/rt_raw --field loop_jitter_us

다음 단계:

  1. 권장 레이아웃으로 PlotJuggler 설정
  2. 애플리케이션의 기준 메트릭 확인
  3. 문제 발생 시 진단 패턴 테이블과 명령으로 원인 분석