What is ROS?
ROS(Robot Operating System)는 로봇을 위한 운영체제이며, 메타운영체제라고도 한다.
윈도우나 리눅스와 같은 전통적인 운영체제는 아니며, 전통적인 운영체제를 이용하여 그 위에서 실행된다.
다수의 이기종 하드웨어간의 데이터 송수신, 스케줄링, 에러 처리 등 로봇 응용 소프트웨어 개발을 위한 필수 기능들을 라이브러리 형태로 제공한다.
일반적으로 운영체제(Operating System)이라고 하면, Windows, Linux, MAC과 같은 범용 컴퓨터에서의 전통적인 운영체제를 이야기한다.
메타 운영체제는 전통적인 운영체제는 아니지만, 애플리케이션과 ROS 노드간의 가상화 레이어를 통해 분산 컴퓨팅 지원 리소스를 활용하여, 스케줄링 및 로드, 감시, 에러 처리 등을 실행하는 시스템이라고 할 수 있다.
로봇, 앱, 센서 등의 이기종 디바이스가 메타 운영체제를 인터페이스로 하여 연동 및 통신이 가능하다
- 소켓 기반의 네트워크 통신을 통해 연동
- 메시지 큐 기반의 데이터 송수신


ROS Layer
ROS의 소프트웨어 아키텍처는 여러 계층으로 나뉘어 있으며, 각각의 계층은 로봇 개발에 필요한 다양한 기능을 제공한다.
아래 이미지는 ROS의 레이어 구조를 시각화한 것이다.

- Client Layer
- 로봇 애플리케이션을 개발하기 위한 클라이언트 라이브러리를 제공
- roscpp, rospy: ROS의 C++ 및 Python 클라이언트 라이브러리
- roslisp, rosjava, roslibjs: Lisp, Java, JavaScript용 클라이언트 라이브러리
- Robotics Application
- 로봇의 고급 애플리케이션을 구현할 때 사용하는 패키지 제공
- MoveIt!: 로봇 움직임 계획 라이브러리
- navigation: 경로 계획 및 내비게이션 라이브러리
- teleop pkgs: 원격 조작 패키지
- 기타: mapviz, ar track, mavros 등
- Robotics Application Framework
- 로봇 애플리케이션을 위한 필수적인 프레임워크와 도구 제공
- dynamic reconfigure: 런타임 동안 매개변수 조정 가능
- robot_localization, robot_pose_ekf: 로봇의 위치 추정
- tf: 좌표계 변환 관리
- perception pcl: 포인트 클라우드 데이터 처리
- 기타: ros control, laser filters, image pipeline
- Communication Layer
- 로봇 내/외부 통신 담당
- common_msgs: 표준 메시지 타입
- rosbag: ROS 메시지를 기록 및 재생
- roslaunch, rosparam: ROS 노드 실행 및 매개변수 관리
- rosmaster: 전체 ROS 시스템 관리
- Hardware Interface Layer
- 하드웨어와 상호작용하기 위한 드라이버 및 인터페이스 제공
- camera drivers, GPS/IMU drivers: 센서 드라이버
- joystick drivers: 조이스틱 입력 지원
- force/torque sensor drivers: 힘/토크 센서 지원
- 기타: rosserial, ethercat drivers 등
- Software Development Tools
- ROS 소프트웨어를 개발하고 디버깅하는 도구
- RViz: 3D 시각화 도구
- rqt: GUI 기반 디버깅 도구
- catkin: ROS 빌드 시스템
- 기타: wstool, rosdep 등
- Simulation
- 로봇 시뮬레이션을 위한 도구
- gazebo_ros_pkgs: Gazebo 시뮬레이터 통합
- stage_ros: Stage 시뮬레이터와 ROS 연결
ROS Ecosystems
이러한 로봇 소프트웨어 프레임워크를 기반으로 다양한 목적의 응용 프로그램
을 개발, 관리, 제공하고 있으며 유저들이 개발한 패키지 또한 유통하는 라이브러리 생태계
(ecosystem)를 갖추고 있다.

ROS Networks
ROS는 노드 간 데이터 통신을 메시지 큐 기반의 단방향 통신으로 지원한다.
통상적 미들웨어로 지칭되는 메시지 전달 인터페이스 지원
- 메시지 파싱 기능
- 로봇 개발 시에 빈번히 사용되는 통신 시스템 제공
- 캡슐화 및 코드 재사용을 촉진하는 노드들 간의 메시지 전달 인터페이스
메시지의 기록 및 재생
- 노드 간 송/수신되는 데이터인 메시지를 저장하고 필요시에 재사용 가능
- 저장된 메시지를 기반으로 반복적인 실험 가능, 알고리즘 개발에 용이함
메시지 사용으로 인한 다양한 프로그래밍 언어 사용 가능
- 노드 간의 데이터 교환이 메시지를 사용하기 때문에 각 노드는 서로 다른 언어로 작성 가능
- 클라이언트 라이브러리: roscpp, rospy, roslisp, rosjava, roslua, roscs, roseus, PhaROS, rosR
분산 매개 변수 시스템
- 시스템에서 사용되는 변수를 글로벌 키값으로 작성하여 공유 및 수정하여 실시간으로 반영
Communication via Message Queue
ROS는 기본적으로 Sub-Pub 모델의 메시지 큐 기반으로 데이터 통신을 제공한다.
ROS의 노드간 통신에 대한 내용은 다음 포스팅에서 자세히 다룰 예정이다.
Pub-Sub 모델의 메시지 큐는 아래와 같은 4가지 핵심 컴포넌트를 가진다.
- Broker
- 메시지 큐에 송수신 되는 데이터에 대한 핸들러(메시징 미들웨어) 역할 수행
- 송수신 되는 데이터에 대해, 어떤 Publisher에서 어떤 Subscriber로 전달할 지에 대한 제어 및 핸들링
- 메시지를 검증, 저장, 라우팅하여 적절한 대상에 전달
- Topic
- 메시지 큐를 통해 통신을 하는 경우, 해당 데이터가 송수신되기 위한 주소 역할을 함
- Publisher
- Subscriber
ROS Components
Node
- ROS에서 약속된
프로세스의 최소 단위를 가리키는 용어로써, 하나의 실행 가능한 프로그램으로 생각하면 된다.
- ROS 에서는
최소한의 실행단위로 프로그램을 나누어 작업하게 된다. 각 노드는 메시지 통신으로 데이터를 주고 받는다.
Package
하나 이상의 노드
- 노드 실행을 위한 정보 등을 묶어 놓은 것.
- 패키지의 묶음을 메타패키지라 하여 따로 분리한다.
Message
- ROS는 메시지 기반으로 노드간의 데이터를 주고받게 된다.
- 메시지는 integer, floating point, boolean 와 같은 변수형태이다.
- 메시지 안에 메시지를 품고 있는 간단한 데이터 구조 및 메시지들의 배열과 같은 구조도 사용할 수 있다.

참고 도서
- ROS 로봇 프로그래밍 - Yoonseok Pyo 저