ROS2 Quality of Service (QoS): 통신 품질을 최적화하는 방법 > 로봇 운영체제(ROS/ROS2) 완전 정복

본문 바로가기
사이트 내 전체검색

로봇 운영체제(ROS/ROS2) 완전 정복

ROS2 Quality of Service (QoS): 통신 품질을 최적화하는 방법

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 267회 작성일 25-12-30 19:45

본문

ROS2 Quality of Service (QoS): 통신 품질을 최적화하는 방법

'ROS2 Quality of Service (QoS): 통신 품질을 최적화하는 방법'이라는 표현은 로봇 제작 지식 쌓기, 제어 시스템, 로봇 하드웨어, 운영체제(ROS) 및 알고리즘 개발, 그리고 시스템의 안정성 분석, 효율성 향상에 대한 깊은 이해와 관심을 가지신 여러분의 핵심적인 고민을 정확히 담고 있습니다. 로봇은 센서 데이터, 모터 명령, 위치 정보 등 다양한 종류의 데이터를 끊임없이 주고받으며 작동합니다. 이때 각 데이터가 요구하는 통신 품질은 서로 다릅니다. 예를 들어, 로봇의 비상 정지 신호는 '반드시', '지연 없이' 전달되어야 하지만, 로깅 데이터는 '최신 정보가 아니어도' 괜찮을 수 있습니다.


**ROS2 Quality of Service (QoS)**는 ROS2의 DDS(Data Distribution Service) 기반 통신에서 "데이터 통신 옵션을 설정하여 통신을 최적화하고 시스템 요구사항을 충족시키기 위한 일련의 정책들"입니다. QoS를 통해 각 통신의 목적과 중요도에 맞춰 통신 품질을 최적화하는 것은 로봇 시스템의 실시간성, 안정성, 신뢰성을 확보하는 데 필수적인 역량입니다. 함께 ROS2 QoS가 무엇이며, 왜 통신 품질 최적화에 중요한지, 핵심 QoS 정책과 로봇 개발에 어떻게 활용되는지 자세히 알아보겠습니다!


ROS2는 기존 ROS1의 실시간성, 보안성, 분산 처리 등의 한계를 극복하기 위해 통신 미들웨어로 **DDS(Data Distribution Service)**를 채택했습니다. 이 DDS의 가장 강력한 특징 중 하나가 바로 **QoS(Quality of Service)**입니다. ROS2에서는 모든 통신(토픽, 서비스, 액션)에 QoS 설정을 적용할 수 있으며, 이는 다음과 같은 이유로 매우 중요합니다.


1. 통신 요구사항의 다양성: 로봇 시스템에는 매우 다양한 종류의 데이터가 흐릅니다.

비상 정지 명령: 반드시 전달되어야 하며, 최신 정보여야 합니다. (고신뢰성, 낮은 지연)

라이다 스캔 데이터: 최신 정보가 중요하며, 일부 프레임이 유실되어도 괜찮을 수 있습니다. (낮은 지연, 높은 빈도, 낮은 신뢰성 허용)

로깅 메시지: 유실되어도 시스템 동작에 큰 영향은 없지만, 순서가 중요할 수 있습니다.

2. 시스템 성능 및 효율성: 모든 통신에 최고 수준의 신뢰성과 지연 시간을 요구하면 네트워크 대역폭과 컴퓨팅 리소스가 불필요하게 낭비될 수 있습니다. QoS를 통해 통신을 최적화하면 시스템 성능을 향상시키고 효율적으로 리소스를 사용할 수 있습니다.

3. 안정성 및 신뢰성 확보: 핵심 데이터는 전송을 보장하고, 중요하지 않은 데이터는 유실을 허용하는 등 데이터의 중요도에 따라 통신 품질을 다르게 적용하여 시스템의 안정성과 신뢰성을 높입니다.

4. 복잡한 로봇 시스템 대응: 대규모 분산 시스템이나 멀티 로봇 시스템에서 QoS는 통신 혼잡을 관리하고, 각 노드의 통신 요구사항을 만족시키며 안정적인 작동을 보장하는 데 필수적입니다.

ROS2 QoS는 "노드 간의 통신을 조정할 수 있는 다양한 서비스 품질(QoS) 정책을 제공"하며, "적절한 서비스 품질 정책 세트를 사용하면, ROS2는 TCP만큼의 신뢰성, UDP만큼의 빠른 전송 속도를 제공"합니다.  


1. ROS2 QoS의 핵심 정책들 (통신 품질을 결정하는 레버!)

ROS2의 QoS 프로파일은 여러 가지 정책들로 구성되어 있으며, 각 정책은 통신의 특정 측면에 영향을 미칩니다. 


1.1. Reliability (신뢰성)

개념: 메시지가 발행자에서 구독자로 얼마나 신뢰성 있게 전달될 것인지 결정합니다.

정책:

BEST_EFFORT: 최선을 다해 메시지를 보내지만, 유실될 수도 있습니다 (UDP와 유사). 낮은 지연 시간이 중요하고, 일부 데이터 유실을 허용하는 센서 데이터 스트리밍(예: 라이다, 카메라)에 적합합니다.

RELIABLE: 메시지 유실 없이 반드시 전달되도록 보장합니다 (TCP와 유사). 중요한 명령(예: 비상 정지, 로봇 이동 목표)이나 설정값에 사용합니다.

활용: RELIABLE은 메시지 재전송 메커니즘이 포함되어 BEST_EFFORT보다 지연 시간이 길어질 수 있으므로, 각 토픽의 중요도에 따라 신중하게 선택해야 합니다.

1.2. Durability (지속성)

개념: 발행자가 메시지를 발행한 시점에 구독자가 없어도, 나중에 구독자가 연결되었을 때 이전 메시지를 받을 수 있는지 여부를 결정합니다.

정책:

VOLATILE: 발행자가 메시지를 발행할 때 구독자가 없으면 메시지는 유실됩니다. 기본값입니다.

TRANSIENT_LOCAL: 발행자는 자신이 발행한 마지막 메시지를 내부적으로 저장하고 있다가, 나중에 새로 연결되는 구독자에게 해당 메시지를 보냅니다.

활용: TRANSIENT_LOCAL은 초기화 데이터(예: 지도, 로봇의 초기 설정값)나 로봇의 현재 상태(예: 배터리 잔량)처럼, 항상 최신 상태를 유지하고 새로 연결된 노드도 즉시 해당 정보를 받아야 하는 경우에 유용합니다.

1.3. History (히스토리)

개념: 발행자가 메시지를 몇 개까지 저장할지, 혹은 구독자가 몇 개까지 메시지를 버퍼링할지를 결정합니다.

정책:

KEEP_LAST: 지정된 수량의 마지막 메시지만 저장합니다.

KEEP_ALL: 모든 메시지를 저장합니다 (버퍼가 가득 차면 오래된 메시지부터 삭제).

활용: KEEP_LAST는 주로 실시간으로 업데이트되는 데이터(예: 센서 데이터)에 사용되어 최신 정보만 중요하게 다룹니다. KEEP_ALL은 메시지 유실을 최소화해야 하는 중요한 데이터 흐름에서 RELIABLE과 함께 사용될 수 있습니다.

1.4. Liveliness (생존성)

개념: 발행자가 여전히 활성 상태인지 여부를 구독자가 감지할 수 있도록 합니다. 발행자가 메시지 발행을 멈추거나 시스템에서 이탈했을 때 이를 감지하는 데 사용됩니다.

정책:

AUTOMATIC: DDS가 자동으로 발행자의 생존을 감지합니다.

MANUAL_BY_TOPIC: 발행자가 특정 토픽으로 주기적인 신호(Alive Message)를 보내야 구독자가 생존을 감지합니다.

활용: 로봇의 핵심 제어 노드나 비상 정지 시스템처럼 발행자의 생존 여부가 중요한 경우에 사용합니다.

1.5. Deadline (지연)

개념: 메시지가 얼마나 자주 발행되어야 하는지 또는 메시지가 도착하는 데 허용되는 최대 시간을 설정합니다. 메시지 발행 주기나 수신 주기의 지연을 감지하는 데 사용됩니다.

활용: 주기적인 센서 데이터(예: IMU)나 모터 제어 명령처럼 엄격한 타이밍이 요구되는 통신에 사용합니다. 발행자가 Deadline 정책을 위반하면 DDS는 이를 감지하고 구독자에게 알릴 수 있습니다.

1.6. Lifespan (수명)

개념: 메시지가 발행된 후 얼마나 오랫동안 유효한지 설정합니다. 오래된 메시지는 구독자에게 전달되지 않습니다.

활용: 로봇 이동 명령처럼 너무 오래된 메시지는 유효하지 않으므로 무시해야 하는 경우에 사용합니다.

2. ROS2 QoS 활용 전략 (로봇 시스템의 안정성과 성능 최적화!)

ROS2의 각 노드는 토픽 발행자(Publisher)와 구독자(Subscriber)를 생성할 때 각각 QoS 프로파일을 설정할 수 있습니다. 발행자와 구독자의 QoS 프로파일이 호환되어야 통신이 성공적으로 이루어집니다.


2.1. 센서 데이터 (Lidar, Camera, IMU)

QoS: BEST_EFFORT, KEEP_LAST (큐 사이즈 작게), Deadline (필요시)

이유: 센서 데이터는 최신 정보가 중요하며, 일부 유실은 허용될 수 있습니다. 높은 빈도로 빠르게 전달되는 것이 더 중요합니다. Deadline을 사용하여 데이터 발행 주기가 지연되는 것을 감지할 수 있습니다.

2.2. 로봇 제어 명령 (Velocity Command, Joint Position)

QoS: RELIABLE, KEEP_LAST (큐 사이즈 1), Deadline (필수)

이유: 모터 제어 명령은 반드시 전달되어야 하며(Reliable), 최신 명령이 중요합니다(Keep_Last, 큐 사이즈 1). Deadline을 사용하여 제어 명령이 제시간에 전달되지 않는 상황을 감지하고 안전 조치를 취할 수 있습니다.

2.3. 로봇 상태 정보 (Battery Status, Error Status)

QoS: RELIABLE, TRANSIENT_LOCAL

이유: 로봇의 상태 정보는 반드시 전달되어야 하며(Reliable), 새로 연결되는 노드(예: GUI 모니터링 툴)도 로봇의 현재 상태를 즉시 알 수 있도록 마지막 메시지를 저장해 둡니다(Transient_Local).

2.4. 비상 정지 / 안전 관련 명령

QoS: RELIABLE, KEEP_LAST (큐 사이즈 1), Deadline, Liveliness (MANUAL_BY_TOPIC)

이유: 최우선적으로 전달되어야 하는 명령입니다. 발행자 노드의 생존 여부를 주기적으로 확인하여, 노드 고장 시에도 안전 시스템이 작동하도록 합니다.

2.5. 로깅 메시지

QoS: BEST_EFFORT, KEEP_LAST (큐 사이즈 작게 또는 1)

이유: 중요도가 낮으며, 네트워크 부하를 줄이기 위해 일부 유실을 허용합니다.

3. ROS2 코드에서 QoS 설정 (C++ 및 Python)

QoS 프로파일은 rclcpp::QoS (C++) 또는 rclpy.qos.QoSProfile (Python) 객체를 통해 설정할 수 있습니다.


C++ (ROS2):


#include "rclcpp/rclcpp.hpp"

#include "std_msgs/msg/string.hpp"


int main(int argc, char * argv[])

{

  rclcpp::init(argc, argv);

  auto node = rclcpp::Node::make_shared("minimal_qos_publisher");


  // QoS 프로파일 설정

  rclcpp::QoS qos_profile(10); // History 깊이 10

  qos_profile.reliability(RMW_QOS_POLICY_RELIABILITY_RELIABLE); // Reliable

  qos_profile.durability(RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL); // Transient_Local

  // qos_profile.liveliness(RMW_QOS_POLICY_LIVELINESS_AUTOMATIC);

  // qos_profile.deadline(std::chrono::milliseconds(100));


  auto publisher = node->create_publisher<std_msgs::msg::String>("my_topic", qos_profile);


  rclcpp::shutdown();

  return 0;

}

Python (ROS2):


import rclpy

from rclpy.node import Node

from rclpy.qos import QoSProfile, ReliabilityPolicy, DurabilityPolicy, LivelinessPolicy


from std_msgs.msg import String


class MinimalQosPublisher(Node):

    def __init__(self):

        super().__init__('minimal_qos_publisher')


        # QoS 프로파일 설정

        qos_profile = QoSProfile(

            depth=10,

            reliability=ReliabilityPolicy.RELIABLE, # Reliable

            durability=DurabilityPolicy.TRANSIENT_LOCAL, # Transient_Local

            # liveliness=LivelinessPolicy.AUTOMATIC,

            # deadline=rclpy.duration.Duration(seconds=0.1)

        )


        self.publisher_ = self.create_publisher(String, 'my_topic', qos_profile)


def main(args=None):

    rclpy.init(args=args)

    node = MinimalQosPublisher()

    rclpy.spin(node)

    node.destroy_node()

    rclpy.shutdown()


if __name__ == '__main__':

    main()

4. QoS 활용, 로봇 개발 효율을 높이는 팁

4.1. 호환성 확인: 발행자와 구독자의 QoS 설정이 호환되어야만 통신이 이루어집니다. ReliabilityPolicy.RELIABLE 발행자와 ReliabilityPolicy.BEST_EFFORT 구독자는 호환되지 않습니다.

4.2. 기본값 이해: 각 DDS 구현체나 ROS2 버전별로 QoS의 기본값이 다를 수 있으므로, 명시적으로 설정하거나 문서를 확인해야 합니다.

4.3. 테스트 및 모니터링: ros2 topic info --verbose <topic_name> 명령어를 사용하여 현재 토픽의 QoS 설정을 확인하고, rqt_graph나 rqt_plot 등을 사용하여 QoS 설정이 통신 품질에 미치는 영향을 모니터링합니다.

4.4. 안전 규격 준수: 산업용 로봇이나 의료 로봇과 같이 안전 관련 규격(예: ISO 26262, IEC 61508)을 준수해야 하는 시스템에서는 통신 품질(특히 Reliability, Deadline)에 대한 엄격한 QoS 설정이 필수적입니다.

4.5. 시스템 안정성 분석: QoS를 통해 메시지 유실, 지연 등의 통신 특성을 제어함으로써 로봇 시스템의 안정성을 분석하고 개선하는 데 활용합니다.

ROS2 Quality of Service (QoS)는 로봇 제작 지식 쌓기, 제어 시스템, 로봇 하드웨어, 운영체제(ROS) 및 알고리즘 개발, 그리고 시스템의 안정성 분석, 효율성 향상에 대한 깊은 이해와 관심을 가지신 여러분에게 ROS2의 DDS 기반 통신에서 각 데이터의 중요도와 목적에 맞춰 통신 품질을 최적화하고, 로봇 시스템의 실시간성, 안정성, 신뢰성을 확보하기 위한 핵심 기술입니다. 이러한 QoS 정책들과 활용법을 완벽하게 마스터하여 미래의 복잡하고 까다로운 로봇 시스템을 효율적이고 안정적으로 구현하는 데 큰 기여를 할 것이라고 믿습니다!

댓글목록

등록된 댓글이 없습니다.


회사소개 개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

작크와콩나무
대표:이강복 등록번호:129-30-34337 개인정보관리책임자:이경영

Copyright © https://roboman.co.kr/ All rights reserved.