Atlas Robotics
ROS2 cơ bảnCơ bản

Package trong ROS2 là gì?

Atlasbot · 16/8/2026 · 10 phút đọc

Package trong ROS2 là gì?
Cấu trúc bên trong một package ROS2

Mọi thứ trong ROS2 — một node điều khiển động cơ, một launch file khởi động cả hệ thống, một bộ file cấu hình Nav2 — đều phải nằm bên trong một package. Đây là đơn vị đóng gói nhỏ nhất mà colcon build hiểu và biết cách biên dịch/cài đặt.

Khái niệm chính

Một package ROS2 tối thiểu cần một file bắt buộc: package.xml — bản khai (manifest) mô tả tên, phiên bản, tác giả, và quan trọng nhất là danh sách các package khác mà nó phụ thuộc (dependencies). Nhờ khai báo này, khi build cả workspace, colcon tự biết cần build package nào trước, package nào sau theo đúng thứ tự phụ thuộc.

Hai kiểu package: ament_cmake và ament_python

  • ament_python — dùng cho package viết bằng Python, cần thêm file setup.py/setup.cfg
  • ament_cmake — dùng cho package viết bằng C++ (hoặc pha trộn C++/Python), cần thêm file CMakeLists.txt mô tả cách biên dịch

Cấu trúc thư mục con bên trong thường theo quy ước chung dù kiểu nào: launch/ (launch file), config/ (file tham số YAML), msg//srv//action/ (định nghĩa kiểu dữ liệu tự khai báo, nếu có), và mã nguồn thực tế (src/ cho C++, thư mục trùng tên package cho Python).

Tóm lại: package.xml là "chứng minh thư" của package — khai đúng dependency ở đây giúp colcon build tự lo phần thứ tự build, không cần bạn tự nhớ package nào phải build trước.

Nguyên lý hoạt động

Tạo một package Python mới trong workspace bằng công cụ có sẵn, không cần gõ tay từng file:

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python my_robot_package

Lệnh trên tự sinh cấu trúc chuẩn:

my_robot_package/
├── package.xml           ← khai tên, phụ thuộc
├── setup.py               ← khai cách cài đặt (Python)
├── setup.cfg
├── resource/my_robot_package
└── my_robot_package/      ← thư mục chứa code Python thực tế
    └── __init__.py

Sau khi thêm code node vào thư mục cùng tên package, khai executable trong setup.py (entry_points), rồi build lại từ thư mục gốc workspace (colcon build) — package mới có thể chạy được ngay bằng ros2 run my_robot_package <tên_node>.

Kiến thức kỹ thuật

Thông số

Quy ước đặt tên package theo REP-144 (chuẩn chính thức của ROS) và định dạng package.xml hiện hành:

Quy tắcYêu cầu
Ký tự cho phépChữ thường, số, dấu gạch dưới (_) — không dùng chữ hoa/dấu gạch ngang
Không bắt đầu bằng sốVD: robot_driver hợp lệ, 2wd_driver không hợp lệ
Định dạng package.xmlFormat 3 (hiện hành) — hỗ trợ khai <depend>, <build_depend>, <exec_depend>, <test_depend> riêng biệt

Phân biệt các loại dependency trong package.xml: <build_depend> chỉ cần lúc biên dịch, <exec_depend> chỉ cần lúc chạy, <depend> cần cho cả hai — khai đúng loại giúp giảm dependency thừa khi đóng gói phân phối package.

Ứng dụng thực tế

Dự án robot thực tế hiếm khi gói toàn bộ code vào 1 package khổng lồ — thông lệ phổ biến là tách theo trách nhiệm: 1 package _msgs chỉ chứa định nghĩa message/service tuỳ chỉnh (ít thay đổi, nhiều package khác phụ thuộc), 1 package _driver chứa code giao tiếp phần cứng, 1 package _navigation chứa logic điều hướng riêng. Tách nhỏ như vậy giúp colcon build --packages-select chỉ build đúng phần đang sửa (nhanh hơn nhiều so với build lại toàn bộ), và cho phép các đội khác nhau trong nhóm phát triển song song ít xung đột hơn.

Ví dụ thực tế

$ ros2 pkg list | grep my_robot
Output:
my_robot_driver
my_robot_msgs
my_robot_navigation
$ ros2 pkg xml my_robot_driver
Output (rút gọn):
<?xml version="1.0"?>
<package format="3">
  <name>my_robot_driver</name>
  <version>0.1.0</version>
  <depend>rclcpp</depend>
  <depend>my_robot_msgs</depend>
</package>

ros2 pkg list liệt kê mọi package mà ROS2 hiện "nhìn thấy" được (đã source đúng workspace) — công cụ đầu tiên để kiểm tra package mới build có thực sự được nhận diện hay chưa trước khi nghi ngờ lỗi code.

Lỗi thường gặp

  • Đặt tên package vi phạm quy ước — dùng chữ hoa hoặc dấu gạch ngang (VD: MyRobot-Driver) khiến ament/colcon báo lỗi hoặc hoạt động không nhất quán — luôn dùng snake_case (chữ thường + gạch dưới).
  • Thiếu khai dependency trong package.xml — code vẫn build được nếu dependency đã cài sẵn trên máy dev, nhưng khi đóng gói/triển khai lên máy khác (hoặc dùng rosdep install để cài tự động) sẽ thiếu, gây lỗi runtime khó chẩn đoán vì lỗi build vẫn "xanh".
  • Trộn lẫn quy ước ament_cmake và ament_python trong cùng 1 package — package thuần Python không cần CMakeLists.txt, package thuần C++ không cần setup.py — thêm nhầm file của kiểu kia gây lỗi build khó hiểu.
  • Quên rebuild + source sau khi thêm package mới vào workspace — ros2 pkg list không thấy package vừa tạo vì chưa colcon build và source install/setup.bash lại, dễ nhầm tưởng package bị lỗi cấu trúc.

Kết luận

Package là đơn vị đóng gói nền tảng của mọi thứ trong ROS2 — nắm vững package.xml và cách khai dependency đúng loại là kỹ năng dùng liên tục khi mở rộng dự án robot thành nhiều package nhỏ có tổ chức. Bài tiếp theo trong chuyên mục nói về Node — đơn vị thực thi nhỏ nhất bên trong một package, nơi logic thực sự của robot chạy.

Package trong ROS2 là gì? — Atlasbot