# 배운 내용 정리와 주요 핵심 포인트

#### ROS2 Humble의 철학과 목표

ROS2는 기존 ROS1의 제한점을 극복하기 위해 설계된 차세대 로봇 소프트웨어 프레임워크이다. ROS2 Humble은 각 배포판마다 누적되어 온 성능 개선과 추가 기능을 통합하면서도, 개발자의 접근성을 높이고 산업 현장에서의 실용성을 더욱 강화하기 위한 목표를 가진다. 특히 다음과 같은 철학과 목표가 강조된다.

* **이식성(Portability)**: 여러 OS 및 다양한 하드웨어 플랫폼에서 동작하도록 설계되었다. 이를 통해 로봇 개발자들은 시스템 간 호환성 문제를 최소화할 수 있다.
* **실시간성(Real-Time)**: DDS(Data Distribution Service)를 기반으로 하여 높은 신뢰도와 실시간성을 제공한다. 로보틱스 애플리케이션에서 요구되는 빠른 제어 주기에 대응할 수 있도록 적절한 QoS 정책을 지원한다.
* **보안(Security)**: DDS 보안 계층을 활용해 메시지 암호화, 인증과 권한 부여를 포함한 신뢰성 높은 통신을 가능하게 한다.
* **유연성(Flexibility)**: 노드 간 통신 인터페이스를 더욱 유연하게 구성할 수 있으며, 기존 ROS1 브리지 등을 통해 점진적으로 ROS2로의 이전을 지원한다.

ROS2 Humble은 이전 버전인 Foxy, Galactic, Rolling 등의 경험을 토대로, 개발자 편의성과 안정성을 동시에 고려하는 주요 플랫폼으로 자리잡고 있다.

#### ROS2 Humble에서의 구조적 차이

ROS2는 기본 아키텍처 측면에서 ROS1과 상이한 부분이 많다. 그중에서도 통신 계층의 변경이 가장 큰 변혁이라고 할 수 있는데, ROS1의 TCP/UDP 통신에서 DDS로 전환한 점이 대표적이다. ROS2 Humble에서는 아래와 같은 구조적 특징을 중점적으로 파악할 수 있다.

1. **미들웨어 추상화 계층(RMW, ROS Middleware)**
   * DDS를 기반으로 하며, 각종 DDS 구현체(eProsima Fast DDS, RTI Connext DDS 등)에 대해 추상화 계층을 둔다.
   * 개발자는 특정 DDS 구현체의 내부 로직에 얽매이지 않고 통일된 RMW 인터페이스를 활용한다.
2. **노드 구성 방식(Node Composition)**
   * 하나의 프로세스 내에서 여러 노드를 구성(Composition)할 수 있는 구조를 통해 자원 활용도를 높이고, 상호 통신 지연을 줄일 수 있다.
   * 별도의 실행 파일을 생성하지 않고도 Node를 마치 모듈처럼 추가·삭제할 수 있어 시스템 확장성에 유리하다.
3. **QoS 설정의 유연성**
   * ROS1에서 간소화되었던 QoS 설정(예: 신뢰성, 내구성, 히스토리 등)을 노드마다 세밀하게 조정할 수 있다.
   * 실시간 처리 요구나 네트워크 환경에 따라 Publisher/Subscriber 간의 QoS 프로필을 다르게 적용하여 데이터 송수신 방식을 최적화할 수 있다.
4. **Lifecycle Node**
   * 노드가 생명주기(lifecycle)를 인지하고 상태 전이를 명확히 처리하도록 지원한다.
   * 상태 머신 개념을 도입하여, 노드 초기화 → 활성화 → 비활성화 → 종료의 과정을 코드로 표현할 수 있어 대규모 시스템에서 안정적인 노드 관리를 용이하게 한다.

#### Node, Topic, Service, Action의 이해

ROS2 Humble에서도 기본적인 개념은 ROS1과 유사하지만, DDS 기반으로 확장된 개념과 API가 다소 달라졌다. 가장 핵심적인 요소인 Node, Topic, Service, Action에 대해 정리하면 다음과 같다.

* **Node**: ROS2의 기본적인 실행 단위이다. 한 노드 안에서 여러 Topic을 Publish/Subscribe하거나, Service를 제공하거나, Action을 정의할 수 있다. Node가 소속된 프로세스를 통해 자원(메모리, CPU 등)을 효율적으로 관리할 수 있다.
* **Topic**: 데이터 흐름을 위한 Pub/Sub 통신 채널이다. ROS2 Humble에서는 Topic을 통해 주고받는 메시지를 DDS의 Sample 단위로 처리하며, QoS 프로필에 따라 신뢰성 혹은 지연 시간 측면에서 다양한 설정이 가능하다.
* **Service**: Request/Response 통신을 위한 쌍방향 구조이다. Topic과 달리 즉각적인 응답이 필요한 기능을 구현할 때 사용한다. 예를 들어 로봇 암(arm)을 특정 위치로 이동시키라는 명령이 있을 때, 이동 성공 여부나 현재 상태를 즉시 확인해야 한다면 Service가 적합하다.
* **Action**: 장시간 실행이 필요한 작업(예: 로봇의 SLAM, 네비게이션, 모션 계획 등)에 대해 진행 상태(Progress)와 피드백을 주고받기 위한 구조이다. 일정 주기로 중간 결과를 보내고, 도중에 목표를 변경하거나 중단하는 기능을 지원한다.

#### TF(Transform) 및 좌표계 관리

ROS2에서도 좌표 변환 패키지인 TF2를 통해 다양한 좌표계 간의 변환을 지원한다. 센서, 로봇 바디, 월드 좌표계 등 복수의 프레임을 동시에 다루어야 할 때 매우 중요하다. 예를 들어 카메라 좌표계에서 본 물체의 좌표 $\mathbf{p}\_\text{cam}$을 로봇 베이스 좌표계로 변환하려면, 일반적으로 다음과 같은 수식을 적용한다.

$$
\mathbf{p}*\text{base} = ^\text{cam} \mathbf{R}*\text{base} , \mathbf{p}*\text{cam} + ^\text{cam} \mathbf{t}*\text{base}
$$

여기서 $^\text{cam}\mathbf{R}*\text{base}$는 회전 행렬, $^\text{cam}\mathbf{t}*\text{base}$는 벡터 형태의 평행 이동을 나타낸다. 이러한 변환 체계를 TF2가 효율적으로 관리해주므로, 로봇 개발자는 TF 트리만 적절히 관리하면 된다.

#### 패키지 구조와 Colcon 빌드 시스템

ROS2 Humble의 빌드 시스템은 `colcon`을 사용하여 패키지를 빌드하고 테스트·배포한다. ROS1에서는 `catkin`을 사용했지만, ROS2부터는 모든 빌드 과정을 좀 더 확장 가능하고 유연한 구조로 운영하기 위해 colcon으로 교체되었다.

**단일 패키지 빌드**: 패키지 하나만 선택적으로 빌드하기 위해서는 다음과 같이 명령어를 사용할 수 있다.

```
colcon build --packages-select my_package
```

빌드 결과물은 `install` 디렉터리에 저장되며, 워크스페이스 내 패키지 간 의존 관계가 제대로 충족되었는지 colcon이 자동으로 확인해준다.

**병렬 빌드 및 캐싱**: colcon은 멀티 코어 시스템에서 병렬로 빌드하여 빌드 속도를 높이고, 캐시를 효율적으로 활용한다. 이를 통해 대규모 프로젝트도 빠르고 안정적으로 빌드할 수 있다.

**빌드 프로필 설정**: 예를 들어, 릴리스(release)와 디버그(debug) 등의 빌드 프로필을 설정할 수 있으며, 빌드 옵션을 세밀하게 조정할 수 있다. 대규모 로봇 소프트웨어 프로젝트에서 특정 컴포넌트만 별도로 디버그 빌드를 수행할 때에도 유용하다.

**교차 컴파일(cross compilation)**: ROS2 Humble에서는 임베디드 기기나 다른 아키텍처(ARM, aarch64 등)를 대상으로 교차 컴파일하는 것이 가능하다. 패키지 구성에서 특정한 툴체인(toolchain)을 설정해두면, colcon이 호스트 머신과 타깃 머신 간 의존 관계를 맞춰서 빌드를 수행해준다.

#### 주요 ROS2 CLI(Command Line Interface) 활용

ROS2는 CLI 도구를 통해 노드, 토픽, 서비스 등을 모니터링하고 제어할 수 있다. `ros2 <subcommand>` 형태로 명령을 실행하는데, 디버깅이나 시스템 상태 확인에 매우 유용하다.

**ros2 node list**: 현재 활성화되어 있는 노드 목록을 확인한다. 대규모 로봇 시스템에서는 노드가 많으므로, 어느 노드가 실행 중인지 빠르게 파악하기 위해 자주 쓰인다.

**ros2 topic list**: 동작 중인 토픽 목록을 출력한다. 원하는 토픽에 대해 `ros2 topic echo /topic_name` 명령어로 실시간 데이터를 모니터링할 수도 있다.

**ros2 service list**: 제공되고 있는 서비스 목록을 확인한다. 특정 서비스에 대해 요청을 보내거나 응답을 받아보고 싶다면 `ros2 service call`을 사용할 수 있다.

**ros2 action list**: 동작 중인 액션 서버 목록을 확인한다. 액션 서버에 goal을 전송하거나 중단시키는 등 액션 클라이언트 역할을 CLI에서 테스트해볼 수 있다.

이 밖에도 파라미터(Parameter)나 QoS 설정 조회, `launch` 파일 실행 등 다양한 명령이 제공되어, 개발자가 직접 코드를 수정하지 않고도 로봇 시스템 상태를 점검할 수 있다.

#### RQt와 RViz2를 통한 디버깅 및 시각화

ROS2 개발에서 중요한 도구로 **RQt**와 **RViz2**를 꼽을 수 있다. 복잡한 로봇 데이터를 시각적으로 확인하고, 손쉽게 파라미터를 수정하거나 토픽 데이터를 비교하는 데 큰 도움을 준다.

**RQt(ROS Qt) 도구**:

* **rqt\_graph**: 노드와 토픽 간의 관계를 그래프로 시각화해준다.
* **rqt\_plot**: 센서나 상태값 등 실시간으로 변하는 데이터를 그래프로 표시한다.
* **rqt\_reconfigure**: 런타임 중에 파라미터를 변경할 수 있는 인터페이스를 제공한다.

**RViz2**:

* 3D 시각화 도구로, 센서 데이터(Point Cloud, Laser Scan 등), 로봇 모델(URDF)과 함께 TF를 기반으로 로봇의 상태를 3차원 공간에서 확인할 수 있다.
* 마우스 조작으로 시점과 Z 축 스케일 등을 변경할 수 있어, 로봇 작업 공간과 주변 환경을 직관적으로 파악한다.

디버깅 과정에서 텍스트 로그만으로는 파악하기 어려운 이슈를 시각화 도구를 통해 확인하면, 문제 해결 시간을 크게 단축할 수 있다.

#### Launch 시스템과 노드 오케스트레이션

ROS2의 Launch 시스템은 여러 노드를 한꺼번에 실행하거나, 특정 조건(파라미터, 이벤트 등)에 따라 노드 실행 순서를 제어하는 기능을 제공한다. ROS1 대비 파이썬(Python) 스크립트 기반의 유연한 구성이 가능해지면서, 복잡한 로봇 애플리케이션도 쉽게 관리할 수 있게 되었다.

**Launch 파일 구조**: `.py` 확장자를 갖는 파이썬 스크립트로 작성되며, `launch` 패키지에서 제공하는 API(`LaunchDescription`, `Node`, `IncludeLaunchDescription` 등)를 활용한다. 노드에 전달할 파라미터, 환경 변수, remapping 설정 등을 중앙에서 일괄적으로 관리할 수 있다.

**IncludeLaunchDescription**: 하위 Launch 파일을 재활용하거나, 여러 Launch 파일을 계층적으로 합치는 방식을 지원한다. 하나의 로봇에 여러 기능(센서, 네비게이션, SLAM 등)을 통합할 때 유용하다.

**Conditional Launch**:특정 파라미터나 명령줄 인자에 따라 노드 실행 여부나 설정이 달라질 수 있다. 예를 들어, 실제 로봇 하드웨어를 연결했을 때와 시뮬레이션 환경일 때 서로 다른 Launch 구성이 필요할 때 조건문을 설정해두면 된다.

#### 파라미터(Parameter) 관리와 동적 파라미터 설정

ROS2 Humble에서 노드의 파라미터를 효율적으로 관리하는 것은 대규모 프로젝트를 구성할 때 매우 중요하다. 파라미터 서버 개념이 ROS1과 다르게 분산되어 있기 때문에, 각 노드가 개별적으로 파라미터를 소유하고 외부에서 접근 가능한 구조를 취한다.

**파라미터 선언(Declare Parameter)**: ROS2 노드에서 파라미터를 사용하려면 반드시 미리 선언해야 한다. 예를 들어, 파이썬 노드에서 다음과 같이 선언할 수 있다:

```python
self.declare_parameter('max_speed', 1.0)
```

이후 `self.get_parameter('max_speed').get_parameter_value().double_value`를 통해 실제 값을 가져온다.

**동적 파라미터(dynamic parameter) 업데이트**: 노드 실행 중에 파라미터 값을 변경해야 하는 경우가 많다. 예컨대, 실시간으로 로봇 속도를 조절하거나, 이미지 처리 알고리즘의 임계값을 수정하고 싶을 때 이를 활용한다.

* `on_parameter_event` 콜백 함수를 등록하여, 파라미터가 변할 때마다 원하는 동작을 수행할 수 있다.
* RQt의 `rqt_reconfigure`나 CLI에서 `ros2 param set <node_name> <param_name> <value>`를 통해 동적으로 변경할 수 있다.

**파라미터 파일(.yaml) 관리**: 여러 노드의 파라미터를 한꺼번에 설정하기 위해 YAML 파일을 사용한다. Launch 파일에서 파라미터 파일을 로드함으로써, 재빌드 없이도 여러 설정값을 쉽게 변환할 수 있다.

#### 라이프사이클 노드(Lifecycle Node)의 활용

실제로 로봇이 운용되는 환경에서는 노드가 특정 시점에만 활성화되거나, 에러 발생 시 특정 상태로 전환되어야 하는 등 명확한 생명주기 관리가 필요하다. ROS2 Humble는 라이프사이클 노드를 지원하여, 노드의 상태를 단계별로 정의하고 전환할 수 있도록 돕는다.

**생성(Create)**:노드가 인스턴스화되지만 아직 활성화되지 않은 상태이다. 이 단계에서 파라미터 설정과 초기화 과정을 수행할 수 있다.

**구성(Configure)**: 외부 리소스를 할당하고, 통신에 필요한 Topic, Service, Action 등을 준비한다.

**활성(Activate)**: 실제 데이터 송수신이 가능해지는 단계로, 로봇 하드웨어 제어나 센서 데이터 처리를 시작한다.

**비활성(Deactivate)**: 노드가 동작을 멈춘 상태이다. 하지만 구성 리소스는 해제되지 않았으므로, 필요하면 활성 단계로 다시 돌아갈 수 있다.

**정리(CleanUp)**: 노드가 사용했던 리소스를 명시적으로 해제하고, 새로운 라이프사이클을 재시작할 수 있도록 준비한다.

**종료(Shutdown)**: 노드가 완전히 종료되는 단계이다. 비정상 종료(에러 발생)와 정상 종료 등을 구분하여 처리할 수 있다.

#### 실시간(Real-Time) 적용과 QoS 튜닝

ROS2 Humble가 DDS 기반으로 동작하면서, 적절한 QoS 설정과 실시간 RTOS 환경(또는 적어도 RT-PREEMPT 커널)에서의 튜닝으로 꽤 높은 수준의 실시간성을 기대할 수 있다.

**실시간 운영체제 사용**:

POSIX RT 확장 혹은 RTOS를 사용하여 노드에 높은 우선순위를 부여한다. 타이머 콜백이나 콜백 큐 스케줄링을 세밀하게 조정한다.

**DDS QoS 프로필**:

* **Reliability**: Reliable vs. Best Effort
* **Durability**: 데이터 내구성(Transient Local, Volatile 등)
* **History**: 버퍼 크기(Keep Last, Keep All) 노드마다 적절히 QoS 프로필을 설정해, 중요한 데이터는 신뢰성을 높이고, 빠른 주기가 필요한 데이터는 지연 시간을 최소화한다.
* **Zero-Copy 통신** 특정 DDS 구현체와 함께 사용할 경우, 메시지 복사 과정을 최소화하여 레이턴시를 줄일 수 있다. 특히 대용량 센서 데이터(이미지, 포인트클라우드 등) 처리 시 성능 향상이 크다.

#### 로깅(logging)과 모니터링

ROS2는 통일된 로깅 인터페이스(`rcutils` 기반)를 통해, 노드별로 로그 레벨과 출력 포맷을 제어할 수 있다. 로깅은 디버깅과 운영 모니터링에 매우 중요하다.

로그 레벨 설정 `DEBUG`, `INFO`, `WARN`, `ERROR`, `FATAL` 등 노드마다 로그 레벨을 구분하여, 실행 환경에 따라 원하는 수준의 메시지를 볼 수 있게 구성한다.

```bash
ros2 run my_pkg my_node --ros-args --log-level DEBUG
```

**원격 로깅 및 분석**: 대규모 로봇 시스템에서는 중앙 서버로 로그를 모으거나, 클라우드 기반 로깅 솔루션과 연동하기도 한다. 이를 통해 장애 발생 시점이나 성능 병목을 빠르게 파악할 수 있다.

#### 강건한(robust) 멀티 로봇 시스템 구성

ROS2 Humble는 멀티 로봇 시스템을 구성할 때 ROS1 대비 훨씬 더 유연하다. 분산 노드 구조와 DDS의 자동 discovery 메커니즘이 결합되어, 추가 브리지 없이도 서로 다른 물리 네트워크 세그먼트에서 로봇 여러 대를 연결 가능하다.

**네트워크 파티셔닝**: DDS 파티션 개념이나 네임스페이스(namespace)를 활용해, 특정 그룹의 로봇들끼리만 통신하도록 제한할 수 있다. 예: `namespace = "team_red"` 형태로 구분해주면, 다른 팀 로봇과의 충돌을 방지한다.

**보안(Security)**: DDS 시큐리티 확장을 통해, 특정 노드 간의 통신을 암호화하거나 접근 권한을 제어할 수 있다. 대규모 멀티 로봇 환경에서 각 로봇이 수집·전송하는 데이터를 안전하게 보호할 수 있다.

**Discovery 확장**: 여러 서브넷에 걸쳐 있는 로봇을 자동으로 발견하는 과정이 원활하지 않을 수 있으므로, 필요에 따라 Discovery Server나 STATIC 설정을 적용해 유니캐스트 주소를 명시적으로 지정해준다.

#### rosbag2를 이용한 데이터 기록 및 재생

로봇 소프트웨어를 개발하다 보면, 센서 데이터와 제어 명령을 기록했다가 다시 재생하여 문제를 디버깅하거나 재현할 필요가 자주 생긴다. ROS2 Humble에서는 `rosbag2`를 사용해 데이터를 쉽고 유연하게 기록·재생할 수 있다.

**데이터 기록(Record)**: 원하는 토픽을 지정하거나, `-a` 옵션으로 모든 토픽을 기록할 수 있다.

```bash
ros2 bag record -a
```

실행하면 현재 실행 중인 모든 노드와 토픽 데이터를 캡처한다. 대규모 로봇 시스템에서 특정 토픽만 골라 기록하려면 `-o` 옵션으로 파일 이름을 지정하고 토픽 목록을 나열한다.

**데이터 재생(Play)**:기록된 `.db3` 파일(기본적으로 SQLite 형식)을 재생한다.

```bash
ros2 bag play <rosbag_file>
```

재생 중에는 실제 센서가 없어도, 마치 실시간으로 토픽이 발행되는 것처럼 동작하기 때문에 알고리즘 디버깅에 매우 유리하다.

**Metadata와 Storage Plugin**: `rosbag2`는 스토리지 방식을 플러그인 형태로 확장할 수 있어, SQLite 외에 다른 DB나 파일 시스템 구조를 사용 가능하다. 메타데이터에는 기록된 토픽의 이름, 타입, 시작·끝 타임스탬프 등 정보가 포함된다.

**사용 예시**: 멀티 로봇 환경에서 여러 대의 로봇 로그를 하나의 파일로 통합하거나, 네트워크 장애 시 누락된 데이터를 복원하는 시나리오에서 유용하다.

#### Gazebo 클래식 및 Ignition Gazebo(aka Gazebo Fortress) 시뮬레이션

ROS2 기반의 로봇 시스템을 시뮬레이션하기 위해 자주 사용하는 도구가 바로 **Gazebo**이다. 특히 ROS2 Humble 시점에서는 전통적인 Gazebo(클래식)와 새로운 Ignition Gazebo(지금은 Gazebo Fortress 등으로 불림)를 혼합해서 사용하기도 한다.

* **Gazebo 클래식**
  * ROS1 시절부터 널리 사용되었으며, `gazebo_ros_pkgs`를 통해 ROS2용 플러그인이 제공된다.
  * 플러그인 구조가 비교적 단순해, 기존 프로젝트의 마이그레이션이나 간단한 테스트 환경 구축에 적합하다.
* **Ignition Gazebo**
  * 새로운 아키텍처로 설계되었으며, 물리 엔진, 렌더링 엔진 등을 모듈 단위로 교체 가능하다.
  * ROS2와의 연동을 위해 `ros_ign` 브리지 패키지가 활용된다. 토픽, 서비스, 액션을 bridge 노드가 양쪽으로 중계한다.
* **시뮬레이션 활용 예시**
  * 로봇 모델(URDF, SDF)을 시뮬레이션에 로드하고, 센서 플러그인(LiDAR, Camera, IMU 등)을 장착해 실제와 유사한 환경을 구성한다.
  * Navigation2 스택이나 SLAM Toolbox 등 고수준 패키지를 시뮬레이션 상에서 테스트하여, 물리 로봇에 배포하기 전에 검증 절차를 거친다.

#### Navigation2 스택을 이용한 자율 주행

ROS2에서 자율 주행을 구현할 때에는 **Navigation2(약칭 Nav2)** 패키지를 주로 사용한다. 이는 ROS1의 `move_base`를 대폭 개선한 형태로, 플러그인 아키텍처를 기반으로 경로 계획, 장애물 회피, 글로벌·로컬 맵핑 등을 진행한다.

* **구성 요소**
  * **Planner Server**: 전역 경로(Global Plan)를 생성한다.
  * **Controller Server**: 로컬 제어 알고리즘을 수행해 회피 동작을 결정한다.
  * **Behavior Tree**: 상태 기계를 시각적으로 표현하며, 상황별로 의사결정을 유연하게 수행한다.
  * **BT Navigator**: 주행 목표(goal)에 따라 행동 시퀀스를 정의한다.
* **맵핑(Mapping)과 SLAM** `slam_toolbox` 또는 `cartographer`를 이용해 실시간으로 맵을 작성하거나, 사전에 구성된 지도를 Nav2에서 활용할 수도 있다.
  * SLAM 노드를 실행하면서 Nav2를 병행하는 시나리오(Exploration)도 가능하다.
* **Parameter Tuning**
  * 장애물 버퍼 크기, 회피 거리, 속도 제한, 회전 반경 등의 파라미터를 세밀하게 조정해, 실제 로봇 환경에 맞는 주행 성능을 끌어낼 수 있다.
  * Launch 파일과 YAML 파라미터 파일을 혼합 사용해, 시뮬레이션과 실제 로봇 환경 간 설정 값을 쉽게 바꿀 수 있다.

#### Docker 및 컨테이너화

개발 환경을 일관성 있게 유지하기 위해 ROS2 Humble를 Docker 컨테이너로 구성하는 사례가 많아지고 있다. 컨테이너를 사용하면 특정 버전의 ROS2, 의존 라이브러리, Python 패키지 등을 하나의 이미지로 패키징하여, 여러 컴퓨터나 클라우드 환경에서 동일하게 재현 가능하다.

**ROS2 Humble Docker 이미지**: 공식 Docker Hub에 올라온 `osrf/ros:humble-...` 이미지들이 있으며, 이를 기반으로 개인 프로젝트 용 Dockerfile을 작성할 수 있다.

```dockerfile
FROM ros:humble
RUN apt-get update && apt-get install -y \
    <additional-packages>
```

**멀티 스테이지 빌드**: 대규모 C++ 프로젝트를 빌드할 때, 빌드 전용 이미지와 런타임 이미지를 분리하여 최종 이미지 크기를 줄일 수 있다.

**네트워크 설정**: 컨테이너 환경에서 ROS2 노드 간 통신을 위해서는 DDS Discovery가 올바르게 동작하도록 네트워크 브리지, 포트 설정, 또는 `--net=host` 옵션을 고려해야 한다. 필요에 따라 Environment 변수를 지정해서 DDS를 멀티캐스트에서 유니캐스트로 바꿀 수도 있다.

#### micro-ROS와 임베디드 로봇 애플리케이션

ROS2 Humble 생태계는 임베디드 기기나 자원 제약이 큰 소형 로봇 플랫폼에도 확장 가능하도록 **micro-ROS** 프로젝트를 지원한다. 이로써 센서 노드, RTOS 기반 임베디드 보드(FreeRTOS, Zephyr 등)와의 연동을 쉽게 처리할 수 있다.

* **RTPS(Real-Time Publish Subscribe) 프로토콜** micro-ROS는 ROS2의 DDS를 직접 구현하기엔 리소스가 너무 제한적인 하드웨어 환경에서, 보다 경량화된 RTPS만을 사용해 통신한다.
* **마이크로 컨트롤러 지원** ARM Cortex-M 계열, ESP32 등과 같은 저사양 보드에서 최소한의 메모리로도 ROS2 토픽을 송수신할 수 있다. 센서 데이터를 micro-ROS 노드가 실시간으로 발행하면, ROS2 노드가 수신해 처리할 수 있다.
* **빌드 및 배포** 통합 개발 환경(예: PlatformIO) 또는 맞춤형 cross-compile 설정을 통해, micro-ROS Agent와 Client를 구성한다. Agent는 ROS2 노드와의 브릿지 역할을 하며, Client가 임베디드 보드에 올라간다.
* **활용 시나리오** 소규모 로봇, 웨어러블 디바이스, IoT 센서 등에서 ROS2 생태계와 긴밀히 연동해야 할 때 사용한다. 예컨대, 로봇의 말단 센서나 액추에이터를 micro-ROS로 구성하면 전체 ROS2 시스템에 쉽게 통합할 수 있다.

#### 하드웨어 가속(Hardware Acceleration)과 GPU 활용

ROS2는 전통적으로 CPU 중심의 로봇 애플리케이션을 구성해왔으나, 최근에는 GPU, FPGA, TPU 등 특수 하드웨어를 활용해 고성능 처리를 시도하는 사례가 증가하고 있다.

* **OpenCL, CUDA, ROS2 Interop** 이미지를 토픽으로 받자마자 CUDA 커널에서 병렬 처리를 수행하거나, OpenCL 기반 FPGA에서 딥러닝 추론을 진행하는 경우가 많다. 이를 위해 메시지를 GPU 메모리로 직접 전달하는 Zero-Copy나 공유 메모리(Shared Memory) 기법이 연구되고 있다.
* **오픈소스 하드웨어 가속 프레임워크** **ROS 2 Hardware Acceleration Working Group**이 활발히 활동 중이며, REP(ROS Enhancement Proposal) 형태로 GPU/FPGA 가속을 위한 표준 인터페이스를 논의하고 있다.
* **Edge AI 및 클라우드 연동** AI 모델 추론을 클라우드나 엣지 서버(GPU 장착)에 오프로딩(offloading)하면서, 로컬 로봇은 실시간으로 고성능 비전·학습 모델 결과를 받아볼 수 있다. ROS2의 메시지 구조와 QoS가 이를 유연하게 지원한다.

#### ROS2 소프트웨어 품질과 Testing

ROS2 Humble에서도 다양한 테스트 프레임워크를 제공하여, 노드 단위(Unit Test), 통합 테스트(Integration Test), 시스템 레벨 테스트(System Test)를 체계적으로 수행할 수 있다.

* **ament\_cmake와 pytest**
  * C++ 노드는 `ament_cmake`를 통해 GTest 기반 유닛 테스트를 작성하고 빌드 과정에서 자동으로 실행할 수 있다.
  * Python 노드는 `pytest`를 사용해 파이썬 함수를 검증하고, 로직이 기대대로 동작하는지 확인한다.
* **rostest2와 시뮬레이션 테스트**
  * 로봇 시뮬레이터(Gazebo 등)와 연동해 실제 로봇 환경을 흉내낸 통합 테스트를 수행한다.
  * 네비게이션, SLAM 등 고수준 패키지의 정상 동작 여부를 자동화 스크립트로 검증할 수 있다.
* **Continuous Integration(CI)/Continuous Delivery(CD)**
  * GitHub Actions, GitLab CI, Jenkins 등 CI 도구와 결합해, 코드를 푸시할 때마다 ROS2 노드를 빌드하고 테스트를 진행한다.
  * 테스트 결과를 시각화하고, 일정 수준을 통과하면 Docker 이미지나 바이너리를 자동 배포하여 로봇 현장에 쉽게 적용한다.

#### 베스트 프랙티스와 코드 구조화

ROS2 Humble 프로젝트를 대규모로 운영하기 위해서는, 단순히 패키지를 여러 개 만들어놓는 것만으로는 부족하다. 확장성과 유지보수성을 높이기 위한 코드 구조화 전략이 필요하다.

* **단일 기능 모듈화** 패키지 하나에는 보통 하나의 명확한 기능(예: 이미지 처리, 센서 드라이버, 제어 알고리즘)을 담는다. 여러 기능이 섞여 있으면 의존 관계와 빌드 복잡성이 증가한다.
* **Node Composition과 Reuse**
  * 각 패키지에서 노드를 구성할 때, 다른 노드와 결합 가능한 인터페이스(토픽, 서비스, 액션)를 명확히 정의한다.
  * 노드 컴포지션 방식을 지원해, 하나의 프로세스 내에서 효율적으로 노드를 통합·재사용할 수 있다.
* **코드 리뷰와 문서화**
  * ROS2 메시지 타입, 노드 동작 방식, 파라미터 목록 등을 위키나 문서로 잘 정리해두면, 팀 간 협업이 원활해진다.
  * 메시지나 서비스, 액션을 정의할 때, `.msg`, `.srv`, `.action` 파일에 주석을 꼼꼼히 작성한다.

#### 산업 현장 적용 사례

ROS2 Humble은 학술 연구 외에도 산업 현장에서의 적용이 점차 늘고 있다. 제조업, 물류(AGV, AMR), 농업 자동화, 자율 주행 셔틀 등 다양한 분야에서 ROS2 생태계를 활용한다.

* **공장 자동화**: PLC(Programmable Logic Controller) 기반 설비와 연동하여, 실시간 제어와 ROS2 기반 고급 알고리즘(머신비전, 딥러닝 등)을 융합한다.
* **물류 로봇(AGV, AMR)**: 자체 개발된 폐쇄형(Closed-Loop) 제어 시스템에 ROS2 네비게이션 스택을 일부 이식해, 유연한 경로 계획과 관제 시스템을 구성한다.
* **드론, 무인 차량**: 마이크로 컨트롤러(Flight Controller)와 ROS2 노드(Companion Computer)가 분리되어, 비행 제어와 상위 임무 계획(미션 플래닝)을 효과적으로 병행한다.

#### 추가 학습 자원

ROS2 Humble을 심도 있게 공부하기 위해서는 다음과 같은 리소스를 참고할 수 있다.

* [ROS 2 공식 문서](https://docs.ros.org/en/humble/index.html)
* [ROS 2 GitHub](https://github.com/ros2/ros2)
* [ROS2 Design Rep](https://design.ros2.org/)
* [Navigation2 문서](https://navigation.ros.org/)
* [micro-ROS 프로젝트](https://micro.ros.org/)
