# Thảo luận về Kiến trúc Navigation cho AMR ## Mục tiêu dự án Nghiên cứu và phát triển hệ thống navigation (di chuyển bám quỹ đạo) cho robot AMR dạng hai bánh vi sai, **không sử dụng ROS**, viết thuần C++ với CMake trên Linux. ## Yêu cầu chức năng Từ `readme.md`: - Có khả năng thay đổi mô hình kinematics (dạng hai bánh vi sai, dạng steering bicycle, ...) - Có chức năng di chuyển từ điểm khởi đầu đến điểm đích - Có chức năng xoay tròn - Có chức năng đi thẳng - Có chức năng thay đổi vận tốc ## Sơ đồ kiến trúc hệ thống Kiến trúc được thiết kế theo mô hình layered, tách biệt các concerns và cho phép mở rộng dễ dàng: ```mermaid flowchart TB %% ========== API LAYER ========== subgraph API["🌐 API Layer"] direction TB CAPI["📦 C API
━━━━━━━━━━━━━━━━
🔌 nav_c_api
💻 P/Invoke cho .NET/C#
📝 Wrapper Functions
🔗 Interop Layer"] style API fill:#E3F2FD,stroke:#1976D2,stroke-width:4px,color:#000 style CAPI fill:#BBDEFB,stroke:#1976D2,stroke-width:3px,font-size:14px end %% ========== USER CONTROLLER LAYER ========== subgraph UserController["🎮 User Controller Layer"] direction TB UserCtrl["🔌 User Controller Plugin
━━━━━━━━━━━━━━━━
📚 Dynamic Loader
⚙️ boost::dll
🎯 Custom Behavior
🔄 Runtime Loading"] style UserController fill:#F3E5F5,stroke:#7B1FA2,stroke-width:4px,color:#000 style UserCtrl fill:#E1BEE7,stroke:#7B1FA2,stroke-width:3px,font-size:14px end %% ========== INTERFACE LAYER ========== subgraph Interface["🔌 Interface Layer"] direction TB BaseNav["📋 BaseNavigation
━━━━━━━━━━━━━━━━
🏗️ move_base_core::BaseNavigation
🎯 Abstract Interface
━━━━━━━━━━━━━━━━
📍 moveTo, dockTo
🔄 rotateTo, moveStraightTo
⏸️ pause, resume, cancel
📊 getRobotPose"] style Interface fill:#FFF3E0,stroke:#E65100,stroke-width:4px,color:#000 style BaseNav fill:#FFE0B2,stroke:#E65100,stroke-width:3px,font-size:14px end %% ========== MOVE BASE CORE ========== subgraph MoveBaseCore["⚙️ Move Base Core"] direction TB MoveBase["🚀 MoveBase
━━━━━━━━━━━━━━━━
📦 move_base::MoveBase
🔄 State Machine
━━━━━━━━━━━━━━━━
📊 PLANNING
🎮 CONTROLLING
🧹 CLEARING
━━━━━━━━━━━━━━━━
🎛️ Control Loop
🔄 executeCycle"] style MoveBaseCore fill:#E8F5E9,stroke:#2E7D32,stroke-width:4px,color:#000 style MoveBase fill:#C8E6C9,stroke:#2E7D32,stroke-width:3px,font-size:14px end %% ========== PLANNING LAYER ========== subgraph Planning["🗺️ Planning Layer - Plugin System"] direction LR GP["🌍 Global Planner
━━━━━━━━━━━━━━━━
📋 nav_core::BaseGlobalPlanner
🔌 Dynamic Plugin
━━━━━━━━━━━━━━━━
🎯 A*, D*, Hybrid A*
📐 Long-range Planning
🗺️ Global Path"] LP["📍 Local Planner
━━━━━━━━━━━━━━━━
📋 nav_core::BaseLocalPlanner
🔌 Dynamic Plugin
━━━━━━━━━━━━━━━━
🎯 DWA, TEB, MKT
🚗 Velocity Commands
🛡️ Obstacle Avoidance"] RB["🔄 Recovery Behaviors
━━━━━━━━━━━━━━━━
📋 nav_core::RecoveryBehavior
🔌 Dynamic Plugin
━━━━━━━━━━━━━━━━
🧹 Clear Costmap
🔄 Rotate Recovery
🚨 Emergency Stop"] style Planning fill:#E1F5FE,stroke:#0277BD,stroke-width:4px,color:#000 style GP fill:#B3E5FC,stroke:#0277BD,stroke-width:3px,font-size:13px style LP fill:#B3E5FC,stroke:#0277BD,stroke-width:3px,font-size:13px style RB fill:#B3E5FC,stroke:#0277BD,stroke-width:3px,font-size:13px end %% ========== COSTMAP LAYER ========== subgraph Costmap["🗺️ Costmap Layer"] direction LR GC["🌍 Global Costmap
━━━━━━━━━━━━━━━━
📦 robot_costmap_2d::Costmap2DROBOT
🌍 frame: map
━━━━━━━━━━━━━━━━
🗺️ Static Map
🚫 Obstacles
💰 Inflation Layer"] LC["📍 Local Costmap
━━━━━━━━━━━━━━━━
📦 robot_costmap_2d::Costmap2DROBOT
📍 frame: odom
━━━━━━━━━━━━━━━━
🔍 Dynamic Obstacles
📡 Sensor Fusion
⚡ Real-time Updates"] style Costmap fill:#F1F8E9,stroke:#558B2F,stroke-width:4px,color:#000 style GC fill:#DCEDC8,stroke:#558B2F,stroke-width:3px,font-size:13px style LC fill:#DCEDC8,stroke:#558B2F,stroke-width:3px,font-size:13px end %% ========== ALGORITHMS LAYER ========== subgraph Algorithms["🧮 Algorithms Layer"] direction LR MKTAlgo["🚗 MKT Algorithm
━━━━━━━━━━━━━━━━
⚙️ Diff Drive Kinematics
🚲 Bicycle Kinematics
📐 Trajectory Generation"] ScoreAlgo["📊 Score Algorithm
━━━━━━━━━━━━━━━━
📈 Trajectory Scoring
✅ Goal Checking
🎯 Path Evaluation"] KalmanAlgo["🔍 Kalman Filter
━━━━━━━━━━━━━━━━
📊 State Estimation
🔮 Sensor Fusion
📉 Noise Filtering"] style Algorithms fill:#FCE4EC,stroke:#C2185B,stroke-width:4px,color:#000 style MKTAlgo fill:#F8BBD0,stroke:#C2185B,stroke-width:3px,font-size:13px style ScoreAlgo fill:#F8BBD0,stroke:#C2185B,stroke-width:3px,font-size:13px style KalmanAlgo fill:#F8BBD0,stroke:#C2185B,stroke-width:3px,font-size:13px end %% ========== DATA SOURCES ========== subgraph DataSources["📡 Data Sources"] direction TB Goal["🎯 Goal Input
━━━━━━━━━━━━━━━━
📍 robot_geometry_msgs::PoseStamped
📨 move_base_simple/goal"] Loc["🌍 Localization
━━━━━━━━━━━━━━━━
📍 Pnkx Loc
🗺️ Global Pose
🔄 Pose Updates"] TF["🔄 Transform System
━━━━━━━━━━━━━━━━
📐 tf3::BufferCore
🌐 Coordinate Frames
⏱️ Time Synchronization"] Odom["🚗 Odometry
━━━━━━━━━━━━━━━━
📍 robot_geometry_msgs::Odometry
⚡ Robot Velocity
📊 Position Tracking"] Laser["📡 Laser Sensors
━━━━━━━━━━━━━━━━
🔍 robot_sensor_msgs::LaserScan
🚫 Obstacle Detection
📏 Distance Measurement"] Map["🗺️ Map Server
━━━━━━━━━━━━━━━━
📋 robot_nav_msgs::OccupancyGrid
🏗️ Static Map
📐 Map Metadata"] style DataSources fill:#FFF9C4,stroke:#F57F17,stroke-width:4px,color:#000 style Goal fill:#FFF59D,stroke:#F57F17,stroke-width:3px,font-size:12px style Loc fill:#FFF59D,stroke:#F57F17,stroke-width:3px,font-size:12px style TF fill:#FFF59D,stroke:#F57F17,stroke-width:3px,font-size:12px style Odom fill:#FFF59D,stroke:#F57F17,stroke-width:3px,font-size:12px style Laser fill:#FFF59D,stroke:#F57F17,stroke-width:3px,font-size:12px style Map fill:#FFF59D,stroke:#F57F17,stroke-width:3px,font-size:12px end %% ========== CONTROL LOOP ========== subgraph ControlLoop["🔄 Control Loop"] direction LR CmdVel["⚡ Velocity Command
━━━━━━━━━━━━━━━━
📤 robot_geometry_msgs::Twist
📨 cmd_vel
━━━━━━━━━━━━━━━━
➡️ Linear Velocity
🔄 Angular Velocity"] BaseCtrl["🎮 Base Controller
━━━━━━━━━━━━━━━━
🚗 diff_driver_controller
🚲 steer_drive_controller
━━━━━━━━━━━━━━━━
⚙️ Kinematics
🔧 Hardware Interface"] style ControlLoop fill:#FFEBEE,stroke:#C62828,stroke-width:4px,color:#000 style CmdVel fill:#FFCDD2,stroke:#C62828,stroke-width:3px,font-size:13px style BaseCtrl fill:#FFCDD2,stroke:#C62828,stroke-width:3px,font-size:13px end %% ========== CONNECTIONS ========== %% API to User Controller CAPI -->|"🔗 P/Invoke"| UserCtrl %% User Controller to Interface UserCtrl -->|"🎯 Uses"| BaseNav %% Interface to MoveBase BaseNav -->|"⚙️ Implements"| MoveBase %% MoveBase to Planning MoveBase -->|"🎛️ Manages"| GP MoveBase -->|"🎛️ Manages"| LP MoveBase -->|"🎛️ Manages"| RB %% MoveBase to Costmap MoveBase -->|"🎛️ Manages"| GC MoveBase -->|"🎛️ Manages"| LC %% Data Sources to Components Goal -->|"📥 Input"| UserCtrl Goal -->|"📥 Input"| BaseNav Loc -->|"📍 Pose"| MoveBase TF -->|"🔄 Transforms"| MoveBase Laser -->|"📡 Scan Data"| LC Map -->|"🗺️ Static Map"| GC Odom -->|"⚡ Velocity"| LP Odom -->|"📍 Pose"| MoveBase %% Planning Flow GC -->|"🗺️ Costmap"| GP GP -->|"🛤️ Global Path"| LP LC -->|"🗺️ Costmap"| LP LC -->|"🗺️ Costmap"| RB GC -->|"🗺️ Costmap"| RB %% Algorithm Integration MKTAlgo -->|"🚗 Kinematics"| LP ScoreAlgo -->|"📊 Scoring"| LP KalmanAlgo -.->|"🔍 Filtering"| Loc %% Control Flow LP -->|"⚡ Velocity Cmd"| CmdVel CmdVel -->|"▶️ Execute"| BaseCtrl BaseCtrl -->|"📊 Feedback"| Odom %% Styling Classes classDef implemented fill:#C8E6C9,stroke:#2E7D32,stroke-width:4px,color:#000 classDef partial fill:#FFF9C4,stroke:#F57F17,stroke-width:3px,color:#000 classDef todo fill:#FFCDD2,stroke:#C62828,stroke-width:3px,color:#000 class BaseNav,MoveBase,GP,LP,RB,GC,LC,CAPI,MKTAlgo,ScoreAlgo,KalmanAlgo,UserCtrl implemented class BaseCtrl,Loc,Odom,Map,Laser,TF partial ``` ## Đề xuất giải pháp kiến trúc ### 1. Xác định phạm vi & yêu cầu vận hành Cần làm rõ: - **Kịch bản sử dụng chính**: go-to-goal trong môi trường indoor/outdoor? Tốc độ di chuyển? Độ chính xác yêu cầu? - **Cảm biến có sẵn**: encoder, IMU, lidar, camera? Dữ liệu nào đã có? - **Yêu cầu real-time**: chu kỳ điều khiển (control loop frequency), độ trễ tối đa cho phép? ### 2. Kiến trúc tổng thể **Các layer chính:** 1. **API Layer** ✅ - C API (`nav_c_api`) cho P/Invoke với .NET/C# - Wrapper functions cho tất cả BaseNavigation methods 2. **User Controller Layer** ✅ - **User Controller Plugin**: Dynamically allocated từ loader controller plugin - Sử dụng `boost::dll` để load plugins động - Cho phép user định nghĩa controller riêng để điều khiển navigation behavior - Kết nối với `BaseNavigation` interface 3. **Interface Layer** ✅ - `move_base_core::BaseNavigation`: Abstract interface cho navigation - Định nghĩa các operations: moveTo, dockTo, rotateTo, moveStraightTo, pause, resume, cancel - Là lớp trung gian định nghĩa các phương thức và thuộc tính liên quan đến navigation 4. **Move Base Core** ✅ - `move_base::MoveBase`: Core implementation của BaseNavigation - Quản lý state machine (PLANNING, CONTROLLING, CLEARING) - Điều phối global/local planner và recovery behaviors - Quản lý costmaps (global và local) - Thực thi control loop (executeCycle) 4. **Planning Layer** ✅ - `robot_nav_core::BaseGlobalPlanner`: Interface cho global planners - **Global Planner Implementations**: - `custom_planner` - Custom path planner với curve support và merge path calculation - `dock_planner` - Docking-specific planner với dock calculation utilities - `two_points_planner` - Simple planner cho two-point navigation - `robot_nav_core::BaseLocalPlanner`: Interface cho local planners - **Local Planner Implementation**: - `pnkx_local_planner` - Main local planner với multiple behaviors: - Position planning (MKT algorithm) - Docking planning - Go straight planning - Rotate planning - `robot_nav_core::RecoveryBehavior`: Interface cho recovery behaviors - Plugin system sử dụng `boost::dll` và `robot::PluginLoaderHelper` để dynamic loading 5. **Costmap Layer** ✅ - `robot_costmap_2d::Costmap2DROBOT`: Global và local costmap wrapper - `robot_costmap_2d::LayeredCostmap`: Layered costmap system - **Costmap Layers** (8 implementations): - `StaticLayer` - Static map từ OccupancyGrid - `ObstacleLayer` - Dynamic obstacles từ sensors - `InflationLayer` - Cost inflation cho robot footprint - `VoxelLayer` - 3D voxel grid cho obstacles - `CriticalLayer` - Critical zones marking - `DirectionalLayer` - Directional cost preferences - `PreferredLayer` - Preferred path zones - `UnpreferredLayer` - Unpreferred zones - Frame management: map (global), odom (local) - Thread-safe access với mutex - Observation buffer cho sensor data 6. **Algorithms Layer** ✅ - **MKT Algorithm** (`mkt_algorithm`): - Differential drive kinematics: - `diff_go_straight` - Go straight behavior - `diff_predictive_trajectory` - Predictive trajectory following - `diff_rotate_to_goal` - Rotate to goal - Bicycle model kinematics: - `bicycle_go_straight` - Go straight với bicycle model - `bicycle_pure_pursuit` - Pure pursuit control - `bicycle_rotate_to_goal` - Rotate behavior - **MKT Plugins** (`mkt_plugins`): - `goal_checker` - Goal checking algorithms - `simple_goal_checker` - Simple goal checking - `standard_traj_generator` - Standard trajectory generation - `limited_accel_generator` - Acceleration-limited trajectory generation - `kinematic_parameters` - Kinematics parameter management - `xy_theta_iterator` - Trajectory iteration utilities - `velocity_iterator` - Velocity space iteration - `one_d_velocity_iterator` - 1D velocity iteration - **Score Algorithm** (`score_algorithm`): - Trajectory scoring và evaluation - Goal checking utilities - Trajectory generator interface - **Kalman Filter** (`kalman`): - State estimation - Sensor fusion - Noise filtering 7. **Data Sources** ⚠️ (Interface cần định nghĩa) - Localization source (Pnkx Loc) - Odometry source - Sensor transforms (tf3) - Map server - Laser sensors 8. **Control Layer** ⚠️ (Cần implementation) - Base Controller interface (Diff/Steer drive) - Velocity command execution **Định dạng dữ liệu:** - `robot_geometry_msgs::Pose2D` / `robot_geometry_msgs::PoseStamped` (vị trí + hướng) - `robot_geometry_msgs::Twist` (vận tốc linear/angular) - `std::vector` (đường đi) - `robot_costmap_2d::Costmap2D` (bản đồ chi phí) ### 3. Thiết kế từng module (interface level) **Các interface đã có:** ✅ - `move_base_core::BaseNavigation` ✅ - `initialize(TFListenerPtr)` - Khởi tạo với TF listener - `moveTo(goal, xy_tol, yaw_tol)` - Di chuyển đến goal - `dockTo(marker, goal, ...)` - Docking đến marker - `rotateTo(goal, yaw_tol)` - Xoay tại chỗ - `moveStraightTo(goal, xy_tol)` - Đi thẳng - `pause()`, `resume()`, `cancel()` - Điều khiển trạng thái - `getRobotPose(...)` - Lấy vị trí robot - `robot_nav_core::BaseGlobalPlanner` ✅ - `makePlan(start, goal, plan)` - Tạo global path - `initialize(name, costmap_robot)` - Khởi tạo với costmap - **Implementations**: `custom_planner`, `dock_planner`, `two_points_planner` - `robot_nav_core::BaseLocalPlanner` ✅ - `computeVelocityCommands(odom, cmd_vel)` - Tính toán velocity command - `setPlan(plan)` - Set global path để follow - `isGoalReached()` - Kiểm tra đã đến goal chưa - `swapPlanner(name)` - Thay đổi planner động (position, docking, go_straight, rotate) - `setTwistLinear/Angular(...)` - Set velocity limits - `getTwistLinear/Angular(...)` - Get velocity limits - **Implementation**: `pnkx_local_planner` với multiple behaviors - `robot_nav_core::RecoveryBehavior` ✅ - `runBehavior()` - Thực thi recovery behavior - `initialize(name, tf, global_costmap, local_costmap)` - Khởi tạo - `robot_costmap_2d::Costmap2DROBOT` ✅ - Wrapper cho costmap với robot footprint - Thread-safe access với mutex **Các interface cần bổ sung:** ⚠️ - `ILocalizationSource` ⚠️ - `getCurrentPose()` - Lấy vị trí hiện tại từ localization - `isAvailable()` - Kiểm tra localization có sẵn không - `IOdometrySource` ⚠️ - `getCurrentPose()` - Lấy vị trí từ odometry - `getCurrentVelocity()` - Lấy vận tốc hiện tại - `isAvailable()` - Kiểm tra odometry có sẵn không - `IBaseController` ⚠️ - `executeVelocity(cmd_vel)` - Thực thi velocity command - `stop()` - Dừng robot ngay lập tức - `getCurrentVelocity()` - Lấy vận tốc thực tế - `IMapProvider` ⚠️ - `getMap()` - Lấy static map - `isMapAvailable()` - Kiểm tra map có sẵn không **Plugin mechanism:** ✅ - Sử dụng `boost::dll` để dynamic loading plugins - Factory pattern với `boost::function` và `boost::dll::import_alias` - `robot::PluginLoaderHelper` để tìm library path từ plugin name - Config file YAML để specify plugin names - Plugin interfaces: - `robot_nav_core::BaseGlobalPlanner` - Global planners - `robot_nav_core::BaseLocalPlanner` - Local planners - `robot_nav_core::RecoveryBehavior` - Recovery behaviors - `robot_costmap_2d::Layer` - Costmap layers - Plugin registration với `BOOST_DLL_ALIAS` macro ### 4. Cơ chế giao tiếp & đồng bộ **Lựa chọn transport:** - Shared memory + mutex (cho real-time nhẹ) - Message queue (ZeroMQ, nanomsg) - Event loop với callback thread-safe **Time synchronization:** - Sử dụng `std::chrono` cho timestamp - Buffer dữ liệu để xử lý dữ liệu không đồng bộ **Threading strategy:** - Mỗi module một thread riêng, hoặc - Scheduler chung quản lý tất cả ### 5. Chiến lược an toàn & recovery **Monitoring:** - Heartbeat mechanism - Watchdog timer **Recovery behaviors:** - Không tìm được đường đi - Mất localization - Obstacle chặn đường - Emergency stop mechanism - Giới hạn vận tốc theo trạng thái ### 6. Config & Logging/Diagnostics **Configuration:** - File YAML/JSON cho: - Kinematics parameters - Velocity limits - Planner parameters - Sensor configurations **Logging & Debugging:** - Logging framework (spdlog?) - Telemetry interface - Visualizer tool (SDL/ImGui) để debug map/path ### 7. Trạng thái triển khai & lộ trình **Đã hoàn thành:** ✅ 1. ✅ **Interface Layer**: - `move_base_core::BaseNavigation` - Abstract interface hoàn chỉnh - `move_base_core::common.h` - Common types và utilities 2. ✅ **Implementation Layer**: - `move_base::MoveBase` - Core implementation với state machine - `executeCycle()` - Control loop implementation - State management (PLANNING, CONTROLLING, CLEARING, PAUSED) - Threading với planner thread và control loop 3. ✅ **Planning Layer - Plugin System**: - **Global Planners** (3 implementations): - `custom_planner` - Custom path planning với curve support - `dock_planner` - Docking-specific planner - `two_points_planner` - Simple two-point planner - **Local Planners** (1 implementation): - `pnkx_local_planner` - Main local planner với: - `pnkx_docking_local_planner` - Docking behavior - `pnkx_go_straight_local_planner` - Go straight behavior - `pnkx_rotate_local_planner` - Rotate behavior - **Recovery Behaviors**: Interface đã định nghĩa - Plugin loading với `boost::dll` và `robot::PluginLoaderHelper` 4. ✅ **Costmap Layer**: - `robot_costmap_2d::Costmap2DROBOT` - Global và local costmap - **Costmap Layers** (8 implementations): - `static_layer` - Static map layer - `obstacle_layer` - Dynamic obstacles - `inflation_layer` - Cost inflation - `voxel_layer` - 3D voxel grid - `critical_layer` - Critical zones - `directional_layer` - Directional costs - `preferred_layer` - Preferred paths - `unpreferred_layer` - Unpreferred zones - Layered costmap system với plugin support 5. ✅ **Algorithms Layer**: - **MKT Algorithm**: - Differential drive kinematics (go_straight, rotate, predictive) - Bicycle model kinematics (go_straight, rotate, pure pursuit) - **MKT Plugins**: - `goal_checker` - Goal checking algorithms - `standard_traj_generator` - Standard trajectory generation - `kinematic_parameters` - Kinematics parameter management - `xy_theta_iterator` - Trajectory iteration - `limited_accel_generator` - Acceleration-limited trajectories - **Score Algorithm**: Trajectory scoring và goal checking - **Kalman Filter**: State estimation và filtering 6. ✅ **API Layer**: - `nav_c_api` - C API wrapper cho .NET/C# P/Invoke - Wrapper functions cho BaseNavigation methods 7. ✅ **Supporting Libraries**: - `tf3` - Transform system (buffer_core, transforms) - `robot_time` - Time management (Time, Duration, Timer, Rate) - `robot_cpp` - Core utilities: - `robot::init()` - Initialization - `robot::NodeHandle` - YAML config loading - `robot::PluginLoaderHelper` - Plugin discovery - `robot_nav_2d_utils` - 2D navigation utilities (conversions, path_ops, polygons, bounds, tf_help) - `robot_nav_2d_msgs` - 2D navigation messages - `geometry_msgs` - Geometry message types (29 types) - `robot_nav_msgs` - Navigation messages (24 types) - `robot_sensor_msgs` - Sensor messages (30 types) - `laser_geometry` - Laser scan geometry utilities - `voxel_grid` - Voxel grid implementation - `data_convert` - Data conversion utilities - `nav_grid` - Navigation grid utilities **Đang triển khai / Cần bổ sung:** ⚠️ 1. ⚠️ **Data Sources Interfaces**: - `ILocalizationSource` interface - Cần định nghĩa - `IOdometrySource` interface - Cần định nghĩa - `IMapProvider` interface - Cần định nghĩa - Integration với Pnkx Loc, odometry sources - Hiện tại dùng trực tiếp qua MoveBase methods 2. ⚠️ **Base Controller**: - `IBaseController` interface - Cần định nghĩa - Diff drive controller implementation - Cần implement - Steer drive controller implementation - Cần implement - Velocity command execution - Hiện tại chỉ có `setTwistLinear/Angular` trong local planner 3. ⚠️ **User Controller Plugin System**: - Factory để load user controller plugins - Cần implement - Interface cho User Controller - Cần định nghĩa - Integration với BaseNavigation - Cần implement 4. ⚠️ **Testing & Documentation**: - Unit tests cho các modules - Một số đã có (costmap, bounds, etc.) - Integration tests - Cần bổ sung - Simulation environment - TODO **Lộ trình tiếp theo:** **Phase 1: Data Sources & Base Controller** (Ưu tiên cao) - Định nghĩa interfaces cho data sources - Implement Base Controller interface và diff drive controller - Integration với MoveBase **Phase 2: Control Loop & State Management** (Ưu tiên cao) - Hoàn thiện executeCycle trong MoveBase - State machine management - Threading strategy **Phase 3: User Controller Plugin System** (Ưu tiên trung bình) - Factory pattern cho user controllers - Plugin loading mechanism - Integration testing **Phase 4: Testing & Optimization** (Ưu tiên trung bình) - Unit tests cho các module - Integration tests - Performance optimization **Testing strategy:** - Unit tests cho các module độc lập (gtest?) - Integration tests cho full navigation stack - Simulation environment (2D simulator) - TODO - Hardware-in-the-loop testing - TODO ## Cấu trúc thư mục ``` pnkx_nav_core/ ├── src/ │ ├── Navigations/ │ │ ├── Cores/ │ │ │ ├── move_base_core/ # BaseNavigation interface ✅ │ │ │ │ ├── include/move_base_core/ │ │ │ │ │ ├── navigation.h # BaseNavigation abstract class │ │ │ │ │ └── common.h # Common types (TFListenerPtr, etc.) │ │ │ ├── robot_nav_core/ # Planner interfaces ✅ │ │ │ │ ├── include/robot_nav_core/ │ │ │ │ │ ├── base_global_planner.h │ │ │ │ │ ├── base_local_planner.h │ │ │ │ │ └── recovery_behavior.h │ │ │ ├── robot_nav_core_adapter/ # Adapter utilities ✅ │ │ │ │ ├── include/robot_nav_core_adapter/ │ │ │ │ │ ├── global_planner_adapter.h │ │ │ │ │ ├── local_planner_adapter.h │ │ │ │ │ └── costmap_adapter.h │ │ │ └── robot_nav_core2/ # Additional nav utilities ✅ │ │ │ ├── include/robot_nav_core2/ │ │ │ │ ├── global_planner.h │ │ │ │ ├── local_planner.h │ │ │ │ └── costmap.h │ │ ├── Libraries/ │ │ │ ├── nav_grid/ # Navigation grid utilities ✅ │ │ │ └── (costmap, tf3, robot_time ở Libraries/) │ │ └── Packages/ │ │ └── move_base/ # MoveBase implementation ✅ │ │ ├── include/move_base/ │ │ │ └── move_base.h │ │ └── src/ │ │ ├── move_base.cpp │ │ └── move_base_main.cpp │ │ │ ├── Algorithms/ │ │ ├── Cores/ │ │ │ └── score_algorithm/ # Trajectory scoring ✅ │ │ │ ├── include/score_algorithm/ │ │ │ │ ├── score_algorithm.h │ │ │ │ ├── goal_checker.h │ │ │ │ └── trajectory_generator.h │ │ ├── Libraries/ │ │ │ ├── mkt_algorithm/ # MKT kinematics algorithms ✅ │ │ │ │ ├── include/mkt_algorithm/ │ │ │ │ │ ├── diff/ # Differential drive │ │ │ │ │ │ ├── diff_go_straight.h │ │ │ │ │ │ ├── diff_predictive_trajectory.h │ │ │ │ │ │ └── diff_rotate_to_goal.h │ │ │ │ │ └── bicycle/ # Bicycle model │ │ │ │ │ ├── bicycle.h │ │ │ │ │ ├── go_straight.h │ │ │ │ │ └── rotate_to_goal.h │ │ │ ├── mkt_plugins/ # MKT plugin components ✅ │ │ │ │ ├── include/mkt_plugins/ │ │ │ │ │ ├── goal_checker.h │ │ │ │ │ ├── standard_traj_generator.h │ │ │ │ │ ├── kinematic_parameters.h │ │ │ │ │ └── xy_theta_iterator.h │ │ │ ├── mkt_msgs/ # MKT message types ✅ │ │ │ ├── kalman/ # Kalman filtering ✅ │ │ │ └── angles/ # Angle utilities ✅ │ │ └── Packages/ │ │ ├── global_planners/ │ │ │ ├── custom_planner/ # Custom global planner ✅ │ │ │ ├── dock_planner/ # Docking planner ✅ │ │ │ └── two_points_planner/ # Two points planner ✅ │ │ └── local_planners/ │ │ └── pnkx_local_planner/ # PNKX local planner ✅ │ │ ├── include/pnkx_local_planner/ │ │ │ ├── pnkx_local_planner.h │ │ │ ├── pnkx_docking_local_planner.h │ │ │ ├── pnkx_go_straight_local_planner.h │ │ │ └── pnkx_rotate_local_planner.h │ │ │ ├── Libraries/ │ │ ├── costmap_2d/ # Costmap system ✅ │ │ │ ├── include/robot_costmap_2d/ │ │ │ │ ├── costmap_2d_robot.h │ │ │ │ ├── layered_costmap.h │ │ │ │ └── layer.h │ │ │ ├── plugins/ # Costmap layers ✅ │ │ │ │ ├── static_layer.cpp │ │ │ │ ├── obstacle_layer.cpp │ │ │ │ ├── inflation_layer.cpp │ │ │ │ ├── voxel_layer.cpp │ │ │ │ ├── critical_layer.cpp │ │ │ │ ├── directional_layer.cpp │ │ │ │ ├── preferred_layer.cpp │ │ │ │ └── unpreferred_layer.cpp │ │ │ └── config/ # Costmap configs │ │ ├── tf3/ # Transform system ✅ │ │ ├── robot_time/ # Time management ✅ │ │ ├── robot_cpp/ # Core utilities ✅ │ │ │ ├── include/robot/ │ │ │ │ ├── init.h # Initialization │ │ │ │ ├── node_handle.h # NodeHandle (YAML config) │ │ │ │ └── plugin_loader_helper.h # Plugin loader │ │ ├── robot_nav_2d_utils/ # 2D nav utilities ✅ │ │ ├── robot_nav_2d_msgs/ # 2D nav messages ✅ │ │ ├── geometry2/ # Geometry utilities ✅ │ │ │ ├── robot_tf3_geometry_msgs/ │ │ │ └── robot_tf3_sensor_msgs/ │ │ ├── common_msgs/ # Message types ✅ │ │ │ ├── robot_geometry_msgs/ │ │ │ ├── robot_nav_msgs/ │ │ │ ├── robot_sensor_msgs/ │ │ │ ├── robot_std_msgs/ │ │ │ ├── robot_protocol_msgs/ │ │ │ └── robot_visualization_msgs/ │ │ ├── laser_geometry/ # Laser geometry ✅ │ │ ├── voxel_grid/ # Voxel grid ✅ │ │ ├── data_convert/ # Data conversion ✅ │ │ └── xmlrpcpp/ # XML-RPC utilities ✅ │ │ │ └── APIs/ │ └── c_api/ # C API wrapper ✅ │ ├── include/nav_c_api.h │ └── src/nav_c_api.cpp │ ├── build/ # Build artifacts ├── config/ # Configuration files ├── examples/ # Example code └── doc/ # Documentation ├── architecture_discussion.md ├── implementation_plan.md └── folders.md ``` ## Ghi chú - ✅ Kiến trúc cốt lõi đã được triển khai với plugin system linh hoạt - ✅ **3 Global Planners** đã triển khai: custom_planner, dock_planner, two_points_planner - ✅ **1 Local Planner** đã triển khai: pnkx_local_planner với 4 behaviors (position, docking, go_straight, rotate) - ✅ **8 Costmap Layers** đã triển khai: static, obstacle, inflation, voxel, critical, directional, preferred, unpreferred - ✅ **MKT Algorithms** hỗ trợ cả differential drive và bicycle model - ✅ **Plugin System** hoàn chỉnh với `boost::dll` và `robot::PluginLoaderHelper` - ⚠️ Cần bổ sung data sources interfaces và base controller - 🔄 Kiến trúc được thiết kế để dễ dàng thay đổi thuật toán và mô hình kinematics thông qua plugin system - 📦 Tất cả components được build bằng CMake, hỗ trợ cả Catkin và Standalone CMake - 🔌 Plugin system sử dụng `boost::dll` cho dynamic loading - 🎯 MoveBase đã có control loop (`executeCycle`) và state machine hoàn chỉnh - 📚 Có đầy đủ message types: geometry_msgs (29), nav_msgs (24), sensor_msgs (30), std_msgs (32)