ROS란
ROS는 Robot Operation System의 약자로 다음 기능 및 도구를 제공한다.
- 오픈소스
- 메타 운영 시스템
- 하드웨어 추상화
- 하위 디바이스 제어
- 로보틱스에서 많이 사용되는 센싱, 인식, 지도 작성, 모션 플래닝 기능 구현
- 프로세스 사이의 메시지 패싱
- 패키지 관리
등등
ROS의 컨셉은 미들웨어 또는 소프트웨어 프레임워크이다.
ROS는 윈도우, 리눅스 같은 독립된 운영체제가 아닌 기존 운영체제를 이용한다.
ROS는 일반적으로 우분투위에 설치하여 운영체제에서 제공하는 프로세스 관리, 파일 시스템, UI, 컴파일러 등을 사용한다.
ROS는 다수의 이기종 하드웨어 간의 데이터 송수신, 스케줄링, 에러 처리 등 로봇 응용 프로그램에 필요한 기능을 라이브러리로 제공한다.
ROS의 역사
2007년 미국 스탠퍼드 대학 AI LAB에서 진행한 STAIR(STandfor AI Robot) 프로젝트를 위해 모건 퀴클리 박사가 개발한
Switchyard 시스템에서 시작되었다.
ROS 1 마지막 버전 선언
ROS 1 마지막 버전은 2020년 5월에 출시한 Noetic Ninjemys 이다. EOL(End-of-life)은 2025년 까지이다.
ROS 2 개발의 필요성
ROS 1의 제한사항
- 단일 로봇
- 워크스테이션급 컴퓨터
- 리눅스 환경
- 실시간 제어 지원 X
- 안정된 네트워크 환경이 요구됨
- 대학이나 연구소 같은 아카데믹한 연구 용도 -> 보안 문제 : 이후에 다룰 예정
ROS 2의 특징 ( ROS 1과 비교 )
1. Platforms (플랫폼)
ROS 2는 리눅스, 윈도우, macOS를 모두 지원한다.
2. Real -time (실시간성)
ROS2는 실시간성을 지원한다.
단, 선별된 하드웨어, 리얼타임 지원 OS, DDS의 RTPS(Real-time Pub-Sub Protocol)와 같은 통신 프로토콜, 리얼타임 코드 사용
3. Security (보안)
ROS 1은 보안 문제가 많았다. ROS master의 IP와 PORT만 노출되면 모든 시스템을 죽일 수 있었기에 큰 문제가 있었다.
ROS 2에서 TCP 기반 통신에 DDS를 도입하였다.
4. Communication(통신)
ROS 2는 RTPSfmf 채용하여 실시간 데이터 전송을 보장하고 임베디드 시스템에서도 사용가능하다.
DDS는 노드간 자동 감지 기능을 지원하고 있어 ROS Master(ROS 1)가 없어도 여러 DDS 프로그램 간에 통신이 가능하다.
노드 간의 통신을 조정하는 QoS(Quailty of Service)를 설정할 수 있어 TCP처럼 데이터 손실 방지하여 신뢰도를 높이거나, UDP처럼 통신 속도를 최우선하여 사용 가능하다.
5. Node manager(Discovery)
ROS 1에서는 필수 실행 프로그램으로 roscore가 있다. 이는 노드의 정보를 관리하고 상대방 노드의 정보를 건네주어 연결할 수 있게 해주는 중매 역할을 수행했었다. 이 ROS Master 연결이 끊기거나 죽는 경우 모든 시스템이 마비되었다.
ROS 2는 roscore가 없어지고 3가지 프로그램 (중개 노드, Pub 노드, Sub 노드)이 각각 독립적으로 수행되도로 바뀌었다.
각각의 노드들은 DDS의 참여자로 취급하고, Dynamic Dsicovery를 이용하여 DDS 미들웨어를 통해 직접 검색하여 연결할 수 있다.
6. Build System
ROS 2에서는 새로운 빌드 시스템인 ament를 사용한다. (catkin의 업그레이드 버전)
catkin이 CMake만 지원했던 반면, ament는 파이썬 패키지 관리도 가능하다. ROS 2에서 파이썬 패키지는 setup.py 파일의 모든 기능을 순수 파이썬 모듈과 동등한 수준으로 사용할 수 있게 되엇다.
7. Build tools
ROS 1 : catkin_make 사용 (catkin_tools도 있음)
ROS 2 : colcon build 사용 (colcon test도 있음)
8. Build options
1. Multiple workspace : 복수의 독립된 워크 스페이스를 사용 -> 작업 목적 및 패키지 종류별로 관리 가능
ROS 1은 catin_ws와 같은 특정 워크 스페이스에서 모든 작업 진행
2. No non-isolated build
ROS 1 은 하나의 CMake 파일로 여러 개의 패키지를 동시에 빌드 -> 속도는 빠르지만 종속성 문제 있음
ROS 2 는 격리 빌드를 지원함으로써 모든 패키지를 별도로 빌드할 수 있다.
3. No devel space
ROS 1에서 catkin은 패키지를 빌드한 후 devel 폴더에 코드를 저장했다. -> 패키지를 설치할 필요 없이 패키지를 사용할 수 있는 환경을 제공했다. -> 사용자는 파이썬 코드를 편집하고 즉시 코드를 실행할 수 있었다. -> 편리하지만 패키지 관리 측면에서 복잡함
ROS 2 에서는 빌드 후 설치해야 패키지를 사용할 수 있도록 바뀌었다. 단, 편리한 사용성 고려하여 "--symlink -install" 과 같은 옵션을 제공하여 설치가 가능하다.
9. Version control system
초기에 ROS 1은 wstool 사용 -> 지금은 vcstool 사용
ROS 2는 vsctool 사용
10. Client library
ROS 1에서는 roscpp, rospy, roslib 등 각 프로그래밍 언어에 대한 Client Library 제공
ROS 2에서는 프로그래밍 언어별로 rclcpp, rclc, rclpy, rcljava, rclobjc, rclada, rclgo 등으로 ROS Client Library를 제공한다.
11. Multiple node
ROS 1 초기에는 하나의 프로세스에서 여러 노드 실행 불가 -> 이후 Nodelet 라이브러리가 추가되었다.
ROS 2는 RCL에 Multiple node 기능을 포함시켰다. 이는 컴포넌트라고 부른다.
12. Threading model
ROS 1에서 개발자는 단일 또는 다중 스레드 실행 중 하나만 선택 가능
ROS 2는 더 세분화 된 실행모델을 C++ or Python에서 사용할 수 있으며, 사용자가 정의한 실행기(실행 모델) 또한 RCL API를 이용하여 쉽게 구현 가능
13. Message(Topic, Service, Action)
ROS 2에서는 ROS 1 의 메시지와 마찬가지로 단일 데이터 구조를 메시지라고 정의한다.
14. Launch
ROS의 실행 시스템은 대표적으로 run과 launch가 있다. run은 단일 프로그램 실행, launch는 사용자 지정 프로그램 실행을 수행한다. 보통 run에 비해 launch를 더 많이 사용한다.
ROS 1의 launch 파일은 형식을 가진다. ROS 2 launch 파일은 XML 형식 외에 파이썬을 지원하여 복잡한 논리와 기능을 자유롭게 사용 가능하다.
15. Embedded Systems
로봇 개발에서 실시간 모터 및 센싱을 제어하는 부분은 중요하게 다루어져 왔다.
ROS 2 에서는 선별된 하드웨어, 리얼타임 OS, DDS의 RTPS와 같은 통신 프로토콜, 리얼 타임 코드 사용을 전제로 실시간성을 지원하고 있지만, 실시간성이라는 것은 상위 SW에서 다루기에는 제약이 많다. 따라서 이를 가능하게 하려면 임베디드 시스템 안에서 해결하는게 더 적합하다.
ROS 1은 임베디드 보드와 메시지를 주고 받을 때 rosserial 통신을 사용하였다.
ROS 2는 한발 더 나아가 기존 시리얼 통신, 블루투스 및 와이파이 뿐만 아니라 RTOS(Real-Time Operation System)와 DDS-XRCE를 지원한다.
이를 통해 임베디드 보드에서 직접 ROS 프로그래밍을 하여 펌웨어로 구현된 노드를 실행할 수 있다. 현재 ARM 사를 포함한 다양한 MCU 업체에서 이를 지원하기 위해 노력하고 있다.
'ROS Project🦾' 카테고리의 다른 글
Jetson AGX Xavier에 Docker ROS image 설치하기 (2) | 2023.09.16 |
---|---|
ROS 2 설치하기 (Ubuntu 22.04) + Pacakge & colcon error [solved] (0) | 2023.08.19 |
ROS2 Vscode 프로그래밍 환경 구축 [2] (0) | 2023.08.15 |
ROS2 개발 툴 설치 & Bashrc 편집 [1] (0) | 2023.08.15 |
2D LiDAR에 obstacle_detector 라이브러리 적용하기 [5] (2) | 2023.07.26 |