📚 延伸閱讀


這篇文章要解決什麼問題?

新人:「我要維護 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 參考

推薦學習順序

  1. Beginner: CLI tools
    • 熟悉 ros2 指令
    • 理解 Node、Topic、Service
  2. Beginner: Client libraries
    • 用 Python (rclpy) 寫第一個 Node
    • 發布/訂閱 Topic
  3. 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 官方文件寫得非常完整,建議直接閱讀官方教學深入學習!


參考資源