이 가이드는 인류와 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:
- FastDDS: Default, open-source, Apache-licensed — best for development
- CycloneDDS: Eclipse Foundation, optimized for embedded systems
- RTI Connext: Commercial, enterprise-grade, built-in security
- Gurum DDS: Korean implementation, automotive-focused
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_IMPLEMENTATION3. 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.xml5. 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 08. 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_name9. 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-args10. Best Practices & Optimization
- Production: Use FastDDS or RTI Connext with SROS2 security
- Embedded: CycloneDDS for minimal memory footprint
- Multicast: Disable on heterogeneous networks; use unicast in datacenters
- QoS: Match reliability/durability to use case (sensor data ≠ control commands)
- Monitoring: Use ros2 doctor and DDS discovery tools for diagnostics
- Latency Tuning: Reduce heartbeat intervals for faster discovery; increase batch sizes for throughput
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.