Ubuntu ROS 실습(3)

zeusqoi·2026년 9월 18일

개인공부

목록 보기
22/42

지난 글에서는 Ubuntu 환경에 ROS 2 Humble을 설치하고, Workspace를 구성한 뒤 Demo Node와 Turtlesim을 실행해 ROS 2의 기본적인 동작을 확인했다.

이번에는 ROS 1과 ROS 2의 차이점을 살펴보고, ROS 2에서 새롭게 추가되거나 개선된 주요 특징들을 정리해보았다.


1. ROS 1과 ROS 2

ROS 1은 2007년부터 개발되기 시작했으며 대학, 연구기관뿐만 아니라 산업계와 개인 로봇 개발 등 다양한 분야에서 사용되어 왔다.

초기의 ROS 1은 개인 서비스 로봇인 PR2 개발에 필요한 미들웨어 형태의 로봇 개발 프레임워크에서 시작했기 때문에 당시의 개발 환경을 기준으로 한 여러 가지 제약이 있었다.

대표적으로 다음과 같은 특징이 있었다.

  • 단일 로봇 중심
  • 워크스테이션급 컴퓨터
  • Linux 환경
  • 실시간 제어 지원 부족
  • 안정적인 네트워크 환경 필요
  • 대학이나 연구소 중심의 연구 용도

하지만 이후 로봇 기술이 발전하면서 요구사항도 달라졌다.

최근에는 하나의 시스템에서 여러 대의 로봇을 사용하거나 임베디드 시스템에서 ROS를 사용하고, 실시간 제어와 불안정한 네트워크 환경에 대한 대응도 필요하게 되었다.

또한 Linux뿐만 아니라 Windows와 macOS 같은 여러 플랫폼에 대한 지원과 상용 로봇에 적용할 수 있는 기능도 필요해졌다.


2. ROS 2가 만들어진 이유

ROS 1에 새로운 기능을 계속 추가하려면 기존 API에 큰 변경이 필요했다.

하지만 기존 ROS 1과의 호환성을 유지하면서 새로운 기능까지 계속 추가하는 것은 쉽지 않았다.

그래서 기존 ROS 1을 유지하면서 새로운 로봇 개발 환경에 필요한 기능을 제공하기 위해 ROS 2가 별도로 개발되었다.

ROS 1과 ROS 2는 완전히 단절된 관계는 아니다.

필요한 경우 ros1_bridge를 사용하여 ROS 1과 ROS 2 사이에서 메시지를 주고받을 수도 있다.


3. ROS 2의 버전

강의자료에서는 ROS 2의 여러 배포판을 다음과 같이 소개하고 있다.

  • Ardent Apalone
  • Bouncy Bolson
  • Crystal Clemmys
  • Dashing Diademata
  • Eloquent Elusor
  • Foxy Fitzroy
  • Galactic Geochelone
  • Humble Hawksbill
  • Iron Irwini
  • Jazzy Jalisco
  • Kilted Kaiju

현재 실습 환경에서는 Ubuntu 22.04.5 LTS + ROS 2 Humble을 사용하고 있다.

Humble은 LTS(Long Term Support) 버전으로 강의자료에서도 주요 ROS 2 배포판 중 하나로 소개되어 있다.


4. Platforms

ROS 2에서는 여러 운영체제를 지원한다.

대표적으로 다음과 같은 플랫폼을 지원한다.

  • Linux
  • Windows
  • macOS

ROS 1에서는 Linux 중심으로 사용되는 경우가 많았지만, ROS 2에서는 Windows와 macOS까지 지원 범위를 넓혔다.

따라서 개발 환경을 선택할 수 있는 범위가 더 넓어졌다.

현재 실습에서는 Ubuntu 22.04 환경에서 ROS 2 Humble을 사용하고 있다.


5. Real-time

ROS 2에서는 Real-time, 즉 실시간성을 고려한 시스템 구성이 가능하다.

다만 ROS 2를 사용한다고 해서 자동으로 실시간성이 보장되는 것은 아니다.

강의자료에서는 다음과 같은 조건을 전제로 실시간성을 지원한다고 설명한다.

  • 적절한 하드웨어 사용
  • Real-time Operating System 사용
  • DDS의 RTPS 프로토콜 사용
  • 잘 설계된 실시간 코드

따라서 실시간 제어가 필요한 로봇 시스템에서는 운영체제, 하드웨어, 통신 방식, 프로그램 구조 등을 함께 고려해야 한다.


6. Security

ROS 1에서는 보안 측면에서 여러 한계가 있었다.

ROS 2에서는 이러한 문제를 개선하기 위해 DDS-Security를 활용한다.

ROS 2의 통신 미들웨어로 사용되는 DDS에 보안 기능을 적용하여 통신 단계에서 보안을 강화할 수 있다.

또한 ROS 커뮤니티에서는 SROS 2(Secure Robot Operating System 2)와 같은 보안 관련 도구도 제공하고 있다.

즉, ROS 2에서는 단순히 노드 간 통신만 고려하는 것이 아니라 로봇 시스템의 보안도 중요한 요소로 다루고 있다.


7. Communication

ROS 1과 ROS 2의 가장 큰 변화 중 하나가 통신 구조이다.

ROS 1에서는 TCPROS와 같은 통신 방식을 사용했다.

반면 ROS 2에서는 DDS(Data Distribution Service)를 기반으로 통신한다.

DDS는 RTPS(Real-Time Publish-Subscribe)를 지원하며 노드 간의 데이터 통신과 검색 등을 담당한다.

ROS 2에서는 DDS를 이용하여 다음과 같은 기능을 활용할 수 있다.

  • 노드 자동 검색
  • 실시간 데이터 전달
  • QoS 설정
  • 불안정한 네트워크 환경 대응
  • 보안 기능

특히 ROS 1과 달리 ROS Master에 의존하지 않고 노드 간의 검색과 연결이 가능하다는 점이 중요한 차이이다.


8. Middleware Interface

ROS 2에서는 DDS를 직접 사용하는 대신 RMW(ROS Middleware Interface)라는 추상화 계층을 사용한다.

DDS는 여러 회사와 프로젝트에서 다양한 구현체가 제공되고 있다.

대표적으로 다음과 같은 DDS 구현이 소개되어 있다.

  • OpenSplice
  • Cyclone DDS
  • Fast DDS
  • Gurum DDS
  • Connext DDS

ROS 2에서는 RMW를 통해 이러한 서로 다른 미들웨어를 사용할 수 있도록 추상화한다.

따라서 ROS 2 사용자는 특정 DDS 구현의 API에 직접 의존하지 않고 비교적 동일한 ROS 2 코드를 사용할 수 있다.

ROS 2 Application
        │
        ▼
       RCL
        │
        ▼
       RMW
        │
   ┌────┼────┐
   ▼    ▼    ▼
 DDS  DDS  DDS

9. Node Manager / Discovery

ROS 1에서는 roscore가 ROS Master 역할을 수행했다.

ROS Master는 노드의 이름과 정보를 관리하고 서로 통신해야 하는 노드들을 연결하는 역할을 했다.

따라서 ROS 1에서는 ROS Master가 중요한 역할을 담당했다.

반면 ROS 2에서는 ROS Master가 사라졌다.

ROS 2에서는 DDS의 Dynamic Discovery 기능을 이용하여 노드들이 서로를 검색할 수 있다.

즉, ROS 2에서는 별도의 roscore를 실행하지 않아도 노드 간의 검색과 연결이 가능하다.

ROS 1

Node ──┐
Node ──┼── ROS Master
Node ──┘


ROS 2

Node ←──→ Node
  ↕        ↕
     DDS
  Discovery

실제로 ROS 2에서 현재 실행 중인 노드를 확인하기 위해 다음 명령어를 사용했다.

ros2 node list

처음에는 실행 중인 노드가 없었기 때문에 아무런 결과가 출력되지 않았다.

이후 Turtlesim을 실행한 뒤 다시 ros2 node list를 실행하자 실행 중인 노드가 확인되었다.

ros2 run turtlesim turtlesim_node

그리고 별도의 터미널에서 다음 명령어를 실행했다.

ros2 node list

실행 결과 다음과 같이 현재 실행 중인 ROS 2 노드를 확인할 수 있었다.

이번 실습에서는 다음과 같이 여러 노드가 자동으로 검색되는 것을 확인할 수 있었다.

/rqt_gui_py_node_8786
/teleop_turtle
/turtlesim

특히 별도의 roscore를 실행하지 않았음에도 /turtlesim과 /teleop_turtle이 검색되는 것을 확인할 수 있었다.

이를 통해 ROS 2에서는 DDS의 Dynamic Discovery를 이용하여 실행 중인 노드들을 자동으로 검색할 수 있다는 것을 직접 확인했다.


10. Languages

ROS 2에서도 다양한 프로그래밍 언어를 사용할 수 있다.

대표적인 언어는 다음과 같다.

  • C++
  • Python

강의자료에서는 ROS 1과 ROS 2의 대표적인 언어 환경을 다음과 같이 비교한다.

ROS 1
C++03
Python 2.7

ROS 2
C++17
Python 3.8

ROS 2에서는 보다 최신의 프로그래밍 언어 환경을 사용할 수 있도록 변경되었다.


11. Build System

ROS 2에서는 ROS 1의 catkin을 대신하여 ament라는 빌드 시스템을 사용한다.

ROS 1:

rosbuild → catkin

ROS 2:

ament

또한 Python 패키지를 독립적으로 관리할 수 있도록 Python setuptools를 지원한다.

즉, ROS 2에서는 CMake 기반의 C++ 패키지뿐만 아니라 Python 패키지도 보다 독립적으로 관리할 수 있다.


12. Build Tools

ROS 2에서는 여러 빌드 도구 중 현재 colcon을 주로 사용한다.

앞선 실습에서도 Workspace를 생성한 후 다음 명령어를 사용했었다.

colcon build --symlink-install

colcon은 ROS 2 패키지를 빌드하고 테스트하는 데 사용되는 CLI 기반 도구이다.

대표적인 명령어는 다음과 같다.

colcon build
colcon test

이번 실습에서도 Workspace를 생성할 때 colcon을 사용했으며, ROS 2에서 중요한 빌드 도구라는 것을 확인할 수 있었다.


13. Build Options

ROS 2의 Workspace와 빌드 방식에는 ROS 1과 다른 특징이 있다.

Multiple Workspace

ROS 2에서는 여러 개의 독립적인 Workspace를 사용할 수 있다.

예를 들어,

workspace A
workspace B
workspace C

와 같이 목적에 따라 Workspace를 나누어 관리할 수 있다.

No non-isolated build

ROS 1에서는 여러 패키지를 하나의 빌드 방식으로 묶어서 빌드할 수 있었지만, ROS 2에서는 패키지를 각각 독립적으로 빌드하는 방식이 사용된다.

이를 통해 패키지 간 의존성을 보다 명확하게 관리할 수 있다.

No devel space

ROS 1에서는 패키지를 빌드하면 devel 공간을 통해 패키지를 사용할 수 있었다.

ROS 2에서는 패키지를 빌드한 후 설치 공간을 사용한다.

다만 colcon build --symlink-install 옵션을 사용하면 개발 과정에서 파일을 직접 복사하지 않고 심볼릭 링크를 이용할 수 있다.

colcon build --symlink-install

실제로 이전 실습에서도 이 옵션을 사용해 Workspace를 빌드했다.


14. Version Control System

ROS에서는 다양한 프로젝트와 패키지를 사용하기 때문에 여러 Git 저장소를 함께 관리해야 하는 경우가 있다.

ROS 2에서는 이러한 여러 저장소를 관리하기 위해 vcstool을 사용한다.

ROS 1에서는 다음과 같은 도구들이 사용되었다.

rosws
wstool
rosinstall

ROS 2에서는:

vcstool
*.repos

형태를 사용한다.

여러 저장소의 정보를 하나의 .repos 파일에 정리할 수 있다는 특징이 있다.


15. vcstool 사용

강의자료에서는 다음과 같은 예제를 소개하고 있다.

wget https://raw.githubusercontent.com/ros2/ros2/humble/ros2.repos

이후 .repos 파일에 정의된 저장소를 가져온다.

vcs import src < ros2.repos

.repos 파일에는 저장소의 종류와 주소, 브랜치 등의 정보가 정의되어 있다.

이를 이용하면 여러 저장소를 한 번에 관리할 수 있다.


16. Client Library

ROS 2에서 실제 프로그램을 작성할 때는 ROS Client Library를 사용한다.

ROS 2에서는 이를 RCL(ROS Client Library)이라고 한다.

대표적인 클라이언트 라이브러리는 다음과 같다.

rclcpp
rclpy

각각 C++과 Python에서 ROS 2를 사용할 때 이용한다.

그 외에도 다양한 언어에 대한 Client Library가 제공된다.

rclcpp
rclc
rclpy
rcljava
rclobjc
rclada
rclgo
rclnodejs

이번 실습에서 Python이나 C++로 ROS 2 노드를 작성하게 된다면 이러한 Client Library를 사용하게 된다.


17. Life Cycle

로봇 시스템에서는 현재 노드가 어떤 상태인지 확인하고, 필요에 따라 다른 상태로 전환하는 기능이 중요하다.

ROS 1에서는 이러한 상태 관리 기능을 구현하기 위해 별도의 패키지를 사용하는 경우가 있었다.

ROS 2에서는 Lifecycle 개념을 제공하여 노드의 상태를 관리할 수 있다.

이를 통해 노드의 상태를 확인하고 상태를 전환하거나 필요에 따라 노드를 재시작하거나 교체하는 등의 동작을 구성할 수 있다.

즉,

노드 상태 확인
      ↓
상태 전환
      ↓
다음 상태에서 작업 수행

과 같은 상태 기반의 시스템 구성이 가능하다.


18. Multiple Nodes

ROS 2에서는 하나의 프로세스 안에서 여러 개의 노드를 실행할 수 있다.

ROS 1에서는 이러한 기능을 위해 nodelet이라는 개념이 사용되었다.

ROS 2에서는 이를 Components라고 한다.

Components를 사용하면 하나의 실행 파일 또는 프로세스 안에서 여러 노드를 구성할 수 있다.

또한 Intra-process Communication을 이용하면 프로세스 내부에서 발생하는 통신 오버헤드를 줄일 수 있다.

Process
 ├── Node A
 ├── Node B
 └── Node C

와 같은 구조로 구성할 수 있다는 것이 핵심이다.


19. Threading Model

ROS 2에서는 보다 세분화된 실행 모델을 제공한다.

이를 Executor라고 한다.

대표적으로 다음과 같은 Executor가 있다.

SingleThreadedExecutor
MultiThreadedExecutor

Single Threaded Executor는 하나의 스레드를 사용하고, Multi Threaded Executor는 여러 스레드를 사용하여 콜백을 처리할 수 있다.

따라서 프로그램의 구조와 작업 특성에 따라 적절한 실행 모델을 선택할 수 있다.


20. Messages

ROS 2에서도 메시지는 노드 간 데이터를 전달하는 중요한 요소이다.

메시지는 다음과 같은 통신 방식에서 사용된다.

  • Topic
  • Service
  • Action

ROS 2에서는 기존의 msg, srv, action 인터페이스뿐만 아니라 IDL(Interface Description Language)도 사용한다.

ROS 2 Interface
 ├── Topic
 ├── Service
 └── Action

그리고 ROS 2에서는 DDS를 사용하기 때문에 ROS 인터페이스와 DDS의 IDL 사이의 매핑이 이루어진다.

즉, ROS 2에서는 메시지 통신의 기본적인 개념은 유지하면서 DDS를 기반으로 통신 구조가 변경되었다.

이 부분은 앞선 Turtlesim 실습에서 확인했던 /turtle1/cmd_vel과도 연결된다.


21. Command Line Interface

ROS 2에서는 CLI 명령어를 통해 시스템의 상태를 확인하고 다양한 작업을 수행할 수 있다.

ROS 1과 ROS 2의 명령어를 비교하면 다음과 같다.

ROS 1
rostopic list

ROS 2
ros2 topic list

ROS 2에서는 대부분의 명령어가 ros2를 기본 명령으로 사용한다.

예를 들어 Topic 관련 명령어는 다음과 같은 형태이다.

ros2 topic list

이전에 Turtlesim 실습에서 사용했던 명령어도 같은 구조였다.

ros2 topic echo /turtle1/cmd_vel

ROS 2 CLI는 노드, 토픽, 서비스 등의 정보를 확인할 때 자주 사용하게 된다.


22. Launch

ROS에는 프로그램을 실행하는 대표적인 방법으로 run과 launch가 있다.

run은 하나의 프로그램을 실행할 때 사용한다.

ros2 run turtlesim turtlesim_node

반면 launch는 여러 프로그램과 설정을 한 번에 실행할 때 사용한다.

run
→ 단일 프로그램 실행

launch
→ 여러 프로그램 및 설정을 포함한 실행

ROS 1의 roslaunch와 비슷한 목적을 가지고 있지만 ROS 2에서는 보다 다양한 형식을 지원한다.

ROS 2 Launch에서는 다음과 같은 형식을 사용할 수 있다.

  • XML
  • YAML
  • Python

특히 Python을 이용하면 조건문이나 Python 모듈 등을 활용하여 보다 복잡한 실행 로직을 구성할 수 있다.


23. Graph API

ROS 시스템은 여러 구성요소가 서로 연결된 Graph 구조로 볼 수 있다.

대표적으로 다음과 같은 구성요소가 있다.

Package
   ↓
Node
   ↓
Topic
   ↓
Message

각 노드와 토픽에는 고유한 이름이 존재하고, 노드 사이의 통신 관계를 연결하여 ROS Graph를 구성할 수 있다.

ROS 2에서는 이러한 연결 관계를 시각적으로 확인할 수 있도록 rqt_graph를 제공한다.

앞선 실습에서 rqt를 실행해본 것처럼 ROS에서는 GUI 기반 도구를 이용해 시스템의 상태를 확인할 수 있다.

특히 rqt_graph를 사용하면 현재 실행 중인 노드와 토픽의 연결 관계를 그래프 형태로 확인할 수 있다.

rqt_graph 실습

Turtlesim과 키보드 조작 노드를 실행한 상태에서 다음 명령어를 실행했다.

rqt_graph

실행 후 rqt_graph의 새로고침 버튼을 눌러 현재 ROS Graph를 확인했다.

화면에서 /turtlesim과 /teleop_turtle 노드가 확인되었으며, 두 노드 사이에 /turtle1/cmd_vel 토픽을 통한 연결 관계가 표시되는 것을 확인할 수 있었다.

구조를 단순화하면 다음과 같다.

/teleop_turtle
       │
       │  /turtle1/cmd_vel
       ▼
   /turtlesim

/teleop_turtle은 키보드 입력을 받아 거북이의 이동 명령을 생성하고, /turtle1/cmd_vel 토픽을 통해 해당 데이터를 전달한다.

/turtlesim은 이 토픽을 받아 거북이를 움직인다.

이전에 직접 실행했던 다음 명령어와도 연결되는 부분이다.

ros2 run turtlesim turtle_teleop_key

그리고 토픽의 실제 데이터를 확인하기 위해 다음 명령어도 사용했다.

ros2 topic echo /turtle1/cmd_vel

키보드의 방향키를 누르면 다음과 같이 이동 명령이 전달되는 것을 확인할 수 있었다.

linear:
  x: 2.0
  y: 0.0
  z: 0.0

angular:
  x: 0.0
  y: 0.0
  z: 0.0

따라서 이번 실습에서는 단순히 노드가 실행되는 것뿐만 아니라 노드 → Topic → 노드 형태로 실제 통신이 이루어지는 과정까지 rqt_graph를 통해 시각적으로 확인할 수 있었다.


24. Embedded Systems

로봇에서는 센서 데이터를 수집하거나 모터를 제어하는 등 하드웨어와 직접 연결되는 부분이 중요하다.

이러한 작업에서는 제한된 자원과 실시간성이 중요한 경우가 많다.

ROS 2에서는 임베디드 시스템에 대한 지원도 고려하고 있다.

대표적으로 다음과 같은 기술이 소개되어 있다.

  • 시리얼 통신
  • Bluetooth
  • Wi-Fi
  • RTOS
  • DDS-XRCE
  • micro-ROS

특히 micro-ROS는 리소스가 제한된 마이크로컨트롤러와 ROS 2 시스템을 연결하기 위한 기술이다.

구조적으로 보면 다음과 같이 생각할 수 있다.

ROS 2 System
     │
     │ ROS 2 Communication
     ▼
Embedded System
     │
     ├── Sensor
     └── Motor

즉, ROS 2는 고성능 컴퓨터에서만 사용하는 것이 아니라 임베디드 시스템과 연결하여 실제 로봇 하드웨어를 제어하는 방향으로도 확장할 수 있다.


마무리

이번에는 ROS 2의 기본적인 사용법보다는 ROS 1에서 ROS 2로 발전하면서 무엇이 달라졌는지를 중심으로 정리해보았다.

이번 강의자료에서 다룬 ROS 2의 20가지 특징을 정리하면 다음과 같다.

번호특징주요 내용
1PlatformsLinux, Windows, macOS 지원
2Real-time실시간 시스템 지원
3SecurityDDS-Security, SROS 2
4CommunicationDDS 기반 통신
5Middleware InterfaceRMW를 통한 미들웨어 추상화
6Node DiscoveryDDS 기반 Dynamic Discovery
7LanguagesC++, Python 등 지원
8Build Systemament
9Build Toolscolcon
10Build OptionsMultiple Workspace, symlink 등
11Version Controlvcstool, .repos
12Client LibraryRCL, rclcpp, rclpy 등
13Life Cycle노드 상태 관리
14Multiple NodesComponents
15Threading ModelExecutor
16MessagesTopic, Service, Action
17CLIros2 명령어
18LaunchXML, YAML, Python
19Graph API노드와 토픽의 연결 관계
20Embedded Systemsmicro-ROS, DDS-XRCE 등

0개의 댓글