Bối cảnh và vấn đề nghiên cứu

Đồ án được thực hiện trong bối cảnh cuộc cách mạng công nghiệp lần thứ tư đang diễn ra mạnh mẽ, với sự phát triển của các công nghệ SMAC (Social, Mobile, Analytics, Cloud), IoT (Internet of Things), AI (Artificial Intelligence), VR (Virtual Reality) và đặc biệt là xe tự hành. Các tập đoàn công nghệ và ô tô lớn trên thế giới như Tesla, Daimler, Google đã tham gia nghiên cứu và phát triển xe tự lái. Tại Việt Nam, FPT phát động cuộc thi "Cuộc đua số" với chủ đề "Xe không người lái" từ ngày 2/11/2016, và Tập đoàn Phenikaa đã giới thiệu xe tự hành thông minh cấp độ 4 "Make-in-Vietnam" đầu tiên tại hội thảo ngày 26/3 tại Trường Đại học Phenikaa (quận Hà Đông, Hà Nội). Trong bối cảnh đó, nhóm tác giả xác định hệ thống điều khiển xe bám đường là yếu tố then chốt để xe có thể tự hành độc lập.

Mục tiêu nghiên cứu:

  1. Nghiên cứu cơ sở lý thuyết và tìm kiếm tài liệu về xử lý ảnh và xe tự hành.
  2. Thiết kế và thực hiện mô hình đồ án xe tự hành ứng dụng xử lý ảnh trên kit xe điều khiển tỉ lệ 1:10.
  3. Xây dựng thuật toán xác định làn đường và thuật toán điều khiển xe bám đường thông qua giao tiếp không dây.
  4. Thực nghiệm và đánh giá kết quả đạt được trên mô hình.

Đối tượng nghiên cứu gồm: phương pháp xử lý ảnh, Kit Arduino ESP32 4MB Flash UNO D1 R32, phần mềm Arduino IDE và phần mềm PyCharm. Phạm vi nghiên cứu tập trung vào lý thuyết và nguyên lý thuật toán xử lý ảnh, phương pháp điều khiển xe tự hành dựa trên xử lý ảnh, và thiết kế mô hình xe tự hành trong điều kiện đường có vạch kẻ phân làn rõ ràng (tương tự đường cao tốc). Đề tài được giao từ ngày 08/01/2024 và hoàn thành ngày 20/05/2024.


Cơ sở lý thuyết và phương pháp

Khung lý thuyết và công nghệ nền tảng

Đồ án sử dụng phân loại 6 cấp độ xe tự lái do Hiệp hội Kỹ sư Ô tô (SAE — Society of Automotive Engineers) công bố năm 2014 làm nền tảng định vị nghiên cứu. Theo khung phân loại này, mô hình được nhóm xây dựng hướng đến khả năng bám đường tự động — một đặc tính cốt lõi từ cấp độ 1 trở lên.

Cơ sở kỹ thuật của đồ án gồm hai nhóm chính:

  • Ngôn ngữ lập trình Python (do Guido Van Rossum tạo ra năm 1990): được chọn vì cú pháp rõ ràng, hỗ trợ lập trình hướng đối tượng, và hệ sinh thái thư viện phong phú phục vụ xử lý ảnh và tự động hóa.
  • Thư viện OpenCV (phát hành theo giấy phép BSD, hỗ trợ C++, C, Python, Java; hoạt động trên Windows, Linux, Mac OS, iOS, Android): đây là thư viện xử lý ảnh trung tâm của toàn bộ pipeline nhận diện làn đường. Cộng đồng người dùng OpenCV vượt 47.000 người và lượt tải vượt 6 triệu.
  • Thư viện Bluetooth trong Python: phục vụ tìm kiếm thiết bị, thiết lập kết nối và truyền nhận dữ liệu qua Bluetooth giữa laptop và Arduino.

Phương pháp nghiên cứu

Đồ án áp dụng phương pháp thiết kế kỹ thuật kết hợp thực nghiệm:

  • Nghiên cứu lý thuyết về xử lý ảnh, phân tích và lựa chọn thuật toán phù hợp.
  • Thiết kế và thi công phần cứng mô hình xe tỉ lệ 1:10.
  • Xây dựng chương trình xử lý ảnh và chương trình điều khiển Arduino.
  • Thực nghiệm trên làn đường mô phỏng và đánh giá khả năng bám đường.

Nguồn dữ liệu

Dữ liệu đầu vào là các khung hình video thu thực từ điện thoại Android Poco C40 sử dụng làm camera, kết nối với laptop qua WiFi thông qua phần mềm Droidcam. Toàn bộ quá trình xử lý được triển khai trên laptop Acer và phát triển trong môi trường PyCharm.


Nội dung chính theo từng chương

Chương 1: Tổng quan

Chương này trình bày lý do chọn đề tài gắn với xu hướng cách mạng công nghiệp 4.0 và sự phát triển của xe tự hành trên thế giới lẫn trong nước. Nhóm tác giả khảo sát tình hình nghiên cứu trong nước (cuộc thi của FPT, xe cấp độ 4 của Phenikaa) và ngoài nước (phân loại SAE, các dự án Waymo với hơn 500 phương tiện tự hành tại San Francisco, Cruise của General Motors). Chương xác định đối tượng, phạm vi và mục tiêu nghiên cứu, đồng thời nêu cấu trúc tổng thể của đồ án gồm 5 chương.

Chương 2: Cơ sở lý thuyết

Chương này trình bày nền tảng lý thuyết của toàn bộ hệ thống xử lý ảnh:

Python: Giới thiệu đặc điểm ngôn ngữ gồm cú pháp thụt lề thay thế dấu ngoặc nhọn, hệ thống duck typing (latent typing), khả năng mở rộng qua module, và tính đa năng. Python được xác định là ngôn ngữ lập trình phổ biến thứ hai trên thế giới tại thời điểm nghiên cứu.

Thư viện OpenCV: Chương mô tả chi tiết các hàm được sử dụng trong đồ án:

Hàm / Phương thức Chức năng trong đồ án
getPerspectiveTransform + warpPerspective Chuyển đổi phối cảnh (bird's eye view), kích thước đầu ra 640×480
cvtColor với COLOR2GRAY Chuyển ảnh RGB sang không gian màu xám
threshold với THRESH_BINARY Phân ngưỡng nhị phân (giá trị pixel: 0 hoặc 255)
GaussianBlur Làm mờ lọc Gaussian để giảm nhiễu trước khi phát hiện cạnh
Canny (ngưỡng 250 và 300, apertureSize=3) Phát hiện cạnh (Canny Edge Detection)
line, putText, imshow Vẽ và hiển thị kết quả xử lý lên khung hình

Thư viện Bluetooth: Cung cấp cơ chế quét, kết nối và truyền nhận dữ liệu không dây giữa ứng dụng Python trên laptop và kit Arduino ESP32.

Chương 3: Xây dựng mô hình và chương trình điều khiển

Đây là chương kỹ thuật trọng tâm, gồm hai phần lớn: xây dựng phần cứng và xây dựng phần mềm.

Phần cứng: Mô hình được lắp trên kit khung xe điều khiển HSP 941770 tỉ lệ 1:10 (đã qua sử dụng). Các thành phần chính bao gồm:

Thiết bị Thông số kỹ thuật chính
Kit Arduino ESP32 4MB Flash UNO D1 R32 ESP32 dual core Tensilica LX6, WiFi 802.11 b/g/n, Bluetooth 4.x, BLE, kích thước 66×53mm
Motor 540 (động cơ chính) Điện áp 6–12V; 12V/1.95A: 18500 vòng/phút; 6V/1.3A: 4500 vòng/phút; trọng lượng 161g
Servo MG996R (cơ cấu lái) Lực kéo 11kg ở 6V; điện áp làm việc 4–6V; nhiệt độ hoạt động 0–55°C
Module BTS7960 43A Điện áp 6–27V; dòng tải 43A; tần số điều khiển tối đa 25KHz; kích thước 40×50×12mm
Pin NCR18650B (Panasonic) 3.7V, ~3400mAh, tuổi thọ 1000 lần sạc; kích thước Ø18×65mm; trọng lượng 45g
Camera Điện thoại Android Poco C40 + phần mềm Droidcam, kết nối WiFi

Sơ đồ kết nối chân quan trọng giữa Module BTS7960 43A, Servo và Arduino ESP32 được trình bày trong Bảng 3.1: R_PWM→GPIO12, L_PWM→GPIO13, R_EN→GPIO26, L_EN→GPIO25, Servo SIGNAL→GPIO14.

Phần mềm: Pipeline xử lý ảnh được xây dựng tuần tự gồm các bước: (1) thu nhận khung hình từ Droidcam qua WiFi; (2) chuyển đổi phối cảnh bird's eye view; (3) chuyển sang ảnh grayscale; (4) áp dụng ngưỡng nhị phân; (5) lọc Gaussian; (6) phát hiện cạnh Canny; (7) kết hợp ảnh nhị phân và ảnh cạnh; (8) tính Histogram để xác định vị trí làn đường trái và phải; (9) tính tâm đường và độ lệch so với tâm khung hình; (10) gửi lệnh điều khiển qua Bluetooth Serial đến Arduino.

Chương trình Arduino nhận lệnh từ Bluetooth, giải mã và gọi các hàm điều khiển tương ứng (đi thẳng, rẽ trái, rẽ phải, rẽ gắt) thông qua tín hiệu PWM điều khiển BTS7960 43A và servo MG996R.

Chương 4: Kết quả thực nghiệm

Chương trình bày kết quả chạy thực tế mô hình trên làn đường mô phỏng do nhóm tự thiết kế. Thực nghiệm được chia theo hai tình huống camera thu nhận:

  • Khi camera thu được cả hai làn đường: Xe xác định được tâm đường từ cả vạch trái và vạch phải, điều chỉnh hướng dựa trên độ lệch tính toán được.
  • Khi camera chỉ thu được một làn đường: Hệ thống vẫn duy trì bám đường dựa trên một vạch kẻ, xử lý tình huống khúc cua gắt thông qua vùng ROI (Region of Interest) sau khi cắt khung hình.

Kết quả hình ảnh được ghi lại qua các giai đoạn: ảnh gốc từ camera, ảnh sau khi áp dụng thuật toán Canny, ảnh sau xử lý khi gặp khúc cua trái và khúc cua gắt, cho thấy hệ thống nhận diện và phản ứng với các tình huống đường cong thực tế.

Chương 5: Kết luận và hướng phát triển

Chương tổng kết các kết quả đạt được và đề xuất hướng nghiên cứu tiếp theo.


Thiết kế và triển khai

Kiến trúc hệ thống

Hệ thống được thiết kế theo kiến trúc phân tán hai tầng:

  • Tầng xử lý (Laptop Acer + Python/OpenCV): Thực hiện toàn bộ pipeline xử lý ảnh, tính toán vị trí làn đường và độ lệch, ra quyết định điều khiển, sau đó mã hóa lệnh và gửi qua Bluetooth Serial.
  • Tầng chấp hành (Arduino ESP32 4MB Flash UNO D1 R32): Nhận lệnh qua BLE (Bluetooth Low Energy), giải mã và điều khiển servo MG996R (lái) và motor 540 qua module BTS7960 43A (dẫn động) bằng tín hiệu PWM.

Kết nối camera sử dụng WiFi (Droidcam), kết nối điều khiển sử dụng Bluetooth Serial nhờ chip ESP32 tích hợp sẵn WiFi và Bluetooth 4.x.

Công nghệ sử dụng

  • Ngôn ngữ: Python (xử lý ảnh, logic điều khiển laptop), Arduino C/C++ (firmware kit ESP32)
  • IDE: PyCharm (Python), Arduino IDE (firmware)
  • Thư viện: OpenCV (xử lý ảnh), thư viện Bluetooth Python (giao tiếp không dây)
  • Phần mềm bổ trợ: Droidcam (biến điện thoại Poco C40 thành webcam qua WiFi)

Các thuật toán chính trong pipeline xử lý ảnh

  1. Perspective Transformation (getPerspectiveTransform + warpPerspective, output 640×480): chuyển góc nhìn sang bird's eye view.
  2. Grayscale Conversion (cvtColor, COLOR2GRAY): chuẩn hóa đầu vào.
  3. Binary Thresholding (threshold, THRESH_BINARY): tách vạch kẻ đường.
  4. Gaussian Blur (GaussianBlur): giảm nhiễu trước phát hiện cạnh.
  5. Canny Edge Detection (Canny, ngưỡng thấp 250, ngưỡng cao 300, apertureSize=3): phát hiện biên.
  6. Histogram-based Lane Finding: tính phân bố điểm ảnh trắng theo cột để xác định vị trí vạch làn trái và phải, từ đó suy ra tâm đường và giá trị result (độ lệch).

Kiểm thử

Kiểm thử được thực hiện trực tiếp trên mô hình vật lý với làn đường mô phỏng do nhóm tự thiết kế, bao gồm các tình huống: đường thẳng, khúc cua trái, khúc cua phải, khúc cua gắt (góc lớn), và tình huống camera chỉ thu được một làn đường.


Kết quả và đóng góp

Kết quả chính

Nhóm tác giả hoàn thành đầy đủ các mục tiêu đề ra:

  • Xây dựng thành công mô hình xe tự hành hoàn chỉnh trên kit xe điều khiển tỉ lệ 1:10 (HSP 941770).
  • Hệ thống xác định được làn đường và điều khiển xe bám theo làn trên đường mô phỏng, xử lý được cả tình huống camera thu hai làn và một làn.
  • Triển khai thành công chuỗi giao tiếp không dây: Camera (WiFi/Droidcam) → Laptop (Python/OpenCV) → Arduino ESP32 (Bluetooth Serial) → Motor/Servo.
  • Nắm vững nguyên lý, cách thức hoạt động của các hàm OpenCV trong pipeline nhận diện làn đường thực tế.
  • Làm chủ lập trình firmware Arduino ESP32 để điều khiển BTS7960 43A và servo MG996R qua PWM.

Đóng góp so với nghiên cứu trước

Đồ án đóng góp một phương án triển khai thực tế chi phí thấp cho bài toán bám đường xe tự hành ở quy mô mô hình: tận dụng điện thoại Android sẵn có làm camera (thay vì camera chuyên dụng), sử dụng kết nối Bluetooth Serial qua chip ESP32 tích hợp (thay vì dây nối cứng hoặc module riêng), và xây dựng toàn bộ pipeline xử lý ảnh bằng Python/OpenCV trên laptop thông thường mà không cần phần cứng nhúng chuyên dụng đắt tiền.


Hạn chế và hướng nghiên cứu tiếp

Theo nội dung văn bản, đồ án có một số giới hạn được tác giả thừa nhận:

  • Phạm vi môi trường hạn chế: Hệ thống chỉ hoạt động trong điều kiện đường có vạch kẻ phân làn rõ ràng (tương tự đường cao tốc); không xử lý được giao lộ, điều kiện ánh sáng thay đổi mạnh, hoặc làn đường không có vạch.
  • Chưa tích hợp phát hiện vật cản: Đồ án tập trung vào bám đường, chưa triển khai hệ thống tránh vật cản — đây là thành phần song hành cần thiết cho xe tự hành hoàn chỉnh.
  • Phụ thuộc thiết bị sẵn có: Việc sử dụng điện thoại Poco C40 và Droidcam qua WiFi, dù tiết kiệm chi phí, có thể ảnh hưởng đến độ trễ và độ ổn định hình ảnh trong điều kiện nhiễu sóng.
  • Trình độ chuyên môn còn hạn chế: Nhóm tác giả tự nhận xét rằng "do trình độ về mặt chuyên môn của nhóm còn hạn chế, sai sót là điều khó tránh khỏi".

Hướng phát triển mà đồ án hướng đến (theo Chương 5): tích hợp thêm khả năng phát hiện và tránh vật cản, nâng cao độ chính xác thuật toán, và mở rộng khả năng xử lý trong nhiều điều kiện đường khác nhau.


Giá trị tham khảo

Đồ án phù hợp để tham khảo với các nhóm đối tượng sau:

  • Sinh viên ngành Công nghệ Kỹ thuật Ô tô, Kỹ thuật Cơ điện tử, Tự động hóa: Chương 3 cung cấp mô tả chi tiết về lựa chọn linh kiện (ESP32, BTS7960 43A, servo MG996R, pin NCR18650B), sơ đồ kết nối chân (Bảng 3.1), và quy trình lắp ráp mô hình thực tế.
  • Sinh viên ngành Công nghệ Thông tin, Khoa học Máy tính làm đề tài xử lý ảnh: Chương 2 trình bày đầy đủ các hàm OpenCV được dùng trong pipeline nhận diện làn đường (Perspective Transform, Grayscale, Threshold, Gaussian Blur, Canny, Histogram), kèm mô tả tham số cụ thể.
  • Người thực hiện đề tài tương tự về xe mô hình tự hành: Phần xây dựng chương trình Arduino (Chương 3) và phần thực nghiệm (Chương 4) cung cấp tham chiếu thực tế về giao tiếp Bluetooth Serial giữa Python và ESP32, điều khiển PWM motor và servo.
  • Sinh viên tìm hiểu về giao tiếp không dây trong hệ thống nhúng: Phần trình bày về BLE, Bluetooth Serial và WiFi (Droidcam) trong kiến trúc hệ thống là tài liệu thực hành có giá trị.

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

1. Tại sao nhóm chọn giao tiếp Bluetooth thay vì WiFi để truyền lệnh điều khiển từ laptop sang Arduino? Nhóm lựa chọn Bluetooth Serial vì kit Arduino ESP32 4MB Flash UNO D1 R32 tích hợp sẵn chip ESP32 hỗ trợ BLE (Bluetooth Low Energy) và WiFi. Việc sử dụng Bluetooth giúp tối giản phần cứng kết nối trực tiếp trên mô hình xe, trong khi kết nối WiFi đã được dành riêng cho luồng truyền hình ảnh từ điện thoại (Droidcam) sang laptop.

2. Điện thoại Android Poco C40 được sử dụng như thế nào để thay thế camera chuyên dụng? Điện thoại Poco C40 được cài đặt phần mềm Droidcam, biến nó thành một webcam kết nối với laptop qua WiFi. Laptop sau đó đọc luồng hình ảnh này như một webcam thông thường trong chương trình Python, qua đó tận dụng được thiết bị sẵn có, đồng thời cải thiện chất lượng và độ ổn định của hình ảnh đầu vào so với camera tích hợp laptop.

3. Hệ thống xử lý như thế nào khi camera chỉ nhìn thấy một làn đường (trường hợp khúc cua gắt)? Khi camera chỉ thu được một vạch làn, chương trình vẫn tính toán vị trí tâm đường dựa trên một vạch duy nhất. Trong trường hợp khúc cua gắt, nhóm áp dụng kỹ thuật cắt ROI (Region of Interest) trên khung hình để tập trung xử lý vùng ảnh có chứa vạch kẻ, kết quả sau xử lý Canny vẫn xác định được hướng cua và gửi lệnh điều khiển tương ứng sang Arduino.

4. Module BTS7960 43A có vai trò gì và được kết nối với Arduino ESP32 theo cách nào? Module BTS7960 43A là mạch đệm điều khiển động cơ DC (motor 540), với dòng tải 43A và điện áp 6–27V. Module này được kết nối với Arduino ESP32 theo sơ đồ: R_PWM→GPIO12, L_PWM→GPIO13, R_EN→GPIO26, L_EN→GPIO25, VCC→5V, GND→GND. Arduino xuất tín hiệu PWM đến các chân này để điều khiển tốc độ và chiều quay của motor 540, với tần số điều khiển tối đa 25KHz.

5. Thông số nào của hàm Canny được nhóm sử dụng và tại sao lại kết hợp ảnh nhị phân với ảnh cạnh? Nhóm sử dụng hàm cv2.Canny(blur, 250, 300, apertureSize=3) với ngưỡng thấp 250, ngưỡng cao 300 và kernel Sobel 3×3. Các pixel có độ gradient trên 300 được xác định chắc chắn là cạnh; các pixel từ 250–300 được giữ lại nếu kết nối với cạnh chắc chắn; dưới 250 bị loại bỏ. Ảnh Canny được kết hợp với ảnh nhị phân (từ threshold) để tận dụng đồng thời thông tin về vùng màu sáng (vạch kẻ) và thông tin về biên cạnh của vạch, giúp phát hiện làn đường chính xác và ổn định hơn trong điều kiện ánh sáng thay đổi.


Kết luận

Đồ án "Nghiên cứu, thiết kế ô tô tự hành ứng dụng phương pháp xử lý ảnh" của Trần Gia Huân và Trần Thanh Phong (Khoa Cơ khí Động lực, Trường Đại học Sư phạm Kỹ thuật TP.HCM, 2024) đã xây dựng thành công một mô hình xe tự hành tỉ lệ 1:10 có khả năng nhận diện làn đường và bám đường thông qua pipeline xử lý ảnh Python/OpenCV và giao tiếp không dây Bluetooth Serial với kit Arduino ESP32. Hệ thống tận dụng thiết bị phổ thông (điện thoại Android, laptop, linh kiện thương mại) để triển khai một giải pháp chi phí thấp, phù hợp với điều kiện nghiên cứu của sinh viên kỹ thuật. Đồ án cung cấp tài liệu kỹ thuật thực hành đầy đủ từ lựa chọn linh kiện, sơ đồ kết nối, đến chi tiết các hàm OpenCV và firmware Arduino, phục vụ cho các nghiên cứu tiếp theo về xe tự hành quy mô mô hình.