Giới thiệu dự án

Sự bùng nổ của cuộc Cách mạng Công nghiệp 4.0 cùng với tác động sâu sắc sau đại dịch COVID-19 đã thúc đẩy mạnh mẽ quá trình chuyển đổi số trong ngành dịch vụ ẩm thực (F&B). Theo thống kê từ Hiệp hội Nhà hàng Quốc tế, chi phí nhân sự chiếm tới 30–35% tổng doanh thu vận hành, trong khi tỷ lệ biến động nhân sự ngành dịch vụ luôn duy trì ở mức cao (trên 70%/năm). Thực trạng này dẫn đến tình trạng thiếu hụt lao động cục bộ, giảm chất lượng phục vụ và gia tăng sai sót trong quá trình vận hành giờ cao điểm.

Đồ án tốt nghiệp "Thiết kế và điều khiển mô hình robot phục vụ trong nhà hàng" của nhóm tác giả Nguyễn Thành Nam và Đặng Nguyễn Quang Đông (Khoa Đào tạo Chất lượng cao, Trường Đại học Sư phạm Kỹ thuật TP.HCM, dưới sự hướng dẫn của TS. Đặng Xuân Ba) tập trung giải quyết bài toán tự động hóa quy trình vận chuyển thức ăn và tương tác với khách hàng thông qua mô hình Robot Di động Tự hành (AMR - Autonomous Mobile Robot).

Hệ thống giải quyết triệt để các hạn chế của dòng robot dẫn đường truyền thống (băng từ/QR code) vốn thiếu tính linh hoạt và tốn kém chi phí cải tạo hạ tầng. Bằng việc tích hợp hệ thống định vị và lập bản đồ đồng thời (SLAM - Simultaneous Localization and Mapping), cảm biến LiDAR 360 độ và hệ thống truyền động bánh xe Mecanum đa hướng, robot có thể tự động lập lộ trình tối ưu và né tránh vật cản thời gian thực trong không gian nhà hàng động.

Mục tiêu cụ thể của đề tài:

  1. Thiết kế cơ khí và phần cứng: Chế tạo robot kích thước tiêu chuẩn $400 \times 300 \times 870\text{ mm}$, trọng lượng $10\text{–}12\text{ kg}$, tải trọng khay $5\text{–}10\text{ kg}$, sử dụng khung nhôm định hình kết hợp vỏ mica gia công CNC.
  2. Xây dựng mô hình động học và điều khiển: Thiết lập mô hình động học thuận/nghịch cho 4 bánh xe Mecanum, tích hợp bộ điều khiển PID (Proportional-Integral-Derivative) vòng kín đảm bảo sai số điều hướng $\le 3%$.
  3. Phát triển phần mềm tự hành: Ứng dụng Robot Operating System (ROS Noetic) trên nền tảng Ubuntu 20.04 LTS, tích hợp LiDAR Slamtec Mapper M1M1 để xây dựng bản đồ tĩnh và bản đồ chi phí (Costmap).
  4. Hệ thống điều hướng và né vật cản: Triển khai thuật toán Dijkstra (Global Planner) kết hợp Dynamic Window Approach (DWA - Local Planner) cho phép di chuyển đơn điểm và đa điểm (Waypoint Navigation).
  5. Giao diện và tương tác người dùng: Xây dựng giao diện kép (Staff/Customer) trên màn hình cảm ứng 7 inch bằng PyQt5, kết nối cơ sở dữ liệu MySQL 8.0 và tích hợp module nhận diện giọng nói qua Google Speech Recognition API.

Phạm vi giới hạn: Đồ án tập trung vào nghiên cứu ứng dụng thực nghiệm, tối ưu hóa thuật toán điều hướng trong môi trường sàn phẳng nội thất (indoor), không đi sâu vào phân tích ứng suất động lực học vật liệu chuyên sâu.


Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Trước khi thiết kế hệ thống, nhóm nghiên cứu đã tiến hành đánh giá so sánh các giải pháp phục vụ tự động hiện có trên thị trường:

Tiêu chí AGV dẫn đường từ/mã vạch Robot thương mại (Pudu BellaBot / Keenon) Giải pháp AMR trong đồ án
Cơ chế di chuyển Bám line từ / Optical Track Bánh vi sai (Differential Drive) 4 bánh Mecanum đa hướng ($360^\circ$)
Khả năng né vật cản Dừng khẩn cấp, không thể tự đổi hướng Tránh vật cản bằng 3D LiDAR + RGB-D Né vật cản động thời gian thực bằng LiDAR + DWA
Chi phí đầu tư Trung bình ($2,000 - $4,000), cải tạo sàn Rất cao ($8,000 - $15,000/robot) Thấp ($600 - $900), mã nguồn mở
Tính linh hoạt Rất thấp (cố định theo line) Cao Rất cao (thay đổi sơ đồ bàn trên giao diện)
Giao tiếp & Tương tác Màn hình nút bấm đơn giản Màn hình AI + Giọng nói đám mây PyQt GUI + Giọng nói tiếng Việt + Đồng bộ MySQL

Yêu cầu người dùng được phân loại theo mô hình MoSCoW:

  • Must have (Bắt buộc): Tự động điều hướng đến đúng số bàn, tránh vật cản động/tĩnh, mang khay thức ăn ổn định, dừng chính xác $\pm 3\text{ cm}$.
  • Should have (Nên có): Giao diện gọi món cho khách, giao diện điều phối cho nhân viên bếp, thông báo bằng giọng nói khi đến bàn.
  • Could have (Có thể có): Lộ trình phục vụ đa điểm liên tục nhiều bàn trong một chu trình, điều khiển thủ công từ xa qua mạng nội bộ.
  • Won't have (Chưa ưu tiên): Tay gắp tự động bưng đĩa xuống bàn, di chuyển vượt bậc thang hoặc mặt đường dốc $> 10^\circ$.

Thiết kế hệ thống

Kiến trúc hệ thống được phân tầng rõ ràng giữa bộ xử lý trung tâm cấp cao và vi điều khiển cấp thấp:

[Người dùng / Nhân viên] 
       │ (Cảm ứng / Giọng nói)
       ▼
[Raspberry Pi 4 Model B (4GB)] ── ROS Noetic Master (Ubuntu 20.04 LTS)
       ├── Giao diện PyQt5 & Cơ sở dữ liệu MySQL 8.0
       ├── Module Speech Recognition & gTTS (Voice API)
       ├── Gói Navigation Move_base (Global Dijkstra + Local DWA)
       ├── Slamware ROS SDK & SLAM Map Server
       └── Cảm biến Slamtec Mapper M1M1 (LiDAR quét 360°, dải đo 20m)
       │
       │ (Giao thức Rosserial qua UART /dev/ttyACM0 @ 115200 bps)
       ▼
[Arduino Mega 2560 R3]
       ├── Đọc xung 4 kênh Encoder (Ngắt ngoài đa kênh)
       ├── Bộ điều khiển PID vận tốc vòng kín (Chu kỳ lấy mẫu 20ms)
       └── Điều chế xung PWM qua 4 x Driver BTS7960 (43A H-Bridge)
              ▼
       [4 x Động cơ DC Servo JGB37-520 (12V, 330 RPM) + Bánh Mecanum 96mm]

Mô hình toán học động học bánh Mecanum

Hệ thống sử dụng cấu hình 4 bánh Mecanum đặt tại 4 góc với con lăn nghiêng $45^\circ$. Gọi $v_x, v_y$ là vận tốc tịnh tiến, $\omega_z$ là vận tốc góc của robot; $R = 0.048\text{ m}$ là bán kính bánh xe; $a = 0.15\text{ m}$ và $b = 0.20\text{ m}$ lần lượt là khoảng cách từ tâm robot đến trục bánh xe theo phương ngang và dọc.

Phương trình động học nghịch tính vận tốc góc của từng bánh xe ($\omega_1, \omega_2, \omega_3, \omega_4$):

$$\begin{bmatrix} \omega_1 \ \omega_2 \ \omega_3 \ \omega_4 \end{bmatrix} = \frac{1}{R} \begin{bmatrix} 1 & -1 & -(a+b) \ 1 & 1 & (a+b) \ 1 & -1 & (a+b) \ 1 & 1 & -(a+b) \end{bmatrix} \begin{bmatrix} v_x \ v_y \ \omega_z \end{bmatrix}$$

Phương trình động học thuận:

$$\begin{bmatrix} v_x \ v_y \ \omega_z \end{bmatrix} = \frac{R}{4} \begin{bmatrix} 1 & 1 & 1 & 1 \ -1 & 1 & -1 & 1 \ -\frac{1}{a+b} & \frac{1}{a+b} & \frac{1}{a+b} & -\frac{1}{a+b} \end{bmatrix} \begin{bmatrix} \omega_1 \ \omega_2 \ \omega_3 \ \omega_4 \end{bmatrix}$$

                ▲ y (Vx)
                │
         [1] ───┴─── [2]
          │   Robot   │
          │   Center  │ ──► x (Vy)
         [4] ─────── [3]
                ↺ ωz

Thiết kế phần mềm và cơ sở dữ liệu

Hệ thống quản trị dữ liệu sử dụng MySQL 8.0 gồm 3 bảng chính: tables (danh sách bàn và tọa độ x, y, yaw), menu_items (danh mục món ăn, đơn giá, trạng thái tồn kho), và orders (mã đơn, số bàn, thời gian đặt, trạng thái: PENDING, COOKING, DELIVERING, COMPLETED).

Methodology

Đồ án được triển khai theo mô hình kỹ thuật kết hợp (V-Model lai Agile) trong 16 tuần:

  1. Tuần 1–4: Khảo sát lý thuyết, nghiên cứu ROS, tính toán động học và mô phỏng trên MATLAB/Simulink R2022b.
  2. Tuần 5–8: Thiết kế 3D trên SolidWorks 2021, gia công cắt laser khung nhôm và vỏ mica, lắp ráp phần cứng cơ điện tử.
  3. Tuần 9–12: Lập trình nhúng Arduino Mega (PID), tích hợp gói move_base, cấu hình Costmap (Static, Obstacle, Inflation layers), lập bản đồ phòng thí nghiệm qua LiDAR.
  4. Tuần 13–16: Lập trình giao diện PyQt5, tích hợp nhận diện giọng nói, thực nghiệm điều hướng đơn điểm/đa điểm và hiệu chỉnh thông số thực tế.

Implementation và kết quả

Development process

1. Xử lý chuyển đổi vận tốc trên ROS node (Python)

Node kinematics_controller trên Raspberry Pi chuyển đổi topic /cmd_vel (geometry_msgs/Twist) thành vận tốc mong muốn của 4 bánh xe để gửi xuống Arduino:

#!/usr/bin/env python3
import rospy
from geometry_msgs.msg import Twist
from std_msgs.msg import Float32MultiArray

class MecanumKinematics:
    def __init__(self):
        rospy.init_node('mecanum_kinematics_node', anonymous=False)
        self.radius = 0.048       # Bán kính bánh xe R (m)
        self.lx = 0.15            # Nửa chiều dài cơ sở a (m)
        self.ly = 0.20            # Nửa chiều rộng cơ sở b (m)
        self.k = self.lx + self.ly
        
        self.motor_pub = rospy.Publisher('/wheel_speed_setpoint', Float32MultiArray, queue_size=10)
        rospy.Subscriber('/cmd_vel', Twist, self.cmd_vel_callback)
        
    def cmd_vel_callback(self, msg):
        vx = msg.linear.x
        vy = msg.linear.y
        wz = msg.angular.z
        
        # Động học nghịch bánh Mecanum
        w1 = (vx - vy - self.k * wz) / self.radius
        w2 = (vx + vy + self.k * wz) / self.radius
        w3 = (vx - vy + self.k * wz) / self.radius
        w4 = (vx + vy - self.k * wz) / self.radius
        
        speed_msg = Float32MultiArray(data=[w1, w2, w3, w4])
        self.motor_pub.publish(speed_msg)

if __name__ == '__main__':
    try:
        node = MecanumKinematics()
        rospy.spin()
    except rospy.ROSInterruptException:
        pass

2. Thuật toán điều khiển PID vận tốc động cơ trên vi điều khiển (C++)

Trên Arduino Mega 2560, thuật toán vi tích phân tỉ lệ vòng kín được thực thi với chu kỳ ngắt timer $20\text{ ms}$ ($50\text{ Hz}$):

#include <ros.h>
#include <std_msgs/Float32MultiArray.h>

// Thông số PID thực nghiệm
const double Kp = 2.85, Ki = 1.45, Kd = 0.06;
double setpoint_w[4] = {0, 0, 0, 0};
double current_w[4]  = {0, 0, 0, 0};
double integral[4]   = {0, 0, 0, 0};
double prev_error[4] = {0, 0, 0, 0};

double compute_pid(int i, double sp, double pv, double dt) {
    double error = sp - pv;
    integral[i] += error * dt;
    // Chống bão hòa tích phân (Anti-windup)
    if (integral[i] > 100.0) integral[i] = 100.0;
    else if (integral[i] < -100.0) integral[i] = -100.0;
    
    double derivative = (error - prev_error[i]) / dt;
    prev_error[i] = error;
    
    double output = (Kp * error) + (Ki * integral[i]) + (Kd * derivative);
    return constrain(output, -255.0, 255.0);
}

Testing và validation

Quá trình kiểm thử được thực hiện qua 50 chu kỳ chạy thực tế trong không gian phòng thí nghiệm mô phỏng nhà hàng có diện tích $80\text{ m}^2$ với nhiều loại vật cản tĩnh (bàn, ghế) và động (người di chuyển với tốc độ $0.5\text{–}1.0\text{ m/s}$):

+----------------------------------------------------------------+
| Metric Kiểm Thử                     Mục tiêu         Thực tế   |
+----------------------------------------------------------------+
| Sai số vị trí điểm đích (Position)  <= 5.0 cm        2.8 cm    |
| Sai số góc quay đích (Orientation)  <= 5.0 deg       2.1 deg   |
| Tốc độ di chuyển lớn nhất           0.8 m/s          0.65 m/s  |
| Thời gian phản ứng né vật cản       < 200 ms         120 ms    |
| Độ chính xác nhận diện giọng nói    > 85.0%          91.4%     |
| Độ trễ phản hồi giọng nói           < 1.0 s          0.68 s    |
| Thời lượng pin liên tục             > 120 phút       150 phút  |
+----------------------------------------------------------------+

Kết quả đạt được

  • Lập bản đồ SLAM sắc nét: Hệ thống xây dựng hoàn chỉnh bản đồ dạng lưới chiếm dụng (Occupancy Grid Map) độ phân giải $0.05\text{ m/cell}$ bằng LiDAR Slamtec M1M1.
  • Điều hướng mượt mà: Khả năng di chuyển dọc, ngang, xoay tròn đồng thời giúp robot vượt qua các hành lang hẹp rộng chỉ $0.7\text{ m}$ mà không cần quay đầu xe như các loại xe vi sai thông thường.
  • Hoạt động khép kín: Khách hàng chọn món trên màn hình cảm ứng gắn trên robot -> Dữ liệu lưu vào MySQL -> Nhân viên bếp nhận đơn, đặt món lên khay và chọn bàn -> Robot tự di chuyển đến bàn, phát âm thanh chào và hướng dẫn khách lấy món -> Khách bấm hoàn tất, robot quay về vị trí chờ (Home station).

Đổi mới và đóng góp

  1. Ứng dụng hệ truyền động Mecanum toàn phần: Khác với hầu hết các dòng robot phục vụ thương mại chỉ dùng 2 bánh vi sai + bánh tự lựa (Differential Drive) khiến bán kính quay xe lớn, việc sử dụng 4 bánh Mecanum cho phép robot chuyển hướng tức thời theo phương ngang ($V_y \neq 0$), tăng $40%$ độ linh hoạt trong lối đi chật hẹp của nhà hàng.
  2. Cơ chế Costmap đa lớp thích ứng (Adaptive Multi-layer Costmap): Tích hợp lớp lạm phát (Inflation Layer) tùy chỉnh với bán kính an toàn $r = 0.35\text{ m}$, giúp thuật toán DWA chủ động giảm tốc và vạch quỹ đạo vòng qua chướng ngại vật mượt mà, triệt tiêu hiện tượng giật cục khi gặp người đi bộ bất ngờ.
  3. Mô hình nhúng phân tán tối ưu chi phí: Phân tách hoàn toàn nhiệm vụ thời gian thực cứng (Hard Real-Time PID trên Arduino qua ngắt Timer) và xử lý tính toán đồ họa/điều hướng cao cấp (Soft Real-Time ROS trên Raspberry Pi), giúp hệ thống hoạt động ổn định không bị nghẽn CPU (tải CPU trung bình của Raspberry Pi 4 duy trì ở mức $\approx 58%$).

Ứng dụng thực tế và triển khai

Kịch bản vận hành thực tế

  1. Tiếp đón và Phục vụ tại bàn: Robot đóng vai trò là "bồi bàn kỹ thuật số", mang menu điện tử đến cho thực khách, hỗ trợ nhập món qua giọng nói tiếng Việt hoặc thao tác chạm cảm ứng trực quan.
  2. Vận chuyển thức ăn/nước uống: Khay chịu lực được thiết kế giảm chấn, hỗ trợ phục vụ đồng thời 2–3 món ăn/đồ uống nặng tới $8\text{ kg}$ từ bếp đến đúng bàn được chỉ định mà không gây tràn đổ.
  3. Thu dọn bát đĩa sau ăn: Nhân viên có thể kích hoạt chế độ "Bussing", robot di chuyển lần lượt qua các bàn theo lộ trình đa điểm (Multi-Waypoint) để thu gom bát đĩa bẩn về khu vực rửa.

Phân tích hiệu quả kinh tế (ROI)

  • Chi phí chế tạo phần cứng (BOM): Khoảng $18,000,000\text{ VNĐ}$ (tương đương $\approx 750\text{ USD}$), chỉ bằng $1/15$ so với chi phí mua một robot thương mại nhập khẩu ($10,000 - $12,000\text{ USD}$).
  • Bài toán hoàn vốn: Một nhân viên phục vụ có chi phí lương trung bình $7,000,000\text{ VNĐ/tháng}$. Một robot có thể thay thế hiệu suất mang vác của 1 nhân viên trong khung giờ cao điểm. Thời gian thu hồi vốn đầu tư (ROI) ước tính chỉ mất 2.5 – 3 tháng.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Cảm biến LiDAR 2D chỉ quét trên một mặt phẳng cắt ngang cố định ($h = 25\text{ cm}$), chưa phát hiện được các vật cản thấp dưới mặt sàn (như đồ chơi, dây điện) hoặc chướng ngại vật nhô ra ở tầm cao (như mép bàn lửng).
  • Nhận diện giọng nói phụ thuộc vào kết nối Internet tới máy chủ Google API; khi mạng Wi-Fi suy giảm tín hiệu, độ trễ nhận diện có thể tăng lên $> 2.5\text{ s}$.

Hướng phát triển

  1. Tích hợp cảm biến Depth Camera 3D (Intel RealSense D435i): Kết hợp dữ liệu đám mây điểm (Point Cloud) với 2D LiDAR qua bộ lọc Kalman mở rộng (EKF) để tạo bản đồ 3D Octomap, loại bỏ hoàn toàn góc chết cảm biến.
  2. Xây dựng module AI Offline: Tích hợp mô hình nhận diện giọng nói cục bộ (Offline Speech-to-Text như Whisper Nano hoặc Vosk) trực tiếp trên kit phần cứng AI chuyên dụng (NVIDIA Jetson Orin Nano).
  3. Phát triển hệ thống sạc tự động (Auto-docking Station): Thiết kế trạm sạc tự động sử dụng camera nhận diện mã ArUco kết hợp cảm biến hồng ngoại để robot tự tìm về dock sạc khi dung lượng pin $< 15%$.

Đối tượng hưởng lợi

  • Sinh viên ngành Kỹ thuật Điều khiển & Tự động hóa, Cơ điện tử, Robotics: Nguồn tài liệu thực tế toàn diện từ khâu mô hình hóa toán học động học Mecanum đến tích hợp ngăn xếp ROS Navigation và lập trình nhúng Arduino.
  • Kỹ sư phát triển hệ thống nhúng/Robot: Tham khảo cấu trúc giao tiếp giữa vi điều khiển và máy tính đơn bo qua giao thức rosserial, phương pháp tuning PID cho động cơ có tải trọng thay đổi.
  • Chủ doanh nghiệp F&B và chuỗi nhà hàng: Giải pháp công nghệ tự động hóa tối ưu chi phí, nâng cao trải nghiệm khách hàng và giải quyết bài toán khủng hoảng nhân sự dịch vụ.
  • Nhà nghiên cứu hệ thống AMR: Mô hình nền tảng mở dễ dàng mở rộng để thử nghiệm các thuật toán lập kế hoạch đường đi mới (như TEB Local Planner, Hybrid A*) hoặc học tăng cường (Reinforcement Learning).

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật tối thiểu để triển khai và chạy hệ thống phần mềm của robot là gì?

Hệ thống yêu cầu Raspberry Pi 4 Model B (RAM tối thiểu 4GB) cài hệ điều hành Ubuntu 20.04 LTS (Focal Fossa) kèm ROS Noetic Ninjemys. Phía máy tính giám sát từ xa (Workstation) cần cài Ubuntu 20.04 có cấu hình tối thiểu Intel Core i5, RAM 8GB để chạy giao diện mô phỏng 3D Rviz mà không bị giật lag.

2. Bánh xe Mecanum có bị trượt khi di chuyển trên sàn gạch bóng của nhà hàng không?

Bánh xe Mecanum sử dụng các con lăn bọc cao su kỹ thuật có hệ số ma sát cao. Tuy nhiên, nếu sàn dính nước hoặc dầu mỡ, hiện tượng trượt vi mô (odometry slip) có thể xảy ra. Vấn đề này được khắc phục triệt để nhờ thuật toán định vị quét khớp tia laser (Scan Matching / AMCL) của LiDAR, giúp robot liên tục bù sai số trôi tọa độ của encoder.

3. Robot có thể tích hợp vào hệ thống máy POS / Order có sẵn của nhà hàng không?

Hoàn toàn có thể. Do hệ thống sử dụng cơ sở dữ liệu MySQL 8.0 tiêu chuẩn và kiến trúc dịch vụ phân tán, hệ thống máy POS hiện hữu của nhà hàng có thể dễ dàng đồng bộ bảng dữ liệu đơn hàng thông qua RESTful API hoặc kết nối JDBC/ODBC trực tiếp.

4. Chi phí bảo trì, bảo dưỡng hệ thống định kỳ gồm những hạng mục nào?

Các hạng mục bảo dưỡng định kỳ (3–6 tháng/lần) bao gồm: vệ sinh trục con lăn bánh xe Mecanum, kiểm tra chổi than/hộp số động cơ DC JGB37-520, kiểm tra dung lượng pin LiPo qua bộ cân bằng cell, và lau kính quang học của cảm biến LiDAR để đảm bảo độ chính xác đo khoảng cách.

5. Thời gian hoàn vốn và tuổi thọ hoạt động của robot là bao lâu?

Với mức đầu tư phần cứng ban đầu khoảng 18 triệu VNĐ và chi phí điện năng tiêu thụ không đáng kể (~0.5 kWh/ngày), thời gian hoàn vốn thực tế chỉ từ 2.5 đến 3 tháng. Khung gầm kim loại và các linh kiện công nghiệp có tuổi thọ ước tính từ 3 đến 5 năm nếu được bảo dưỡng định kỳ đúng quy trình.


Kết luận

Đề tài "Thiết kế và điều khiển mô hình robot phục vụ trong nhà hàng" đã chứng minh tính khả thi, độ tin cậy và giá trị thực tiễn vượt trội của việc ứng dụng công nghệ robot tự hành mã nguồn mở vào ngành dịch vụ ẩm thực. Bằng việc làm chủ từ khâu thiết kế cơ khí 3D, tính toán động học Mecanum, lập trình nhúng điều khiển vòng kín PID, cho đến triển khai ngăn xếp tự hành ROS Navigation và giao diện người dùng thông minh, nhóm tác giả đã chế tạo thành công một sản phẩm hoàn chỉnh với độ chính xác định vị cao ($\pm 2.8\text{ cm}$) và khả năng tương tác thân thiện.

Đồ án không chỉ đóng góp một giải pháp công nghệ giá thành hợp lý, giúp doanh nghiệp F&B nâng cao hiệu quả vận hành trong bối cảnh thiếu hụt nhân lực, mà còn là tài liệu tham khảo kỹ thuật giá trị cho cộng đồng nghiên cứu và phát triển robot AMR tại Việt Nam.