突破性 middleware 如何革命化機器人通訊,從單一機器人到廣域機器人群體
想像一下:自主機器人正在東京的倉庫中導航,而我們在舊金山的辦公室中監控其進度。在雲端運行的控制演算法與機器人的載體系統無縫協調,就像它們在同一個房間裡一樣。同時,城市中的送貨無人機群組分享即時協調資料,儘管它們在品質變化的行動網路上運作,但仍能保持完美同步。
這不是科幻小說——這是現代機器人團隊今天正在建構的現實。但問題來了:讓這一切成為可能的通訊骨幹一直是瓶頸。
機器人世界本質上是分散式的。無論你是在協調無人機群、從地球另一端遙控機器人,還是建構擁有數十個處理單元的複雜自主車輛,一切都取決於一個關鍵因素:你的元件彼此溝通得多好。
在 ROS 2 生態系統中,這種通訊透過 RMW (ROS Middleware) 層發生——可以把它想像成讓機器人的大腦、感測器和致動器能夠對話的通用翻譯器。
多年來,ROS 依賴 DDS (Data Distribution Service) 實作。DDS 強大且經過實戰考驗,為機器人社群提供了出色的服務。但當我們推進新的前沿——網際網路規模的機器人、邊緣到雲端的整合,以及大規模多機器人系統——我們遇到了傳統 middleware 未設計來處理的障礙。
痛點是真實的:
這時 Zenoh 帶來的一線曙光。更具體地說,對 ROS 2 社群而言,是 rmw_zenoh。
在深入解決方案之前,讓我們了解是什麼讓 rmw_zenoh_cpp
如此強大。它建構在精心設計的堆疊上,每一層都有特定用途,從你的高層機器人應用程式到網路硬體:
┌─────────────────────────────────────────────────────────────┐
│ ROS 2 Applications │
│ (your robots, nodes, launch files) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ ROS 2 Client Libraries │
│ (rclcpp, rclpy, rclc, etc.) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ RCL (ROS Client Library) │
│ (language-agnostic common functionality) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ RMW Interface │
│ (standardized middleware API) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ rmw_zenoh_cpp │ ← This is where the magic happens
│ (Zenoh RMW implementation for C++) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ zenoh-cpp │
│ (C++ bindings for Zenoh) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ zenoh-c │
│ (C API wrapper around Zenoh core) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ Zenoh (Rust Core) │
│ (high-performance pub/sub/query protocol engine) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ Network Transport Layer │
│ (TCP, UDP, Unix sockets, shared memory, etc.) │
└─────────────────────────────────────────────────────────────┘
在基礎層,Zenoh 核心(用 Rust 編寫以獲得最大效能和安全性)處理複雜的網路、路由和協定細節。C 和 C++ 綁定提供符合人體工學的 API,而 rmw_zenoh
將 ROS 2 語意轉換為 Zenoh 操作。
這種分層方法的美妙之處在於 你現有的 ROS 2 應用程式完全保持不變——它們仍然使用熟悉的 rclcpp
或 rclpy
API。但在底層,它們獲得了 Zenoh 先進網路功能的存取權:無縫 WAN 通訊、強健的探索和最佳化的傳輸選擇。
對機器人團隊而言,這些功能解決了重大挑戰:
rmw_zenoh
是 官方 RMW 實作,無縫整合 Zenoh 的革命性網路功能到 ROS 2 生態系統中。
轉換異常簡單: 透過將預設的 DDS RMW 替換為 rmw_zenoh
,你的 ROS 2 節點停止說 DDS 而開始說 Zenoh。你不需要更改應用程式碼的任何一行。你的 publisher、subscriber、service 和 action 完全如以前一樣工作——但現在它們由 Zenoh 的先進網路引擎驅動。
這就像在機器人仍在運行時升級其神經系統。
要真正理解 rmw_zenoh
的威力,檢視其內部架構和設計決策至關重要。該實作代表了將 ROS 2 的通訊範式複雜地映射到 Zenoh 的網路原語上。
每 Context 一個 Session 設計:
每個 ROS 2 "context"(middleware 配置)恰好映射到一個 Zenoh "session"。這意味著單一 context 內的所有 publisher、subscription、service 和 client 共享相同的底層 Zenoh session,最佳化資源使用和連線管理。
Router 輔助探索與點對點資料流:
該架構使用混合方法,利用中心化和去中心化設計的最佳部分:
這種設計提供了可靠的探索,同時保持直接點對點資料傳輸的效能優勢。
Graph Cache:ROS 2 整合的核心rmw_zenoh
最巧妙的方面之一是其 graph cache 系統。由於 Zenoh 優先考慮最小探索開銷,而 ROS 2 期望完整的圖可見性,每個 context 維護所有已發現實體的綜合快取:
@ros2_lv
前綴為 ROS 2 實體創建隔離的命名空間智慧 Key Expression 映射:
Topic 和 service 使用複雜的方案映射到 Zenoh key expression,確保型別安全和域隔離:
<domain_id>/<fully_qualified_name>/<type_name>/<type_hash>
這種方法防止不同 ROS 域之間的交叉通訊,並確保只有相容的型別能夠通訊。
Quality of Service 轉換:
實作智慧地將 ROS 2 QoS 策略映射到 Zenoh 功能:
TRANSIENT_LOCAL
durability → Zenoh publication cacheRELIABLE
reliability → TCP 傳輸選擇KEEP_ALL
history → Congestion control blocking mode + Queue預設網路拓樸經過精心設計以獲得最佳效能:
Local Zenoh Router (tcp/[::]:7447)
↑
│ (discovery only)
↓
ROS 2 Sessions ←→ Direct P2P connections (data)
預設配置:
tcp/localhost:7447
,在隨機 loopback port 上監聽訊息的CDR 序列化策略:
Attachment Metadata:
每則訊息在 Zenoh attachment 中包含豐富的 metadata:
Service-to-Query 映射:
ROS 2 service 優雅地映射到 Zenoh 的 query/reply 模式:
ALL_COMPLETE
目標的 Zenoh query這種架構基礎使 rmw_zenoh
不只是簡單的協定轉換層,而是保持 ROS 2 語意同時解鎖 Zenoh 先進網路功能的複雜通訊系統。
以下是讓機器人切換到 rmw_zenoh
的具體好處:
殺手級功能: 連接跨網際網路的 ROS 2 系統變得像連接到本地網路一樣簡單。在雲端部署 Zenoh router,將你的機器人和控制站指向它而無需自訂橋接程式碼。
Zenoh 的超輕量級協定直接轉化為 更低的 CPU 使用率、減少的記憶體佔用和延長的電池壽命。對於資源受限的嵌入式系統,這不只是最佳化——這是可行與不可行的差別。
簡單的 JSON5 配置檔案讓你精細調整一切:點對點 vs. router 模式、安全設定、傳輸選擇。不再與 XML 配置噩夢搏鬥。
Zenoh 的路由功能實現與其他系統——MQTT、網路服務、雲端平台——的無縫整合。既存的 ROS 2 系統成為更大數位生態系統的一部分,無需自訂橋接解決方案。
準備好轉換你的 ROS 2 通訊了嗎?RMW 層的美妙之處在於切換到不同實作異常將但。
對於單主機通訊,你需要運行 Zenoh router:
# Terminal 1: Start the Zenoh router
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
ros2 run rmw_zenoh_cpp rmw_zenohd
# Terminal 2: Run your talker
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
ros2 run demo_nodes_cpp talker
# Terminal 3: Run your listener
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
ros2 run demo_nodes_cpp listener
與傳統 DDS 實作不同,Zenoh 使用基於 router 的架構進行探索,但然後建立直接點對點連線進行資料傳輸。當 ROS 節點啟動時:
rmw_zenohd
)這種設計提供了兩全其美的好處:簡單的探索和高效的直接通訊。
rmw_zenoh
使用兩個關鍵配置檔案:
DEFAULT_RMW_ZENOH_ROUTER_CONFIG.json5
- 用於 Zenoh routerDEFAULT_RMW_ZENOH_SESSION_CONFIG.json5
- 用於 ROS 節點可以透過從安裝目錄複製來自訂這些:
# Copy default configs for customization
cp /opt/ros/${ROS_DISTRO}/share/rmw_zenoh_cpp/config/DEFAULT_RMW_ZENOH_ROUTER_CONFIG.json5 ./router_config.json5
cp /opt/ros/${ROS_DISTRO}/share/rmw_zenoh_cpp/config/DEFAULT_RMW_ZENOH_SESSION_CONFIG.json5 ./session_config.json5
# Use custom configs
export ZENOH_ROUTER_CONFIG_URI=./router_config.json5
export ZENOH_SESSION_CONFIG_URI=./session_config.json5
對於 WAN 通訊或連接多個主機,修改你的配置以連接到遠端 router:
// session_config.json5
{
mode: "client", // Important for remote connections
connect: {
endpoints: ["tcp/your.robot.ip:7447"]
}
}
要傳遞大資料時,可選擇啟用 shared memory 以減少延遲:
// In your config files
{
transport: {
shared_memory: {
enabled: true
}
}
}
也可以透過環境變數直接替換配置功能,是不是很方便呢?
# Enable multicast scouting for peer discovery without router
ZENOH_CONFIG_OVERRIDE='scouting/multicast/enabled=true' ros2 run demo_nodes_cpp talker
模式 1:雲端連接機器人
模式 2:多機器人系統
模式 3:邊緣到雲端整合
如果你想更深入了解 zenoh-plugin-ros2dds 的詳細內容,可以參考我們之前的文章:Day 25: Zenoh 在機器人系統的應用全景 Part 2 - ROS 2 與 zenoh-plugin-ros2dds
在探索 ROS 2 的 Zenoh 生態系統時,你會遇到兩種不同的方法:rmw_zenoh
和 zenoh-plugin-ros2dds
。理解它們的差異對於為你的應用程式選擇正確的工具至關重要。
rmw_zenoh:原生 RMW 方法
zenoh-plugin-ros2dds:Bridge 方法
選擇 rmw_zenoh 當:
選擇 zenoh-plugin-ros2dds 當:
方面 | rmw_zenoh | zenoh-plugin-ros2dds |
---|---|---|
設定複雜度 | 最小 - 只需更改 RMW_IMPLEMENTATION | 中等 - 需要 bridge 部署 |
效能 | 最高 - 沒有轉換開銷 | 高 - 有轉換成本 |
記憶體使用 | 低 - 單一協定堆疊 | 高 - 運行 DDS 和 Zenoh |
遷移路徑 | 全有或全無的切換 | 漸進地採用 |
混合環境 | 所有節點必須使用 rmw_zenoh | 可以橋接任何基於 DDS 的節點 |
探索開銷 | Zenoh 的高效探索 | 將 DDS 探索橋接到 Zenoh |
探索機制:
rmw_zenoh:
ROS Node → Zenoh Session → Zenoh Router → Network
zenoh-plugin-ros2dds:
ROS Node → DDS → Bridge (DDS Reader/Writer) → Zenoh → Network
訊息流:
配置:
最後我們來看一下即將在今年十月登場的 ROSCon 2025 workshop, 這個系列透過涵蓋以下內容,來展示了以下的主題:
強調 rmw_zenoh
不只是理論上的改進 —— 它是開發者可以立即部署的實用解決方案,而無需更改多少程式碼。
我們正在見證機器人學的根本轉變,孤立的單機器人系統時代正在結束, 未來的機器人在機器人群中運作,跨區域協作,並無縫整合雲端智慧與邊緣處理。
這種轉換需要能跟得上的通訊骨幹——強健、高效且無限可擴展的。rmw_zenoh
不只是應對這項挑戰;它正在定義什麼是可能的。
如果你正在建構分散式機器人系統,快來參與這份開源專案吧! rmw_zenoh