Package trong ROS2 là gì?
Atlasbot · 16/8/2026 · 10 phút đọc
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.txtmô 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.xmllà "chứng minh thư" của package — khai đúng dependency ở đây giúpcolcon buildtự 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ắc | Yêu cầu |
|---|---|
| Ký tự cho phép | Chữ 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.xml | Format 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ếnament/colconbá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ùngrosdep 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ầnsetup.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 listkhông thấy package vừa tạo vì chưacolcon buildvàsource install/setup.bashlạ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.