2.9 KiB
2.9 KiB
Kiến Trúc recovery_core
Vị trí trong stack
recovery_core nằm ở tầng Navigations/Libraries, cạnh robot_clear_costmap_recovery. Nó
giữ vai trò interface tương tự robot_nav_core::RecoveryBehavior cho các recovery cần trả
về output (path/vận tốc), đồng thời vẫn dùng global path/costmap/tf như bản gốc.
Các thành phần
RecoveryBehavior(interface, template-method): API non-virtualconfigure/start/update/cancel; plugin chỉ triển khai hookonConfigure/onStart(goal)/onUpdate(dt).RecoveryContext: gói con trỏ ngữ cảnh (tf/costmap/global_path) truyền một lần quaconfigure.RecoveryGoal: mục tiêu RUNTIME mỗi lượt (angle/distance/target_pose/params).RecoveryResult/RecoveryStatus/RecoveryOutputType: hợp đồng output hợp nhất 3 họ + rich feedback (progress/remaining/elapsed/message), thêm trạng tháikCancelled.- Plugin mẫu:
ClearCostmapRecovery: clear layer costmap theo tên, one-shot no-output.RotateRecovery: quay tớigoal.angle(rad); sinhTwist.angular.zmỗi cycle.BackUpRecovery: lùi tớigoal.distance(m); sinhTwist.linear.x < 0mỗi cycle.RegenPathRecovery: trả lạirobot_nav_msgs::Pathtừglobal_pathhiện tại.
Luồng runtime
configure(name, ctx) // 1 lần: cache ctx, đọc config chung, onConfigure()
│
start(goal) // mỗi lượt: chốt mục tiêu runtime, onStart()
│
├── one-shot (họ A/B): update(dt) 1 lần ─────────► RecoveryResult{status, path|none, msg}
│
└── per-cycle (họ C): loop { update(dt) } ──────► RecoveryResult{status, velocity,
(tới khi status != kRunning) progress, remaining}
Ghi chú thiết kế
- Template-method: base xử lý guard vòng đời (configure→start→update),
dt<=0,timeout, đoelapsed, vàcancelmột chỗ; plugin không lặp lại các guard này. - Mục tiêu là RUNTIME qua
RecoveryGoal(không cố định trong config): cùng plugin phục vụ nhiều yêu cầu góc/khoảng khác nhau. Field = 0 → dùng default plugin đọc ởonConfigure(). onUpdate(dt)lấy pose robot từ costmap/tf bên trong; không truyền pose qua tham số.- Sau
cancel(), base tự trả stop output (Twist 0) +kCancelled. - Param chung duy nhất còn lại là
timeout(s, 0 = không giới hạn), base đọc trongconfigure()từ~/<name>/timeout; giá trịNaN/Inf/<0bị thay bằng 0. Param RIÊNG của plugin đọc trongonConfigure(). - Interface KHÔNG include Boost.DLL; export/import là việc của plugin/loader.
- Plugin mẫu có dùng Boost.DLL alias, nhưng core contract vẫn không biết loader/adaptor.