welcom ! Handel home

2025年2月17日 星期一

ROS 2 ROS_DOMAIN_ID 設定規則

 

 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,它們就可以彼此通訊,無需考慮子網域的問題。

✅ 設定方式

bash
export ROS_DOMAIN_ID=10

這樣,同一台主機內的所有 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/),只要:

  1. 它們在相同的網路(區域網或 VPN)
  2. 它們的 ROS_DOMAIN_ID 設定相同
  3. 它們的 DDS Middleware 相容(預設都是 FastDDS)

這些主機上的 ROS 2 Nodes 可以互相發現並通訊

✅ 設定方式

主機 A(192.168.1.10)

bash
export ROS_DOMAIN_ID=10 source ~/ros2_ws/install/setup.bash ros2 run demo_nodes_cpp talker

主機 B(192.168.1.11)

bash
export ROS_DOMAIN_ID=10 source ~/ros2_ws/install/setup.bash ros2 run demo_nodes_cpp listener

如果環境正確,主機 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

設定方式:

bash
# Terminal 1:應用 A(控制機器人) export ROS_DOMAIN_ID=10 ros2 run my_robot_controller node_a # Terminal 2:應用 B(模擬環境) export ROS_DOMAIN_ID=20 ros2 run gazebo_ros gazebo

這樣,應用 A 和 B 之間的 ROS 2 Nodes 彼此不會互相影響


情境 2️⃣:同一個局域網內有不同的 ROS 2 機器

如果你有兩台 ROS 2 機器,但它們屬於不同的 ROS 應用,你可以設定不同的 ROS_DOMAIN_ID

bash
# 機器 A(負責導航,使用 DOMAIN 10) export ROS_DOMAIN_ID=10 ros2 run nav2_bringup bringup_launch.py # 機器 B(負責感測器數據處理,使用 DOMAIN 20) export ROS_DOMAIN_ID=20 ros2 run sensor_processing_node sensor_node

這樣 導航系統感測器數據處理系統 之間不會干擾。


📌 總結

場景ROS_DOMAIN_ID 設定影響
同一台主機,單個 ROS 2 應用相同所有 Node 可通訊
同一台主機,兩個獨立 ROS 2 應用不同彼此隔離,互不干擾
不同主機,應用互通相同跨機器通訊
不同主機,不同應用不同彼此隔離

🚀 如果你的 ROS 2 Nodes 需要互通,就讓 ROS_DOMAIN_ID 相同;如果需要隔離,就讓 ROS_DOMAIN_ID 不同! 🎉

沒有留言: