# ROS2 Humble 설치 요구사항

#### 지원 운영체제

ROS2 Humble은 주로 Ubuntu 22.04(Jammy) LTS에서 가장 안정적으로 지원된다. 공식 문서에서도 Ubuntu 22.04를 권장하며, 그 외에 다음과 같은 환경에서 설치 및 동작이 가능하다.

* Debian 기반 리눅스 환경
* Windows 10(빌드 19044 이상) 또는 Windows 11
* macOS 11 이상(Big Sur 이상)

그러나 운영체제별로 일부 기능과 패키지 지원에 차이가 있을 수 있다. 특히 Windows나 macOS 환경에서는 리눅스 환경 대비 네트워킹 및 일부 편의 툴에서 제약이 발생할 가능성이 높다. 따라서 본격적인 개발 환경을 구축하려면 가장 호환성이 높은 Ubuntu 22.04 환경을 권장한다.

#### 호환 하드웨어 사양

ROS2 Humble 환경의 요구사항은 기존 ROS1 버전 대비 유사하거나 약간 증가했다. 대규모 시뮬레이션이나 복잡한 알고리즘을 실행해야 한다면 충분한 CPU와 메모리가 필요하다. 일반적으로 다음 사양 이상을 권장한다.

* CPU: AMD64 또는 x86\_64 아키텍처의 멀티코어 프로세서 (4코어 이상 권장)
* 메모리(RAM): 8GB 이상 (16GB 이상 권장)
* 저장공간: 20GB 이상의 여유 공간
* GPU: NVIDIA CUDA 기반 GPU가 있는 경우 시뮬레이션 및 GPU 가속 라이브러리 활용 가능

하드웨어가 너무 낮으면 빌드 및 실행 속도가 느려지거나 RViz, 시뮬레이터(Gazebo, Ignition 등) 구동 시 성능 저하가 심할 수 있다.

#### ROS2 공식 지원 환경

ROS2 Humble은 아래와 같은 플랫폼에서 빌드를 테스트하고 배포한다. (임베디드 환경이나 ARM 아키텍처에서도 동작 가능하지만, 별도의 크로스컴파일 설정이 필요할 수 있다.)

* Ubuntu 22.04 (Jammy) LTS
* ROS2의 빌드 도구(colcon), CMake, Python 3.10 이상
* DDS(Data Distribution Service) 구현체: Fast DDS, Cyclone DDS, Connext DDS 등

공식 문서의 호환 목록에는 여러 DDS 구현체가 포함되어 있으나, 일반적으로 Fast DDS 또는 Cyclone DDS가 오픈소스 커뮤니티에서 활발히 사용된다.

#### Python 버전

ROS2 Humble은 Python 3.10 이상을 요구한다. Ubuntu 22.04에는 Python 3.10이 기본 설치되어 있으므로 별도의 추가 설정 없이 사용할 수 있다. Python 스크립트 노드나 rclpy 패키지를 활용하는 프로젝트를 진행하려면 다음을 확인해야 한다.

* `python --version` 명령어로 Python 버전 확인
* 가상 환경(venv) 사용 시 rosdep, colcon 등 툴을 해당 venv에 설치

Python 버전이 맞지 않으면 rclpy 패키지에서 오류가 발생하거나 일부 의존성이 정상적으로 설치되지 않을 수 있다.

#### CMake 버전

ROS2를 빌드하려면 최소 CMake 3.8 이상이 필요하다. Ubuntu 22.04 환경에서 기본 제공되는 CMake 버전은 이를 만족하나, 더 최신 버전을 사용해도 무방하다. CMake를 최신 버전으로 업데이트하는 경우, PPA(개인 패키지 저장소)를 통해 설치하거나 소스 컴파일을 통해 수동으로 설치할 수 있다.

아래는 CMake 버전을 확인하는 간단한 명령어 예시다.

```
cmake --version
```

만약 이 명령어 결과가 3.8 미만이라면 CMake를 반드시 업데이트해주어야 한다.

#### 빌드 필수 도구

ROS2 Humble 환경을 설치하고 빌드하기 위해서는 여러 패키지와 빌드 도구가 필요하다. 일반적으로 아래와 같은 패키지를 추가로 설치해야 한다.

* build-essential (C++ 컴파일러 및 링크 툴)
* curl, wget (네트워크 파일 다운로드)
* git (소스 버전 관리 툴)
* locales (로케일 설정, UTF-8 환경)
* libpython3-dev (Python C API 사용 시 필요)
* python3-colcon-common-extensions (ROS2 빌드 도구)
* python3-rosdep, python3-vcstool (ROS 의존성 관리 툴, 멀티 레포지토리 클론 툴 등)

이 외에도 rclcpp, rclpy, sensor\_msgs 등 주요 ROS2 라이브러리가 의존하는 패키지가 설치되어야 한다. 일반적으로 rosdep을 활용하여 자동으로 필요한 패키지를 설치하는 과정을 거치면 대부분 해결된다.

#### Docker 환경에서의 요구사항

Docker를 활용하면 호스트 시스템을 오염시키지 않고 격리된 컨테이너 내에서 ROS2 Humble을 동작시킬 수 있다. 공식적으로 Docker Hub에는 ROS2 Humble 이미지를 제공하므로, 별도의 설치 과정을 최소화하고 빠르게 개발 환경을 구성할 수 있다.

* **Docker 버전**: 20.10 이상 권장
* **Docker Compose 버전**: 2.x 이상 (여러 컨테이너를 동시에 관리할 경우)
* **호스트 GPU 연동**: 시뮬레이션 및 3D 가속이 필요한 경우, NVIDIA Docker(혹은 nvidia-container-toolkit)를 통해 GPU를 컨테이너로 전달해야 한다.

아래는 Docker를 사용하는 일반적인 흐름 예시다.

공식 ROS2 Humble Docker 이미지 Pull

```
docker pull osrf/ros:humble-desktop
```

컨테이너 실행 시 필요한 포트나 볼륨을 노출

```
docker run -it \
  --name ros2_humble_dev \
  -v /home/user/ros2_ws:/home/ros2_ws \
  osrf/ros:humble-desktop \
  bash
```

컨테이너 내부에서 colcon 빌드, rosdep 설치 등을 수행

Docker 컨테이너가 정상적으로 동작하기 위해서는 호스트 시스템에서 네트워크, 볼륨 마운트, GPU(옵션) 등의 구성이 올바르게 설정되어 있어야 한다. 또한 GUI 애플리케이션(RViz, rqt 등)을 사용하려면, X11 포워딩 또는 VirtualGL 등 별도 설정이 필요할 수 있다.

#### 네트워크 및 DDS 관련 요구사항

ROS2는 DDS(데이터 분산 서비스) 프로토콜을 기반으로 노드 간 통신을 수행한다. DDS 구현체별로 네트워킹 요구사항이 다르지만, 공통적으로 다음 사항에 유의해야 한다.

* **포트 개방**: 노드 간 데이터 송수신을 위한 포트를 방화벽에서 허용해야 한다. 각 DDS 구현체는 기본 포트 범위를 사용하며, 노드 수가 늘어날수록 포트 사용 범위가 증가할 수 있다.
* **멀티캐스트 설정**: 기본적으로 일부 DDS 구현체(예: Fast DDS)는 멀티캐스트를 활용한다. 네트워크 스위치나 라우터에서 멀티캐스트 트래픽이 차단되는지 확인이 필요하다.
* **QoS(서비스 품질) 프로필**: DDS는 다양한 QoS 프로필을 제공하므로, 임베디드 기기나 무선 네트워크 환경에서 QoS 설정을 적절히 조정해야 통신 장애를 줄일 수 있다.

네트워크가 불안정하거나 멀티캐스트가 제한된 환경이라면, RTPS(Reliable Transport Protocols for DDS) 포트를 직접 지정하거나 unicast-only 설정을 고려해야 한다.

#### 그래픽 드라이버

RViz, Gazebo, Ignition 등의 3D 시뮬레이션 및 시각화 툴을 원활히 사용하려면 시스템에 적절한 그래픽 드라이버가 설치되어 있어야 한다. 특히 NVIDIA GPU를 사용하는 경우에는 다음과 같은 드라이버가 필요하다.

* NVIDIA 프로프라이어터리 드라이버(440.xx 이상 권장)
* CUDA(옵션), cuDNN(옵션)

Intel, AMD GPU를 사용하는 경우에도 각 벤더의 공식 드라이버가 설치되어 있어야 RViz 등의 OpenGL 기반 애플리케이션이 정상적으로 구동된다.

#### ARM 아키텍처 및 임베디드 환경

ROS2 Humble은 ARMv8(aarch64) 아키텍처용 바이너리를 공식적으로 제공한다. NVIDIA Jetson 시리즈(예: Jetson Nano, Jetson Xavier)나 Raspberry Pi(64비트 OS를 사용하는 모델)에서 ROS2 Humble을 사용할 수 있다.

* **Jetson 시리즈**: CUDA, TensorRT 등의 구성 요소와 함께 사용할 경우, JetPack SDK 버전에 맞춰 ROS2 패키지를 설치해야 한다.
* **Raspberry Pi 4 이상**: 64비트 운영체제(예: Ubuntu Server 22.04 for Raspberry Pi)에서 공식 패키지 설치가 가능하다.
* **성능 이슈**: 임베디드 환경에서는 CPU 및 메모리가 제한적이므로, ROS2 빌드를 소스에서 직접 하지 않는 것이 좋다. 가능하다면 바이너리 패키지를 설치하거나 크로스컴파일 도구체인을 활용한다.

여러 기능 패키지(rqt, nav2, perception 등)를 모두 설치하면 저장공간 부족 문제가 발생할 수 있으므로, 사용자가 필요한 패키지만 선별 설치하는 전략이 필요하다.

#### 병렬 빌드 및 시스템 자원

ROS2 프로젝트는 colcon을 통해 병렬 빌드가 가능하다. 시스템 사양에 맞춰 최적의 병렬 작업 개수를 설정하면 빌드 시간을 단축할 수 있다.

colcon 병렬 빌드:

```
colcon build --parallel-workers 8
```

Make 백엔드의 병렬 빌드:

```
MAKEFLAGS="-j8"
```

코어나 스레드 수가 많은 환경에서 병렬 빌드를 적절히 활용하면 개발 속도를 크게 높일 수 있다. 반대로 임베디드 환경 등에서 CPU 자원이 부족할 때는 병렬 작업 개수를 줄이거나 단일 스레드로 빌드하는 것이 안정적일 수 있다.

#### 추가 요구사항 요약 (mermaid 예시)

아래 다이어그램은 ROS2 Humble 설치를 위해 고려해야 할 주요 요구사항을 개괄적으로 표현한다.

{% @mermaid/diagram content="flowchart TD
A\["운영체제 (Ubuntu 22.04 권장)"]
B\["필수 패키지 (build-essential, git 등)"]
C\["DDS 설정 (Fast DDS, Cyclone DDS)"]
D\["Python 3.10 이상"]
E\["CMake 3.8 이상"]
F\["네트워크 환경 (멀티캐스트/포트 개방)"]
G\["GPU/그래픽 드라이버"]

```
A --> B
B --> D
B --> E
C --> F
B --> C
G --> B" %}
```

#### 실시간(Real-Time) 커널 환경

ROS2 Humble에서는 실시간 시스템(예: 로봇 제어, 산업 자동화 등)이 요구될 때 RT-PREEMPT(Real-Time Preempt) 커널 혹은 별도의 실시간 OS에서 실행하는 방식을 고려할 수 있다. 일반적인 Linux 배포판(예: Ubuntu 22.04)은 기본적으로 실시간 커널이 포함되어 있지 않으므로, 별도의 커널 설치 또는 패치 작업이 필요하다.

**RT-PREEMPT 패치**: 특정 커널 버전에 대해 **PREEMPT\_RT** 패치를 적용한 후, 이를 빌드하여 설치해야 한다.

**스케줄러 설정**: 실시간 우선순위를 가진 스레드를 활용하려면 `chrt`나 `rtprio` 등의 설정이 필요하다. ROS2 노드나 DDS 레이어에서 실시간 우선순위를 부여할 수 있도록 OS 측 설정을 진행해야 한다.

실시간 커널을 운영하게 되면 레이턴시가 감소하고, 안정적인 응답 시간을 보장할 수 있지만, 일반 커널보다 설정 및 유지보수가 복잡해질 수 있다.

#### SROS2(보안 ROS2) 고려사항

ROS2에서는 DDS에 내장된 보안 기능(Access Control, Cryptography 등)을 활용할 수 있는데, 이를 SROS2(Secure ROS2)라고 부른다. 개발 환경에서 보안을 강화하려면 다음과 같은 요소를 확인해야 한다.

**DDS 보안 플러그인**: Fast DDS, Cyclone DDS 등에서 보안 플러그인을 활성화하여 DDS Security 스펙에 맞춰 통신 암호화를 진행한다.

**보안 아티팩트 생성**:SROS2 도구를 통해 인증서, 키, 정책 파일 등을 생성하고, 각 노드에 배포해야 한다.

**환경 변수 설정**: 보안 디렉토리(`ROS_SECURITY_ROOT_DIRECTORY`) 등을 명시적으로 지정해주어야 한다.

보안이 활성화된 환경에서는 통신 오버헤드가 증가할 수 있으므로, 성능과 보안 요구사항 간의 트레이드오프를 고려해야 한다.

#### Windows 환경 요구사항

ROS2 Humble을 Windows에서 사용하려면 다음 요구사항을 충족해야 한다.

* **Windows 10 빌드 19044 이상 또는 Windows 11** MSVC(Visual Studio 2019 이상) 툴체인과 호환되는지를 확인해야 한다.
* **Visual Studio** C++ 개발을 위해 Visual Studio 2019(VC++ 14.2) 이상이 필요하다.
* **Chocolatey, Winget 등** 패키지 매니저를 통해 편리하게 CMake, Git, Python 등 의존성을 설치할 수 있다.
* **Microsoft C++ Redistributable** 일부 런타임 라이브러리에 의존성이 있으므로, 런타임 설치가 누락되지 않았는지 확인해야 한다.

Windows에서는 파일 경로 제한, 네트워크 설정, PowerShell 스크립트 실행 정책 등에서 리눅스와 다른 제약이 있으므로, 공식 문서에 안내된 설정 사항을 준수해야 한다.

#### macOS 환경 요구사항

macOS 환경에서 ROS2 Humble을 사용하려면 다음 항목을 충족해야 한다.

* **macOS 11(Big Sur) 이상** Apple Silicon(M1, M2 시리즈 등)에서도 Homebrew를 통한 바이너리 혹은 소스 빌드 형태로 ROS2를 설치할 수 있다.
* **Xcode** C++ 컴파일러 툴체인 및 Command Line Tools를 설치해야 한다.
* **Homebrew** CMake, Python, OpenSSL 등 의존성을 설치할 때 주로 활용된다.
* **Apple Silicon 호환** 일부 패키지는 Rosetta 2를 통해 x86\_64 바이너리를 에뮬레이션해야 할 수도 있으므로, Native Apple Silicon 지원 여부를 확인해야 한다.

macOS에서 RViz, Gazebo, Ignition 시뮬레이터 등 그래픽 애플리케이션을 사용할 때, 시스템 보안 정책(게이트키퍼 등)과 OpenGL/Metal 호환성 이슈에 유의해야 한다.

#### 추가 Python 패키지 의존성

ROS2는 Python 스크립트를 통해 빌드 스크립트(colcon), 테스트, 노드(예: rclpy) 등을 제어하는 경우가 많다. 따라서 개발 중에 자주 사용되는 Python 패키지가 있다면 미리 설치해두는 것이 효율적이다.

* **numpy, scipy** 센서 데이터 처리, 간단한 수학 연산 등에 자주 활용된다.
* **matplotlib, plotly** 시각화 및 데이터 분석을 위한 라이브러리.
* **OpenCV-python** 영상 처리, 컴퓨터 비전 작업 시 활용 가능.

패키지 설치 시 pip(혹은 venv)에서 ROS2 환경과 버전 충돌이 없는지 확인하고, 가상 환경을 통해 프로젝트별로 패키지 버전을 분리 관리하는 것이 바람직하다.

#### 대규모/멀티머신 환경 고려

ROS2는 분산 환경에서 여러 노드가 통신하는 구조를 지원하기 때문에, 대규모 로봇 시스템 혹은 멀티머신 환경에서 다음 요구사항을 고려해야 한다.

* **Domain ID** 여러 로봇(네임스페이스)을 분리하려면 ROS\_DOMAIN\_ID 환경 변수를 다르게 설정한다.
* **Discovery 설정** DDS discovery가 멀티캐스트나 unicast를 사용하는지, Discovery Server를 통해 중앙 집중형 구조를 사용할지를 결정한다.
* **클럭 동기화** 메시지 타임스탬프나 TF(Transform) 연산 정확도를 위해서 ntp, chrony 등으로 시스템 시간을 동기화하는 것이 좋다.
* **QoS 프로필 설계** 대규모 환경에서는 네트워크 부하와 메시지 손실 가능성이 크므로, Reliability, Durability, Deadline 등의 QoS 옵션을 적절히 조정해야 한다.

멀티머신 네트워크 구성이 복잡할수록 DDS 레벨의 설정 파일(예: Fast DDS XML, Cyclone DDS TOML 등)을 통해 세부 파라미터를 튜닝하게 된다.

#### 환경 변수 설정

ROS2 Humble을 원활히 활용하려면 ROS 관련 환경 변수를 올바르게 설정해야 한다. ROS1과 달리 ROS2에서는 `$ROS2_WS/install/local_setup.*` 스크립트를 통해 대부분 자동 세팅되지만, 다음 항목을 확인해 두는 것이 좋다.

**`ROS_DOMAIN_ID`:**

서로 다른 물리 시스템(로봇, 시뮬레이터 등) 간의 통신 충돌 방지를 위해 도메인 아이디를 다르게 설정할 수 있다.

```
export ROS_DOMAIN_ID=23
```

**`RMW_IMPLEMENTATION`:**

사용 중인 DDS 구현체에 따라 rmw 계층(ROS Middleware Layer)을 전환할 수 있다. 예: `rmw_fastrtps_cpp`, `rmw_cyclonedds_cpp` 등.

```
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
```

**`ROS_SECURITY_ROOT_DIRECTORY`**:

SROS2를 사용할 때, 인증서, 키, 정책 파일 등이 저장된 디렉토리를 지정한다.

**`PATH, LD_LIBRARY_PATH`**:

ROS2 실행 파일 및 라이브러리 경로가 쉘에 등록되어 있어야 한다. `$source /opt/ros/humble/setup.bash` 등을 통해 자동 설정하거나, 별도 경로에 설치한 경우 수동으로 설정한다.

#### 셸(Shell) 선택 및 설정

ROS2 개발 환경에서 주로 사용하는 셸은 Bash나 Zsh이다. 어느 셸이든 크게 상관은 없으나, 다음과 같은 설정을 권장한다.

**자동 완성 기능(Autocompletion)**:

colcon, ros2 명령어 자동 완성 스크립트를 `$HOME/.bashrc` 또는 `$HOME/.zshrc`에 등록한다.

**로컬 워크스페이스 병행 사용**:

`source /opt/ros/humble/setup.bash` `source ~/ros2_ws/install/local_setup.bash` 여러 버전(ROS2 Foxy, Humble 등)을 동시 설치한 뒤 사용할 경우, 원하는 버전을 가장 마지막에 source 해야 한다.

**프롬프트 설정**:

환경에 따라 `$ROS_DOMAIN_ID` 또는 현재 활성화된 ROS2 버전을 프롬프트에 표시하면 편리하다.

#### 시리얼 통신 및 I/O 권한

실제 로봇에 센서나 모터 컨트롤러를 연결할 때, 시리얼 포트(USB, UART 등)를 사용하거나 GPIO/I2C 등을 활용해야 할 수 있다.

dialout 그룹 가입:

Ubuntu 기준으로 `/dev/ttyUSB*`, `/dev/ttyACM*` 등 시리얼 포트 접근 권한이 필요하다면, 사용자를 dialout 그룹에 추가해야 한다.

```
sudo usermod -a -G dialout <사용자이름>
```

**udev 규칙 설정**

특정 센서나 디바이스를 별도의 심볼릭 링크로 연결하려면 `/etc/udev/rules.d` 폴더에 규칙 파일을 작성하여 디바이스 식별자를 고정할 수 있다.

**권한 확인**

임베디드 보드나 Docker 환경에서도 동일하게 시리얼 포트 사용 권한을 부여해야 한다.

#### Time Synchronization(시간 동기화)

ROS2는 메시지의 타임스탬프를 기반으로 TF(Transform) 연산이나 로깅, 센서 융합(fusion)을 수행한다. 분산 환경에서 여러 장치가 서로 다른 시간을 가지면 문제가 발생할 수 있다.

* **NTP(네트워크 타임 프로토콜)** 로컬 네트워크에서 여러 기기(PC, 임베디드 보드 등)를 시간 동기화하기 위해 ntp나 chrony 같은 서비스를 구동한다.
* **하드웨어 클럭** 임베디드 보드에서 RTC(Real-Time Clock)가 정확히 유지되는지 확인한다.
* **DDS 내장 타임싱크** 일부 DDS 구현체에서 내부적으로 타임싱크 기능을 제공할 수 있지만, 정확도가 일반 NTP 대비 떨어질 수 있으므로 주의한다.

#### 추가 디버깅 및 모니터링 툴

ROS2 애플리케이션을 디버깅하고 성능을 모니터링하기 위해 다음 툴들을 고려할 수 있다.

* **ROS2 CLI 툴(ros2 topic, ros2 service 등)** 토픽 퍼블리셔/서브스크라이버 상태, 서비스 호출 등을 확인할 수 있다.
* **RQT 그래프(rqt\_graph)** 노드-토픽 연결 관계를 GUI로 시각화해 문제를 빠르게 발견한다.
* **RViz** 센서 데이터, 로봇 상태 등을 3D로 시각화하여 이해하기 쉽다.
* **System-level 툴** `htop`, `nmon`, `iotop` 등을 통해 CPU/메모리/IO 사용량을 모니터링하며, 병목 상태를 찾아낸다.
* **네트워크 트래픽 분석** wireshark, tcpdump 등으로 DDS 트래픽이 제대로 송수신되고 있는지 확인한다.

추가로, logging 설정(`rcutils_logging`)을 통해 원하는 수준의 로깅(오류, 경고, 정보, 디버그)을 제어할 수 있다.

#### 빌드 캐시 및 점진적 빌드

ROS2 프로젝트가 커질수록 빌드 시간이 점점 증가하게 된다. colcon을 활용한 빌드 최적화 방안은 다음과 같다.

**ccache**:

C/C++ 컴파일 시 중복 빌드를 캐싱해주는 툴. 다음과 같이 설치 후 설정할 수 있다.

```
sudo apt-get install ccache
export PATH="/usr/lib/ccache:$PATH"
```

그리고 CMake 옵션으로 `-DCMAKE_CXX_COMPILER_LAUNCHER=ccache` 등을 지정하거나, colcon 빌드시 환경 변수를 설정한다.

**Incremental build**:

colcon은 기본적으로 변경된 부분만 재빌드하며, 설치 단계는 `--merge-install` 옵션을 통해 개선할 수 있다.

```
colcon build --merge-install
```

**패키지 단위 빌드**:

특정 패키지만 빌드하려면 `colcon build --packages-select <패키지명>` 명령어로 시간을 절약할 수 있다.

#### 로깅 및 분석

ROS2 Humble은 로깅 메시지를 Bag 파일(ROS2 Bag)로 기록해두고, 이를 추후에 플레이백하여 디버깅할 수 있다.

**ros2 bag record**:

필요한 토픽을 선별적으로 녹화(Record)한다.

```
ros2 bag record /camera/image_raw /scan
```

**ros2 bag play**:

기록한 Bag 파일을 재생(Play)하여, 실제 센서가 없더라도 과거 데이터를 기반으로 알고리즘을 테스트할 수 있다.

**ros2 bag info**:

Bag 파일에 기록된 토픽 목록, 메시지 수, 타임스탬프 범위 등을 조회한다.

**Bag 파일 분석**:

Python API나 rqt\_bag2, Foxglove Studio 등을 활용해 대규모 로그 데이터를 시각화, 분석할 수 있다.

이러한 로깅 및 재생 기능은 필드 테스트나 시뮬레이션 중 발생한 문제를 사후에 분석하는 데 매우 유용하다.

#### 소스 설치 고려사항

ROS2 Humble을 설치할 때, 패키지 매니저(apt, Homebrew 등)를 통한 바이너리 설치 대신 소스에서 직접 빌드하는 상황도 발생할 수 있다. 주로 다음과 같은 경우에 소스 설치를 고려한다.

* **최신 기능** 테스트: 디스트리뷰션에 포함되지 않은 최신 기능이나 버그 수정된 브랜치를 사용해야 할 때
* **커스텀 패치 적용**: 특정 패키지에 커스텀 기능이나 패치를 적용해야 할 때
* **비표준 환경**: 공식적으로 지원하지 않는 OS 버전, 툴체인, 아키텍처 등에 맞춰 자유롭게 빌드해야 할 때

소스 설치 시 유의해야 할 점은 다음과 같다.

**ROS2 리포지토리 목록 준비:** `ros2.repos` 파일(또는 변형된 버전)을 내려받고, `vcs` (vcstool) 명령어를 통해 여러 패키지를 일괄 체크아웃할 수 있다.

```
mkdir -p ~/ros2_humble_src
cd ~/ros2_humble_src
wget https://raw.githubusercontent.com/ros2/ros2/humble/ros2.repos
vcs import < ros2.repos
```

**의존성 설치**: 모든 패키지가 의존하는 시스템 라이브러리를 rosdep을 통해 설치한다.

```
rosdep install --from-paths src --ignore-src -y --rosdistro humble
```

**colcon 빌드:** 환경 변수(CMake 옵션 등)를 적절히 설정한 뒤 colcon으로 빌드한다.

```
colcon build --symlink-install
source install/local_setup.bash
```

**지속적 업데이트**: ROS2 메인 개발 브랜치를 사용하면 패키지가 자주 업데이트되므로, `git pull`, `vcs pull` 등으로 변경분을 받아야 한다.

소스 빌드는 시간이 오래 걸릴 수 있으며, 빌드 실패 시 의존성 충돌, 특정 브랜치 이슈 등을 일일이 확인해야 하므로 초보자에게는 바이너리 설치를 권장한다.

#### 패키지 선택 설치

ROS2 Humble에는 데스크톱용, 베이스용, ROS-Base 등 다양한 메타 패키지가 제공된다. 다음은 예시 메타 패키지 목록이다.

* **ros-humble-ros-base**: 핵심 ROS2 라이브러리와 주요 CLI 툴, 통신 스택만 포함
* **ros-humble-desktop**: RViz, rqt 등의 GUI 툴 포함 (시각화, 디버깅을 위한 데스크톱 환경)
* **ros-humble-desktop-full**: 시뮬레이션 툴(Gazebo)까지 포함 (일부 버전에서는 별도 제공 가능)

사용 목적에 맞춰 메타 패키지를 선택하여 설치하면, 불필요한 패키지로 인한 디스크 사용량 및 빌드 시간을 절약할 수 있다.

#### clang/clang-tidy, sanitizer 활용

일부 개발자는 GCC 대신 Clang 컴파일러를 사용하거나, 런타임 디버깅 목적으로 AddressSanitizer(ASan), ThreadSanitizer(TSan) 등을 활용한다. 다음과 같은 사항을 참고한다.

**Clang 컴파일러 설정**: `$CXX=clang++` 와 `$CC=clang` 를 지정하거나, CMake 설정에서 `-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang` 를 적용한다.

**AddressSanitizer**: 동적 메모리 사용 오류를 체크하는 데 유용하며, ROS2 노드 실행 시 메모리 누수 혹은 잘못된 접근이 발생하면 즉시 경고를 표시한다.

```
colcon build \
  --cmake-args -DCMAKE_CXX_FLAGS="-fsanitize=address" -DCMAKE_LINKER_FLAGS="-fsanitize=address"
```

**ThreadSanitizer**: 멀티스레드 환경에서의 동기화 오류(데드락, 데이터 레이스 등)를 검출한다.

**clang-tidy**: 코드 정적 분석 도구로, colcon 빌드 시 CMake 옵션이나 mixins 설정을 통해 자동으로 코드 품질을 점검한다.

이러한 도구들은 실시간 환경이나 최적화 환경(Release 빌드)에서는 오버헤드가 크므로, 주로 디버깅 또는 테스트 단계에서 사용한다.

#### 다국어 로케일 설정

ROS2 메시지에 UTF-8 문자열이 포함되거나, 로케일 환경이 다른 시스템과 교차할 경우 문제가 생길 수 있다. 다음과 같은 설정을 권장한다.

**로케일 설정 Ubuntu 예시**:

```
sudo locale-gen en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
```

**환경 변수 확인**: `$locale` 명령어로 현재 설정을 확인하고, `$LANG`, `$LC_ALL` 등이 UTF-8로 설정되었는지 점검한다.

**메시지 프로토콜**: DDS 레벨에서 언어와 상관없이 UTF-8 인코딩을 유지하도록 주의하며, 유니코드 문자 처리가 필요한 경우 노드에서 Python 3의 UTF-8 모드가 올바르게 동작하는지 확인한다.

#### 테스트 및 CI 환경

ROS2 프로젝트의 품질을 높이려면 자동화된 빌드 및 테스트(CI/CD) 파이프라인을 구축하는 것이 도움이 된다.

**Github Actions, GitLab CI**: Ubuntu 22.04 기반 Docker 이미지에서 colcon 빌드, rosdep 설치, 자동 유닛 테스트를 수행할 수 있다.

**colcon test**: gtest, pytest 등을 활용하여 단위 테스트 작성 후 colcon으로 통합 실행할 수 있다.

**coverage**: 코드 커버리지 도구(lcov, gcov 등)를 통해 테스트 범위를 측정한다.

**성능 벤치마크**: eProsima Fast DDS Monitor, Apex.AI Performance Test 등 ROS2 전용 성능 테스트 툴을 고려해볼 수 있다.

CI 환경에서 빌드 캐시나 Docker 레이어 캐싱 등을 활용하면 ROS2 대규모 빌드 시간을 단축시킬 수 있다.

#### 유지보수 기간 및 업데이트 주기

ROS2 Humble은 LTS(Long Term Support) 디스트리뷰션으로, 일정 기간 보안 패치 및 버그 수정이 제공된다. (일반적으로 ROS2의 LTS는 출시 후 2\~3년간 주요 업데이트를 지원한다.)

**패치 릴리스**: ROS2 Core 패키지나 주요 패키지의 버그가 수정되면, 패치 릴리스가 배포된다. apt나 기타 패키지 매니저를 통해 업데이트 가능하다.

**브레이킹 체인지**: LTS 릴리스 내에서는 호환성을 크게 깨뜨리는 변경이 발생하지 않으나, minor 버전 업그레이드 시 일부 API가 제거되거나 비권장(deprecated)될 수 있다.

**업그레이드 경로**: 다음 버전 LTS로 업그레이드를 준비할 경우, 종속성(특히 C++17 이상, Python 버전 등)을 점검하여 호환성을 미리 확보해야 한다.

ROS2 Humble 환경을 안정적으로 유지하려면 정기적으로 업데이트(apt upgrade)하고, 패키지 호환성 테스트를 진행해야 한다.
