홍든램지의 보일러실

[ROS2] 로봇의 대화법, "내 말 잘 들리니?" (DDS QoS 완벽 정리) 본문

카테고리 없음

[ROS2] 로봇의 대화법, "내 말 잘 들리니?" (DDS QoS 완벽 정리)

예비보일 2025. 11. 25. 13:20
반응형

 

안녕하세요! ROS2(Robot Operating System 2) 에서 사용하는 DDS와 QoS에 대해서 많이 들어보았을 것입니다.

ROS2가 기존 ROS1과 가장 크게 달라진 점 중 하나는 바로 통신 방식에 DDS(Data Distribution Service)를 도입했다는 것입니다.

 

그리고 이 DDS를 제대로 쓰기 위해 반드시 알아야 할 설정이 바로 QoS(Quality of Service)입니다.

이름만 들어도 머리가 아픈 QoS, 오늘은 쉽게 이해할 수 있도록 "택배 배송""라이브 방송"에 비유해서 아주 쉽게 풀어보겠습니다.


1. QoS(Quality of Service)가 대체 뭔가요?

로봇 안에는 수많은 부품(노드, Node)들이 있습니다.

  • 📷 카메라: "앞에 장애물이 있어!" (엄청난 양의 사진 데이터를 보냄)
  • 🧠 제어기: "멈춰!" (중요한 명령을 보냄)
  • 🔋 배터리: "배터리 10% 남았어." (가끔 상태를 보냄)

이 부품들이 서로 대화할 때, 상황에 따라 대화하는 방식(규칙)을 다르게 설정하는 것이 바로 QoS입니다.

쉽게 말해: 친구와 수다를 떨 때(가벼운 대화)와 선생님께 수행평가 파일을 제출할 때(중요한 전달)의 태도가 다른 것과 같습니다.


2. 핵심 QoS 옵션 3대장

ROS2에서 가장 많이 쓰이는 QoS 설정 3가지를 알아봅시다.

① Reliability (신뢰성): "확실하게 줄까? 빨리 줄까?"

데이터를 보낼 때 얼마나 꼼꼼하게 보낼지 결정하는 옵션입니다.

  • Reliable (믿음직한 배송)
    • 비유: 등기 우편 📩
    • 설명: 받는 사람이 "나 잘 받았어!(ACK)"라고 답할 때까지 계속 확인합니다. 중간에 데이터가 유실되면 다시 보냅니다.
    • 언제 쓸까? 로봇에게 "오른쪽으로 90도 꺾어" 같은 중요한 명령을 내릴 때. (하나라도 놓치면 로봇이 사고가 나니까요!)
  • Best Effort (최선을 다함)
    • 비유: 라이브 방송 📺
    • 설명: "일단 최대한 빨리 보내볼게. 못 받으면 어쩔 수 없고." 데이터가 중간에 끊겨도 재전송하지 않고 무시합니다.
    • 언제 쓸까? 카메라나 라이다(LiDAR) 센서 데이터. 1초에 30장씩 사진을 보내는데, 옛날 사진 1장을 다시 받느라 최신 사진이 늦어지는 게 더 손해일 때 씁니다.

② History (기록): "기억력이 얼마나 좋아?"

데이터를 얼마나 쌓아두고 처리할지 결정합니다.

  • Keep Last (최신만 기억해)
    • 비유: 스냅챗/인스타 스토리 👻
    • 설명: 옛날 건 필요 없고, 가장 최근 것 N개(Depth)만 기억합니다. 새로운 데이터가 오면 가장 오래된 건 버립니다.
    • 언제 쓸까? 센서 데이터. "지금 로봇 앞에 뭐가 있는지"가 중요하지, "10초 전에 뭐가 있었는지"는 덜 중요하니까요.
  • Keep All (다 기억해)
    • 비유: 카톡 대화 내용 내보내기 💾
    • 설명: 보낸 데이터를 메모리가 허용하는 한 전부 저장합니다.
    • 언제 쓸까? 로봇의 이동 경로(Trajectory) 전체를 기록하거나 분석해야 할 때.

③ Durability (지속성): "지각생에게도 자료를 줄까?"

데이터를 보내는 쪽(Publisher)이 먼저 데이터를 뿌리고 있었는데, 받는 쪽(Subscriber)이 나중에(지각해서) 들어왔을 때 어떻게 할지를 정합니다.

  • Volatile (휘발성)
    • 비유: 실시간 라디오 방송 📻
    • 설명: 방송할 때 안 듣고 있었으면 끝입니다. 나중에 켜도 지나간 노래는 들을 수 없습니다.
    • 언제 쓸까? 대부분의 일반적인 센서 데이터.
  • Transient Local (잠깐 저장해둠)
    • 비유: 칠판에 적어둔 공지사항 📝
    • 설명: 지각생(늦게 켜진 노드)이 들어오면, "아까 이런 말을 했었어"라고 마지막 데이터를 챙겨줍니다.
    • 언제 쓸까? 지도(Map) 데이터. 지도는 한 번 보내면 잘 안 바뀌는데, 로봇이 나중에 켜졌다고 지도를 못 받으면 안 되겠죠? 이때 씁니다.

3. 주의! 서로 눈높이를 맞춰야 대화가 통한다 (QoS 호환성)

ROS2 통신에서 가장 중요한 규칙이 있습니다. **"받는 사람(Subscriber)의 요구 조건이 보내는 사람(Publisher)보다 까다로우면 안 된다"**는 것입니다.

이것을 Rx/Tx 호환성이라고 합니다.

  • 성공하는 대화 (⭕)
    • 보내는 애: "나 꼼꼼해! (Reliable)" ➡️ 받는 애: "난 대충 받아도 돼 (Best Effort)" (OK)
    • 보내는 애: "나 꼼꼼해! (Reliable)" ➡️ 받는 애: "나도 꼼꼼한 거 원해 (Reliable)" (OK)
  • 실패하는 대화 (❌) - 통신 안 됨!
    • 보내는 애: "난 대충 보낼 거야 (Best Effort)" ➡️ 받는 애: "무조건 꼼꼼하게 줘! (Reliable)"
    • 결과: 받는 애는 데이터를 거부합니다. (서로 연결이 안 됨)

팁: 센서가 데이터를 보내는데 화면에 아무것도 안 뜬다면, 90% 확률로 이 QoS 설정(특히 Reliability)이 서로 안 맞아서 그렇습니다!


4. 코드로는 어떻게 쓸까? (Python 예제)

개발자라면 코드를 봐야겠죠? ROS2 Python(rclpy)에서 QoS를 설정하는 방법은 아주 간단합니다.

Python
 
import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicy, DurabilityPolicy
from std_msgs.msg import String

class MyRobotNode(Node):
    def __init__(self):
        super().__init__('qos_example_node')

        # 1. QoS 프로필 생성 (커스텀 설정)
        my_qos_profile = QoSProfile(
            reliability=ReliabilityPolicy.BEST_EFFORT, # 전송 속도 중시
            history=HistoryPolicy.KEEP_LAST,           # 최신 데이터만
            depth=10,                                  # 10개까지만 저장
            durability=DurabilityPolicy.VOLATILE       # 지나간 건 잊어라
        )

        # 2. Publisher 생성 시 QoS 적용
        self.publisher_ = self.create_publisher(
            String, 
            'topic_name', 
            qos_profile=my_qos_profile
        )

        # 참고: ROS2에는 미리 정의된 프리셋도 있습니다. (센서용)
        # from rclpy.qos import qos_profile_sensor_data
        # self.publisher_ = self.create_publisher(..., qos_profile=qos_profile_sensor_data)

5. 요약 정리표

바쁜 분들을 위한 한 줄 요약입니다.

설정 항목 옵션 이름 비유 특징 추천 용도
Reliability

(신뢰성)
Reliable 등기 우편 잃어버리면 재전송 (느림) 로봇 제어 명령, 지도
  Best Effort 라이브 방송 끊겨도 그냥 진행 (빠름) 카메라, 라이다 센서
Durability

(지속성)
Transient Local 칠판 공지 늦게 온 애한테도 보여줌 지도, 파라미터 설정
  Volatile 라디오 안 들었으면 끝 일반 데이터
History

(기록)
Keep Last 인스타 스토리 최신 N개만 저장 실시간 모니터링
  Keep All 대화 기록 전부 저장 로그 기록, 경로 분석

마치며

ROS2가 어렵게 느껴지는 이유는 이런 설정들이 숨어 있기 때문입니다. 하지만 "왜" 필요한지를 이해하면, 내 로봇에게 딱 맞는 최적의 통신 환경을 만들어줄 수 있습니다.

  • 카메라가 끊긴다? ➡️ Best Effort로 바꾸세요.
  • 지도가 안 보인다? ➡️ Transient Local인지 확인하세요.

이 글이 여러분의 로봇 개발에 작은 도움이 되었으면 좋겠습니다! 🚀

반응형
Comments