下面分四個面向回答你的問題:
-
是不是所有套件都必須靠
ros2 pkg create
來「註冊」? -
如果不用那個指令自己手刻會出什麼問題?
-
不同工作區 (
workspace
) 能不能同名?同名時 ROS 2 怎麼決定用哪個? -
執行期(DDS)又是怎麼把「同名節點/話題」區隔開?
1 ros2 pkg create
只是「快速範本」—不是強制規則
ros2 pkg create --build-type ament_cmake|ament_python <pkg_name>
會:
-
幫你做 正確目錄結構
(package.xml
、CMakeLists.txt
或setup.py
、resource/<pkg_name>
…) -
自動把
<pkg_name>
寫進package.xml
的<name>
欄位 -
建立最小可編譯的程式檔(空 node)
只要最終結果符合 ROS 2 套件格式,你手動複製或 Git clone 也行。
關鍵是:
gopkg/
├── package.xml (必填,名稱必須唯一)
├── CMakeLists.txt | setup.py/-cfg (依 build-type)
└── resource/<pkg_name> (空檔,用來讓 ament_index 快速查包)
2 如果「沒照規矩」手刻,常見地雷
問題 | 會發生在哪一步 | 現象 |
---|---|---|
<name> 不是唯一或與資料夾不同 | colcon build | 直接報錯 package name must be unique |
缺 package.xml 或 resource/<pkg> | colcon build 成功但… | ros2 pkg list 找不到;其他套件無法 find_package() |
少 setup.py / CMakeLists.txt | colcon build | 指定該套件時編譯失敗 |
把套件丟在 src 以外 | 掃描階段 | colcon 根本不知道有這個套件 |
ros2 pkg create
,但一定要留意上述四個檢查點。3 同名套件在「不同 workspace」可以並存,但只能有一個生效
-
同一個 workspace 內:
colcon 會拒絕重複名—檔案系統只能有一份,不然誰也編不過。 -
多個 workspace overlay:
-
先 source A,再 source B → B 裡的同名套件會把 A 蓋掉
(決定權在於AMENT_PREFIX_PATH
的先後順序)。 -
典型流程:
bashsource /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_ID 或 rmw_dds_common__ros_namespace ) | 0 – 232 | 粗分網段;不同 domain 完全不互通 |
Topic & Type 名稱 | /namespace/topic + 型別 | 決定能不能配對 (同 domain 才配得到) |
Node name (rclcpp::NodeOptions::start_parameter_event_publisher ) | 任意 | 節點唯一性;同 domain 同 node name 會出現「重名衝突」警告 |
🔑 小抄
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.xml
、resource/<pkg>
等文件。 -
若套件結構不完整,
ros2 pkg list
找不到、其他套件也無法依賴。 -
不同 workspace 可以同名;最後一次
source
的會蓋掉前面那個。 -
DDS 以 Domain ID + topic/type + node name 隔離或合併通訊;調變這些即可讓「同名但不同專案」互不干擾。
希望這張速查表能幫你快速釐清整個流程!
沒有留言:
張貼留言