32 KiB
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:
flowchart TB
%% ========== API LAYER ==========
subgraph API["🌐 API Layer"]
direction TB
CAPI["<b>📦 C API</b><br/>━━━━━━━━━━━━━━━━<br/>🔌 nav_c_api<br/>💻 P/Invoke cho .NET/C#<br/>📝 Wrapper Functions<br/>🔗 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["<b>🔌 User Controller Plugin</b><br/>━━━━━━━━━━━━━━━━<br/>📚 Dynamic Loader<br/>⚙️ boost::dll<br/>🎯 Custom Behavior<br/>🔄 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["<b>📋 BaseNavigation</b><br/>━━━━━━━━━━━━━━━━<br/>🏗️ move_base_core::BaseNavigation<br/>🎯 Abstract Interface<br/>━━━━━━━━━━━━━━━━<br/>📍 moveTo, dockTo<br/>🔄 rotateTo, moveStraightTo<br/>⏸️ pause, resume, cancel<br/>📊 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["<b>🚀 MoveBase</b><br/>━━━━━━━━━━━━━━━━<br/>📦 move_base::MoveBase<br/>🔄 State Machine<br/>━━━━━━━━━━━━━━━━<br/>📊 PLANNING<br/>🎮 CONTROLLING<br/>🧹 CLEARING<br/>━━━━━━━━━━━━━━━━<br/>🎛️ Control Loop<br/>🔄 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["<b>🌍 Global Planner</b><br/>━━━━━━━━━━━━━━━━<br/>📋 nav_core::BaseGlobalPlanner<br/>🔌 Dynamic Plugin<br/>━━━━━━━━━━━━━━━━<br/>🎯 A*, D*, Hybrid A*<br/>📐 Long-range Planning<br/>🗺️ Global Path"]
LP["<b>📍 Local Planner</b><br/>━━━━━━━━━━━━━━━━<br/>📋 nav_core::BaseLocalPlanner<br/>🔌 Dynamic Plugin<br/>━━━━━━━━━━━━━━━━<br/>🎯 DWA, TEB, MKT<br/>🚗 Velocity Commands<br/>🛡️ Obstacle Avoidance"]
RB["<b>🔄 Recovery Behaviors</b><br/>━━━━━━━━━━━━━━━━<br/>📋 nav_core::RecoveryBehavior<br/>🔌 Dynamic Plugin<br/>━━━━━━━━━━━━━━━━<br/>🧹 Clear Costmap<br/>🔄 Rotate Recovery<br/>🚨 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["<b>🌍 Global Costmap</b><br/>━━━━━━━━━━━━━━━━<br/>📦 robot_costmap_2d::Costmap2DROBOT<br/>🌍 frame: map<br/>━━━━━━━━━━━━━━━━<br/>🗺️ Static Map<br/>🚫 Obstacles<br/>💰 Inflation Layer"]
LC["<b>📍 Local Costmap</b><br/>━━━━━━━━━━━━━━━━<br/>📦 robot_costmap_2d::Costmap2DROBOT<br/>📍 frame: odom<br/>━━━━━━━━━━━━━━━━<br/>🔍 Dynamic Obstacles<br/>📡 Sensor Fusion<br/>⚡ 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["<b>🚗 MKT Algorithm</b><br/>━━━━━━━━━━━━━━━━<br/>⚙️ Diff Drive Kinematics<br/>🚲 Bicycle Kinematics<br/>📐 Trajectory Generation"]
ScoreAlgo["<b>📊 Score Algorithm</b><br/>━━━━━━━━━━━━━━━━<br/>📈 Trajectory Scoring<br/>✅ Goal Checking<br/>🎯 Path Evaluation"]
KalmanAlgo["<b>🔍 Kalman Filter</b><br/>━━━━━━━━━━━━━━━━<br/>📊 State Estimation<br/>🔮 Sensor Fusion<br/>📉 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["<b>🎯 Goal Input</b><br/>━━━━━━━━━━━━━━━━<br/>📍 robot_geometry_msgs::PoseStamped<br/>📨 move_base_simple/goal"]
Loc["<b>🌍 Localization</b><br/>━━━━━━━━━━━━━━━━<br/>📍 Pnkx Loc<br/>🗺️ Global Pose<br/>🔄 Pose Updates"]
TF["<b>🔄 Transform System</b><br/>━━━━━━━━━━━━━━━━<br/>📐 tf3::BufferCore<br/>🌐 Coordinate Frames<br/>⏱️ Time Synchronization"]
Odom["<b>🚗 Odometry</b><br/>━━━━━━━━━━━━━━━━<br/>📍 robot_geometry_msgs::Odometry<br/>⚡ Robot Velocity<br/>📊 Position Tracking"]
Laser["<b>📡 Laser Sensors</b><br/>━━━━━━━━━━━━━━━━<br/>🔍 robot_sensor_msgs::LaserScan<br/>🚫 Obstacle Detection<br/>📏 Distance Measurement"]
Map["<b>🗺️ Map Server</b><br/>━━━━━━━━━━━━━━━━<br/>📋 robot_nav_msgs::OccupancyGrid<br/>🏗️ Static Map<br/>📐 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["<b>⚡ Velocity Command</b><br/>━━━━━━━━━━━━━━━━<br/>📤 robot_geometry_msgs::Twist<br/>📨 cmd_vel<br/>━━━━━━━━━━━━━━━━<br/>➡️ Linear Velocity<br/>🔄 Angular Velocity"]
BaseCtrl["<b>🎮 Base Controller</b><br/>━━━━━━━━━━━━━━━━<br/>🚗 diff_driver_controller<br/>🚲 steer_drive_controller<br/>━━━━━━━━━━━━━━━━<br/>⚙️ Kinematics<br/>🔧 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:
-
API Layer ✅
- C API (
nav_c_api) cho P/Invoke với .NET/C# - Wrapper functions cho tất cả BaseNavigation methods
- C API (
-
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
BaseNavigationinterface
-
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
-
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)
-
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 calculationdock_planner- Docking-specific planner với dock calculation utilitiestwo_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::dllvàrobot::PluginLoaderHelperđể dynamic loading
-
Costmap Layer ✅
robot_costmap_2d::Costmap2DROBOT: Global và local costmap wrapperrobot_costmap_2d::LayeredCostmap: Layered costmap system- Costmap Layers (8 implementations):
StaticLayer- Static map từ OccupancyGridObstacleLayer- Dynamic obstacles từ sensorsInflationLayer- Cost inflation cho robot footprintVoxelLayer- 3D voxel grid cho obstaclesCriticalLayer- Critical zones markingDirectionalLayer- Directional cost preferencesPreferredLayer- Preferred path zonesUnpreferredLayer- Unpreferred zones
- Frame management: map (global), odom (local)
- Thread-safe access với mutex
- Observation buffer cho sensor data
-
Algorithms Layer ✅
- MKT Algorithm (
mkt_algorithm):- Differential drive kinematics:
diff_go_straight- Go straight behaviordiff_predictive_trajectory- Predictive trajectory followingdiff_rotate_to_goal- Rotate to goal
- Bicycle model kinematics:
bicycle_go_straight- Go straight với bicycle modelbicycle_pure_pursuit- Pure pursuit controlbicycle_rotate_to_goal- Rotate behavior
- Differential drive kinematics:
- MKT Plugins (
mkt_plugins):goal_checker- Goal checking algorithmssimple_goal_checker- Simple goal checkingstandard_traj_generator- Standard trajectory generationlimited_accel_generator- Acceleration-limited trajectory generationkinematic_parameters- Kinematics parameter managementxy_theta_iterator- Trajectory iteration utilitiesvelocity_iterator- Velocity space iterationone_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
- MKT Algorithm (
-
Data Sources ⚠️ (Interface cần định nghĩa)
- Localization source (Pnkx Loc)
- Odometry source
- Sensor transforms (tf3)
- Map server
- Laser sensors
-
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<robot_geometry_msgs::PoseStamped>(đườ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 listenermoveTo(goal, xy_tol, yaw_tol)- Di chuyển đến goaldockTo(marker, goal, ...)- Docking đến markerrotateTo(goal, yaw_tol)- Xoay tại chỗmoveStraightTo(goal, xy_tol)- Đi thẳngpause(),resume(),cancel()- Điều khiển trạng tháigetRobotPose(...)- Lấy vị trí robot
-
robot_nav_core::BaseGlobalPlanner✅makePlan(start, goal, plan)- Tạo global pathinitialize(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 commandsetPlan(plan)- Set global path để followisGoalReached()- Kiểm tra đã đến goal chưaswapPlanner(name)- Thay đổi planner động (position, docking, go_straight, rotate)setTwistLinear/Angular(...)- Set velocity limitsgetTwistLinear/Angular(...)- Get velocity limits- Implementation:
pnkx_local_plannervới multiple behaviors
-
robot_nav_core::RecoveryBehavior✅runBehavior()- Thực thi recovery behaviorinitialize(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ừ localizationisAvailable()- Kiểm tra localization có sẵn không
-
IOdometrySource⚠️getCurrentPose()- Lấy vị trí từ odometrygetCurrentVelocity()- Lấy vận tốc hiện tạiisAvailable()- Kiểm tra odometry có sẵn không
-
IBaseController⚠️executeVelocity(cmd_vel)- Thực thi velocity commandstop()- Dừng robot ngay lập tứcgetCurrentVelocity()- Lấy vận tốc thực tế
-
IMapProvider⚠️getMap()- Lấy static mapisMapAvailable()- Kiểm tra map có sẵn không
Plugin mechanism: ✅
- Sử dụng
boost::dllđể dynamic loading plugins - Factory pattern với
boost::functionvà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 plannersrobot_nav_core::BaseLocalPlanner- Local plannersrobot_nav_core::RecoveryBehavior- Recovery behaviorsrobot_costmap_2d::Layer- Costmap layers
- Plugin registration với
BOOST_DLL_ALIASmacro
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::chronocho 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: ✅
-
✅ Interface Layer:
move_base_core::BaseNavigation- Abstract interface hoàn chỉnhmove_base_core::common.h- Common types và utilities
-
✅ Implementation Layer:
move_base::MoveBase- Core implementation với state machineexecuteCycle()- Control loop implementation- State management (PLANNING, CONTROLLING, CLEARING, PAUSED)
- Threading với planner thread và control loop
-
✅ Planning Layer - Plugin System:
- Global Planners (3 implementations):
custom_planner- Custom path planning với curve supportdock_planner- Docking-specific plannertwo_points_planner- Simple two-point planner
- Local Planners (1 implementation):
pnkx_local_planner- Main local planner với:pnkx_docking_local_planner- Docking behaviorpnkx_go_straight_local_planner- Go straight behaviorpnkx_rotate_local_planner- Rotate behavior
- Recovery Behaviors: Interface đã định nghĩa
- Plugin loading với
boost::dllvàrobot::PluginLoaderHelper
- Global Planners (3 implementations):
-
✅ Costmap Layer:
robot_costmap_2d::Costmap2DROBOT- Global và local costmap- Costmap Layers (8 implementations):
static_layer- Static map layerobstacle_layer- Dynamic obstaclesinflation_layer- Cost inflationvoxel_layer- 3D voxel gridcritical_layer- Critical zonesdirectional_layer- Directional costspreferred_layer- Preferred pathsunpreferred_layer- Unpreferred zones
- Layered costmap system với plugin support
-
✅ 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 algorithmsstandard_traj_generator- Standard trajectory generationkinematic_parameters- Kinematics parameter managementxy_theta_iterator- Trajectory iterationlimited_accel_generator- Acceleration-limited trajectories
- Score Algorithm: Trajectory scoring và goal checking
- Kalman Filter: State estimation và filtering
- MKT Algorithm:
-
✅ API Layer:
nav_c_api- C API wrapper cho .NET/C# P/Invoke- Wrapper functions cho BaseNavigation methods
-
✅ Supporting Libraries:
tf3- Transform system (buffer_core, transforms)robot_time- Time management (Time, Duration, Timer, Rate)robot_cpp- Core utilities:robot::init()- Initializationrobot::NodeHandle- YAML config loadingrobot::PluginLoaderHelper- Plugin discovery
robot_nav_2d_utils- 2D navigation utilities (conversions, path_ops, polygons, bounds, tf_help)robot_nav_2d_msgs- 2D navigation messagesgeometry_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 utilitiesvoxel_grid- Voxel grid implementationdata_convert- Data conversion utilitiesnav_grid- Navigation grid utilities
Đang triển khai / Cần bổ sung: ⚠️
-
⚠️ Data Sources Interfaces:
ILocalizationSourceinterface - Cần định nghĩaIOdometrySourceinterface - Cần định nghĩaIMapProviderinterface - 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
-
⚠️ Base Controller:
IBaseControllerinterface - 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/Angulartrong local planner
-
⚠️ 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
-
⚠️ 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::dllvà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::dllcho 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)