Từ indoor đến outdoor, từ 1 robot đến nhiều robot
Trong 4 bài trước của series, chúng ta đã đi từ SLAM đến Nav2, learning-based navigation, và vision-language navigation. Tất cả đều tập trung vào 1 robot hoạt động trong nhà. Nhưng thực tế công nghiệp đòi hỏi nhiều hơn:
- Outdoor navigation: robot giao hàng, robot nông nghiệp, robot khám phá -- nơi GPS có thể không có hoặc không chính xác
- Multi-robot coordination: 50 AMR trong 1 kho hàng, làm sao để chúng không đụng nhau và hoạt động hiệu quả?
Đây là 2 bài toán khó nhất trong navigation thực tế, và là chủ đề của bài cuối trong series này.
Phần 1: Outdoor Navigation
Thách thức khi ra ngoài trời
Indoor navigation (Nav2 + LiDAR SLAM) hoạt động tốt vì môi trường có cấu trúc: tường thẳng, sàn phẳng, ánh sáng ổn định. Outdoor là câu chuyện khác:
| Thách thức | Indoor | Outdoor |
|---|---|---|
| Địa hình | Phẳng | Gồ ghề, dốc, bùn, cát |
| GPS | Không cần | Có thể không có (GPS-denied) |
| Thời tiết | Ổn định | Mưa, sương, nắng chói |
| Dynamic obstacles | Người, xe đẩy | Ô tô, động vật, cây cối |
| Map | Có thể map trước | Thay đổi liên tục |
| Ánh sáng | Ổn định | Thay đổi theo giờ, ngày/đêm |
GPS-Denied Navigation
Trong nhiều tình huống, GPS không khả dụng hoặc không chính xác:
- Trong nhà / dưới lòng đất: không có tín hiệu GPS
- Urban canyon: tòa nhà cao chắn tín hiệu, multipath reflection
- Rừng rậm: tán cây che phủ
- EW (Electronic Warfare): GPS bị jam hoặc spoof (quân sự)
Giải pháp: Sensor Fusion
Khi không có GPS, robot phải dựa vào sensor fusion -- kết hợp nhiều nguồn thông tin:
┌──────────┐
│ IMU │ ← Short-term accurate, long-term drift
└────┬─────┘
│
┌──────────┐ ┌────▼─────┐ ┌──────────┐
│ LiDAR │──▶│ Fusion │◀──│ Camera │
│ SLAM │ │ (EKF/ │ │ (Visual │
└──────────┘ │ Factor │ │ Odom) │
│ Graph) │ └──────────┘
┌──────────┐ └────┬─────┘
│ Wheel │───────▶│
│ Odom │ │
└──────────┘ ┌────▼─────┐
│ Fused │
│ Pose │
└──────────┘
LIO-SAM (đã giới thiệu trong Part 1) là framework tốt cho outdoor vì hỗ trợ factor graph có thể thêm bất kỳ sensor nào: LiDAR, IMU, wheel odometry, và GPS (khi có).
Visual Place Recognition
Khi robot quay lại nơi đã đến, visual place recognition giúp nhận ra và correct drift. Các phương pháp hiện đại:
- NetVLAD / Patch-NetVLAD: CNN-based feature aggregation cho place recognition
- DINOv2: vision foundation model, cho retrieval features tốt mà không cần train
- CosPlace (Berton et al., CVPR 2022): optimized cho large-scale visual geo-localization
Terrain Classification
Robot outdoor cần hiểu địa hình để chọn đường đi an toàn và hiệu quả:
- Asphalt: đi nhanh, an toàn
- Cỏ: đi được nhưng chậm hơn
- Đất mềm: có thể bị trượt, sa lầy
- Đá sỏi: rung, cần giảm tốc
- Nước: tránh né
- Bậc thang / dốc: cần đánh giá khả năng leo
Phương pháp
Semantic segmentation từ camera:
# Sử dụng pre-trained model cho terrain classification
import torch
from torchvision.models.segmentation import deeplabv3_resnet101
model = deeplabv3_resnet101(pretrained=True).eval()
# Terrain classes: road, grass, dirt, gravel, water, obstacle
# Fine-tune trên off-road dataset (RUGD, RELLIS-3D)
Point cloud analysis từ LiDAR:
- Roughness: độ gồ ghề của mặt đất (variance của z trong local patch)
- Slope: độ dốc (normal vector của surface)
- Step height: độ cao của bậc thang / lề đường
Traversability map: kết hợp visual + geometric analysis thành cost map cho path planning:
Traversability score = w1 * terrain_type + w2 * slope + w3 * roughness
Score này được đưa vào Nav2 costmap để planner tránh địa hình nguy hiểm.
Outdoor SLAM: Các giải pháp
| Phương pháp | Sensor | Outdoor Performance | Ghi chú |
|---|---|---|---|
| LIO-SAM | LiDAR + IMU | Rất tốt | Factor graph, GPS optional |
| FAST-LIO2 | LiDAR + IMU | Rất tốt | Incremental kd-tree, nhanh |
| ORB-SLAM3 | Camera + IMU | Tốt (có texture) | Thất bại khi texture ít |
| VILENS | Visual-Inertial-LiDAR | Tốt nhất | Multi-sensor, robust nhất |
Phần 2: Multi-Robot Coordination
Tại sao Multi-Robot?
Một robot AMR đi 1 m/s, mang 100 kg hàng. Muốn throughput 1000 đơn/giờ? Cần 20-50 robot hoạt động đồng thời. Và đây là lúc vấn đề bắt đầu phức tạp:
- Traffic management: 50 robot đi lại trong kho, làm sao để không đụng nhau?
- Task allocation: đơn nào giao cho robot nào?
- Deadlock prevention: 2 robot đợi nhau trong hành lang hẹp -- ai lùi?
- Heterogeneous fleet: robot A là forklift, robot B là AMR nhỏ -- coordination khác nhau
VDA5050 -- Chuẩn giao tiếp cho AGV/AMR Fleet
VDA5050 là chuẩn giao tiếp mở giữa AGV/AMR và fleet management software, phát triển bởi VDA (Hiệp hội Ô tô Đức) và VDMA (Hiệp hội Máy móc Đức).
Tại sao cần VDA5050?
Trước VDA5050, mỗi nhà sản xuất robot có giao thức riêng. Muốn dùng 10 robot MiR + 5 robot KUKA trong 1 kho? Cần 2 fleet managers riêng biệt, không giao tiếp được với nhau. VDA5050 giải quyết bằng giao thức chung.
Kiến trúc VDA5050
┌─────────────────────────────────┐
│ Master Control │ ← Fleet Management Software
│ (Fleet Manager / Supervisor) │
└──────────┬──────────────────────┘
│ MQTT (JSON messages)
│
┌──────┼──────┬──────────┐
│ │ │ │
┌───▼──┐┌──▼──┐┌──▼──┐ ┌───▼──┐
│AGV 1 ││AGV 2││AGV 3│ │AGV N │
│(MiR) ││(KUKA)││(Custom)│(Any) │
└──────┘└─────┘└─────┘ └──────┘
Các message chính
Từ Master Control → AGV:
{
"headerId": 1,
"timestamp": "2026-02-20T10:00:00Z",
"version": "2.0.0",
"manufacturer": "vnrobo",
"serialNumber": "AMR-001",
"orderId": "order-123",
"orderUpdateId": 1,
"nodes": [
{
"nodeId": "node-1",
"sequenceId": 0,
"released": true,
"nodePosition": { "x": 10.5, "y": 3.2, "mapId": "warehouse-A" },
"actions": [
{ "actionType": "pick", "actionId": "pick-1", "blockingType": "HARD" }
]
},
{
"nodeId": "node-2",
"sequenceId": 2,
"released": true,
"nodePosition": { "x": 15.0, "y": 3.2, "mapId": "warehouse-A" }
}
],
"edges": [
{
"edgeId": "edge-1",
"sequenceId": 1,
"startNodeId": "node-1",
"endNodeId": "node-2",
"released": true,
"maxSpeed": 1.0
}
]
}
Từ AGV → Master Control (State):
- Vị trí hiện tại (x, y, theta, map_id)
- Trạng thái battery, tốc độ, errors
- Tiến độ order (node nào đã đến, action nào đã hoàn thành)
Ưu điểm VDA5050
- Interoperability: robot từ nhiều hãng khác nhau trong 1 fleet
- Open standard: miễn phí, không vendor lock-in
- MQTT-based: lightweight, real-time, scale tốt
- Adopted rộng rãi: MiR, KUKA, Locus Robotics, và 50+ hãng khác
MAPF -- Multi-Agent Path Finding
MAPF là bài toán tìm đường đồng thời cho nhiều agent sao cho không va chạm và tối ưu tổng chi phí (minimize total path length hoặc makespan).
Bài toán
Input:
- Graph G (map với nodes và edges)
- N agents, mỗi agent có start và goal
- Constraint: 2 agents không được ở cùng node hoặc swap positions
Output:
- Chuỗi actions cho mỗi agent
- Không có conflict
- Tối ưu (tổng path length ngắn nhất)
Độ khó: MAPF tối ưu là NP-hard khi tối ưu makespan. Thực tế cần algorithms nhanh và gần tối ưu.
CBS -- Conflict-Based Search
CBS (Sharon et al., 2015) là algorithm được dùng rộng rãi nhất cho MAPF:
CBS Algorithm:
1. [Low-level]: Tìm shortest path cho mỗi agent (A* độc lập)
2. [High-level]: Kiểm tra conflicts giữa các paths
3. Nếu có conflict (2 agents ở cùng vị trí tại cùng thời điểm):
a. Tạo 2 child nodes:
- Node 1: cấm agent A ở vị trí conflict
- Node 2: cấm agent B ở vị trí conflict
b. Re-plan cho agent bị cấm
4. Lặp lại cho đến khi không còn conflict
Độ phức tạp: optimal nhưng exponential worst case. Trong thực tế, với các heuristics (ECBS, EECBS), chạy nhanh cho hàng trăm agents.
Thực hành MAPF với Python
# Sử dụng thư viện python-mapf
# pip install cbs-mapf
from cbs import CBSSolver
# Define map (0 = free, 1 = obstacle)
grid = [
[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 0, 0, 0, 0],
]
# Define agents: (start, goal)
agents = [
((0, 0), (4, 4)), # Agent 0: top-left to bottom-right
((4, 0), (0, 4)), # Agent 1: bottom-left to top-right
((2, 0), (2, 4)), # Agent 2: mid-left to mid-right
]
solver = CBSSolver(grid, agents)
paths = solver.solve()
for i, path in enumerate(paths):
print(f"Agent {i}: {path}")
MAPF trong thực tế
| Algorithm | Optimality | Tốc độ | Scale | Use case |
|---|---|---|---|---|
| CBS | Optimal | Chậm (>50 agents) | ~50 agents | Research, nhỏ |
| ECBS | Bounded sub-optimal | Nhanh | ~200 agents | Production |
| Priority-Based | Sub-optimal | Rất nhanh | ~1000 agents | Large warehouse |
| ORCA | Local (reactive) | Real-time | Unlimited | Dynamic obstacles |
Traffic Management trong Warehouse
MAPF giải quyết offline planning. Nhưng trong warehouse thực tế, cần online traffic management:
Zone-based Control
┌─────────┬─────────┬─────────┐
│ Zone A │ Zone B │ Zone C │
│ (max 3 │ (max 2 │ (max 3 │
│ robots) │ robots) │ robots) │
├─────────┼─────────┼─────────┤
│ Zone D │ Zone E │ Zone F │
│ (max 2 │ (max 1) │ (max 2 │
│ robots) │ ONE-WAY │ robots) │
└─────────┴─────────┴─────────┘
- Giới hạn số robot trong mỗi zone
- One-way corridors cho hành lang hẹp
- Priority rules: robot có hàng ưu tiên hơn robot không hàng
Deadlock Prevention
4 điều kiện cho deadlock (Coffman):
- Mutual exclusion: chỉ 1 robot ở 1 vị trí
- Hold and wait: robot giữ vị trí hiện tại và chờ vị trí tiếp
- No preemption: không thể bắt robot lùi
- Circular wait: A đợi B, B đợi C, C đợi A
Giải pháp: phá vỡ điều kiện 4 (circular wait) bằng priority ordering -- robot có ID thấp hơn luôn nhường.
Open-RMF -- Fleet Management cho ROS 2
Open-RMF (Open Robotics Middleware Framework) là framework fleet management cho ROS 2, hỗ trợ multi-robot coordination.
# Cài đặt Open-RMF
sudo apt install ros-humble-rmf-demos
# Launch demo với 2 fleet (TinyRobot + DeliveryRobot)
ros2 launch rmf_demos office.launch.xml
Open-RMF cung cấp:
- Traffic negotiation: robots tự động negotiate khi gặp nhau
- Fleet adapter: kết nối với bất kỳ robot nào (kể cả non-ROS)
- Task dispatcher: phân công task cho robot phù hợp
- Web dashboard: giao diện quản lý fleet
Tham khảo thêm tại Open-RMF Fleet Management.
Kết hợp Outdoor + Multi-Robot
Một số ứng dụng kết hợp cả 2:
Nông nghiệp tự động
- Fleet tractor tự lái trên đồng ruộng
- GPS-RTK cho định vị chính xác (±2cm)
- Multi-robot coordination để cover toàn bộ diện tích
- Terrain classification để tránh vùng ngập nước
Giao hàng last-mile
- Fleet robot giao hàng trên vỉa hè
- GPS + visual localization trong urban
- Traffic management với ô tô, người đi bộ
- Dynamic re-routing khi có obstacle
Khám phá và cứu nạn
- Multi-robot exploration trong môi trường không biết
- GPS-denied (trong tòa nhà sập, dưới lòng đất)
- Collaborative SLAM: nhiều robot đồng thời xây bản đồ
- Communication constraints: không phải lúc nào cũng có wifi
Tổng kết series Navigation hiện đại
Qua 5 bài, chúng ta đã đi qua toàn bộ landscape của robot navigation hiện đại:
| Bài | Chủ đề | Keyword |
|---|---|---|
| Part 1 | SLAM | EKF, Cartographer, LIO-SAM, ORB-SLAM3 |
| Part 2 | Nav2 | Path planning, behavior trees, costmap |
| Part 3 | Learning-based | GNM, ViNT, NoMaD, diffusion |
| Part 4 | VLN | R2R, LLM planning, NaVILA |
| Part 5 | Outdoor + Multi-Robot | GPS-denied, VDA5050, MAPF |
Takeaway chính:
- Indoor structured: Nav2 + LiDAR SLAM vẫn là lựa chọn tốt nhất cho production
- Unstructured / novel: Learning-based (NoMaD, ViNT) đang tiến đến production-ready
- Language-guided: VLN + LLMs mở ra giao tiếp tự nhiên với robot
- Multi-robot: VDA5050 cho interoperability, MAPF cho coordination, Open-RMF cho ROS 2
- Outdoor: sensor fusion là then chốt, terrain classification quyết định an toàn
Bài viết liên quan
- Multi-Robot Coordination -- Bài toán phối hợp nhiều robot
- Open-RMF Fleet Management -- Framework quản lý fleet ROS 2
- AGV vs AMR: So sánh -- Chọn loại robot phù hợp
- Robot Fleet Management -- Tổng quan quản lý đội robot
- LiDAR 3D Mapping -- Công nghệ LiDAR cho outdoor mapping