Atlas Robotics
ROS2 nâng caoNâng cao

Lifecycle Node — quản lý node theo trạng thái rõ ràng

Atlasbot · 17/8/2026 · 11 phút đọc

Lifecycle Node — quản lý node theo trạng thái rõ ràng
4 trạng thái chính và các transition của Lifecycle Node

Một node C++/Python thông thường (rclcpp::Node) chạy logic ngay trong constructor — không có cách nào chuẩn để "khai báo xong nhưng chưa chạy". Với hệ thống nhiều node phụ thuộc lẫn nhau như Nav2 (amcl phải sẵn sàng trước khi planner_server bắt đầu nhận lệnh), điều này gây ra tình trạng khởi động không đồng bộ. Lifecycle Node (rclcpp_lifecycle::LifecycleNode) giải quyết vấn đề này bằng một máy trạng thái (state machine) rõ ràng.

Khái niệm chính

4 trạng thái chính:

  • Unconfigured — vừa tạo, chưa cấp phát tài nguyên (chưa mở port, chưa đọc file config)
  • Inactive — đã cấu hình xong (đã cấp phát tài nguyên) nhưng chưa xử lý dữ liệu — publisher tồn tại nhưng chưa publish, subscriber chưa nhận callback
  • Active — hoạt động đầy đủ, publisher/subscriber/timer đều chạy thật
  • Finalized — trạng thái cuối, đã giải phóng toàn bộ tài nguyên, không quay lại được

Chuyển giữa các trạng thái qua transition (configure, activate, deactivate, cleanup, shutdown) — mỗi transition tương ứng một callback bạn override trong code:

class MotorLifecycleNode : public rclcpp_lifecycle::LifecycleNode {
public:
  MotorLifecycleNode() : LifecycleNode("motor_node") {}

  CallbackReturn on_configure(const rclcpp_lifecycle::State &) override {
    pub_ = create_publisher<std_msgs::msg::Float32>("motor_status", 10);
    return CallbackReturn::SUCCESS;
  }

  CallbackReturn on_activate(const rclcpp_lifecycle::State &) override {
    pub_->on_activate();   // publisher chỉ thực sự publish sau bước này
    return CallbackReturn::SUCCESS;
  }

private:
  std::shared_ptr<rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Float32>> pub_;
};

Tóm lại: Khác biệt cốt lõi so với node thường: publisher của Lifecycle Node tồn tại ngay từ on_configure() nhưng chỉ thực sự gửi dữ liệu sau on_activate() — cho phép hệ thống bên ngoài kiểm soát chính xác thời điểm node bắt đầu ảnh hưởng tới phần còn lại.

Nguyên lý hoạt động

lifecycle_manager — điều phối nhiều node cùng lúc, chính xác cơ chế Nav2 dùng để đảm bảo map_server sẵn sàng trước khi amcl active, amcl active trước khi planner_server/controller_server bắt đầu nhận lệnh:

ros2 lifecycle set /motor_node configure
ros2 lifecycle set /motor_node activate
ros2 lifecycle get /motor_node    # xem trạng thái hiện tại

lifecycle_manager (package nav2_lifecycle_manager) tự động hoá đúng chuỗi lệnh này cho một danh sách node theo thứ tự khai báo, thay vì bạn phải gọi tay từng ros2 lifecycle set.

Kiến thức kỹ thuật

Thông số

Ngoài 4 trạng thái "ổn định" đã nêu, chuẩn lifecycle ROS2 còn có các trạng thái chuyển tiếp (transitional) ngắn hạn trong lúc đang xử lý callback:

Trạng thái chuyển tiếpXảy ra khi nào
ConfiguringĐang chạy on_configure(), trước khi vào Inactive
ActivatingĐang chạy on_activate(), trước khi vào Active
DeactivatingĐang chạy on_deactivate(), trước khi quay lại Inactive
CleaningUpĐang chạy on_cleanup(), trước khi quay lại Unconfigured
ErrorProcessingCallback trả về lỗi, đang chạy on_error() để xử lý phục hồi

Protocol

Các transition không phải cơ chế nội bộ ẩn — mỗi Lifecycle Node tự động lộ ra 2 Service chuẩn: change_state (yêu cầu chuyển trạng thái) và get_state (đọc trạng thái hiện tại) — đây chính xác là 2 service mà ros2 lifecycle set/get gọi bên dưới, và cũng là cách lifecycle_manager giao tiếp với từng node nó quản lý. Giống hệt mẫu hình đã thấy ở Parameter (dùng Service chuẩn get_parameters/set_parameters), lifecycle là một ví dụ khác của việc ROS2 xây tính năng cấp cao trên nền những khối cơ bản (Service) đã học.

Ứng dụng thực tế

Lifecycle Node đặc biệt phù hợp cho node cần cấp phát tài nguyên tốn kém — VD: 1 node driver camera load sẵn 1 model AI nhận diện vật thể vào bộ nhớ GPU trong on_configure() (có thể mất vài giây), sau đó có thể deactivate/activate lại nhiều lần rất nhanh (chỉ bật/tắt việc publish, không phải load lại model) khi hệ thống chuyển đổi giữa các chế độ vận hành khác nhau — nhanh hơn nhiều so với việc tắt hẳn và khởi động lại node từ đầu (phải load lại model tốn kém mỗi lần).

Ví dụ thực tế

$ ros2 lifecycle set /motor_node configure
Output:
Transitioning successful
$ ros2 lifecycle get /motor_node
Output:
inactive [2]
$ ros2 lifecycle set /motor_node activate
Output:
Transitioning successful

Số [2] bên cạnh tên trạng thái là mã số nội bộ của trạng thái đó theo chuẩn lifecycle — hữu ích khi đọc code xử lý trạng thái bằng số thay vì tên chuỗi.

Lỗi thường gặp

  • Gọi activate trước khi configure — transition không hợp lệ theo máy trạng thái (không thể nhảy từ Unconfigured thẳng lên Active), bị từ chối với lỗi rõ ràng — luôn đi đúng thứ tự configure → activate.
  • Quên gọi pub_->on_activate()/on_deactivate() tường minh trong callback — khác rclcpp::Publisher thông thường, LifecyclePublisher không tự động bắt đầu publish chỉ vì node đã vào trạng thái Active — quên dòng này khiến publisher "có vẻ" hoạt động (không lỗi) nhưng không thực sự gửi dữ liệu nào.
  • lifecycle_manager timeout khi 1 node mất quá lâu để configure — nếu on_configure() của 1 node mất nhiều thời gian hơn timeout mặc định (VD: load model AI lớn), lifecycle_manager có thể coi là lỗi dù node vẫn đang xử lý bình thường — cần tăng timeout cấu hình cho phù hợp với thời gian khởi tạo thực tế.
  • Không implement on_error() khiến lỗi cấu hình gây crash thay vì phục hồi có kiểm soát — nếu 1 callback trả về FAILURE mà không có logic xử lý ở on_error(), hệ thống mất khả năng phục hồi nhẹ nhàng, phải khởi động lại toàn bộ node thay vì chỉ retry transition bị lỗi.

Kết luận

Lifecycle Node mang lại kiểm soát tường minh về thời điểm 1 node thực sự "sống" — quan trọng cho hệ thống nhiều node phụ thuộc thứ tự khởi động chặt chẽ như Nav2, và cho node cần tách riêng bước cấp phát tài nguyên tốn kém khỏi bước xử lý dữ liệu. Không phải node nào cũng cần độ phức tạp này — chỉ nên dùng khi thực sự cần kiểm soát vòng đời chi tiết. Bài tiếp theo trong chuyên mục nói về Composition — kỹ thuật gộp nhiều node vào chung 1 tiến trình để giảm overhead hệ thống.

Lifecycle Node — quản lý node theo trạng thái rõ ràng — Atlasbot