Skip to main content
🤝

이 가이드는 인류와 AI가 함께 만드는 지식입니다.

이 콘텐츠는 Human + AI Partnership 철학 아래 모든 사람이 로봇·AI를 배울 수 있도록 무료로 제공됩니다. 당신의 질문과 기여가 다음 학생의 미래를 바꿉니다.

ROS 2 Middleware (RMW) Configuration Guide 2026

ROS 2 abstracts middleware through the RMW (ROS 2 Middleware) layer, enabling flexible switching between DDS implementations. Master middleware selection, QoS configuration, and network optimization for production robotics systems.

1. RMW Architecture Overview

The RMW layer decouples ROS 2 from specific DDS implementations, allowing runtime selection:

2. Switching RMW Implementations

Set the active middleware at runtime:

# List available RMW implementations
ros2 topic list --implementation

# Switch to CycloneDDS
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
ros2 run demo_nodes_cpp talker

# Switch to RTI Connext
export RMW_IMPLEMENTATION=rmw_connext_cpp
ros2 run demo_nodes_cpp listener

# Reset to default (FastDDS)
unset RMW_IMPLEMENTATION

3. QoS Profile Configuration

QoS (Quality of Service) policies control communication reliability, latency, and durability:

// Configure QoS in C++
#include <rclcpp/rclcpp.hpp>
#include <rmw/qos_profiles.h>

class PublisherNode : public rclcpp::Node {
 public:
  PublisherNode() : Node("publisher") {
    // Sensor QoS: Best effort, volatile (fast, unreliable)
    auto publisher = create_publisher<std_msgs::msg::String>(
      "topic", rmw_qos_profile_sensor_data);

    // System default QoS: Reliable, transient local
    auto cmd_pub = create_publisher<std_msgs::msg::String>(
      "command", rmw_qos_profile_default);

    // Custom QoS
    rclcpp::QoS qos(10);
    qos.reliability(rclcpp::ReliabilityPolicy::Reliable);
    qos.durability(rclcpp::DurabilityPolicy::TransientLocal);
    qos.deadline(std::chrono::milliseconds(100));
    qos.lifespan(std::chrono::milliseconds(1000));

    auto custom_pub = create_publisher<std_msgs::msg::String>(
      "custom", qos);
  }
};

4. Environment Variables & Configuration Files

Control RMW behavior through environment variables and XML configuration:

# Environment variables
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
export CYCLONEDDS_URI=file:///etc/cyclonedds.xml
export RMW_USE_LOCALHOST_ONLY=1  # Disable multicast

# Check active RMW
ros2 doctor --report

# FastDDS configuration (FastRTPS_DEFAULT_PROFILES_FILE)
export FASTRTPS_DEFAULT_PROFILES_FILE=/path/to/fastdds.xml

5. CycloneDDS XML Configuration

Advanced CycloneDDS tuning via XML:

<?xml version="1.0" encoding="UTF-8"?>
<CycloneDDS>
  <General>
    <AllowMulticast>spdp</AllowMulticast>
    <MaxMessageSize>65500</MaxMessageSize>
  </General>
  <Domain>
    <Id>0</Id>
    <RegisterBuiltinTopics>true</RegisterBuiltinTopics>
    <Internal>
      <HeartbeatInterval>100ms</HeartbeatInterval>
    </Internal>
    <Security>
      <Enable>false</Enable>
    </Security>
  </Domain>
  <NetworkInterfaces>
    <NetworkInterface name="eth0" priority="default" multicast="default" />
  </NetworkInterfaces>
</CycloneDDS>

6. FastDDS Profile Configuration

FastDDS uses XML profiles for tuning:

<?xml version="1.0" encoding="UTF-8"?>
<profiles>
  <participant profile_name="default_participant">
    <domainId>0</domainId>
    <discovery>
      <discoveryProtocol>SIMPLE</discoveryProtocol>
      <leaseAnnouncement>
        <seconds>10</seconds>
        <fraction>0</fraction>
      </leaseAnnouncement>
    </discovery>
    <transport>
      <builtin>UDP</builtin>
    </transport>
  </participant>

  <data_writer profile_name="default_writer">
    <qos>
      <reliability>
        <kind>RELIABLE</kind>
      </reliability>
      <durability>
        <kind>TRANSIENT_LOCAL</kind>
      </durability>
    </qos>
  </data_writer>
</profiles>

7. Multicast vs Unicast Configuration

Control discovery and communication patterns:

# Localhost-only (no network)
export RMW_USE_LOCALHOST_ONLY=1
ros2 run demo_nodes_cpp talker

# Disable multicast (unicast discovery)
export CYCLONEDDS_URI=file:///etc/cyclonedds-unicast.xml

# Check network discovery
ros2 topic list
ros2 node list

# Monitor DDS discovery (FastDDS)
fastdds discovery -i 0  # Domain ID 0

8. Network Diagnostics & Troubleshooting

Diagnose RMW and DDS communication issues:

# Full system report
ros2 doctor --report

# RMW implementation check
python3 -c "from rmw_implementation_cmake import get_rmw_impl_env_var; print(get_rmw_impl_env_var())"

# DDS participant discovery (wireshark or tcpdump)
tcpdump -i eth0 -n "udp port 7400"

# ROS 2 discovery inspection
ros2 run rclcpp_components list_components

# Topic statistics
ros2 topic bw /topic_name
ros2 topic hz /topic_name

9. Security & SROS2 Integration

Enable DDS-level security with SROS2:

# Enable SROS2 security (requires key generation)
export ROS_SECURITY_STRATEGY=enforce
export ROS_SECURITY_ROOT_DIRECTORY=/path/to/keystore
export ROS_SECURITY_LOOKUP_TYPE=FILE

# Generate security keys
ros2 security create_key /path/to/keystore /node_name
ros2 security create_policy /path/to/keystore policy.xml

# Run with security
ros2 run demo_nodes_cpp talker --ros-args --enforce-ros-args

10. Best Practices & Optimization

Key Takeaways

RMW abstraction enables switching DDS implementations without code changes. Master QoS profiles, network configuration, and security to build robust multi-node ROS 2 systems. Profile your network conditions and select the right combination of reliability, durability, and discovery policies for your robotics deployment.