로봇 소프트웨어 개발을 위한 오픈소스 프레임워크로,
노드와 데이타의 통신을 프레임단위로 규격화해놓은 라이브러리와 다양한 디버깅 도구를 제공한다.

ROS1과 ROS2의 가장 큰 차이점은 DDS(Data Distribution Service)이다.
고유의 ROS 통신 프로토콜(TCP또는 UDP)을 사용하여 노드 간 데이터를 주고받는다. 중앙 노드인 ROS Master을 통해 노드 간 통신을 관리하여, Master가 다운되면 전체 시스템이 동작하지 않게 된다. 또한, 노드 간 데이터 통신을 세부적으로 조절할 수 없어 데이터 손실이 발생할 수 있다.
표준화된 DDS를 통신 미들웨어로 사용하여 동적 검색이 가능하다. 또한, Qos(Quality of Service)를 지원하여 전송 신뢰성, 우선순위, 대역폭, 메시지 손실 방지가 가능하다. 이를 통해 다양한 환경에 대응할 수 있는 통신 성능을 보장하여 실시간 제어 및 멀티 플랫폼에서 사용 가능하다.
| 특징 | ROS 1 (Custom Protocol) | ROS 2 (DDS 기반) |
|---|---|---|
| 통신 프로토콜 | 고유의 ROS TCP/UDP 프로토콜 | DDS (Data Distribution Service) |
| QoS 설정 | 제공하지 않음 | DDS QoS 설정 가능, 실시간성 및 신뢰성 제어 |
| 실시간 지원 | 제한적 실시간 지원 | 실시간 통신 지원, 실시간 제어 애플리케이션 가능 |
| 분산 시스템 | 중앙 ROS 마스터 필요 | 분산 시스템 지원, ROS 마스터 없이 동적 노드 연결 |
| 보안 | 기본적인 보안 기능 없음 | 메시지 암호화, 인증 및 보안 기능 제공 |
| 멀티캐스트 및 유니캐스트 | 제한적 멀티캐스트 지원 | 멀티캐스트 및 유니캐스트 모두 지원 |
sudo apt remove ~nros-humble-* && sudo apt autoremove
sudo rm /ect/apt/sources.list.d/ros2.list
sudo apt update
sudo apt autoremove
sudo apt upgrade
더 이상 ROS2를 사용할 일이 없다면 레포지토리도 완전히 삭제한다!
sudo rm /etc/apt/sources.list.d/ros2.list
sudo apt update
sudo apt autoremove
sudo apt upgrade
ROS는 코드의 재사용성을 위해 패키지와 노드 단위로 구성되어 있으며, 각 패키지는 다른 패키지와 상호 호환성을 위해 의존성을 갖게 된다. ROS2의 빌드 시스템은 colcon 이라는 빌드 도구 중심으로 동작한다.
colcon을 통해 패키지 빌드, 테스트, 패키지 배포 등의 기능을 수행할 수 있다.
ROS2의 작업 공간을 생성한다.
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
src : ROS2 패키지 저장 디렉토리
install : 빌드된 패키지가 설치된 디렉토리
build : 빌드 프로세스 중간에 생성되는 파일들이 저장된 디렉토리
colcon build 를 통해 빌드를 명령할 수 있다. 빌드는 꼭 ros2_ws에서 진행하자.
빌드가 완료되면 패키지는 install폴더에 설치된다.
C++에서는 CMake기반의 ament_cmake와 python에서는 setuptools를 사용하여 패키지를 생성한다. python에서 GUI프로그램을 사용할 예정이라면 ament_cmake를 입력하면 된다.
ros2 pkg create my_pkg --build-type ament_cmake
ros2 pkg create my_pkg --build-type ament_python
ros2 pkg create my_pkg --build-type ament cmake --dependencies <참조할 패키지>colcon build --packages-select my_pkgrm -rf build/ install/ logcolcon clean빌드가 완료 된 후, ROS2 환경을 활성화하기 위해 source install/setup.bash 명령어를 실행해야 한다.
colcon testcolcon test-result명령어를 수행하는 최소 단위로 ROS 네트워크 내에서 서로 통신하여 다양한 작업을 수행한다.
💡 Message란?
노드 간 통신을 위해 주고받는 데이터 단위
💡 비동기성 vs 동기성
✔ 비동기성 : 송신자가 데이터를 보낸 후, 수신자가 데이터를 받았는지 확인하지 않고 다른 작업이 가능
✔ 동기성 : 송신자가 데이터를 보낸 후, 수신자가 데이터를 받고 응답할때까지 기다려야 다른 작업이 가능
로봇의 동작에 필요한 정보를 가지고 있는 데이터 스트림이다. 센서 데이터(카메라, 라이다)나 상태 정보(로봇의 위치와 속도)를 전달하는데 사용된다. 메시지는 데이터 그 자체를, 토픽은 메시지를 전달하는 통로로써 데어터가 연속적으로 흐르며 전달된다.

로봇에게 서비스를 요청(request)하고 응답(response)을 받는 통신 매커니즘이다.

로봇의 동작을 실행하고 진행 상태를 피드백 하는 매커니즘이다. 로봇이 목표 위치로 이동하는 동안 진행 상황(이동 중인지, 장애물에 부딪혔는지)을 피드백받고, 사용자가 중간에 중지 명령을 내릴 수 있다.


💡 서비스 vs 액션
✔ 서비스: 단순하고 즉각적인 요청-응답 처리, 서비스 서버에게 직접 동작 명령
✔ 액션: 장기간 지속되는 작업을 수행, 피드백 토픽을 통해 작업 진행 상태를 모니터링하고 업데이트하며 동작 수행
| 메커니즘 | 특징 | 예시 | 통신 방식 |
|---|---|---|---|
| 토픽(Topic) | 비동기적, 발행-구독 모델 | 센서 데이터 전송 | 단방향, 지속적인 데이터 전송 |
| 서비스(Service) | 동기적, 요청-응답 모델 | 특정 작업 요청(예: 목표 위치 설정) | 양방향, 즉시 응답 필요 |
| 액션(Action) | 비동기적, 상태 추적 및 피드백 제공 가능 | 장기 작업(예: 경로 따라가기) | 양방향, 진행 상태와 결과 전달 |

💡 예시 - 로봇이 목표 위치로 이동하는 과정
- 목표 위치 설정 : 서비스
- 서버 클라이언트가 서버에게 목표 위치 요청 - 서비스 서버가 목표 위치 설정 응답 반환
- 경로 계획 및 이동 : 액션
- 서비스가 직접 요청을 보낸것이 아닌, 노드 내에 저장되거나 공유된 목표를 액션클라이언트가 참조하여 수행 or 개별적으로 목표 수행
- 액션 클라이언트가 "목표 위치로 이동"을 액션 서버에 작업 요청
- 이동 하는 동안 액션 서버는 로봇 진행 상황을 피드백을 통해 액션 클라이언트에게 전송
- 목표 위치에 도달하면 서버는 작업 결과 메시지를 액션 클라이언트에게 보내고 작업이 종료
- 서비스 서버에게 로봇의 작업 상태를 송신하여 서버가 작업 상태를 업데이트 할 수도 있음
- 센서 데이터 및 상태 정보 : 토픽
- 로봇이 목표 위치로 이동하는 동안 피드백 토픽을 통해 로봇의 상태와 센서 데이터를 지속적으로 전송