# 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)