ROS2(Robot Operating System 2) 기반의 로봇 소프트웨어 개발 시 데이터 유실(Packet Loss), 지연(Latency), 멀티 로봇 노드 간 미탐색(Discovery) 문제가 발생할 때 DDS(Data Distribution Service) 미들웨어를 최적화하고 네트워크 환경을 튜닝하는 실무 지침서입니다.
1. ROS2 DDS 미들웨어 선택 가이드
ROS2는 기본 DDS로 FastDDS 또는 CycloneDDS를 주로 사용합니다.
- CycloneDDS: 대용량 센서 데이터(LiDAR, RGB-D 카메라) 전송 안정성이 뛰어나며, 안정적인 유니캐스트/멀티캐스트 지원.
- FastDDS: eProsima의 기본 미들웨어로, 기능이 풍부하고 디버깅 도구가 다양함.
CycloneDDS 변경 및 패키지 설치
sudo apt update
sudo apt install ros-humble-rmw-cyclonedds-cpp
# RMW(ROS Middleware Implementation) 환경 변수 설정
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
2. 리눅스 커널 소켓 버퍼 튜닝 (패킷 드랍 방지)
LiDAR 점군(PointCloud2) 데이터나 고해상도 카메라 이미지를 발행/구독할 때 UDP 소켓 수신 버퍼가 작으면 패킷 손실이 일어납니다.
커널 소켓 버퍼 크기 확장 (sysctl)
/etc/sysctl.d/60-ros2-dds.conf 파일을 생성하고 아래 설정을 추가합니다.
# UDP 버퍼 수신/송신 최대 크기 확장 (32MB)
net.core.rmem_max=33554432
net.core.wmem_max=33554432
net.core.rmem_default=33554432
net.core.wmem_default=33554432
# 설정 즉시 적용
sudo sysctl --system
3. CycloneDDS XML 설정 파일 작성 및 적용
CycloneDDS의 세부 동작(네트워크 인터페이스 지정, 공유 메모리, 단편화 설정 등)을 제어하기 위해 XML 파일을 작성합니다.
cyclonedds.xml 생성:
<?xml version="1.0" encoding="UTF-8" ?>
<CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
<Domain id="any">
<General>
<!-- 바인딩할 네트워크 인터페이스 명시 (예: eth0 또는 wlan0) -->
<NetworkInterfaceAddress>eth0</NetworkInterfaceAddress>
<AllowMulticast>true</AllowMulticast>
<MaxMessageSize>65500B</MaxMessageSize>
</General>
<Internal>
<SocketBufferSize min="10MB" />
</Internal>
<Discovery>
<!-- 멀티캐스트가 차단된 와이파이/스위치 환경일 경우 피어 유니캐스트 IP 직접 지정 -->
<Peers>
<Peer Address="192.168.1.100"/>
<Peer Address="192.168.1.101"/>
</Peers>
</Discovery>
</Domain>
</CycloneDDS>
# bashrc에 환경변수 등록
export CYCLONEDDS_URI=file:///path/to/cyclonedds.xml
4. 멀티 로봇 환경 격리 (ROS_DOMAIN_ID)
동일한 와이파이 네트워크에 여러 대의 로봇 또는 개발자 PC가 접속해 있을 때 메시지 간섭을 막으려면 각 로봇/서버별로 ROS_DOMAIN_ID를 다르게 부여합니다.
# 로봇 1번
export ROS_DOMAIN_ID=11
# 로봇 2번
export ROS_DOMAIN_ID=12
5. 트러블슈팅 체크리스트
① 토픽 목록은 보이나 echo 시 데이터가 들어오지 않는 경우
- 원인: QoS(Quality of Service) 설정 불일치 (Reliability / Durability).
- 해결: 발행자(Publisher)와 구독자(Subscriber)의 QoS 설정(
RELIABLEvsBEST_EFFORT)을 맞추거나ros2 topic info /topic_name --verbose로 mismatch 상태 확인.
② 다른 PC/로봇 간에 ros2 topic list가 뜨지 않는 경우
- 원인: 방화벽(UFW) 통과 실패 또는 와이파이 공유기의 멀티캐스트(IGMP Snooping) 차단.
- 해결:멀티캐스트가 차단되는 와이파이 환경에서는 3번 섹션의 CycloneDDS
# 테스트용 방화벽 임시 해제 sudo ufw disablePeers유니캐스트 설정을 사용합니다.
마무리
대용량 노드가 복잡하게 얽히는 실시간 로봇 시스템에서는 커널 UDP 소켓 버퍼 확장과 CycloneDDS XML 튜닝, 그리고 알맞은 QoS 정책 수립이 안정적인 통신 체계의 핵심입니다.