welcom ! Handel home

2025年3月20日 星期四

ROS 分散式IP 之 node 設定及通訊方式 (ROS master) link (ROS clinet)

 在 ROS1 (如 Noetic) 中,若 ROS Master 與 Client Node 分布於不同主機(多台電腦),你需要手動設定環境變數,讓節點之間能夠跨主機透過 TCP 通訊。


✅ 你問的兩個核心問題解答:

🔸 1. ROS Client 主機也要安裝 ROS 嗎?

👉 是的!

  • 即使只是運行 ROS Node,也必須安裝 ROS(至少基本套件 ros-<version>-ros-coreros-<version>-desktop)。
  • ROS Node 需要用到 roscpprospy 等函式庫來與 Master 溝通。
  • 不必安裝完整的 Gazebo/RViz,但 roscorerosnoderostopic 等基本功能必須存在。

🔸 2. ROS Master 與 Client 在不同 IP 該如何通訊?

💡 前提:兩台主機(例如 Master 為 192.168.0.10,Client 為 192.168.0.20)必須能 互 ping、無防火牆阻擋


📌 步驟:設定跨主機 ROS 通訊(環境變數)

ROS Master 機器設定

bash
export ROS_MASTER_URI=http://192.168.0.10:11311 export ROS_HOSTNAME=192.168.0.10

ROS Client 機器設定

bash
export ROS_MASTER_URI=http://192.168.0.10:11311 export ROS_HOSTNAME=192.168.0.20

🧠 說明:

變數名稱說明
ROS_MASTER_URI指定 ROS Master 的位置 (IP:Port)
ROS_HOSTNAME or ROS_IP自己的主機 IP,讓其他節點能回傳給你

🚨 注意:只能設定 ROS_HOSTNAMEROS_IP,不要同時設兩個!


🗂️ ROS 的檔案結構與網路通訊角色

🧩 ROS Master(主控端):

負責管理:

  • Node 名稱、註冊
  • Topic 訂閱者與發布者
  • Service 請求管理

啟動指令

bash
roscore

🧩 ROS Node(Client):

  • 可以是 Publisher / Subscriber / Service Client / Server。
  • 會從 ROS_MASTER_URI 取得其他節點的位置,再進行點對點 TCPROS 連線

🌐 節點連線架構示意:

plaintext
[Node A on 192.168.0.20] <------> [ROS Master on 192.168.0.10] <------> [Node B on 192.168.0.10] | | |---------------- TCPROS direct link ----------------------|

🧪 測試連線狀態

✅ 在 ROS Master 機器:

bash
roscore

✅ 在 Client 機器(設定環境變數後):

bash
rosnode list

👉 如果連線成功,你會看到來自 ROS Master 的節點清單。

✅ 訂閱測試:

在 Master 上發 topic:

bash
rostopic pub /chatter std_msgs/String "data: 'hello from master'"

在 Client 上訂閱:

bash
rostopic echo /chatter

✅ 建議:寫入 .bashrc

你可以將環境變數加入到對應主機的 ~/.bashrc

在 Master 機器中:

bash
export ROS_MASTER_URI=http://192.168.0.10:11311 export ROS_HOSTNAME=192.168.0.10

在 Client 機器中:

bash
export ROS_MASTER_URI=http://192.168.0.10:11311 export ROS_HOSTNAME=192.168.0.20

然後執行:

bash
source ~/.bashrc

🛠️ Troubleshooting Checklist

問題解法
ping 不通檢查防火牆、防火牆服務 (如 ufw) 是否有開放 TCP
沒有收到 topic檢查 topic 是否真的存在 (rostopic list),或主機名解析有問題
IP 變動建議固定 IP 或使用 ROS_IP 明確指定
Docker 中 ROS 多機使用 --net=host 模式,並設定 ROS_MASTER_URIROS_IP

✅ 小補充:必要 ROS 套件

若你不想在 Client 安裝整個 ROS,可以只裝核心元件:

bash
sudo apt install ros-noetic-ros-core

這樣可支援最基本的 Node 與 Topic 功能(無 RViz/Gazebo)。


✅ 總結

題目答案
Client 需要安裝 ROS 嗎?✅ 需要安裝 ROS(至少核心)
跨主機如何連線?✅ 設定 ROS_MASTER_URIROS_HOSTNAME/ROS_IP
IMU、Camera、Sensor 分布多台機器?✅ 各自設成 ROS Node,透過 ROS Master 協調
要用 Wi-Fi 還是 LAN?✅ 建議用有線網路(LAN)穩定性佳

若你提供你目前的 IP 配置與角色(Master 是哪一台、誰是 Client),我可以幫你生成 具體設定與 bashrc 檔案模版 👇

沒有留言: