2025年6月26日 星期四

ROS2 ros2 pkg create 順序及同名問題

 下面分四個面向回答你的問題:

  1. 是不是所有套件都必須靠 ros2 pkg create 來「註冊」?

  2. 如果不用那個指令自己手刻會出什麼問題?

  3. 不同工作區 (workspace) 能不能同名?同名時 ROS 2 怎麼決定用哪個?

  4. 執行期(DDS)又是怎麼把「同名節點/話題」區隔開?


1 ros2 pkg create 只是「快速範本」—不是強制規則

ros2 pkg create --build-type ament_cmake|ament_python <pkg_name> 會:

  • 幫你做 正確目錄結構
    package.xmlCMakeLists.txtsetup.pyresource/<pkg_name> …)

  • 自動把 <pkg_name> 寫進 package.xml<name> 欄位

  • 建立最小可編譯的程式檔(空 node)

只要最終結果符合 ROS 2 套件格式,你手動複製或 Git clone 也行。
關鍵是:

go
pkg/ ├── package.xml (必填,名稱必須唯一) ├── CMakeLists.txt | setup.py/-cfg (依 build-type) └── resource/<pkg_name> (空檔,用來讓 ament_index 快速查包)

2 如果「沒照規矩」手刻,常見地雷

問題會發生在哪一步現象
<name> 不是唯一或與資料夾不同colcon build直接報錯 package name must be unique
package.xmlresource/<pkg>colcon build 成功但…ros2 pkg list 找不到;其他套件無法 find_package()
setup.py / CMakeLists.txtcolcon build指定該套件時編譯失敗
把套件丟在 src 以外掃描階段colcon 根本不知道有這個套件

結論: 你可以不用 ros2 pkg create,但一定要留意上述四個檢查點。

3 同名套件在「不同 workspace」可以並存,但只能有一個生效

  1. 同一個 workspace 內
    colcon 會拒絕重複名—檔案系統只能有一份,不然誰也編不過。

  2. 多個 workspace overlay

    • 先 source A,再 source B → B 裡的同名套件會把 A 蓋掉
      (決定權在於 AMENT_PREFIX_PATH 的先後順序)。

    • 典型流程:

      bash
      source /opt/ros/humble/setup.bash # 基礎層 source ~/ws1/install/setup.bash # 第二層 source ~/ws2/install/setup.bash # 第三層,優先度最高

因此「同名但不同版本」要共存,就放在不同殼層,需要哪個版本就最後 source 哪一層。


4 執行時(DDS)如何區隔?

ROS 2 透過 DDS 參數把「誰該跟誰講話」分成三層:

層級依據用途
Domain ID (ROS_DOMAIN_IDrmw_dds_common__ros_namespace)
0 – 232
粗分網段;不同 domain 完全不互通
Topic & Type 名稱/namespace/topic + 型別決定能不能配對
(同 domain 才配得到)
Node name (rclcpp::NodeOptions::start_parameter_event_publisher)任意節點唯一性;同 domain 同 node name 會出現「重名衝突」警告

同名套件 只要在執行時給節點不同 Domain IDnode name / namespace,DDS 就能把它們分開;反之如果都一樣,這兩套程式其實就會互相發現並直接交流(有時是你要的、有時剛好相反)。

🔑 小抄

bash
# 換網段(最常用):同機不同專案不互串 export ROS_DOMAIN_ID=10 # 同網段,但把所有話題包在自己的 namespace ros2 run my_pkg my_node --ros-args -r __ns:=/projectA # 指定 node name 避免重名衝突 ros2 run my_pkg my_node --ros-args -r __node:=my_node_A

TL;DR

  • ros2 pkg create 只是快速產生骨架,不強制;手刻也行,但一定要有合法 package.xmlresource/<pkg> 等文件。

  • 若套件結構不完整ros2 pkg list 找不到、其他套件也無法依賴。

  • 不同 workspace 可以同名;最後一次 source 的會蓋掉前面那個。

  • DDS 以 Domain ID + topic/type + node name 隔離或合併通訊;調變這些即可讓「同名但不同專案」互不干擾。

希望這張速查表能幫你快速釐清整個流程!






沒有留言:

張貼留言