(ROS2 기초)1. ROS의 정의와 ROS2 세팅하기
참고도서 1. ROS 2로 시작하는 로봇 프로그래밍. 표윤석 . 루비페이퍼 . 2021
참고도서 2. ROS2 혼자공부하는 로봇SW 직접 만들고 코딩하자 . 민형기 . 잇플 . 2022
참고자료 1. PinkWink(민형기)님의 ROS2 강의자료
참고자료 2. ROS2 humble documeation
ROS2를 복습하는 김에 제대로 다시 한 번 정리하고 넘어가고 싶어서 이 시리즈를 작성합니다.
이 글은 Turtlebot3 패키지를 제대로 이해하고, 다양한 센서를 부착하면서 활용하는 것을 목표로 합니다.
또한 글이 끝날 때 ROS와 관련된 문제를 하나 만들어서 직접 풀어보도록 합니다.
사용하고 있는 운영체제는
Ubuntu 22.04 (영문) <- 영문 버전이 아니라 발생하는 오류들이 많습니다. 그러니 운영체제는 영문을 사용하시길 바랍니다.
ROS2 Humble 버전입니다.
만약
Ubuntu20.04라면,
ROS2 Foxy 버전을 사용하시면 됩니다.
ROS란 무엇인가요?
ROS는 Robot Operation System의 약자로 직역하면 로봇 운영체제입니다. ROS는 표윤석님의 책에서는 메타운영체제라는 표현을 하시며 "애플리케이션과 분산 컴퓨팅 자원 간의 가상화 레이어로 분산 컴퓨팅 자원을 활용하여 스케줄링 및 로드, 감시, 에러 처리 등을 실행하는 시스템" 이라 언급합니다.
간단하게 말하면 로봇의 여러 센서, 제어기들간의 통신을 편리하게 해주는 친구라고 볼 수도 있습니다. 그리고 ROS는 노드 단위의 분산 프로세스와 공유 및 재배포를 쉽게 하기위한 패키지 단위 관리 그리고 다양한 프로그래밍언어를 지원합니다.
조금 더 쉽게 들어가보면 로봇이나 자율주행자동차 등을 연구하는 사람이 모든 분야의 내용을 잘알지 못합니다. 제어기를 연구하는 사람이 있을 것이고, 내부에 들어가는 소프트웨어나 알고리즘을 연구하는 사람이 있을 것이고, 시뮬레이션을 담당하는 사람이 있을 것이고
그러면 제어기의 소스코드, 알고리즘의 소스코드, 시뮬레이션의 코드 등등을 합쳐서 사용하려고 한다면 ROS를 사용해서 연결을 하게 됩니다. 제어기의 결과를 ROS패키지로 만들어서 ROS세상에 topic의 형태로 발행하고, 알고리즘의 결과물도 Topic의 형태로 발행합니다. 그러면 이러한 topic을 구독하기만 하면 3가지의 결과물을 모두 받아볼 수 있습니다. 이는 Sytem Architecture 설계를 용이하게 해줍니다.
ROS1과 ROS2의 차이점?
저도 이 부분에서는 전문용어가 많이 나와 제대로 이해하지 못했지만 간단하게 정리하면 다음과 같습니다.
- ROS1은 마스터 노드라는 것이 존재합니다. 그러나 ROS2는 없습니다. ROS2는 DDS(데이터 분산 서비스)라는 것을 채택하면서 보완성과 범용성 그리고 시장성을 높혔다고 합니다.
우리는 이정도만 상식선에서 알고가면 됩니다. 현직자분들이 ROS2 넘어오면서 무궁무진한 가능성이 열렸다라는 말씀을 자주하십니다. 그 중에서도 DDS가 혁명을 가져왔다고 하시는데, 솔직히 배우는 입장에서는 ROS를 배우러 와서 갑자기 DDS라니 싶기도 합니다.
만약 추가적인 정보가 필요하다면 다음을 참고합니다.
https://docs.ros.org/en/foxy/_downloads/2a9c64e08982f3709e23d20e5dc9f294/ros2-brochure-ltr-web.pdf
표윤석님의 책에서는 ROS2의 특징을 20가지로 정리를 해주셨습니다. 그러나 지금 당장 이를 이해할 필요는 없다고 생각됩니다.
1. Platforms : 다양한 운영체제를 지원한다.
2. Real-time : 실시간성을 지원하는데, 선별된 하드웨어나 리얼타임 OS , DDS의 RTPS와 같은 통신 프로토콜, 리얼타임 코드 사용을 전제로 한다.
3. Security : ROS1에는 보안상 취약점이 있어서 ROS2에서는 이를 해결하였다.
4. Communication : 리얼타임 퍼블리시와 서브스크라이브 프로토콜인 RTPS를 지원하는 통신 미들웨어 DDS를 사용하고 있다. 그래서 상업적으로 적합하다는 평가가 지배적이다.
5. Middleware interface : DDS는 다양한 기업에서 통신 미들웨어 형태로 제공, ROS2에서는 이러한 벤더들의 미들웨어를 유저가 원하는 사용 목적에 맞게 선택하여 사용할 수 있도록 ROS 형태로 지원하고 있다.
6. Node Manager : ROS1과는 다르게 ROS Master는 삭제되었고, DDS의 기능들로 대체되었다. 노드는 DDS의 participant로 취급하게 되었고, Dynamic Discovery를 이용하여 DDS 미들웨어를통해 노드를 직접 검색하여 연결할 수 있게 되었다.
7. Languages : C++, 파이선을 지원한다 (더 상위버전까지 C++ 14, C++ 17, 파이썬 3.7이상)
8. Build System : ROS2에서는 새로운 빌드 시스템인 ament를 사용한다. ROS1에서 사용되던 빌드 시스템인 catkin의 업그레이드 버전이다. 그래서 ament는 CMake를 사용하지 않는 파이썬도 지원한다.
9. Build tools : 지금은 빌드 프로그램으로 colcon 이 추천되고 있다.
10. Build options : Multiple workspace 복수의 독립된 워크스페이스를 사용할 수 있어, 목적에 맞게 패키지 종류별로 이를 관리할 있다. No non-isolated build 로 모든 패키지를 별도로 빌드해서 설치용 폴더를 분리하거나 병합할 수 있게 되었다. No devel space 는 패키지를 빌드한 후 설치해야 사용할 수 있다.
11. Version control system : 다양한 사람들이 만들어가는 프로그램이니 만큼 버전관리에 용의하도록 vcstool 이라는것을 지원한다.
12. client library : ROS Client Library API 로 rclcpp, rclpy 같은거를 구경해봐라.
13. Lifecycle : ROS2는 패키지의 각 노드들의 현재 상태를 모니터링하고 상태를 제어할 수 있는 lifecycle을 클라이언트 라이브러리에 포함시켜 ROS 시스템 상태를 효과적으로 제어할 수 있게 되었다.
14. Multiple nodes : ROS2에서는 컴포넌트를 통해 동일한 실행파일에서 복수의 노드를 실행시킬 수 있게 되었다.
15. Threading model : ROS2에서는 세분화된 실행모델을 C++ 와 파이썬에서 사용할 수 있다.
16. Messages : ROS2에서는 DDS를 사용하면서 메시지를 이용한 토픽, 서비스, 액션 콘셉은 변하지 않았나 사용방법이 바뀌었다.
17. Command Line Interface : ROS2에서 명령어가 조금 바뀌었다고 한다.
18. Launch : Launch파일에 파이썬도 지원하게 되었다.
19. Graph API : rqt_graph를 보안하는 프로그램을 개발중이라고 한다.
20. Embedded Systems : 임베디드 시스템 (실시간성)을 지원하기위해 노력하고 있다.
ROS2에서 DDS란?
ROS1에서는 TCPROS라는 전용의 통신 라이브러리를 사용했지만, ROS2에서는 OMG에 의해 표준화된 DDS의 RTPS를 사용하고 있습니다.
DDS(Data Distribution Service)는 데이터 분산 시스템의 줄임말입니다. ROS2의 통신 미들웨어로 사용됩니다. ROS에서의 DDS의 특징은 다음과 같습니다만, 만약 ROS를 처음 접한다면 그냥 흘려서 보아도 됩니다.
1. 산업 표준 (Industry Standards)
DDS는 분산 객체에 대한 기술 표준을 재정의하기 위해서 설립된 OMG(Object Management Group)라는 그룹의 관리하에 산업 표준으로 자리 잡았다. 이 때문에 ROS2가 IOT, 자동차, 국방, 항공, 우주분야로 넓혀갈 수 있는 발판이 마련되었다.
2. 운영체제 독립 (OS Independent)
DDS는 다양한 운영체제를 지원하고 있다.
- chat GPT DDS는 다양한 운영체제를 지원하지만, ROS2에서는 현재 주로 리눅스 운영체제를 사용하고 있습니다. 이는 ROS2가 개발자 커뮤니티에서 주로 리눅스를 사용하는 환경에서 개발되었기 때문입니다. 또한 ROS2의 중요한 특징 중 하나는 실시간 시스템을 위한 지원이 강화되었다는 것입니다. 실시간 시스템에서는 빠른 데이터 처리와 안정적인 성능이 중요합니다. 이러한 요구사항을 충족하기 위해서는 운영체제에서 제공하는 실시간 기능을 이용하는 것이 필요합니다. 리눅스는 실시간 운영체제로 널리 사용되며, ROS2는 리눅스에서 실시간 기능을 지원하도록 설계되었습니다. 따라서 ROS2는 리눅스 환경에서의 활용이 많은 것입니다. 하지만 ROS2는 Windows 및 macOS와 같은 다른 운영체제에서도 지원됩니다.
3. 언어 독립 (Language Independent)
DDS를 사용하기 위해 기존에 사용하던 프로그래밍 언어를 변경할 필요가 없다.
- DDS는 데이터 중심의 기술로, 서로 다른 언어를 사용하는 시스템 간의 데이터 통신을 가능하게 합니다. 이는 DDS가 언어 독립적인 프로토콜이기 때문입니다. 예를 들어, ROS2 시스템에서는 C++, Python, Java 등 다양한 언어로 작성된 노드들이 함께 동작할 수 있습니다. 이러한 노드들은 DDS를 통해 서로 데이터를 주고 받습니다. DDS에서는 데이터를 교환하는 메시지의 형식을 정의하는 IDL(Interface Definition Language)을 사용합니다. IDL은 노드 간 데이터를 교환하는 메시지의 구조를 명시합니다. 이를 통해 서로 다른 언어로 작성된 노드들도 동일한 메시지 형식을 이해할 수 있습니다. DDS는 IDL에 따라 데이터를 직렬화하여 전송하므로, 노드 간의 데이터 통신에서 언어의 종류에 상관없이 효율적인 통신이 가능합니다. 이러한 언어 독립적인 특징은 시스템 구성 요소를 개발하는데 있어서 유연성과 확장성을 높이는데 큰 장점을 제공합니다.
4. UDP 기반의 전송 방식 (Transport on UDP/IP)
UDP의 멀티캐스트는 브로드캐스트처럼 여러 목적지로 동시에 데이터를 보낼 수 있지만, 불특정 목적지가 아닌 특정한 도메인 그룹에 대해서만 데이터를 전송하게 된다.
- DDS는 기본적으로 UDP 기반의 전송 방식을 사용합니다. 이는 DDS의 특징 중 하나인 높은 신뢰성과 성능을 제공하는데 중요한 역할을 합니다. UDP는 User Datagram Protocol의 약자로, 전송 중 데이터의 유효성을 확인하지 않습니다. 따라서 UDP는 TCP와 달리 데이터 전송 중에 손실이 발생할 수 있습니다. 그러나 DDS에서는 이러한 문제를 해결하기 위해 여러 가지 방법을 사용합니다. 예를 들어, DDS에서는 데이터를 손실 없이 전송하기 위해 데이터를 여러 패킷으로 나누어 보내는 방식을 사용합니다. 이를 통해 전송 중 데이터가 손실되더라도 이를 감지하고 재전송하여 누락된 데이터를 보완할 수 있습니다. 또한 DDS에서는 데이터의 신뢰성을 보장하기 위해 데이터의 유효성을 확인하는 메커니즘을 사용합니다. 이를 통해 노드 간의 데이터 전송 중에도 데이터의 유효성을 보장할 수 있습니다. UDP 기반의 전송 방식은 빠른 전송 속도와 낮은 지연 시간을 제공하며, 대부분의 시스템에서 사용 가능합니다. 이러한 특징들은 DDS가 실시간 시스템과 같은 높은 신뢰성과 성능 요구사항을 가진 시스템에서 매우 유용하게 사용될 수 있도록 만들어줍니다.
- ROS 2에서는 DDS를 이용한 네트워크 통신이 기본적으로 사용되기 때문에, DDS의 UDP 기반 전송 방식은 ROS 2에서 중요한 역할을 합니다. ROS 2에서는 DDS의 UDP 기반 전송 방식을 활용하여 노드간에 데이터를 주고 받습니다. 이를 통해 노드 간의 통신이 빠르고 효율적으로 이루어질 수 있습니다. DDS의 UDP 기반 전송 방식은 ROS 2에서 매우 유용합니다. 이는 실시간 시스템과 같은 높은 신뢰성과 성능 요구 사항을 가진 시스템에서 사용될 수 있기 때문입니다. ROS 2에서는 실시간 제어와 같은 높은 요구 사항을 가지는 시스템에서도 안정적인 동작을 보장할 수 있습니다. 또한, DDS의 UDP 기반 전송 방식을 사용함으로써, ROS 2는 다양한 운영체제와 플랫폼에서 사용될 수 있습니다. 이는 ROS 2가 로봇 및 자율주행 차량 등의 다양한 분야에서 활용될 수 있도록 만들어줍니다. 따라서, DDS의 UDP 기반 전송 방식은 ROS 2에서 매우 중요한 역할을 합니다. 이를 통해 노드 간의 데이터 전송이 빠르고 안정적으로 이루어질 수 있으며, ROS 2가 다양한 운영체제와 플랫폼에서 사용될 수 있도록 만들어줍니다.
5. 데이터 중심적 기능 (Data Centricity)
DDS는 적절한 수신자에게 적절한 정보를 효율적으로 전달하는 것을 목표로 하는 publish subscribe 방식으로, DDS의 미들웨어는 어떤 데이터인지, 이 데이터가 어떤 형식인지, 이 데이터를 어떻게 노낼 것인지, 이 데이터를 어떻게 안전하게 보낼 것인지에 대한 기능을 지원한다.
6. 동적검색 (Dynamic Discovery)
DDS는 동적 검색을 제공해서 응용프로그램이 DDS의 동적 검색을 통해 어떤 토픽이 지정 도메인 영역에 있으며, 어떤 노드가 이를 발신하고 수신하는지 알 수 있게 된다. 이 덕분에 ROS 프로그램을 개발할 때 데이터를 주고받을 노드들의 IP주소 및 포트를 미리 입력하거나 따로 구성하지 않아도 되며, 사용되는 시스템 아키텍처의 차이를 고려할 필요가 없기 때문에 모든 운영체제 또는 하드웨어에 플랫폼에서 매우 쉽게 작업이 가능하다.
ROS2에서는 ROS1의 ROS Master가 없어져서 DDS의 동적 검색 기능을 사용해 노드를 DDS의 Participant로 취급하게 되었으며, 동적 검색 기능을 이용하여 이를 연결할 수 있게 되었다.
- ROS1에서는 모든 노드 간의 통신을 중계하기 위해 ROS Master라는 중앙화된 노드가 필요했습니다. ROS Master는 노드의 등록, 발견, 토픽 및 서비스의 이름과 URI를 관리하는 중요한 역할을 했습니다. 하지만 이러한 중앙화된 접근 방식은 ROS1의 확장성과 안정성을 제한하는 문제가 있었습니다. 또한, ROS Master가 단일 장애 지점(SPOF)이 되어 분산 시스템의 신뢰성을 감소시키는 등의 문제도 있었습니다.
- ROS2에서는 이러한 문제를 해결하기 위해 중앙 집중식 ROS Master를 대체하는 분산형 시스템을 채택했습니다. ROS2에서는 DDS의 동적 검색 기능을 이용해 노드 및 토픽을 검색하고 연결할 수 있습니다. 이를 통해 노드 간의 직접적인 통신이 가능해졌으며, ROS Master의 단일 장애 지점과 확장성 문제를 해결할 수 있게 되었습니다.
- DDS는 분산 시스템에서의 데이터 공유를 위한 중요한 기술이며, ROS2에서 이를 활용해 노드 간의 통신을 관리합니다. DDS의 동적 검색 기능은 노드 간의 통신을 효율적으로 관리하고, ROS2의 분산 시스템에서 확장성과 신뢰성을 보장합니다. 또한, DDS의 데이터 중심적인 설계는 ROS2에서 데이터 공유와 통합을 용이하게 만들어 줍니다. 이러한 이유로 ROS2에서는 DDS를 중심으로 분산형 시스템을 구성하고 있습니다.
7. 확장 가능한 아키텍처 (Scalable Architecture)
DDS Participant 형태의 노드는 확장 가능한 형태로 제공되어 사용할 수 있으며 단일 표준 통신 계층에서 많은 복잡성을 흡수하여 분산 시스템 개발을 더욱 단순화시켜 편의성을 높였다. 특히 ROS와 같이 최소 실행 가능한 노드 단위로 수백, 수천 개의 노드를 관리해야하는 시스템에서는 이 부분이 강점으로 보이며 한 대의 로봇이 아닌 복수의 로봇, 주변 인프라와 다양한 IT기술, 데이터베이스, 클라우드로 연결 및 확장해야 하는 ROS 시스템에 매우 적합한 기능이다.
8. 상호 운용성(Interoperability)
- ROS DDS에서 상호 운용성(interoperability)이란, 서로 다른 제조사나 기관에서 개발한 DDS 시스템 간에 데이터를 주고받을 수 있는 능력을 말합니다. 즉, DDS의 국제 표준에 따라 구현된 모든 시스템들은 동일한 데이터 교환 규약을 준수하며, 서로 다른 시스템에서 생성된 데이터를 상호 전달할 수 있습니다.
- ROS DDS에서는 두 가지 방법으로 상호 운용성을 지원합니다. 첫째, DDS의 국제 표준 규격을 따르므로 다른 DDS 기반 시스템과 상호 운용이 가능합니다. 둘째, ROS에서는 DDS를 사용하기 때문에 다른 ROS 기반 시스템과도 상호 운용이 가능합니다.
- ROS1에서는 ROS master가 중앙 집중식으로 노드간 통신을 관리했기 때문에 상호 운용성이 제한되었습니다. 하지만 ROS2에서는 DDS의 동적 검색 기능을 이용해 중앙 집중식으로 노드간 통신을 관리하는 ROS master가 제거되고, 노드간 직접적인 통신이 가능해졌기 때문에 상호 운용성이 크게 향상되었습니다.
9. 서비스의 품질 (Quality of Service(Qos))
ROS2에서는 DDS의 도입으로 데이터의 송수신 관련 설정을 목적에 맞추어 유저가 직접 설정할 수 있게 되었다. 노드간의 DDS 통신 옵션을 설정하는 QoS(Quality of Service)가 그것인데, Publish 및 subscribe등을 선언할 때 이를 사용할 수 있다.
- ROS에서 QoS(Quality of Service)는 노드 간 데이터 교환 시, 데이터를 전송하는 데에 있어서 서로 다른 요구 사항들에 대한 특성을 정의하는 방식입니다. 즉, QoS를 사용하면 노드 간 데이터 전송에 대한 우선 순위, 안정성, 대역폭, 지연 시간 등을 정의하여 데이터 교환의 품질을 제어할 수 있습니다.
- ROS에서는 DDS의 QoS를 기반으로 하여 QoS 정책을 설정할 수 있습니다. 이를 통해 노드 간 통신에서 QoS 관련 문제를 제어하고 최적화할 수 있습니다.
- ROS의 QoS 설정은 다양한 옵션을 제공합니다. 대표적으로 다음과 같은 QoS 설정이 있습니다.
- Reliability: 데이터의 전송을 보장하는 속성으로, 데이터 손실을 방지하기 위해 사용됩니다. reliability 속성은 Best-Effort(최선 노력) 또는 Reliable(신뢰성 높음) 두 가지 옵션으로 설정할 수 있습니다.
- History: 이전에 전송된 데이터를 유지하도록 하는 속성입니다. history 속성은 KEEP_LAST(최신 몇 개만 유지) 또는 KEEP_ALL(모든 데이터 유지) 두 가지 옵션으로 설정할 수 있습니다.
- Durability: 데이터가 보존되는 기간을 지정하는 속성입니다. durability 속성은 TRANSIENT_LOCAL(로컬 영역에서만 유지), TRANSIENT(영구 저장소에서 유지되지 않지만, 일시적으로 다른 시스템에서도 사용 가능), PERSISTENT(영구 저장소에 유지) 등으로 설정할 수 있습니다.
- Deadline: 데이터가 만료되는 시간을 지정하는 속성입니다. deadline 속성을 설정하면 특정 시간 내에 데이터가 수신되지 않으면 데이터가 삭제됩니다.
- Lifespan: 데이터의 유효 기간을 지정하는 속성입니다. lifespan 속성을 설정하면 데이터가 일정 시간이 지나면 삭제됩니다.
- Liveliness: 데이터 송신자의 활성성을 확인하는 속성으로, 데이터 송신자가 여전히 활성 상태인지 확인하고, 활성 상태가 아니면 연결을 끊는 등의 작업을 수행합니다.
10. 보안 (Security)
ROS1의 가장 큰 문제는 보안이였다. ROS2에서는 이를 DDS로 해결하였다. ROS 2 에서는 DDS Security라는 DDS 보안 사양을 ROS2에 적용하여 보안에 대한 이슈를 통신단부터 해결하였다.
- ROS1은 초기에 보안을 고려하지 않은 상태에서 개발되었습니다. 따라서 ROS1에서는 보안 기능이 부족하거나 취약했습니다.
- ROS1에서는 네트워크 통신을 위해 XMLRPC와 TCPROS 등의 프로토콜을 사용했는데, 이들 프로토콜은 보안 취약점이 있었습니다. 예를 들어, TCPROS는 데이터를 암호화하지 않고 전송하였기 때문에 데이터가 중간에 도청될 수 있는 위험이 있었습니다. 또한, ROS1에서는 암호화된 통신을 제공하는 TLS/SSL을 지원하지 않았습니다. 이러한 보안 취약점으로 인해 ROS1 시스템에서는 데이터 유출이나 변조, 불법적인 릴레이 등의 보안 위협에 취약했습니다.
- 하지만, ROS1 커뮤니티는 이러한 보안 취약점을 인식하고 보완하기 위해 노력하였습니다. 예를 들어, ROS1에서는 ROS Secure를 제공하고 있으며, 이를 통해 암호화된 통신을 지원합니다. 또한, ROS2에서는 DDS의 보안 기능을 활용하여 보안성을 강화하였습니다.
ROS2 설치하고 세팅하기
ROS는 window나 mac에서도 사용할 수 있다고는 하나 ROS2는 Ubuntu에서 사용하는 것을 추천합니다.
ROS2 설치에 관련한 글은 다음의 글을 참고합니다.
(실무리눅스) 12. 우분투 22.04에 ROS2 Humble 설치하고 rviz와 gazebo까지 설치하기
https://docs.ros.org/en/humble/Installation.html Installation — ROS 2 Documentation: Humble documentation Binary packages Binaries are only created for the Tier 1 operating systems listed in REP-2000. Given the nature of Rolling, this list may be updated
kimbrain.tistory.com
해당 글은 정말 간략하게, 터미널에 입력해야할 정보만을 담고 있습니다. 상세한 설치방법은 documentation을 확인하도록 합니다.
추가적으로 ROS를 사용하면서 부터는 많은 터미널을 사용하게 됩니다. 그러므로 다음을 설치하여 사용하시면 편합니다.
sudo apt install terminator
추가적으로 Visual Studio Code를 설치해주도록 합시다.
https://code.visualstudio.com/
Visual Studio Code - Code Editing. Redefined
Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.
code.visualstudio.com
대충 설치를 완료하면 다음의 확장 프로그램을 다운받아주도록 합니다.
VScode 세팅하기 (확장파일 받기)
우선 Home에서 ros_ws 폴더를 하나 만들고 VScode 를 실행한다. 다음의 확장을 설치합니다.
1. C/C++
2. CMake
3. CMake Tools
4. Python
5. ROS
6. URDF
7. Colcon Tasks
8.XML Tools
9. YAML
10. Markdown All in One
이정도만 받아주도록 합니다. 지금 당장은 ROS2에서 CODE부분을 만지거나 하지는 않을 것입니다.