welcom ! Handel home

2025年2月17日 星期一

ROS 2 多主機 (Multi-Machine) 通訊架構

 


📌 ROS 2 多主機 (Multi-Machine) 通訊架構

ROS 2 採用了 DDS(Data Distribution Service),這是一種**無需 Master(去中心化)**的通訊架構,因此在 不同主機之間的 Node 互聯 變得更加靈活。以下是如何在 多主機架構下整合 ROS 2 分佈式通訊 的方法。


1️⃣ ROS 2 多主機通訊的基本概念

在 ROS 1 中,所有的 Node 都需要連接到 ROS Master(單一管理中心),所以需要設定:

bash
export ROS_MASTER_URI=http://<master-ip>:11311 export ROS_IP=<your-ip>

但在 ROS 2 中,沒有 ROS Master,而是基於 DDS,使用 Peer-to-Peer(P2P)網絡發現,這使得 ROS 2 可以直接讓不同主機上的 Node 通訊,無需中心管理。


2️⃣ ROS 2 多主機通訊設定

要讓不同主機的 ROS 2 Node 可以互相通訊,需要:

🔹 (1) 確保所有設備在相同的網絡內

所有 ROS 2 主機必須在 相同的子網VPN 內,否則 DDS 發現機制可能無法運行。例如:

bash
主機 A:192.168.1.10 主機 B:192.168.1.11

🔹 (2) 設定 ROS_DOMAIN_ID

每台電腦都必須設定相同的 ROS_DOMAIN_ID 來確保它們屬於相同的 ROS 2 網絡:

bash
export ROS_DOMAIN_ID=10

ROS_DOMAIN_ID 預設為 0,如果你有多組 ROS 2 網絡,需要分配不同的 ID。

💡 建議方式:將這個設定寫入 ~/.bashrc

bash
echo "export ROS_DOMAIN_ID=10" >> ~/.bashrc

🔹 (3) 檢查 DDS 廠商(RMW Implementation)

ROS 2 預設支援多種 DDS 廠商(Middleware),但不同 DDS 可能無法互通,因此確保所有機器使用 相同的 DDS

bash
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp # 預設使用 FastRTPS

可用的 DDS 供應商:

  • rmw_fastrtps_cpp (預設)
  • rmw_cyclonedds_cpp
  • rmw_connextdds(需額外安裝)

測試目前 DDS 設定:

bash
ros2 doctor --report

🔹 (4) 測試不同主機的 ROS 2 通訊

主機 A 啟動 Talker:

bash
ros2 run demo_nodes_cpp talker

主機 B 啟動 Listener:

bash
ros2 run demo_nodes_cpp listener

如果設定正確,主機 B 應該能夠接收來自主機 A 的 ROS 2 訊息


3️⃣ 多主機架構的進階整合方法

如果你希望不同主機之間的 ROS 2 通訊更穩定或跨網段通訊,你可以使用以下進階方案。

🔹 (1) 設定 FASTRTPS_DEFAULT_PROFILES_FILE

ROS 2 使用 Fast DDS 作為預設 DDS,並且允許透過 XML 設定手動指定 ROS 2 網絡的通訊模式

  1. 建立 fastdds.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="192.168.1.11" port="7400"/> </locator> </metatrafficUnicastLocatorList> </builtin> </rtps> </participant> </profiles>
  2. 讓 ROS 2 使用這個設定
    bash
    export FASTRTPS_DEFAULT_PROFILES_FILE=/etc/ros2/fastdds.xml

🔹 (2) 使用 ROS 2 DDS Router

ROS 2 DDS Router 可用來讓不同網段或 VPN 之間的 ROS 2 通訊,這是因為 ROS 2 預設的 DDS 無法在不同網段內自動發現對方

  1. 安裝 ROS 2 DDS Router
    bash
    sudo apt install ros-humble-dds-router
  2. 建立 Router 設定 建立 /etc/ros2/dds_router.yaml
    yaml
    version: v1.0 participants: - name: machine_A kind: simple domain: 10 discovery: unicast: - address: 192.168.1.10 port: 7400 - name: machine_B kind: simple domain: 10 discovery: unicast: - address: 192.168.1.11 port: 7400
  3. 啟動 DDS Router 在機器上執行:
    bash
    ros2 run dds_router dds_router /etc/ros2/dds_router.yaml
    這將允許跨網段通訊。

🔹 (3) 使用 VPN 來確保 ROS 2 網絡穩定

如果你的主機不在同一個區域網路,ROS 2 可能無法透過 DDS 自動發現 對方,解決方案:

  • 使用 VPN(如 Tailscale, Zerotier) 來模擬相同子網。
  • 確保 VPN 內的 IP 在 fastdds.xml 內手動指定

📌 總結

方法適用情境設定難度
ROS_DOMAIN_ID 相同本地區域網內,所有機器在相同子網
FASTRTPS_DEFAULT_PROFILES_FILE指定特定機器連線,適合跨不同子網
ROS 2 DDS Router跨網段,適用於不同 VPN 或遠端機器中等
VPN(Tailscale, Zerotier)不同地點的 ROS 2 機器互聯

🚀 推薦方式

1️⃣ 如果在相同區域網,使用 ROS_DOMAIN_ID 設定相同的值即可。
2️⃣ 如果機器跨網段,使用 Fast DDS XML 設定 來手動指定 IP。
3️⃣ 如果機器不在同一區域網或遠端機器要通訊,使用 ROS 2 DDS Router 或 VPN

這樣你的 ROS 2 分散式系統 就可以跨多主機運行,讓機器人與邊緣設備無縫通訊!🚀🎉

沒有留言: