Robot Operating System(ROS)가 본격적으로 로봇 연구 커뮤니티에 보급되고 발전하게 된 지 어느덧 10년이 넘어가게 되었습니다. 그 기간동안 ROS 생태계에도 여러 변화가 있었는데, 그 중에서도 가장 큰 변화는 기존 시스템을 갈아엎은 ROS2로의 전환이라고 볼 수 있습니다. 아직은 개발과 수정이 한창 진행중인 전환단계인 만큼 기존 버전과 공존하고 있지만, 2025년 ROS1의 공식 지원이 종료되는 시점 부터는 그 전환이 더 빠르게 이루어질 것 같습니다.
이번 포스팅에서는 새로운 ROS2에는 이전 버전에 비해 어떤 변화가 생겼는지, 그리고 이에 따른 장단점에 대해 적어보도록 하겠습니다.
참고로, ROS에 대한 기본적인 소개는 별도 포스팅에 자세히 적어두었습니다. ROS2에 대한 개요는 이곳에서도 확인할 수 있습니다.
Table of Contents
ROS2의 등장과 전환의 이유
ROS1 자체도 로봇 연구 용도로 사용하기에 훌륭한 프레임워크인 것은 맞지만, 근본적으로 해결이 어려운 이슈를 동반하고 있어 결국 새로운 버전인 ROS2이 개발되고 배포되었습니다. 여러 이유 중 몇가지를 적어보면 아래와 같습니다:
확장성 및 실시간성(Real-Time)
ROS1은 실시간 성능을 염두에 두고 설계되지 않았습니다. 프로토타이핑 및 연구에는 뛰어났지만, 많은 현대 응용 프로그램, 특히 산업 및 중요한 임무를 수행하는 로봇 공학에서는 실시간 처리와 엄격한 타이밍 제어가 필요합니다. ROS1의 통신 인프라는 구현 과정의 편의성 등의 장점을 확보하기 위해 통신 지연은 크게 고려하지 않고 구축되었기 때문에, 다중 로봇 시스템과 대역폭이 높은 데이터 스트림을 다루는 데 한계가 있습니다.
통신 방식의 한계
ROS1은 TCP 및 UDP를 기반으로 한 자체 비표준 통신 계층을 사용합니다. 이는 오랜 기간 동안 목적을 달성하는 데 충분했지만, 분산 시스템에서 신뢰할 수 있는 통신을 위해 필요한 품질 보증(QoS) 기능이 부족합니다. 로봇 시스템이 점점 더 복잡해지고 자율주행차나 드론과 같은 동적인 환경에서 배치되면서, 강력하고 유연한 통신 시스템의 필요하다는 의견이 커뮤니티 내에서 점점 더 많아지게 되었고, 결국 이를 고려한 시스템을 담아 새로운 버전을 개발하게 된 것입니다.
여러 OS 호환성 (Cross Platform)
ROS1은 처음 설계될 때부터 리눅스(Linux)를 기반으로 개발되었습니다. 리눅스는 오픈 소스 소프트웨어로서 로봇 개발에 필요한 유연성과 자유도를 활용할 수 있으면서도 수많은 개발자들의 손을 거쳐 개선된 OS이기 때문에, 많은 로봇 공학 연구 및 개발 프로젝트에 사용되었습니다. 이렇다 보니 기본적으로 연구를 위한 로봇 개발은 우분투를 기반으로 진행하는 것이 일종의 국룰이었는데, ROS를 활용하는 범위가 넓어지면서 우분투 뿐 아니라 다른 운영체제에서도 호환이 필요하다는 요구는 꾸준히 늘어왔습니다.
여러 운영체제에서 모두 동일하게 동작할 수 있는 호환성을 확보하도록 개발하는 것은 상당히 어려운 과정이며, 기존 ROS의 구조를 유지해서는 크로스 플랫폼 호환을 확보하는데 한계가 있었던 것 같습니다.
정보 보안
로봇 연구를 주 목적으로 개발된 ROS1에는 시스템 전반적으로 데이터를 보호하는 기능이 사실상 존재하지 않습니다. 연구용으로만 사용되고 리소스가 공개되는 경우에는 크게 문제되지 않는 필수적이지 않은 요소일 수 있지만, 연구실을 넘어 더 많은 분야에서 사용되기 위해서는 어느정도의 정보 보안이 반드시 필요하게 될 수 밖에 없습니다. 기존의 구조로는 이를 추가하는데 한계가 있어 보안 기능을 포함한 새로운 버전을 개발하게 된 것입니다.
ROS1과 ROS2 차이
위에 적은 기존 버전의 한계를 보완하기 위해 개발된 새로운 버전에는 어떤 변화가 생겼는지 알아보도록 하겠습니다. 결론부터 정리해보면 프로세스간 통신방식 변화가 가장 큰 변화를 보이게 되었습니다. 참고로, Python 3 지원 여부가 다른 점이라 말도 있지만, ROS1 마지막 버전에서 Python 3를 지원하므로 이는 사실이 아닙니다.
통신 미들웨어 – ROS Master의 유무
표면적으로 보면 두 버전의 가장 눈에띄는 차이는 ROS Master 노드의 유무입니다. 기존 버전은 시스템 실행에 앞서 중앙 관리자 역할을 하는 Master 노드가 우선 실행되어야 다른 노드간 통신이 가능했습니다. 이는 규모가 작은 Centralized System에서는 적합하지만, 관리자 역할을 하는 주체가 정해지지 않는 분산 시스템(Distributed System)에서는 적합하지 않은 문제가 있습니다. 이에, 새 버전에서는 Master 노드를 없애고 DDS를 사용해 서로 독립적인 통신을 할 수 있도록 설계되었습니다.
ROS1: TCP/ROS와 UDP/ROS를 기반으로 한 맞춤형 통신 프로토콜을 사용합니다. 기능적으로는 문제없지만, 메시지 신뢰성, 지연 시간, 실시간 성능 측면에서 한계가 있습니다.
ROS2: DDS(데이터 분배 서비스)를 기반으로 한 통신 미들웨어를 채택합니다. DDS는 고성능 실시간 분산 시스템을 위해 설계된 널리 사용되는 표준 프로토콜입니다. ROS2는 DDS를 통해 QoS(서비스 품질) 설정을 제공하여, 신뢰성, 지속성, 기한 등을 지정할 수 있어 메시지 전달의 동작을 더 세밀하게 제어할 수 있습니다.
실시간(Real-Time) 기능
ROS1: 실시간 작업을 염두에 두고 설계되지 않았습니다. 스케줄링 및 통신 메커니즘은 지연을 초래할 수 있으며, 이는 엄격한 타이밍 제어가 필요한 시스템에서 사용을 제한합니다.
ROS2: 실시간 요구 사항을 해결하기 위해 노드 실행과 통신에 대한 더 나은 제어 기능을 제공합니다. ROS2 노드는 RTOS(실시간 운영 체제)에서 실행될 수 있어, 결정론적 동작을 가능하게 하며, 이는 로봇 제어 루프 및 미션 크리티컬 애플리케이션에 필수적입니다.
정보 보안
ROS1: 내장된 보안 기능이 없습니다. 모든 노드 간 통신은 암호화되지 않으며, 인증 또는 접근 제어를 지원하지 않아 시스템이 공격에 취약합니다.
ROS2: 보안 기능이 처음부터 통합되어 있습니다. DDS를 사용하여 암호화, 인증, 접근 제어를 지원함으로써 데이터 프라이버시와 무결성이 중요한 헬스케어나 자율 시스템과 같은 응용 분야에 적합합니다.
크로스 플랫폼 지원
ROS1: 주로 리눅스 기반 시스템을 위해 설계되었지만, Windows와 macOS에서도 사용하기 위한 해결책이 존재합니다. 그러나 비리눅스 시스템에서의 성능은 최적화되지 않았습니다.
ROS2: 리눅스, Windows, macOS를 네이티브로 지원하여 개발자들이 다양한 플랫폼에서 쉽게 작업할 수 있게 합니다. 이는 다양한 운영 환경을 사용하는 조직이나 다양한 설정에서 로봇을 배치하려는 경우 특히 유용합니다.
이 외에도 빌드 시스템의 변경 등의 변화가 있었지만, 결과적으로는 모두 위 통신 및 운영체제 호환성을 위한 변화로 볼 수 있습니다.
ROS1 vs ROS2: 장단점 비교
다른 모든 소프트웨어 시스템이 그렇듯 ROS 역시 새로운 버전이 기존 버전의 한계를 보완하고자 개발되기는 하였으나, 새로운 버전이 무조건 더 좋다고는 볼 수 없습니다. 각 버전의 장단점에 대해 몇가지 적어보도록 하겠습니다.
ROS1의 장점과 단점
기본적으로 더 오래 사용된 버전인 만큼 이를 사용하는 커뮤니티가 이미 존재하고 그 규모가 작지 않은 점이 ROS1의 가장 큰 장점으로 볼 수 있습니다. 여러 연구자들이 구현하고 공개한 상당수의 리소스가 ROS1을 기반으로 개발되었고, 그만큼 이전 버전에 익숙한 개발자가 많다는 점이 가장 큰 장점으로 볼 수 있겠습니다. 저 역시 아직은 ROS1을 주로 사용하고 있으며, 문제 해결을 위한 리소스도 여전히 ROS1에 대한 내용이 더 많습니다.
오래 사용된 시스템의 또다른 장점은 그 시간동안 많은 개발자의 손을 거쳐 안정성과 신뢰도를 그만큼 확보했다는 점 입니다. 초기 버전에서는 종종 발견되던 많은 문제들을 해결한 상태이기 때문에 예상치 못한 근본적인 문제를 마주해야 할 경우가 그만큼 적어 개발하는 입장에서는 마음이 편한 점이 분명 있습니다.
단점은 위에서 적은 새로운 버전의 등장 이유와 같다고 보면 될 것 같습니다. 더 나은 실시간성, 정보 보안 등 근본적으로 해결이 어려운 점들이 기존 버전의 최대 단점입니다.
ROS2의 장점과 단점
기존 버전의 한계로 부터 시작한 만큼 이전 버전에서는 해결할 수 없었던 문제들을 근본적으로 해결하여 개발되었습니다. 이에 이전 버전으로는 구현할 수 없었던 것들이 가능해 진 것이 새로운 버전의 최대 장점이라고 할 수 있겠습니다.
실제 로봇과 활용에 더 적합한 실시간성을 확보할 수 있으며, 통신 프레임워크 교체를 통해 Master와 Slave 방식이 아닌 더 Distributed System에 적합한 시스템을 만들 수 있게 되었고, (아직은 더 개발이 필요하지만) 이전 버전에 비해서 크게 향상된 여러 운영체제간 호환성을 보입니다.
상대적으로 새로운 시스템인 만큼 단점도 분명하게 존재합니다. 기존 버전에 비해 사용자가 적은 만큼 사용자 커뮤니티가 상대적으로 작고, 이 때문에 아직은 관련 리소스가 상대적으로 적습니다. 익숙하지 않은 새로운 프레임워크에서의 개발은 예상치 못한 문제를 마주하게 될 경우가 더 많음과 다르지 않은데, 리소스가 적다 보니 해결에 더 많은 노력이 필요할 수 있습니다.
이전 버전으로 개발되고 공유된 수많은 기존 리소스를 고스란히 사용할 수 없는 점도 큰 단점입니다. ROS Bridge를 통해 일부 호환이 가능하도록 개발할 수 있지만, 기존 버전에서 개발하는 경우에 비해 추가적인 작업이 필요하고, 결과적으로는 비효율적인 시스템이 되기 쉽습니다.
시간이 지남에 따라 개선될 것으로 예상되기는 하지만, ROS2는 이전 버전에 비해 아직 안정성을 충분히 확보하지 못한 상태입니다. 버그 등 예상치 못한 문제들이 종종 발견되고, 아직은 활발하게 개선하는 과정에 있기 때문에 당장은 예상하는 시스템을 안정적으로 구축하지 못할 수도 있습니다.
ROS1 vs ROS2: 어떤 버전을 사용해야 할까
이전 버전이 2025년에 공식 지원이 종료될 예정이기는 하지만 아직 ROS1의 장점이 분명하고, 공식 지원 종료 후에도 사용은 가능하기 때문에 무조건 새로운 버전을 사용하기 보다는 목적에 따라 고민해 보는 것이 좋겠습니다.
ROS1을 사용해야 하는 경우
- 기존 시스템을 사용 중일 때: 만약 여러분의 프로젝트가 기존의 ROS1 코드베이스에 의존하거나, 아직 ROS2로 포팅되지 않은 서드파티 패키지에 크게 의존하고 있다면 ROS1을 계속 사용하는 것이 합리적입니다. 많은 산업과 연구 프로젝트에서 이미 ROS1을 광범위하게 통합했으며, 단기간에 새로운 버전으로 전환하는 것은 어려울 수 있습니다.
- 광범위한 커뮤니티 지원이 필요할 때: ROS1은 10년 이상 사용되어 왔으며, 그 광범위한 커뮤니티 덕분에 더 많은 튜토리얼, 포럼, 사전 제작된 패키지를 찾을 수 있습니다. 만약 여러분이 학계에 있거나 보안 및 실시간 성능이 중요한 요소가 아닌 소규모 프로젝트를 진행 중이라면, ROS1의 성숙도는 중요한 이점이 될 수 있습니다.
- 실시간 성능과 보안이 우선순위가 아닐 때: 만약 실시간 성능이나 보안 통신이 필요하지 않은 애플리케이션(예: 교육용 로봇, 소규모 연구 프로토타입)이라면, ROS1의 이러한 기능 부재는 큰 문제가 되지 않을 수 있습니다.
ROS2를 사용해야 하는 경우
- 실시간 기능이 필요할 때: 여러분의 애플리케이션이 산업 자동화, 자율주행차, 드론과 같이 엄격한 타이밍 제약을 요구하는 경우, ROS2가 명확한 선택입니다. 새로운 버전에서는 실시간 운영 체제(RTOS) 및 결정론적 통신을 지원하여 시간 민감한 애플리케이션에 적합합니다.
- 보안을 우선시할 때: 헬스케어, 방위 산업 또는 대규모 산업용 로봇과 같이 데이터 무결성과 보안이 중요한 분야에서는 새로운 버전의 암호화, 인증, 접근 제어 기능이 필수적인 보호를 제공합니다. 이러한 보안 기능은 ROS1에는 내장되어 있지 않습니다.
- 확장 가능하고 복잡한 다중 로봇 시스템을 구축할 때: ROS2의 모듈형 아키텍처와 확장 가능한 통신 시스템은 다중 로봇이나 여러 하위 시스템이 원활하게 협력해야 하는 대규모 분산 시스템에 더 적합합니다. 개선된 노드 생명주기 관리 및 DDS 지원 덕분에 다중 로봇 간의 협력 및 확장성을 더 잘 처리할 수 있습니다.
- 크로스 플랫폼 지원이 필수적일 때: 프로젝트가 리눅스, Windows, macOS에서 실행되어야 하는 경우, ROS2의 네이티브 크로스 플랫폼 지원은 개발 시간을 절약하고 플랫폼 간 성능을 향상시킵니다.
장기적인 고려 사항
- 미래 대비: 새로운 프로젝트를 시작하고 장기적인 개발을 계획 중이라면, ROS2가 더 나은 선택일 가능성이 큽니다. 새로운 버전에서는 활발히 개발되고 있으며, ROS1은 계속 지원되지만 시간이 지나면서 ROS2로 대체될 것으로 예상됩니다.
- 커뮤니티 및 패키지 생태계: ROS1은 현재 더 큰 커뮤니티와 더 많은 패키지를 보유하고 있습니다. 그러나 ROS2 생태계는 빠르게 성장 중이며, 많은 핵심 ROS1 패키지들이 새로운 버전에 맞춰 포팅되고 있습니다. 시간이 지남에 따라 ROS2는 ROS1을 따라잡고, 이를 능가할 가능성이 높습니다.
ROS1에서 ROS2로 전환
만약 여러분이 이미 ROS1을 사용 중이지만 ROS2로 전환하려는 경우, 두 시스템이 완전히 호환되지 않음을 유의해야 합니다. 기존의 ROS1 코드를 새로운 버전으로 포팅하려면 일정한 노력이 필요하지만, ros1_bridge
와 같은 도구를 사용하면 다른 버전에서 개발된 노드 간의 통신을 돕는 하이브리드 접근 방식을 취할 수 있습니다. 이 방식은 기존 ROS1 시스템을 사용하는 동안 ROS2로 점진적으로 전환하려는 프로젝트에 유용할 수 있습니다.
마무리
이번 포스팅에서는 ROS1과 ROS2의 주요 차이점과 각각의 장단점을 살펴보았습니다. ROS1은 오랜 기간에 걸쳐 성숙된 생태계를 바탕으로 다양한 프로젝트에서 안정적인 성능을 제공하고 있으며, 특히 실시간성과 보안이 중요한 요소가 아닌 프로젝트에는 여전히 유용한 선택입니다. 반면, ROS2는 실시간 성능, 보안, 확장성을 염두에 두고 설계된 차세대 로봇 운영 시스템으로, 복잡한 다중 로봇 시스템이나 다양한 플랫폼을 지원해야 하는 상황에서 뛰어난 기능을 제공합니다.
프로젝트의 요구 사항과 사용 환경에 따라 ROS1 또는 ROS2를 선택하는 것이 중요하며, 장기적인 관점에서 ROS2로의 전환을 고려하는 것도 좋은 전략이 될 수 있습니다. 두 버전 모두 로봇 공학에서 중요한 역할을 하고 있으며, 로봇 개발자들이 프로젝트 목표에 맞는 올바른 도구를 선택함으로써 성공적인 로봇 시스템을 구축할 수 있을 것입니다.