📚 延伸閱讀
這篇文章要解決什麼問題?
新人:「我要維護 AGV 專案,聽說用了 ROS2,那是什麼?」
資深工程師:「ROS2 是機器人作業系統,不是真的 OS,而是一套開發框架。」
新人:「框架?像 React 那樣嗎?」
資深工程師:「有點像。它提供通訊機制、工具鏈,讓你專注在機器人邏輯,不用自己處理底層通訊。」
新人:「聽起來很複雜,我該從哪裡開始?」
資深工程師:「先理解幾個核心概念就好,官方文件寫得很清楚。」
這篇文章涵蓋:
- ROS2 是什麼、解決什麼問題
- 核心概念(Node、Topic、Service、Action)
- Workspace 與 Package 結構
- 常用指令
- 官方資源導覽
技術概念
ROS2 是什麼?
ROS2(Robot Operating System 2)是一套機器人軟體開發框架,不是傳統意義的作業系統。
它提供:
- 通訊機制:讓不同程式(節點)互相溝通
- 工具鏈:建置、測試、部署工具
- 生態系統:大量現成的套件(導航、視覺、控制等)
為什麼需要 ROS2?
假設你要開發一台 AGV(自動導引車),需要:
| 功能 | 需要處理 |
|---|---|
| 感測器讀取 | LiDAR、相機、編碼器 |
| 路徑規劃 | 避障、最短路徑 |
| 運動控制 | 馬達、PID 控制 |
| 通訊介面 | 與派車系統對接 |
沒有 ROS2:每個功能都要自己寫通訊協定、處理資料格式、管理執行順序。
有 ROS2:
- 每個功能寫成獨立的 Node
- Node 之間用標準化的 Topic/Service 溝通
- 專注在業務邏輯,不用管底層通訊
ROS2 版本
| 版本 | 代號 | Ubuntu | 支援期限 |
|---|---|---|---|
| Humble | Humble Hawksbill | 22.04 | 2027 |
| Jazzy | Jazzy Jalisco | 24.04 | 2029 |
我們使用 ROS2 Jazzy,搭配 Ubuntu 24.04。
核心概念
1. Node(節點)
Node 是 ROS2 的最小執行單位,一個獨立的程式。
AGV 系統可能有這些 Node:
├── lidar_driver # LiDAR 驅動
├── camera_driver # 相機驅動
├── path_planner # 路徑規劃
├── motor_controller # 馬達控制
└── web_api # Web 介面
每個 Node 各司其職,透過 Topic/Service 溝通。
# 查看運行中的節點
ros2 node list
# 查看節點資訊
ros2 node info /path_planner
2. Topic(主題)
Topic 是 Node 之間的單向資料串流,採用發布/訂閱模式。
發布者 (Publisher) 訂閱者 (Subscriber)
│ │
└──── /scan (Topic) ────────┘
LiDAR Driver ──發布──→ /scan ──訂閱──→ Path Planner
──訂閱──→ Safety Monitor
特點:
- 一對多:一個發布者,多個訂閱者
- 非同步:發布者不等待訂閱者
- 適合:持續的感測器資料、狀態更新
# 查看所有 Topic
ros2 topic list
# 查看 Topic 資訊
ros2 topic info /scan
# 監聽 Topic 資料
ros2 topic echo /scan
# 發布測試資料
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.5}}"
3. Service(服務)
Service 是 Node 之間的請求/回應通訊,像是函數呼叫。
客戶端 (Client) 伺服器 (Server)
│ │
├── Request ───────────────→│
│ │(處理請求)
│←─────────────── Response ─┤
Web API ──請求──→ /get_robot_status ──回應──→ Web API
特點:
- 一對一:一個請求對應一個回應
- 同步:客戶端等待回應
- 適合:設定參數、觸發動作、查詢狀態
# 查看所有 Service
ros2 service list
# 查看 Service 類型
ros2 service type /get_robot_status
# 呼叫 Service
ros2 service call /get_robot_status std_srvs/srv/Trigger
4. Action(動作)
Action 用於長時間執行的任務,提供進度回饋和取消功能。
客戶端 (Client) 伺服器 (Server)
│ │
├── Goal ──────────────────→│(開始執行)
│←─────────── Feedback ─────┤(回報進度 10%)
│←─────────── Feedback ─────┤(回報進度 50%)
│←─────────── Feedback ─────┤(回報進度 90%)
│←─────────── Result ───────┤(完成/失敗)
導航請求:
Web API ──目標──→ /navigate_to_pose ──進度──→ Web API
──結果──→
特點:
- 可以取消執行中的任務
- 提供進度回饋
- 適合:導航、夾取、長時間運算
# 查看所有 Action
ros2 action list
# 查看 Action 資訊
ros2 action info /navigate_to_pose
# 發送 Action 目標
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose "{...}"
概念比較
| 通訊方式 | 模式 | 同步性 | 適用場景 |
|---|---|---|---|
| Topic | 發布/訂閱 | 非同步 | 感測器資料、狀態串流 |
| Service | 請求/回應 | 同步 | 設定、查詢、短任務 |
| Action | 目標/回饋/結果 | 非同步 | 導航、長時間任務 |
Workspace 與 Package
Workspace(工作空間)
Workspace 是存放 ROS2 套件的目錄,結構如下:
my_ws/ # Workspace 根目錄
├── src/ # 原始碼
│ ├── package_a/
│ └── package_b/
├── build/ # 建置產物(自動產生)
├── install/ # 安裝檔案(自動產生)
└── log/ # 建置日誌(自動產生)
Package(套件)
Package 是 ROS2 的基本組織單位,包含:
my_package/
├── package.xml # 套件描述(名稱、依賴)
├── setup.py # Python 套件設定
├── my_package/ # Python 模組
│ ├── __init__.py
│ └── my_node.py
├── launch/ # Launch 檔案
├── config/ # 設定檔
└── test/ # 測試
colcon:建置工具
ROS2 使用 colcon 建置套件:
# 進入 Workspace
cd ~/my_ws
# 建置所有套件
colcon build
# 建置特定套件
colcon build --packages-select my_package
# 只建置有變更的套件
colcon build --packages-select my_package --symlink-install
# 載入環境
source install/setup.bash
symlink-install 選項很實用:修改 Python 檔案後不需要重新建置。
常用指令速查
節點與 Topic
# 節點
ros2 node list # 列出節點
ros2 node info /node_name # 節點資訊
# Topic
ros2 topic list # 列出 Topic
ros2 topic info /topic_name # Topic 資訊
ros2 topic echo /topic_name # 監聽資料
ros2 topic hz /topic_name # 發布頻率
ros2 topic pub /topic ... # 發布資料
Service 與 Action
# Service
ros2 service list # 列出 Service
ros2 service type /service_name # 查看類型
ros2 service call /service ... # 呼叫 Service
# Action
ros2 action list # 列出 Action
ros2 action info /action_name # Action 資訊
ros2 action send_goal /action ... # 發送目標
套件與建置
# 套件資訊
ros2 pkg list # 列出套件
ros2 pkg prefix package_name # 套件路徑
ros2 pkg executables package_name # 可執行檔
# 建置
colcon build # 建置全部
colcon build --packages-select pkg # 建置特定套件
colcon build --symlink-install # 符號連結模式
# 環境載入
source /opt/ros/jazzy/setup.bash # 載入 ROS2 基礎
source install/setup.bash # 載入 Workspace
Launch
# 啟動 Launch 檔案
ros2 launch package_name launch_file.py
# 帶參數
ros2 launch package_name launch_file.py arg:=value
環境建置
官方安裝指南
ROS2 Jazzy 官方安裝文件非常完整,請參考:
📖 ROS2 Jazzy 安裝指南(Ubuntu 24.04)
簡要步驟:
# 1. 設定 locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
# 2. 加入 ROS2 apt repository
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 3. 安裝 ROS2 Jazzy
sudo apt update
sudo apt install ros-jazzy-desktop # 完整桌面版(含 RViz)
# 或
sudo apt install ros-jazzy-ros-base # 基礎版(無 GUI)
# 4. 環境設定(加入 ~/.bashrc)
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
source ~/.bashrc
# 5. 安裝開發工具
sudo apt install python3-colcon-common-extensions
驗證安裝
# 檢查 ROS2 版本
ros2 --version
# 測試通訊
# 終端機 1:啟動 talker
ros2 run demo_nodes_cpp talker
# 終端機 2:啟動 listener
ros2 run demo_nodes_cpp listener
# 應該看到 listener 收到 talker 的訊息
學習資源
官方文件(推薦)
| 資源 | 連結 | 說明 |
|---|---|---|
| 官方教學 | ROS2 Jazzy Tutorials | 從入門到進階的完整教學 |
| 概念說明 | ROS2 Concepts | 核心概念詳細解說 |
| API 文件 | rclpy API | Python API 參考 |
推薦學習順序
- Beginner: CLI tools
- 熟悉
ros2指令 - 理解 Node、Topic、Service
- 熟悉
- Beginner: Client libraries
- 用 Python (rclpy) 寫第一個 Node
- 發布/訂閱 Topic
- Intermediate
- Launch 檔案
- 參數管理
- 自訂訊息類型
實用工具
# rqt:圖形化工具集
sudo apt install ros-jazzy-rqt*
rqt # 啟動 rqt
rqt_graph # 查看節點關係圖
# RViz2:3D 視覺化
rviz2
小結
這篇文章介紹了 ROS2 的核心概念:
| 概念 | 說明 |
|---|---|
| Node | 最小執行單位,獨立的程式 |
| Topic | 發布/訂閱模式,適合串流資料 |
| Service | 請求/回應模式,適合短任務 |
| Action | 長時間任務,提供進度回饋 |
| Workspace | 存放套件的目錄 |
| Package | ROS2 的基本組織單位 |
| colcon | 建置工具 |
ROS2 官方文件寫得非常完整,建議直接閱讀官方教學深入學習!
參考資源
- ROS2 官方網站
- ROS2 Jazzy 文件
- ROS2 GitHub
- ROS Answers(社群問答)
- The Robotics Back-End(優質教學部落格)