Files
App/docs/AMR_SLAM_Thang_May.md
2026-07-24 09:07:54 +07:00

392 lines
16 KiB
Markdown

---
title: "AMR SLAM Đa Tầng Qua Thang Máy"
subtitle: "Ghi chú nguyên lý và chức năng thang máy"
author: "RD Odomety"
date: "10/07/2026"
lang: vi
---
# Tổng quan
Tài liệu này tổng hợp nguyên lý điều hướng **AMR (Autonomous Mobile Robot)** sử dụng **SLAM** để di chuyển giữa các tầng thông qua thang máy, và vai trò/chức năng của thang máy trong hệ thống.
Đây là bài toán **điều hướng đa tầng (multi-floor navigation)** — không chỉ là SLAM thuần túy. SLAM giải quyết "robot đang ở đâu trên bản đồ", còn thang máy thêm lớp **điều phối hệ thống tòa nhà + chuyển đổi ngữ cảnh giữa các tầng**.
---
# Phần 1: Nguyên lý AMR SLAM di chuyển qua thang máy
## 1.1 Kiến trúc tổng quan
Các thành phần chính trong hệ thống:
| Thành phần | Vai trò |
|---|---|
| **SLAM / Localization** | Định vị trên bản đồ từng tầng |
| **Global planner** | Lập kế hoạch đường đi xuyên tầng |
| **Elevator interface** | Gọi thang, mở cửa, giữ cửa, nhận trạng thái |
| **Mission / State machine** | Điều phối toàn bộ quy trình lên/xuống tầng |
| **Map management** | Quản lý nhiều bản đồ, chuyển tầng |
Luồng tương tác:
```
AMR + SLAM → Navigation / Mission → Elevator Manager
Elevator Controller / BMS
Map Switch / Relocalization
```
## 1.2 Cách biểu diễn bản đồ đa tầng
### A. Nhiều bản đồ độc lập (phổ biến nhất)
- Mỗi tầng một map riêng (2D occupancy grid hoặc graph).
- Các map **không nối liên tục về mặt hình học** — chỉ liên kết qua **elevator node**.
- Ví dụ: `Floor_1.map`, `Floor_2.map`, mỗi map có điểm `elevator_A_in`, `elevator_A_out`.
### B. Một bản đồ 3D / multi-layer
- Một map chứa nhiều "layer" (mỗi layer = một tầng).
- Phù hợp khi dùng SLAM 3D hoặc hệ thống thương mại (MiR, Omron, Geek+…).
### C. Topological graph (đồ thị)
- **Node** = điểm quan trọng (phòng, thang máy, cửa).
- **Edge** = đường đi hoặc **kết nối thang máy giữa các tầng**.
- Global planner chạy trên graph, local planner chạy trên map 2D từng tầng.
## 1.3 Quy trình điển hình (State Machine)
```
[Tầng nguồn] [Thang máy] [Tầng đích]
| | |
Navigate --> Wait at door --> Call elevator --> Enter --> Ride -->
Align in cabin --> Door close --> Moving --> Door open --> Exit -->
Relocalize on new floor --> Navigate to goal
```
### Các trạng thái chi tiết
1. **Navigate to elevator waiting point** — Robot đi đến vị trí chờ trước cửa thang.
2. **Request elevator** — Gửi yêu cầu qua API/BMS: tầng đích, ID thang, ưu tiên.
3. **Wait for arrival** — Chờ thang đến đúng tầng, cửa mở, cabin trống.
4. **Enter elevator** — Local navigation vào cabin (line following, QR marker, hoặc map nhỏ trong cabin).
5. **Inside cabin — localization bị "mù"** — Điểm then chốt kỹ thuật (xem mục 1.4).
6. **Ride to target floor** — Robot đứng yên; hệ thống theo dõi trạng thái thang.
7. **Exit elevator** — Ra khỏi cabin, đến điểm relocalization đã định sẵn.
8. **Relocalize on new floor** — Xác định lại vị trí trên map tầng mới.
9. **Continue mission** — Điều hướng bình thường trên tầng đích.
## 1.4 Thách thức SLAM / Localization trong thang máy
### Vấn đề cốt lõi
Trong cabin, môi trường **thay đổi liên tục** (cửa đóng/mở, cabin di chuyển, người vào ra). LiDAR scan matching dễ **drift** hoặc **nhảy pose sai**.
### Cách xử lý thực tế
| Giai đoạn | Chiến lược |
|---|---|
| **Trước khi vào** | Localization bình thường (AMCL, Cartographer, SLAM Toolbox…) |
| **Trong cabin** | **Tắt hoặc "đóng băng" SLAM**; chỉ dùng odometry ngắn hoặc IMU |
| **Khi ra cabin** | **Relocalization** bằng scan matching với map tầng mới |
| **Backup** | QR / AprilTag / UWB tại cửa thang hai đầu |
### Vai trò của Odometry
Trong cabin, **wheel odometry + IMU** giữ ước lượng tương đối ngắn (vài mét). Tuy nhiên odometry **không đủ** để biết đã lên tầng nào — cần **tín hiệu từ thang máy** (floor reached).
Luồng điển hình:
```
SLAM (tin cậy) → Odom only (trong thang) → SLAM relocalize (tầng mới)
```
## 1.5 Tích hợp thang máy (Elevator Integration)
### Mức độ tích hợp
**Mức 1 — Passive (đơn giản)**
- Robot chỉ chờ cửa mở (sensor hoặc camera), không điều khiển thang.
- Phù hợp thang công cộng, khó triển khai công nghiệp.
**Mức 2 — API với BMS / EMS (phổ biến)**
- Giao thức: Modbus, BACnet, OPC-UA, REST API, MQTT.
- Robot gửi: `call(floor=5)`, `hold_door()`, `release()`.
- Thang trả: `current_floor`, `door_open`, `moving`, `fault`.
**Mức 3 — Dedicated robot elevator**
- Thang riêng cho robot (Kone, Otis, Schindler có giải pháp robot elevator).
-**robot mode**: giữ cửa lâu hơn, điều khiển từng bước.
### Tín hiệu thường cần
```
Robot → Elevator: call_floor, destination_floor, hold_door, cancel
Elevator → Robot: current_floor, door_status, ready, in_service, fault_code
```
## 1.6 Global planning xuyên tầng
Planner không tính đường liên tục 3D. Thường là **2 tầng lập kế hoạch**:
1. **Topological planner** (đồ thị):
```
Room_A (F1) → Elevator_1_wait (F1) → [elevator_edge] → Elevator_1_exit (F3) → Room_B (F3)
```
2. **Local planner** (từng tầng): DWA, TEB, Nav2 trên map 2D của tầng đó.
**Elevator edge** là "cạnh ảo": chi phí = thời gian chờ thang + thời gian di chuyển + rủi ro lỗi.
## 1.7 Relocalization khi sang tầng mới
Sau khi ra khỏi thang, robot **không biết chính xác pose** trên map tầng mới (drift trong cabin).
| Phương pháp | Mô tả |
|---|---|
| **Scan matching** | So khớp LiDAR với map tầng mới (AMCL global localization) |
| **Known exit pose** | Điểm ra cố định; initial pose gần đúng |
| **Fiducial marker** | QR/AprilTag tại cửa thang |
| **Feature matching** | Đặc trưng quanh khu vực cửa thang |
Quy trình an toàn: robot ra đến **relocalization zone** → dừng → xác nhận pose (confidence > ngưỡng) → mới tiếp tục.
## 1.8 Luồng dữ liệu tổng thể
```
Mission: "Deliver to Room 502 (Floor 5)"
|
v
+------------------+
| Task Scheduler | --> Chọn route: F1 -> Elevator B -> F5
+--------+---------+
|
+----+----+
v v
+--------+ +--------------+
| Nav2 | | Elevator FSM |
| (local)| | (call/wait/ |
| | | enter/exit) |
+---+----+ +------+-------+
| |
v v
+--------+ +-----------+
| SLAM / | | Elevator |
| AMCL | | API/BMS |
+---+----+ +-----------+
|
v
+----------+
| Odometry | <- dung khi SLAM khong tin cay (trong cabin)
| + IMU |
+----------+
```
## 1.9 Các vấn đề thực tế cần lưu ý
1. **An toàn**: E-stop, phát hiện người trong cabin, không chen khi cửa sắp đóng.
2. **Đồng bộ thời gian**: Timestamp map, odometry và trạng thái thang phải nhất quán.
3. **Nhiều robot**: Queue thang, tránh hai robot cùng gọi một cabin.
4. **Map maintenance**: Thay đổi nội thất từng tầng → cập nhật map riêng.
5. **Khe cửa thang / ngưỡng**: Robot phải vượt qua được; thường cần map chi tiết vùng cửa.
6. **Mất mạng**: Timeout khi gọi thang; retry và fallback.
7. **Chuẩn hóa tọa độ**: Mỗi tầng một hệ tọa độ; chỉ nối qua elevator node, không cộng trực tiếp tọa độ giữa các tầng.
---
# Phần 2: Chức năng thang máy trong điều hướng AMR đa tầng
## 2.1 Vai trò vật lý vs vai trò logic
| Lớp | Thang máy làm gì |
|---|---|
| **Vật lý** | Chuyển robot từ tầng A sang tầng B |
| **Logic (navigation)** | Cạnh nối giữa hai map độc lập (`Floor_A` ↔ `Floor_B`) |
| **Điều phối** | Tài nguyên dùng chung — nhiều robot có thể tranh nhau |
| **An toàn** | Vùng nguy hiểm: cửa, khe, cabin chuyển động |
Với SLAM: **thang máy là ranh giới mà localization không còn đáng tin**. Robot "nhảy" từ một không gian định vị được sang không gian khác, còn thang đảm nhiệm phần ở giữa.
## 2.2 Chức năng theo góc nhìn hệ thống
### A. Vận chuyển (Transport)
Chức năng cơ bản: đưa cabin từ tầng nguồn đến tầng đích.
Robot **không tự biết** đã lên tầng nào nếu không có tín hiệu từ thang (`current_floor`, `arrived_at_destination`).
### B. Cửa và vùng truy cập (Access control)
Thang quyết định **khi nào robot được vào/ra**:
- Cửa mở đủ lâu để robot vào (thường cần **hold door**)
- Cabin dừng đúng tầng, không lệch sàn quá ngưỡng
- Không đóng cửa khi có vật cản (light curtain, cảm biến cửa)
### C. Đồng bộ với robot (Synchronization)
```
Robot FSM Elevator FSM
----------- --------------
GO_TO_ELEVATOR IDLE
WAIT_CALL --> RECEIVE_CALL
WAIT_DOOR_OPEN <-- ARRIVED + DOOR_OPEN
ENTERING <-> DOOR_HELD
INSIDE --> GO_TO_DEST_FLOOR
WAIT_EXIT <-- ARRIVED + DOOR_OPEN
EXITING <-> DOOR_HELD
RELOCALIZE RELEASE / IDLE
```
### D. Tài nguyên dùng chung (Resource management)
- **Queue** yêu cầu
- **Reservation** (giữ thang cho robot)
- **Priority** (robot giao hàng vs robot dọn phòng)
## 2.3 Interface: Robot ↔ Thang
### Robot → Thang (Commands)
| Lệnh | Mục đích |
|---|---|
| `call_elevator(floor)` | Gọi thang đến tầng robot đang đứng |
| `request_ride(dest_floor)` | Đặt đích sau khi đã vào cabin |
| `hold_door()` | Giữ cửa mở khi robot đang vào/ra |
| `release_door()` | Cho phép đóng cửa |
| `cancel()` | Hủy khi nhiệm vụ thất bại |
| `ping / heartbeat` | Giữ session, phát hiện mất kết nối |
### Thang → Robot (Status / Events)
| Tín hiệu | Robot dùng để |
|---|---|
| `current_floor` | Biết thang đang ở đâu |
| `door_open / door_closed` | Quyết định vào/ra |
| `moving / stopped` | Biết cabin đang chạy hay dừng |
| `at_destination` | Xác nhận đã đến tầng đích |
| `ready_for_robot` | Cabin sẵn sàng (trống, không lỗi) |
| `fault / maintenance` | Dừng mission, chọn thang khác |
| `passenger_present` | Có người — có thể chờ hoặc hủy |
## 2.4 Các chế độ vận hành thang với robot
| Chế độ | Mô tả |
|---|---|
| **Thang công cộng** | Robot chỉ quan sát, khó triển khai công nghiệp |
| **Robot mode** | API với BMS, giữ cửa lâu, ưu tiên cabin trống — phổ biến nhất |
| **Thang chuyên dụng** | Chỉ robot dùng, điều khiển hoàn toàn qua API |
## 2.5 Chức năng thang tại từng giai đoạn mission
### Giai đoạn 1: Trước cửa thang (tầng nguồn)
**Thang:** Nhận call, di chuyển cabin, mở cửa, báo ready.
**Robot:** Đi đến `elevator_wait_point`, chờ `door_open` + `current_floor == my_floor`.
### Giai đoạn 2: Vào cabin
**Thang:** `hold_door` trong khi robot vào.
**Robot:** Tắt/hạ độ tin cậy SLAM, dùng odometry ngắn, gửi `request_ride(dest_floor)` khi vào xong.
### Giai đoạn 3: Trong cabin (đang chạy)
**Thang:** Báo `moving`, `current_floor`, `at_destination` + `door_open`.
**Robot:** Đứng yên, **không cố SLAM**, chờ tín hiệu thang.
### Giai đoạn 4: Ra cabin (tầng đích)
**Thang:** Giữ cửa mở cho đến khi robot báo `exited`.
**Robot:** Ra đến relocalization zone, load map tầng đích, relocalize, sau đó `release_door`.
## 2.6 Thang như "cạnh" trong đồ thị điều hướng
```
Floor 1: [Room] --- [Elev1_Wait] ====ELEVATOR==== [Elev1_Exit]
|
Floor 3: [Room] --- [Elev1_Wait] ====ELEVATOR==== [Elev1_Exit]
|
Floor 5: [Room] --- [Elev1_Wait] ====ELEVATOR==== [Elev1_Exit]
```
**Thuộc tính của cạnh thang:**
- **Cost** = thời gian chờ + thời gian chạy + độ tin cậy
- **Constraint** = chỉ đi được khi `elevator.available == true`
- **Precondition** = robot tại `wait_point`, thang `ready`
- **Postcondition** = robot tại `exit_point` tầng đích, đã relocalize
## 2.7 Chức năng phụ quan trọng
- **Timeout & retry** — Gọi thang quá lâu → đổi thang hoặc hủy mission
- **Interlock an toàn** — Robot trong cabin, thang fault, lệch inside_pose
- **Multi-robot coordination** — Queue, gán elevator_id, tránh tranh cabin
- **Ghi log / audit** — Debug khi SLAM lệch sau khi ra thang
## 2.8 Phân chia trách nhiệm
| Việc | Ai làm |
|---|---|
| Biết vị trí trên hành lang từng tầng | Robot (SLAM/AMCL) |
| Lập đường trong tầng | Robot (local planner) |
| Vào/ra cabin không va chạm | Robot (local nav + odometry) |
| Relocalize sau khi ra | Robot |
| Chọn thang nào trong tòa nhà | Fleet / mission manager |
| Mở cửa, chạy tầng, báo trạng thái | Thang (qua BMS/API) |
## 2.9 Ví dụ luồng sự kiện đầy đủ
```
1. Mission: F2 → F5 qua Elevator B
2. Robot nav đến Elev_B_wait (F2) [SLAM hoạt động]
3. Robot → Elev: call(2)
4. Elev → Robot: moving_to_2
5. Elev → Robot: arrived, door_open
6. Robot → Elev: hold_door
7. Robot nav vào cabin (2m) [odom chính, SLAM phụ]
8. Robot → Elev: entered, ride_to(5)
9. Robot → Elev: release_door (cho đóng)
10. Elev: moving 2→5
11. Elev → Robot: floor=3,4... (optional)
12. Elev → Robot: arrived_5, door_open
13. Robot → Elev: hold_door
14. Robot nav ra + relocalize (F5) [SLAM bật lại]
15. Robot → Elev: exited, release_door
16. Robot nav đến đích trên map F5
```
---
# Tóm tắt
## Ba trụ cột của hệ thống
1. **Perception / Localization** — biết vị trí trên từng tầng
2. **Building integration** — điều khiển và đọc trạng thái thang máy
3. **Mission orchestration** — quy trình vào/ra thang và chuyển map
## Sáu chức năng cốt lõi của thang máy
1. **Transport** — chuyển tầng vật lý
2. **Gateway** — nối hai không gian/map SLAM tách biệt
3. **Access** — kiểm soát cửa và thời điểm vào/ra
4. **Signaling** — cung cấp trạng thái mà SLAM không suy ra được
5. **Resource** — tài nguyên dùng chung cần đặt chỗ và xếp hàng
6. **Safety envelope** — vùng vận hành có rủi ro cao, cần interlock
## Kết luận
> **AMR multi-floor không phải một SLAM map khổng lồ 3D**, mà là **nhiều map 2D + đồ thị kết nối qua thang máy + state machine điều phối thang + relocalization khi đổi tầng**.
Thang máy là **cầu nối có điều kiện** giữa các map — robot SLAM điều hướng trong từng tầng, còn thang đảm nhiệm **chuyển tầng + đồng bộ trạng thái + kiểm soát cửa**; localization được **tạm ngưng trong cabin****khôi phục sau khi ra**.