welcom ! Handel home

2025年2月17日 星期一

ROS2 不同網域的 workspace_name & ROS_DOMAIN_ID 互通

 

📌 不同網域的 ROS 2 workspace_name & ROS_DOMAIN_ID 是否可以互通?

ROS 2 中,通訊基於 DDS(Data Distribution Service)並不依賴 Workspace 名稱,而是依賴 ROS_DOMAIN_ID 和 DDS 發現機制

簡單結論:如果 ROS_DOMAIN_ID 相同,則即使 workspace 名稱不同,也可以通訊
如果 ROS_DOMAIN_ID 不同,即使 workspace 名稱相同,也無法通訊

但如果是 不同的網域(不同子網),即使 ROS_DOMAIN_ID 相同,也可能需要額外設定 DDS,以確保它們可以跨網通訊。


1️⃣ 影響 ROS 2 通訊的關鍵條件

影響因素是否影響 ROS 2 通訊?
ROS_DOMAIN_ID (需相同)✅ 影響(不同則無法通訊)
Workspace 名稱❌ 不影響
IP 地址是否可達✅ 影響(不同網段可能有問題)
DDS Middleware✅ 影響(不同 DDS 可能無法發現彼此)
防火牆 / NAT✅ 影響(若阻擋 UDP 7400~7600,通訊可能失敗)

2️⃣ ROS_DOMAIN_ID 相同,但不同網域(不同子網)如何通訊?

✅ 條件 1:兩台機器可以相互 ping

如果機器 A(192.168.1.10)與機器 B(10.0.0.20)在不同的子網內,首先確認它們可以互相 ping

bash
ping 10.0.0.20 # 在 192.168.1.10 上測試 ping 192.168.1.10 # 在 10.0.0.20 上測試

如果 ping 失敗,表示它們不在同一個可通訊的網絡內,ROS 2 DDS 無法發現對方

✅ 條件 2:確保 UDP 7400~7600 端口開放

ROS 2 DDS 預設使用 UDP 7400~7600 進行通訊,請確保這些端口沒有被防火牆封鎖:

bash
sudo ufw allow 7400:7600/udp

✅ 條件 3:指定手動發現機制(Fast DDS XML 設定)

如果不同子網無法自動發現 ROS 2 Node,可以手動指定 DDS 發現對象。

🔹 設定 Fast DDS XML

/etc/ros2/fastdds.xml 添加:

xml
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles"> <participant profile_name="ros_default_participant" is_default_profile="true"> <rtps> <builtin> <metatrafficUnicastLocatorList> <locator> <udpv4 address="192.168.1.10" port="7400"/> </locator> <locator> <udpv4 address="10.0.0.20" port="7400"/> </locator> </metatrafficUnicastLocatorList> </builtin> </rtps> </participant> </profiles>

然後在每台機器上設定:

bash
export FASTRTPS_DEFAULT_PROFILES_FILE=/etc/ros2/fastdds.xml

這樣 ROS 2 就會強制透過 指定的 IP 來進行通訊,即使在不同子網內也可以互通。


3️⃣ 測試不同網域的 ROS 2 通訊

🔹 機器 A

IP:192.168.1.10

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

🔹 機器 B

IP:10.0.0.20

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

如果設定正確,機器 B 應該會收到來自機器 A 的訊息 🎉。


4️⃣ 何時 ROS_DOMAIN_ID 應該相同?何時應該不同?

場景ROS_DOMAIN_ID 設定影響
同一子網內,所有設備互通相同直接發現對方
不同子網,但希望互通相同 + FastDDS XML需手動指定對方 IP
不同子網,互相隔離不同彼此不會干擾
同一子網,運行多個 ROS 2 應用不同彼此隔離

📌 總結

即使 workspace 名稱不同,只要 ROS_DOMAIN_ID 相同,ROS 2 Nodes 仍然可以通訊。
如果 ROS_DOMAIN_ID 不同,則無法通訊,即使 workspace 名稱相同。
如果不同網域(不同子網),需要手動指定 DDS 發現機制,否則可能無法自動找到對方。
確保 UDP 7400~7600 端口開放,避免防火牆阻擋 DDS 通訊。

🚀 如果你要在不同網域的 ROS 2 設備互通,建議設定 ROS_DOMAIN_ID 相同,

並使用 Fast DDS XML 來手動指定對方 IP! 🎉

沒有留言: