2025年9月10日 星期三

Gzserver 和 Gzclient 確實可以在不同 IP 的主機上運行

 Gzserver 和 Gzclient 確實可以在不同 IP 的主機上運行,這是 Gazebo 模擬器設計的核心優勢之一,允許您將複雜的物理模擬(在 Gzserver 上)與圖形化視覺化(在 Gzclient 上)分開。這對於遠端控制、高效能計算或多使用者協作非常有用。

如何建立 Gzserver 與 Gzclient 的遠端連線

要讓 Gzserver 和 Gzclient 在不同 IP 的主機上成功連線,您需要確保以下條件和步驟:

步驟一:設定環境變數

這是最關鍵的步驟。Gzserver 和 Gzclient 預設會尋找一個名為 GAZEBO_MASTER_URI 的環境變數來建立連線。這個變數會告訴客戶端伺服器的位置。

  • 在運行 Gzserver 的主機上:

    Gzserver 在啟動時會綁定一個主機位址和埠號。您可以透過 export 設定 GAZEBO_MASTER_URI,也可以讓它使用預設值。預設的埠號是 11345

    # 這行指令是選擇性,如果未指定,Gazebo會自動使用預設的 'localhost:11345'
    export GAZEBO_MASTER_URI=http://<伺服器IP位址>:11345
    

    然後,啟動伺服器:

    gzserver --verbose empty.world
    
  • 在運行 Gzclient 的主機上:

    這是最重要的一步。您必須將客戶端的 GAZEBO_MASTER_URI 設定為伺服器的 IP 位址。

    # 這裡的 <伺服器IP位址> 是運行 gzserver 的主機的實際 IP
    export GAZEBO_MASTER_URI=http://<伺服器IP位址>:11345
    

    接著,啟動客戶端:

    gzclient
    

如果一切設定正確,Gzclient 將會連線到遠端伺服器,並開始顯示模擬畫面。

步驟二:確保網路連線暢通

  • 防火牆設定:請確保伺服器主機的防火牆允許來自客戶端主機的連線,特別是 Gazebo 使用的 11345 埠號。如果需要,您可能需要新增一條防火牆規則。

  • IP 位址:確保客戶端填寫的 IP 位址是伺服器主機在網路中的可達位址。如果兩台主機在同一個區域網路,通常是 192.168.x.x10.0.x.x 這樣的位址。


ROS2 與 Gazebo Sim (新版) 的連線

對於 ROS2 和 Gazebo Sim(例如 Fortress 或 Garden),連線機制更加簡化。它依賴於 ROS2 的 DDS (Data Distribution Service) 通訊協定。

ROS2 的節點(包括 Gazebo Sim 的 ROS 插件)使用 DDS 進行發現和通訊。只要兩台電腦在同一個網路中,且 ROS2 的環境變數(例如 ROS_DOMAIN_ID)設定一致,它們就能自動找到彼此並建立連線。

因此,在 ROS2 環境中,您通常只需要確保:

  1. ROS2 環境變數一致:在兩台主機上執行 source 指令來載入相同的 ROS2 版本,並確保 ROS_DOMAIN_ID 環境變數相同。

  2. 啟動 Gazebo Sim

    • 在伺服器主機上啟動 Gazebo Sim,通常是透過 ROS2 啟動檔案:

      Bash
      ros2 launch my_robot_pkg my_robot.launch.py
      
    • 在客戶端主機上,您只需要啟動一個 ROS 節點來處理資料或發送命令,例如啟動 RVIZ2 來視覺化:

      Bash
      ros2 run rviz2 rviz2
      

總之,Gzserver 和 Gzclient 可以在不同主機上連線。在 Gazebo Classic 中,這需要手動設定 GAZEBO_MASTER_URI;而在 ROS2 的新版 Gazebo Sim 中,它則透過更先進的 DDS 機制自動完成。



沒有留言:

張貼留言