ROS 2 ROS_DOMAIN_ID
設定規則
ROS_DOMAIN_ID
主要影響 ROS 2 通訊的範圍,因為 ROS 2 使用 DDS(Data Distribution Service) 進行去中心化 P2P 通訊,並透過 Domain ID 來區隔不同的 ROS 2 網絡。
1️⃣ 同一主機內的 ROS 2 Workspace
在 同一台主機內,你可以有多個 workspace(例如 ros2_ws1/
和 ros2_ws2/
),只要這些 Workspace 使用相同的 ROS_DOMAIN_ID
,它們就可以彼此通訊,無需考慮子網域的問題。
✅ 設定方式
這樣,同一台主機內的所有 ROS 2 Nodes(無論來自哪個 Workspace),都可以通訊。
📌 注意:
- ROS 2 不會因為 workspace 名稱不同 而影響通訊,只看
ROS_DOMAIN_ID
。 source install/setup.bash
會讓當前 terminal 使用該 Workspace 的 packages,但這不會影響ROS_DOMAIN_ID
。
2️⃣ 不同主機的 ROS 2 Workspace
如果 不同主機 上有 相同名稱的 Workspace(例如都叫 ros2_ws/
),只要:
- 它們在相同的網路(區域網或 VPN)
- 它們的
ROS_DOMAIN_ID
設定相同 - 它們的 DDS Middleware 相容(預設都是 FastDDS)
這些主機上的 ROS 2 Nodes 可以互相發現並通訊。
✅ 設定方式
在 主機 A(192.168.1.10):
在 主機 B(192.168.1.11):
✅ 如果環境正確,主機 B 應該會接收到主機 A 發送的訊息。
📌 注意:
ROS_DOMAIN_ID
不需要與 Workspace 名稱匹配,即使不同主機的 Workspace 叫不同名字(ros2_ws_A/
和ros2_ws_B/
),只要ROS_DOMAIN_ID
相同,它們仍可通訊。- 不同
ROS_DOMAIN_ID
之間無法通訊,這是 ROS 2 用來區隔不同 ROS 2 網絡的方法。
3️⃣ 何時 ROS_DOMAIN_ID
需要不同?
如果你希望 不同的 ROS 2 網絡 彼此隔離,則需要給它們不同的 ROS_DOMAIN_ID
。
情境 1️⃣:同一台主機內有不同 ROS 2 應用,需要隔離
假設你在 同一台主機內 運行兩個 ROS 2 應用:
- 應用 A:機器人控制(使用
ROS_DOMAIN_ID=10
) - 應用 B:模擬環境(使用
ROS_DOMAIN_ID=20
)
設定方式:
這樣,應用 A 和 B 之間的 ROS 2 Nodes 彼此不會互相影響。
情境 2️⃣:同一個局域網內有不同的 ROS 2 機器
如果你有兩台 ROS 2 機器,但它們屬於不同的 ROS 應用,你可以設定不同的 ROS_DOMAIN_ID
:
這樣 導航系統 和 感測器數據處理系統 之間不會干擾。
📌 總結
場景 | ROS_DOMAIN_ID 設定 | 影響 |
---|---|---|
同一台主機,單個 ROS 2 應用 | 相同 | 所有 Node 可通訊 |
同一台主機,兩個獨立 ROS 2 應用 | 不同 | 彼此隔離,互不干擾 |
不同主機,應用互通 | 相同 | 跨機器通訊 |
不同主機,不同應用 | 不同 | 彼此隔離 |
🚀 如果你的 ROS 2 Nodes 需要互通,就讓 ROS_DOMAIN_ID
相同;如果需要隔離,就讓 ROS_DOMAIN_ID
不同! 🎉
沒有留言:
張貼留言