Workspace 與 Package
自訂的 ROS 2 Package 通常會在 colcon Workspace 中進行開發。本頁會建立後續 Publisher/Subscriber、Service 與 Action 以及 Parameter 與 Launch 實作範例所使用的 Workspace 與 Package。
概述
Workspace 是一個具有特定目錄結構的資料夾,通常包含 src/,而在完成 Build 後還會產生 build/、install/ 與 log/。colcon — ROS 2 標準的 Build Tool — 會使用這種結構來管理編譯流程。
Package 則是位於 src/ 內的一個資料夾,並包含 package.xml Manifest,用來描述 Package 名稱、Dependency 與 Build Type。
ros2_ws/
├── src/
│ └── my_package/
│ ├── package.xml
│ ├── setup.py # (Python package)
│ └── my_package/
│ └── my_node.py
├── build/ # generated by colcon build
├── install/ # generated by colcon build — this is what you source
└── log/ # generated by colcon build
為什麼重要
許多 ROS 2 中的 "package not found" 或 "no executable found" 錯誤,通常都可以追溯到幾個常見原因:Workspace 沒有成功 Build、Workspace Overlay 沒有被 source,或 Executable 沒有正確安裝或註冊到 Package 中。
核心概念
Workspace vs. Package vs. Install
- 一個 Workspace 可以包含許多 Package。
colcon build會對src/底下的 Package 進行編譯與安裝準備,並將結果放到build/與install/。- source
install/setup.bash後,這個 Workspace 會成為一個 Overlay,讓其中的 Package 可以在先前已載入的 ROS 2 Distribution Underlay 之上使用。可參考 CLI 基礎操作。
Build Types
ROS 2 Package 常見的 Build Type 包括:
| Build type | Language | Manifest hints |
|---|---|---|
ament_python | Python | setup.py, setup.cfg, package.xml |
ament_cmake | C++ | CMakeLists.txt, package.xml |
本文件系列使用 ament_python,與本章其餘 Python 範例保持一致。
使用 rosdep 管理 Dependency
Package 會在 package.xml 中宣告 Dependency,例如 <depend>rclpy</depend>。
rosdep 會讀取 src/ 下各個 Package 的 Dependency 宣告,並安裝對應的系統或 ROS Package:
# One-time setup (skip if already initialized on this machine/container)
sudo rosdep init
rosdep update
# Run from the workspace root, before building
rosdep install --from-paths src --ignore-src -r -y
-r 會讓 rosdep 在某個 Dependency 安裝發生錯誤時,繼續處理其他 Dependency,而不是立即停止;-y 則會略過互動式確認。
實作步驟
1. 建立 Workspace
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
2. 建立 Python Package
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python --license Apache-2.0 my_ros2_tutorial \
--dependencies rclpy std_msgs
執行後會產生:
my_ros2_tutorial/
├── package.xml
├── setup.py
├── setup.cfg
├── resource/
│ └── my_ros2_tutorial
├── test/
└── my_ros2_tutorial/
└── __init__.py
Publisher/Subscriber 中的 Python 範例,會在 my_ros2_tutorial/my_ros2_tutorial/ 下加入 Node 檔案。
3. 解析 Dependency
cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -y
4. 使用 colcon Build
cd ~/ros2_ws
colcon build --symlink-install
--symlink-install 會將 Python Package 檔案以 Symbolic Link 的方式放到 install/,而不是直接複製,因此一般 .py 原始碼修改通常不需要重新 Build 就能生效。
如果修改的是 Package Metadata、Dependency 或 console_scripts Entry Point,仍然需要重新 Build。
如果 Workspace 中有很多 Package,也可以只 Build 指定的 Package:
colcon build --packages-select my_ros2_tutorial
5. Source the Overlay
source ~/ros2_ws/install/setup.bash
每一個需要執行該 Package 的新 Terminal 都要執行這個步驟。
可以使用以下指令確認是否成功:
ros2 pkg list | grep my_ros2_tutorial
預期成果
colcon build 應該能在沒有錯誤的情況下完成,並顯示類似:
Summary: 1 package finished
source install/setup.bash 後:
ros2 pkg list | grep my_ros2_tutorial
應該會顯示該 Package 名稱。
常用指令
# Build
colcon build # build every package in src/
colcon build --symlink-install # symlink Python files (recommended while developing)
colcon build --packages-select <name> # build one package only
colcon build --packages-up-to <name> # build a package and its workspace dependencies
# Clean rebuild
rm -rf build/ install/ log/
colcon build
# Dependency management
rosdep install --from-paths src --ignore-src -r -y
# Inspecting packages
ros2 pkg list
ros2 pkg xml <package_name> # print package.xml contents
ros2 pkg prefix <package_name> # where it installed to
常見問題
Package 'my_ros2_tutorial' not found— 目前這個 Terminal 尚未 source Overlay,或之前的 Build 沒有成功完成。重新執行colcon build並確認輸出內容,再次 sourceinstall/setup.bash。- 修改 Python Node 後沒有任何變化 — Workspace 可能不是使用
--symlink-installBuild。重新 Build Package,或清除產生的目錄後,再使用--symlink-installBuild。 colcon: command not found—colcon尚未安裝。在某些精簡 ROS 2 安裝中,colcon是獨立工具。請依目前的 Distribution / OS 安裝python3-colcon-common-extensions。rosdep顯示 unknown key —package.xml中的 Dependency 名稱可能不符合已知的 rosdep key。請確認拼字是否正確,並確認最近已執行過rosdep update。- Underlay / Overlay 混用造成問題 — 每一個新的 Terminal 都應先 source ROS 2 Distribution 的 Underlay,再 source Workspace Overlay,順序不要顛倒。可參考 CLI 基礎操作。
重點整理
- Workspace 可以在
src/下包含多個 Package;colcon build會產生build/、install/與log/。 ros2 pkg create --build-type ament_python可以建立一個包含正確 Manifest 與 Entry Point 結構的 Python Package。rosdep install --from-paths src --ignore-src -r -y會處理各個 Package 在package.xml中宣告的 Dependency。- 開發 Python Node 時使用
--symlink-install,可以避免每次修改原始碼後都重新 Build。 - Build 完成後,所有需要使用該 Package 的 Terminal 都要 source
install/setup.bash。
下一步
接著前往 Publisher/Subscriber,在這裡建立的 my_ros2_tutorial Package 中加入第一組可以實際執行的 Node。