Search

260127_1811_ROS2의 구조적 병목, DDS, IPC, zero-copy, scheduling, RTOS, CPU cache/memory… 을! 곁들인…

아래 영상을 보고 너무 감명받아 포스팅을 한다.
왜 우리는 ROS를 걷어냈는가 : ROS 없이 순수 C++로 프로덕션 코드 만들기 | 개발대장 Holyground
00:00 시작 00:03 우리는 왜 ROS를 걷어냈는가. 01:47 개발대장 소개/홀리그라운드 소개 02:31 (파트.0)ROS를 사용하면서 겼었던 어려움 05:40 그래서 오늘은 무엇을 할 것인가 09:10 (파트.1) 왜 ROS로 할 수 없었는가. 15:50 그래서 이렇게 결론 내렸습니다. 안녕하세요, 개발대장입니다. 지난 12월 20일 진행했던 세미나 영상을 일부 공개합니다. [HolyGround] ROS 없이 프로덕션 C++ 만드는 방법 - 가이드 공개 여러분의 커리어에 확실한 동력을 더해보시고, 우리의 여정에 함께 해 보세요. https://www.holyground.world/ 강사 이력 https://www.holyground.world/ko/cultivators/2e27b2b8-06cf-4074-8254-b0622de62946 교육문의 : studio.holyground@gmail.com 함께 성장하는 커뮤니티 : 인공지능 다스리기 (https://open.kakao.com/o/g0jagPof) ━━━━━━━━━━━━━━━━━━━━ 📘 Branch: Production C++ Framework Guide ROS 걷어내고 순수 C++로 프로덕션 만들어본 적 있습니다. 두 번 했습니다. 로봇 회사에서 한 번, 자율주행 회사에서 한 번. 두 번째는 훨씬 빨랐습니다. 뭘 해야 하는지 알았으니까요. 그때 정리해둔 것들 공개합니다. • 포함 내용 [기반] - 왜 ROS가 프로덕션에서 안 되는가 [시스템] - 환경 구축, 프로젝트 구조, CMake, 의존성 관리, 테스트 통합 [품질] - 스타일 가이드, 포매팅, 린팅, 문서화, 테스트, CI [코어] - 에러 처리, 단위 시스템, 시간 표현, 메모리 관리, 동시성, 파이프라인 코드 아닙니다. "왜 이렇게 해야 하는지" 설명하는 가이드입니다. • 가격: ₩129,000 → ₩96,750 (얼리버드 25%) • 마감: 1월 2일까지 https://www.holyground.world/ko/forest/branch/@captaindev/production-cpp-framework-guide?utm_source=openchat&utm_medium=community&utm_campaign=branch-launch ━━━━━━━━━━━━━━━━━━━━ 🛠 Fruit: Production Playground for C++ 위 가이드라인을 실제로 구현한 코드입니다. • 포함 내용 [Core 라이브러리] - Error: 예외 없는 에러 처리 (Result 타입) - Unit: 타입 안전 단위 (Distance, Velocity, Angle, Frequency) - Concurrency: ThreadPool, Scheduler, Pipeline - Memory: 실시간용 메모리 풀 - Time: Duration, Stamp - Configuration: YAML 설정 파서 - Filesystem: 파일시스템 래퍼 - Diagnostics: 프로덕션 퀄리티 로거, 프로파일러 [빌드 & 검증 시스템] - CMake Presets (debug, release, ci, profile) - clang-format, clang-tidy 설정 - Catch2 테스트 프레임워크 - gcovr 커버리지 (80% 강제) - GitHub Actions CI/CD (Ubuntu + macOS) [환경 설정] - setup.sh: 전체 도구 원클릭 설치 - verify.sh: 설치 검증 [데모 애플리케이션] - Multi-Sensor Fusion Robot (IMU, LiDAR, GPS, Camera 4개 센서 실시간 퓨전) • 가격: ₩499,000 https://www.holyground.world/ko/forest/fruit/@captaindev/cpp-production-playground?utm_source=openchat&utm_medium=community&utm_campaign=branch-launch ──────────────────── 실제 사용자 후기 학생 개발자 (외주 진행 중): "C++ 기반 프로젝트 구현 시 5시간 이상 돌아가는게 정말 감탄이 나오더라구요. 지금까지 구매한 컨텐츠 중에서 가장 맘에 들었습니다" 프로젝트 개발자: "LLM 기반 개발론은 이론이나 자료도 부족할텐데 시스템을 워낙 체계적으로 잘 만들어 놓으신 것 같아서 감탄했습니다" ────────────────────

"30fps로 쏘는 카메라가 0.5fps로 수신돼요." "CPU 8코어인데 하나만 쓰고 있어요." "멀티 익스큐터 켰는데 왜 싱글스레드로 도는 거죠?" "Depth 이미지 쏘니까 전체 토픽이 마비됐어요."

ROS는 장단점이 매우 명확한 프레임워크다. 그래서 실제 제품 개발을 해본 엔지니어라면 누구나 한 번쯤은 “ROS를 계속 가져가야 하는가?”라는 고민을 하게 된다.
ROS가 제품 개발에서 자주 비판받는 이유는 단순히 “무겁다”는 인상 때문이 아니다. 구조적으로 연산 자원과 메모리, 네트워크 대역폭을 과도하게 소비할 가능성이 있는 설계 패턴을 기본값으로 채택하고 있기 때문이다. 예를 들어 ROS 1의 TCPROS/UDPROS 기반 pub-sub 구조 serialization/deserialization, context switching, kernel networking stack을 반복적으로 거치면서 latency jitter를 유발한다. ROS 2는 DDS를 채택하면서 deterministic 통신을 목표로 했지만, QoS 설정, discovery traffic, middleware 구현체(Fast DDS, Cyclone DDS 등)에 따라 실제 성능 특성이 크게 달라지는 문제가 있다.

실제 이슈

1289
issues
고트래픽 환경에서 이러한 특성은 더욱 두드러진다. LiDAR point cloud, multi-camera raw frame, IMU, GNSS, radar 등이 동시에 발행되는 시스템에서는 초당 수백 MB~수 GB급 데이터가 ROS 토픽을 통해 이동한다. 이때 copy 횟수, serialization 비용, intra-process communication 설정 여부에 따라 CPU utilization과 memory bandwidth가 급격히 증가하며, 예측 불가능한 latency spike가 발생한다. 특히 Linux non-RT kernel 환경에서 scheduler interference까지 겹치면 control loop의 deterministic guarantee는 사실상 무너지게 된다.
리소스 관리와 디버깅의 불편함 역시 구조적인 문제다. ROS 노드는 프로세스 단위로 분리되어 있어 fault isolation에는 유리하지만, IPC 경계가 많아질수록 profiling과 tracing이 어려워진다. rosbag, rqt_graph, rqt_plot 등 도구들이 존재하지만, 실제 제품 환경에서 system-level profiling(perf, eBPF, LTTng 등)과 ROS graph-level tracing을 함께 해석하는 것은 상당한 비용을 요구한다.
보안 측면에서도 ROS는 기본적으로 research-friendly하게 설계되었기 때문에 production security model을 전제로 하지 않는다. ROS 2의 DDS-Security가 존재하지만, 인증서 관리, secure discovery, enclave 분리 등은 제품 개발 단계에서 상당한 운영 비용과 복잡성을 추가한다.
또 하나의 현실적인 문제는 핵심 스택 커스터마이징이다. ROS의 navigation stack, perception pipeline, SLAM framework 등은 빠른 프로토타이핑에는 탁월하지만, 제품 요구사항에 맞게 깊이 커스터마이징하려 하면 결국 middleware 레벨까지 내려가야 하는 경우가 많다. 이 단계에서 ROS abstraction layer가 오히려 개발 속도를 늦추는 역설적인 상황이 발생한다.
그럼에도 ROS가 여전히 강력한 이유는 분명하다. 패키지 생태계, 표준화된 메시지 인터페이스, launch 및 lifecycle 관리, 그리고 수천 개의 검증된 오픈소스 스택은 개발 초기 속도를 압도적으로 높여준다.

특히 연구 코드 → 제품 프로토타입 → 파일럿 시스템으로 이어지는 파이프라인에서 ROS는 사실상 industry lingua franca 역할을 하고 있다.

문제는 이 장점들이 제품 요구사항의 복잡도와 성능 요구를 그대로 따라와 주지는 못한다는 점이다. 고성능 perception pipeline, 그리고

sensor fusion,

real-time control이 요구되는 제품에서는 ROS의 default architecture가 bottleneck이 되는 경우가 많다.

이 지점에서 ROS 도입 여부는 기술적 취향이 아니라 현실적인 시스템 엔지니어링 선택 문제가 된다.

상용 제품 개발에서 ROS 사용 여부는 이념이 아니라 TCO(Total Cost of Ownership)에 기반해 결정된다. 개발 일정, 팀의 middleware 역량, 장기 유지보수 비용, 그리고 리스크 관리까지 고려하면, ROS를 전면적으로 배제하는 것이 반드시 비용 효율적이라고 보기도 어렵다.
실무적으로는 ROS를 “운영체제처럼 쓰지 않는” 하이브리드 구조가 자주 선택된다. 예를 들어 Visual SLAM 비중이 높은 제품이라면, SLAM 파이프라인 자체를 C++ native pipeline으로 구성하고 shared memory, zero-copy IPC, GPU direct memory access 등을 활용해 성능을 확보한다. ROS는 high-level orchestration, parameter server, telemetry, system management layer 정도로 제한적으로 사용된다. 이는 ROS의 생태계와 개발 생산성은 취하되, 성능 민감 영역에서는 ROS 의존도를 최소화하기 위한 현실적인 타협이다.
물론 여기까지 오면

“이 정도로 우회해서까지 ROS를 써야 하나?”

라는 의문이 자연스럽게 든다. 하지만 이는 ROS의 기술적 우수성 문제라기보다는, 이미 검증된 생태계를 활용하는 것이 주는 개발 리스크 감소 효과와 팀 생산성 향상이라는 현실적인 이점에 대한 판단에 가깝다.
결국 ROS를 완전히 배제하고 새 아키텍처를 설계하더라도 시스템이 마법처럼 가벼워지지는 않는다. 고성능 middleware를 직접 구현하면 copy path, memory layout, scheduler, real-time constraint까지 모두 직접 책임져야 한다. 잘 분배된 ROS 기반 구조와 비교했을 때 성능 차이는 분명 존재하겠지만, 제품 레벨에서 체감될 정도로 드라마틱한 차이가 나는 경우는 생각보다 많지 않다.

결국 다 이거라니깐?

그렇다. 절대적인 성능 경쟁이라기보다는, 리스크 관리와 개발 효율, 그리고 시스템 복잡도 관리 사이에서 어디에 무게를 둘 것인가라는 엔지니어링 트레이드오프의 문제로 귀결된다.

안녕하세요

관련 기술 문의와 R&D 공동 연구 사업 관련 문의는 “glory@keti.re.kr”로 연락 부탁드립니다.

Hello

For technical and business inquiries, please contact me at “glory@keti.re.kr”