# An Toàn — recovery_core > Cảnh báo an toàn khi dùng interface này. Đọc trước khi triển khai plugin họ vận tốc. ## recovery_core KHÔNG đảm bảo - **Không collision-check tự động.** Interface không kiểm tra va chạm khi sinh vận tốc (backup/spin) hay khi tạo path. Việc tránh va chạm là trách nhiệm của **plugin** (dùng costmap được cấp qua `initialize`) hoặc của **caller**. - **Không quản lý vòng lặp thời gian thực.** Caller chịu trách nhiệm gọi `computeCommand(dt)` đúng nhịp và publish command. - **Không đảm bảo frame/đơn vị.** Pose lấy từ costmap/tf phải đúng frame; đơn vị phải nhất quán (m, rad, s, m/s, rad/s). - **Guard vòng đời ở base.** `start()` trước `configure()`, hay `update()` trước `start()`, đều trả `RecoveryResult::Failed()`. `dt <= 0`, `NaN`, `Inf`, và `timeout` do base chặn trước khi gọi `onUpdate()`. Sau `cancel()`, base trả stop output (Twist 0) + `kCancelled`. ## Nguyên tắc cho plugin - Guard costmap/tf null (lấy qua `ctx()`) trước khi thao tác; fail an toàn -> `RecoveryResult::Failed()`. - Không cần tự guard `dt <= 0`/`NaN`/`Inf`/`timeout` — base đã lo; chỉ tập trung logic recovery. - Với họ vận tốc: khi không chắc an toàn, trả **stop command** (Twist 0), không trả vận tốc mù. - Kiểm tra NaN/Inf của pose/vận tốc trước khi xuất command. - Tôn trọng giới hạn vận tốc/gia tốc của robot (đọc qua param). - `BackUpRecovery` có param `require_costmap` để bắt buộc có local costmap trước khi xuất vận tốc lùi. Adapter production vẫn nên có safety gate/collision check riêng trước publish. ## Trách nhiệm caller/adapter - Đảm bảo ngữ cảnh cho phép recovery (vd: đã dừng planner, vùng xung quanh đủ an toàn). - Áp timeout/giám sát ngoài để tránh recovery chạy vô hạn.