Skip to content

Commit 81f748a

Browse files
raisewise0211claude
andcommitted
Add DDS Session 6: Domain ID & Namespace network isolation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent f41f068 commit 81f748a

4 files changed

Lines changed: 233 additions & 1 deletion

File tree

docs/index.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<span class="stat-label">논문 리뷰</span>
2222
</div>
2323
<div class="stat">
24-
<span class="stat-number">7</span>
24+
<span class="stat-number">8</span>
2525
<span class="stat-label">ROS2 분석</span>
2626
</div>
2727
<div class="stat">
@@ -66,6 +66,11 @@
6666
## 최근 업데이트
6767

6868
<ul class="recent-list">
69+
<li>
70+
<span class="recent-date">2026-06-19</span>
71+
<span class="recent-tag">ROS2</span>
72+
<a href="ros2/dds/session-06-domain-namespace/">DDS 세션 6 - Domain ID & Namespace</a>
73+
</li>
6974
<li>
7075
<span class="recent-date">2026-06-19</span>
7176
<span class="recent-tag">ROS2</span>
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
# 세션 6: 네트워크 분리 — Domain ID & Namespace
2+
3+
!!! info "세션 정보"
4+
- **학습 시간**: 2시간 (학습 1h 45m + 복습 15m)
5+
- **핵심 목표**: Domain ID로 물리적 네트워크 분리, Namespace로 논리적 토픽 분리
6+
- **관련 표준**: OMG DDS Domain, ROS2 Namespace/Remapping
7+
8+
---
9+
10+
## 한 줄 요약
11+
12+
> **Domain ID**는 Discovery 패킷이 도달하는 범위 자체를 물리적으로 분리하고, **Namespace**는 같은 Domain 안에서 토픽 이름에 접두사를 붙여 논리적으로 충돌을 방지한다.
13+
14+
---
15+
16+
## Domain ID로 논리적 네트워크 분리
17+
18+
### Domain ID의 본질
19+
20+
```
21+
Domain ID = "이 도메인 안에서만 서로 Discovery 한다"는 격벽
22+
23+
같은 물리 네트워크(같은 와이파이/스위치)라도
24+
Domain ID가 다르면 SPDP 멀티캐스트 자체가 다른 포트로 가서
25+
서로 존재를 모름 → 완전 격리
26+
```
27+
28+
```
29+
같은 와이파이 네트워크
30+
┌─────────────────────────────────────┐
31+
│ Domain 0: 로봇 A의 노드들 │
32+
│ ─ 포트 7400 사용 │
33+
│ │
34+
│ Domain 1: 로봇 B의 노드들 │
35+
│ ─ 포트 7650 사용 │
36+
│ │
37+
│ → 둘은 같은 와이파이에 있어도 │
38+
│ 서로 ros2 topic list에 안 보임 │
39+
└─────────────────────────────────────┘
40+
```
41+
42+
각 도메인 **내부**에서는 SPDP/SEDP Discovery가 정상적으로 일어난다. 서로 다른 도메인끼리는 멀티캐스트 패킷이 다른 포트로 가기 때문에 물리적으로 도달하지 않아 격리되는 것이다.
43+
44+
### 왜 분리가 필요한가?
45+
46+
- **테스트/개발 환경 분리**: 개발 PC와 실제 로봇이 같은 네트워크에 있어도 서로 간섭 안 하게
47+
- **다중 로봇 독립 운용**: 각 로봇이 자기 노드만 보고 통신
48+
- **CI/CD 환경**: 같은 머신에서 여러 테스트 인스턴스를 동시에 돌릴 때 충돌 방지
49+
50+
---
51+
52+
## ROS_DOMAIN_ID 설정, 포트 번호 공식
53+
54+
### 설정 방법
55+
56+
```bash
57+
export ROS_DOMAIN_ID=42
58+
59+
# 영구 설정 (bashrc)
60+
echo "export ROS_DOMAIN_ID=42" >> ~/.bashrc
61+
```
62+
63+
기본값은 `0`. 설정 안 하면 모든 ROS2 시스템이 기본 Domain 0을 공유한다 (같은 네트워크에 있으면 의도치 않게 서로 발견됨 — 흔한 실수).
64+
65+
### 포트 번호 공식
66+
67+
DDS RTPS는 Domain ID마다 **4개의 포트**를 사용한다.
68+
69+
```
70+
PB = 7400 (기본 포트 베이스)
71+
DG = 250 (Domain Gap)
72+
PG = 2 (Participant Gap, 한 머신에 여러 Participant 있을 때)
73+
74+
공식:
75+
SPDP 멀티캐스트 포트 = PB + DG × DomainID
76+
SPDP 유니캐스트 포트 = PB + DG × DomainID + 1
77+
SEDP 멀티캐스트 포트 = PB + DG × DomainID + 2 (보통 안 씀)
78+
SEDP 유니캐스트 포트 = PB + DG × DomainID + (PG × ParticipantID) + 11
79+
```
80+
81+
| Domain ID | SPDP 멀티캐스트 | SPDP 유니캐스트 |
82+
|-----------|----------------|----------------|
83+
| 0 | 7400 | 7401 |
84+
| 1 | 7650 | 7651 |
85+
| 5 | 8650 | 8651 |
86+
| 10 | 9900 | 9901 |
87+
| 42 | 17900 | 17901 |
88+
89+
!!! warning "Domain ID 범위 주의"
90+
이론상 0~232까지 가능하지만, 실용적으로는 **0~101** 권장. 너무 큰 값은 포트 번호가 65535(TCP/UDP 포트 한계)를 넘어갈 수 있어 일부 OS/방화벽에서 문제 발생.
91+
92+
```
93+
계산 예: DomainID = 232
94+
7400 + 250 × 232 = 65,400 (한계 근접, 위험)
95+
96+
DomainID = 101
97+
7400 + 250 × 101 = 32,650 (안전)
98+
```
99+
100+
### 실전 활용: 로봇 식별자로 활용
101+
102+
```bash
103+
# 로봇 1
104+
export ROS_DOMAIN_ID=1
105+
106+
# 로봇 2
107+
export ROS_DOMAIN_ID=2
108+
109+
# 시뮬레이션 환경
110+
export ROS_DOMAIN_ID=99
111+
```
112+
113+
---
114+
115+
## Namespace, remapping으로 토픽 충돌 방지
116+
117+
Domain ID가 "물리적/네트워크 레벨 격리"라면, **Namespace**는 "같은 도메인 안에서 논리적으로 이름을 구분"하는 방법이다.
118+
119+
### Namespace 없이 동일 로봇 2대를 같은 Domain에 띄우면?
120+
121+
```
122+
로봇 A: /cmd_vel, /odom, /scan
123+
로봇 B: /cmd_vel, /odom, /scan
124+
125+
→ 토픽 이름이 같아서 서로 명령이 섞여버림! (충돌)
126+
```
127+
128+
### Namespace로 해결
129+
130+
```bash
131+
ros2 run my_robot_pkg controller --ros-args -r __ns:=/robot_a
132+
ros2 run my_robot_pkg controller --ros-args -r __ns:=/robot_b
133+
```
134+
135+
```
136+
로봇 A: /robot_a/cmd_vel, /robot_a/odom, /robot_a/scan
137+
로봇 B: /robot_b/cmd_vel, /robot_b/odom, /robot_b/scan
138+
139+
→ 같은 Domain에 있어도 완전히 독립적으로 통신
140+
```
141+
142+
### Launch 파일에서 Namespace 적용
143+
144+
```python
145+
# launch 파일 예시
146+
Node(
147+
package='my_robot_pkg',
148+
executable='controller',
149+
namespace='robot_a',
150+
name='controller_node'
151+
)
152+
```
153+
154+
### Remapping — 토픽 이름 직접 변경
155+
156+
Namespace는 "접두사"를 붙이는 방식이고, **Remapping**은 토픽 이름 자체를 임의로 바꾸는 더 유연한 방법이다.
157+
158+
```bash
159+
# /cmd_vel 토픽을 /robot_a/drive_cmd 로 변경
160+
ros2 run my_robot_pkg controller --ros-args -r cmd_vel:=/robot_a/drive_cmd
161+
```
162+
163+
```
164+
사용 사례:
165+
- 레거시 시스템과 연동 시 토픽 이름 맞추기
166+
- 같은 노드를 다른 역할로 재사용 (센서 토픽 이름만 바꿔서)
167+
- 시뮬레이션 ↔ 실제 로봇 전환 시 토픽 분기
168+
```
169+
170+
### Domain ID vs Namespace 비교
171+
172+
| 항목 | Domain ID | Namespace |
173+
|------|-----------|-----------|
174+
| 격리 수준 | 네트워크/Discovery 레벨 (완전 분리) | 토픽 이름 레벨 (논리적 구분) |
175+
| 같은 도메인 내 통신 | 불가능 (서로 안 보임) | 가능 (의도하면 통신 가능) |
176+
| 사용 사례 | 완전히 독립된 시스템 (다른 팀, 다른 환경) | 같은 시스템 내 여러 로봇/모듈 구분 |
177+
| 변경 방법 | 환경변수 `ROS_DOMAIN_ID` | `--ros-args -r __ns:=` |
178+
179+
---
180+
181+
## 핵심 개념 정리
182+
183+
!!! tip "세션 6 핵심 3가지"
184+
1. **Domain ID**: 네트워크 레벨에서 물리적으로 격리, `7400 + 250×DomainID` 공식으로 포트 계산
185+
2. **Namespace**: 같은 Domain 안에서 토픽 이름에 접두사를 붙여 논리적으로 분리
186+
3. **Remapping**: 토픽 이름을 임의로 변경하는 유연한 방법, Namespace보다 세밀한 제어 가능
187+
188+
---
189+
190+
## 복습 (15분)
191+
192+
!!! question "Q1"
193+
`ROS_DOMAIN_ID=10`일 때 SPDP 유니캐스트 포트는?
194+
195+
??? success "정답"
196+
`7400 + 250×10 + 1 = 9901`
197+
198+
!!! question "Q2"
199+
Domain ID 분리와 Namespace 분리의 가장 큰 차이는?
200+
201+
??? success "정답"
202+
**Domain ID**는 Discovery 패킷이 물리적으로 도달하는 범위 자체를 분리한다 (서로 다른 포트라서 패킷이 안 닿음). 각 도메인 내부에서는 Discovery가 정상적으로 일어나지만, 도메인 간에는 패킷 교환이 아예 없다.
203+
**Namespace**는 같은 Domain·같은 포트에서 Discovery 패킷이 전부 오가지만, 토픽 이름 자체가 달라서 논리적으로 충돌을 방지하는 방식이다.
204+
205+
!!! question "Q3"
206+
같은 로봇 모델 2대를 같은 Domain에서 충돌 없이 운용하려면 어떻게 해야 하는가?
207+
208+
??? success "정답"
209+
각 로봇에 서로 다른 Namespace(`/robot_a`, `/robot_b` 등)를 부여한다. `--ros-args -r __ns:=/robot_a` 같은 방식으로 모든 토픽에 접두사가 붙어 충돌 없이 공존할 수 있다.
210+
211+
!!! question "Q4"
212+
Domain ID를 232처럼 너무 크게 설정하면 안 되는 이유는?
213+
214+
??? success "정답"
215+
`7400 + 250×232 = 65,400`으로 UDP/TCP 포트 번호 한계(65535)에 근접해서, 일부 OS/방화벽 환경에서 포트 할당 문제가 발생할 수 있다. 실용적으로 0~101 범위를 권장한다.
216+
217+
---
218+
219+
## 다음 세션 예고
220+
221+
**세션 7: DDS 설정 파일 (XML Profile)**
222+
223+
- FASTRTPS_DEFAULT_PROFILES_FILE 환경변수, XML 구조
224+
- 유니캐스트 전용 설정 (클라우드/VPN 환경)
225+
- Initial Peers 설정

docs/ros2/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ ROS2는 로봇 소프트웨어를 만드는 미들웨어이자 생태계다.
3333
[:octicons-arrow-right-24: 세션 3 - RTPS 프로토콜](dds/session-03-rtps.md)
3434
[:octicons-arrow-right-24: 세션 4 - QoS 정책 마스터](dds/session-04-qos.md)
3535
[:octicons-arrow-right-24: 세션 5 - rmw 레이어](dds/session-05-rmw.md)
36+
[:octicons-arrow-right-24: 세션 6 - Domain ID & Namespace](dds/session-06-domain-namespace.md)
3637

3738
- **Isaac ROS Cloud Control**
3839

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ nav:
7171
- 세션 3 - RTPS 프로토콜: ros2/dds/session-03-rtps.md
7272
- 세션 4 - QoS 정책 마스터: ros2/dds/session-04-qos.md
7373
- 세션 5 - rmw 레이어: ros2/dds/session-05-rmw.md
74+
- 세션 6 - Domain ID & Namespace: ros2/dds/session-06-domain-namespace.md
7475
- Nav2:
7576
- MPPI Controller: ros2/nav2/mppi-controller.md
7677
- Lifecycle Manager: ros2/nav2/lifecycle-manager.md

0 commit comments

Comments
 (0)