로봇 시스템 최적화
📌 개요
- 통합을 마친 시스템이 "동작은 하는데 느리다, 배터리가 빨리 닳는다, 가끔 제어 주기를 놓친다"면 최적화 필요
- 최적화는 감(感)이 아니라 측정 → 병목 식별 → 개선 → 재측정의 사이클로 진행
- 핵심 출제: 최적화의 대상 지표, 프로파일링과 병목, 암달의 법칙, 시간–공간 트레이드오프, 조기 최적화의 함정
📖 핵심 개념
무엇을 최적화하나 — 대상 지표
-
로봇 시스템에서 개선 대상이 되는 대표 지표들
-
서로 상충(trade-off)하는 경우가 많아 우선순위를 요구사항에서 정한다
-
처리 시간·주기: 사이클 타임(작업 1회 시간), 제어 주기 준수율
-
지연(Latency)과 지터(Jitter): 입력→출력까지 걸리는 시간과 그 흔들림 — 실시간 제어의 생명 (→ 로봇 소프트웨어 운영체제)
-
자원 사용량: CPU 점유율, 메모리 사용량, 통신 대역폭
-
전력 소모: 배터리 구동 이동로봇의 가동 시간을 직접 결정
-
정밀도·품질: 속도를 올리면 떨어지기 쉬운 반대편 지표
최적화의 제1원칙 — 측정 없이 최적화 없다
어디가 느린지는 추측이 아니라 측정으로 찾는다.
- 프로파일링(Profiling): 함수·모듈별 실행 시간과 호출 횟수를 측정해 병목(Bottleneck — 전체 성능을 제한하는 가장 느린 부분) 을 식별하는 활동. 도구로는 프로파일러(perf, gprof 등), 로그 타임스탬프 분석 등이 있다
- 경험칙으로 실행 시간의 대부분은 소수의 코드(핫스팟)에 몰려 있다 — 병목이 아닌 곳을 아무리 고쳐도 전체는 거의 빨라지지 않는다
- 조기 최적화(Premature Optimization)의 함정: 측정도 하기 전에 코드를 비틀어 가독성·유지보수성만 해치는 것. "조기 최적화는 만악의 근원"(Knuth)
암달의 법칙 (Amdahl's Law)
-
전체 중 개선 가능한 부분의 비중이 전체 개선 효과의 상한을 정한다는 법칙
-
병렬화·부분 최적화의 한계를 설명할 때 쓰임
-
전체 실행 시간 중 개선되는 부분의 비율이 p, 그 부분을 s배 빠르게 하면 전체 속도 향상은 아래 수식과 같다
-
예: 전체의 40%(p=0.4)를 아무리 무한히(s→∞) 빠르게 해도 전체는 최대 1/(1−0.4) ≈ 1.67배까지만 빨라진다
소프트웨어 최적화 기법
효과가 큰 순서로 접근한다 — 알고리즘 > 자료구조 > 코드 세부.
- 알고리즘 개선: 시간 복잡도를 낮추는 것이 최우선. O(n²) 전수 비교 → O(n log n) 정렬 기반, 격자 지도 전수 탐색 → 휴리스틱 탐색(A*) 등
- 자료구조 선택: 검색이 많으면 해시/트리, 최근접 이웃 탐색은 k-d 트리 등
- 시간–공간 트레이드오프: 메모리를 써서 시간을 산다 — 룩업 테이블(LUT) 에 삼각함수·역기구학 해를 미리 계산해 두고 조회 (반대로 공간이 부족하면 계산으로 대체)
- 코드 수준: 루프 안의 불변 계산 밖으로 빼기, 불필요한 복사 제거, 캐시 친화적(연속 메모리) 접근, 컴파일러 최적화 옵션(-O2 등)
실시간성·임베디드 최적화
제어 루프가 주기를 지키게 만드는 최적화다 (→ 임베디드 프로그래밍 특성).
- 실시간 태스크에 높은 우선순위 부여, 주기가 다른 작업을 분리(멀티레이트)
- 제어 루프 안에서 동적 메모리 할당·파일 I/O·블로킹 호출 금지 — 실행 시간이 들쭉날쭉해지는 원인
- 인터럽트 처리(ISR)는 최소화하고 나머지는 태스크로 넘김
통신·시스템 수준 최적화
- 통신: 메시지 발행 주기·크기를 필요만큼으로 조정, 구독하지 않는 토픽 정리, QoS(신뢰성/최선형) 적절 선택 (→ 로봇 구성 요소 간 통신 프로토콜)
- 부하 분산: 무거운 인지 연산을 별도 코어·별도 컴퓨터로 분산, 병렬화(멀티스레드/멀티프로세스)
- 파라미터 튜닝: 지도 해상도, 센서 처리 주기, 계획 빈도 등 정확도–속도를 저울질하는 파라미터 조정
최적화 후 반드시 할 일
- 최적화는 코드를 바꾸는 일 → 기능이 그대로인지 회귀 시험(Regression Test)으로 확인
- 개선 전후 측정치를 기록해 효과를 증명 (→ 로봇 시스템 평가절차)
📊 다이어그램 · 수식
최적화 사이클
flowchart LR
M["① 측정
(프로파일링)"] --> B["② 병목 식별
(핫스팟)"] --> I["③ 개선
(알고리즘·코드·파라미터)"] --> V["④ 재측정·회귀 시험"] --> M암달의 법칙
- p: 개선되는 부분이 전체 실행 시간에서 차지하는 비율, s: 그 부분의 속도 향상 배수
- s → ∞ 여도 전체 향상은 1/(1−p)를 넘지 못한다
🎯 핵심 요약 · 암기 포인트
제어 루프 안에서 피해야 할 코드 3가지는?::동적 메모리 할당, 파일 I/O, 블로킹 호출 (실행 시간 예측 불가) 조기 최적화(Premature Optimization)란?::측정 없이 미리 최적화해 가독성·유지보수성만 해치는 것 — "만악의 근원" 최적화 직후 반드시 해야 하는 시험은?::회귀 시험(Regression Test) — 기능이 그대로인지 확인
✏️ 예상문제
1. 시스템 최적화의 순서로 가장 적절한 것은?
① 개선 → 측정 → 병목 식별 → 재측정 ② 측정 → 병목 식별 → 개선 → 재측정 ③ 병목 식별 → 개선 → 측정 → 재측정 ④ 개선 → 재측정 → 측정 → 병목 식별
정답 및 해설
정답: ② "측정 없이 최적화 없다"가 제1원칙이다. 먼저 프로파일링으로 어디가 느린지 측정·식별한 뒤 그곳을 개선하고, 재측정으로 효과와 부작용(회귀)을 확인한다.
2. 전체 실행 시간의 50%를 차지하는 모듈을 무한히 빠르게 최적화할 때 전체 시스템의 최대 속도 향상은?
① 1.5배 ② 2배 ③ 4배 ④ 무한대
정답 및 해설
정답: ② 암달의 법칙에서 s → ∞이면 전체 향상의 상한은 1/(1−p) = 1/(1−0.5) = 2배다. 나머지 50%는 그대로 남기 때문이다.
3. 실시간 제어 루프의 주기 준수를 위한 조치로 옳지 않은 것은?
① 제어 태스크에 높은 우선순위를 부여한다 ② 루프 안의 동적 메모리 할당을 제거한다 ③ 루프 안에서 로그 파일을 직접 기록하도록 한다 ④ 인터럽트 처리 루틴을 최소화한다
정답 및 해설
정답: ③ 파일 I/O는 소요 시간을 예측할 수 없는 블로킹 동작이라 제어 루프의 지터를 키운다. 로그는 버퍼에 쌓아 별도의 낮은 우선순위 태스크가 기록하게 한다.
4. 삼각함수 값을 미리 계산해 배열에 저장해 두고 실행 중에는 조회만 하는 기법의 본질은?
① 공간을 희생해 시간을 얻는 트레이드오프 ② 시간을 희생해 공간을 얻는 트레이드오프 ③ 통신 대역폭 최적화 ④ 알고리즘 복잡도 개선
정답 및 해설
정답: ① 룩업 테이블(LUT)은 메모리(공간)를 추가로 쓰는 대신 계산 시간을 없애는 대표적 시간–공간 트레이드오프다. 메모리가 부족한 임베디드에서는 반대로 테이블을 버리고 계산을 택하기도 한다.
5. 조기 최적화(premature optimization)에 대한 설명으로 가장 적절한 것은?
① 개발 초기에 병목을 측정하는 활동이다 ② 측정·근거 없이 미리 코드를 최적화해 가독성과 유지보수성을 해치는 것이다 ③ 컴파일러가 자동으로 수행하는 최적화다 ④ 실시간 태스크의 우선순위를 미리 정하는 것이다
정답 및 해설
정답: ② 병목은 대개 소수의 핫스팟에 몰려 있으므로, 측정 없이 여기저기 최적화하면 효과는 미미하고 코드 품질만 나빠진다. 먼저 올바르게 만들고, 측정한 뒤, 병목만 최적화하는 것이 정석이다.
🔗 관련 노트
- 로봇 시스템 통합 설계 — 최적화 이전 단계인 통합
- 로봇 시스템 평가절차 — 개선 효과를 확인하는 평가
- 로봇 소프트웨어 운영체제 — 실시간성·스케줄링의 기반
- 로봇 구성 요소 간 통신 프로토콜 — 통신 최적화의 대상
- 임베디드 프로그래밍 특성 — 임베디드 쪽 실시간 코딩 규칙
- _MOC 로봇소프트웨어구조설계