- Trên đây là khung video được quay từ camera V2.1 gắn trên xe. Đầu tiên cần làm là cô lập các vùng màu trắng trên ảnh. Để thực hiện việc này, trước tiên ta cần chuyển không gian màu được sử dụng bởi hình ảnh là RGB (red, green, blue) thành khơng gian màu HSV (Hue, Saturation, Value). Mục đích chính cho việc thực hiện chuyển đổi này là trong hình ảnh RGB các phần khác nhau của màu lane đường (băng keo màu trắng) có thể được chiếu sáng bằng các màu sáng khác nhau dẫn đến xuất hiện dưới dạng màu trắng đậm hơn hay màu trắng nhạt hơn. Do đó, trong khơng gian màu HSV, thành phần Hue sẽ hiển thị toàn bộ băng màu trắng thành 1 màu bất kể độ bóng của màu đó.
Hình 4.9: Hình ảnh trong khơng gian màu HSV
- Do OpenCV đọc hình ảnh vào khơng gian màu BGR (Xanh lam, xanh lá cây, đỏ) theo mặc định thay vì khơng gian màu RGB (đỏ, xanh lá cây, xanh lam) được sử dụng phổ biến hơn. Về cơ bản, chúng là không gian màu tương đương, chỉ là thứ tự của các màu được hốn đổi.
44
- Sau khi hình ảnh ở trong HSV, chúng ta có thể lọc tất cả các màu trắng khỏi hình ảnh. Điều này là bằng cách chỉ định một dải màu trắng.
Hình 4.10: Xác định đường Lane Phát hiện các đường viền của làn đường: Phát hiện các đường viền của làn đường:
- Tiếp theo, chúng ta cần phát hiện các cạnh trong khối dải màu trắng để chúng ta có thể có một vài đường phân biệt đại diện cho các đường làn đường màu trắng. - Thực hiện lệnh Canny, đây là 1 lệnh chính xác để phát hiện các cạnh trong một hình ảnh.
Hình 4.11: Xác định đường viền ngồi của Lane Cơ lập khu vực quan tâm:
- Từ hình ảnh trên, chúng ta thấy rằng chúng ta đã phát hiện ra khá nhiều khu vực màu trắng KHÔNG phải là vạch phân làn đường của chúng ta. Quan sát kỹ hơn sẽ thấy rằng tất cả chúng đều nằm ở nửa trên của màn hình. Khi thực hiện điều hướng làn đường, ta chỉ quan tâm đến việc phát hiện các vạch kẻ làn đường gần xe hơn,
45
nơi cuối màn hình. Vì vậy, chúng ta sẽ đơn giản là cắt bỏ nửa trên. Hai vạch phân làn được đánh dấu rõ ràng như được thấy trên hình ảnh bên phải.
Hình 4.12: Vạch phân làn đường Phát hiện phân đoạn dòng: Phát hiện phân đoạn dòng:
- Trong hình ảnh các cạnh được cắt ở trên, đối với con người chúng ta, rõ ràng là chúng ta đã tìm thấy bốn đường biểu thị hai đường làn đường. Tuy nhiên, đối với máy tính, chúng chỉ là một loạt các pixel màu trắng trên nền đen. Chúng ta cần trích xuất tọa độ của các đường làn này từ các pixel màu trắng này. OpenCV có chứa một chức năng được gọi là Hough Transform, thực hiện chính xác điều này. Hough Transform là một kỹ thuật được sử dụng trong xử lý hình ảnh để trích xuất các đối tượng địa lý như đường thẳng, hình trịn và hình elip. Chúng ta sẽ sử dụng nó để tìm các đường thẳng từ một loạt các pixel dường như tạo thành một đường thẳng. Về cơ bản, hàm HoughLinesP khớp nhiều dòng qua tất cả các pixel màu trắng và trả về tập hợp các dịng có khả năng xảy ra cao nhất, tn theo các giới hạn ngưỡng tối thiểu nhất định.
46
- Nếu chúng ta in ra đoạn thẳng được phát hiện, nó sẽ hiển thị các điểm cuối (x1, y1) theo sau là (x2, y2) và độ dài của mỗi đoạn thẳng.
Kết hợp các đoạn đường thành hai làn đường:
- Bây giờ chúng ta có nhiều đoạn thẳng nhỏ với tọa độ điểm cuối của chúng (x1, y1) và (x2, y2), làm thế nào để chúng ta kết hợp chúng thành hai đường mà chúng ta thực sự quan tâm, đó là đường làn trái và phải. Một cách là phân loại các đoạn thẳng này theo độ dốc của chúng. Từ hình trên, chúng ta có thể thấy rằng tất cả các đoạn thẳng thuộc làn đường bên trái phải dốc lên và ở bên trái màn hình, trong khi tất cả các đoạn thẳng thuộc làn đường bên phải dốc xuống và ở bên phải của màn hình. Khi các đoạn đường được phân loại thành hai nhóm, chúng ta chỉ cần lấy trung bình cộng của độ dốc và điểm giao nhau của đoạn thẳng để có được độ dốc và điểm giao nhau của các đường làn bên trái và bên phải.
- Đây là hình ảnh cuối cùng với các đường làn được phát hiện được vẽ bằng màu xanh lá cây.
Hình 4.14: Đường phân làn được phát hiện Lập kế hoạch chuyển động: Lập kế hoạch chuyển động:
- Bây giờ chúng ta đã có tọa độ của các vạch làn đường, chúng ta cần điều khiển xe sao cho nó nằm trong vạch kẻ làn đường, tốt hơn nữa là chúng ta nên cố gắng giữ nó ở giữa làn đường. Về cơ bản, chúng ta cần tính tốn góc lái của ơ tơ, dựa trên các vạch làn được phát hiện.
47
Hai đường làn được phát hiện:
- Chúng ta có thể tính tốn hướng đi bằng cách lấy trung bình các điểm cuối xa của
cả hai đường làn. Dòng màu xanh hiển thị bên dưới là đường căn chỉnh. Lưu ý rằng, điểm dưới của đường căn chỉnh màu xanh luôn nằm ở giữa cuối màn hình, đó là bởi vì chúng ta đặt camera hành trình được lắp ở giữa xe và hướng thẳng về phía trước.
Hình 4.15: Đường căn chỉnh màu xanh ở giữa Góc lái: Góc lái:
- Để xe có thể rẽ hướng ta cần tính tốn được góc lái cho xe. Ta đặt góc lái cho xe
là 900 là hướng thẳng, 450–890 là rẽ trái và 910–1350 là rẽ phải.
Nhận biết biển báo giao thông vào hầm
- Trước hết ta cần cài đặt phần mềm Cascade Trainer GUI trên máy tính, phần mềm
này có mục đích train cho Raspberry có thể nhận biết được biển báo, để sau đó khi Camera truyền hình ảnh vào Raspberry có thể so sánh từ đó thực hiện lệnh ban đầu. - Sau đó ta sẽ dùng chính camera V2.1 gắn trên xe để chụp ảnh biển báo như hình bên dưới, chúng ta cần chụp nhiều góc độ khác nhau để khi vào thực tế xe chạy ổn định và nhận biết biển báo chính xác nhất.
48
Hình 4.16: Các góc chụp của camera truyền về
- Chúng ta nhập 1 tệp tất cả hình ảnh đã chụp vào phần mềm Trainer GUI. - Thực hiện zoom hình và cắt khoanh vùng xuất hiện biển báo bằng chuột.
- Thực hiện chạy phần mềm kết quả trả về là một tệp mới trong đó biển báo vào hầm sau khi được phát hiện sẽ nằm trong ơ màu đỏ.
Hình 4.17: Vùng nhận diện biển báo của camera
- Cuối cùng kết quả nhận được là một thuật tốn sau q trình nhập hình ảnh, xác định biển báo trong khơng gian. Chúng ta sẽ nhập file thuật toán này vào Raspberry để nhận diện hình ảnh từ camera gắn trên xe.
Kiểm sốt hành trình chủ động và vật cản phía trước
49
- Khi được cấp nguồn động cơ bắt đầu hoạt động quay với vận tốc 70 vịng/phút.
Hình 4.18: Xe di chuyển bình thường khơng có vật cản
Khi xe gặp vật cản ở phía trước:
50
Trường hợp 1: Vật cản ở khoảng cách nhỏ hơn 40cm
+ Sóng siêu âm được phát ra từ chân Trig của cảm biến HC-SR04, chân Echo nhận được tín hiệu phản xạ ngay lập tức, thông tin được truyền đến Arduino Uno đến chân số 10 digital thông qua dây dẫn của arduino. Sau khi thông tin được truyền vào mạch Arduino thì tại đây nó sẽ được con chip U7 xử lý thông tin dựa trên mã Code đã được cài đặt trước đó, sau khi xử lý thơng tin thì nó sẽ phát tín hiệu cảnh báo đèn LED bắt đầu sáng. Đồng thời mạch điều khiển động cơ điều khiển motor quay với vận tốc 45 vòng/phút.
Trường hợp 2: Vật cản ở khoảng cách nhỏ hơn 30cm
+ Lúc này thông tin tiếp tục được xử lí, sau đó phát tín hiệu động thời loa Buzzer phát âm thanh và LED tiếp tục sáng. Động cơ quay với vận tốc chậm hơn 40 vịng/phút.
Hình 4.20: Khi gặp vật cản ở khoảng cách nguy hiểm Trường hợp 3: Vật cản ở khoảng cách nhỏ hơn hoặc bằng 20cm Trường hợp 3: Vật cản ở khoảng cách nhỏ hơn hoặc bằng 20cm
+ Thơng tin được xử lí, động cơ dừng hẳn để tránh xảy ra va chạm với vật cản phía trước.
51
CHƯƠNG 5: THI CƠNG VÀ THỰC NGHIỆM
MƠ HÌNH
5.1 Thi cơng
* Chuẩn bị mơ hình đường cho xe chạy:
- Nhóm chuẩn bị phông nền màu xanh lá đậm để trải lên sàn nhà nhằm mục đích tránh bị nhiễu hình ảnh cho Camera.
- Mặt đường được sơn màu đen.
- Đường line sử dụng băng keo màu trắng để tạo thành một nét liền đậm.
Hình 5.1: Mơ hình mặt đường
* Lắp ráp xe tự hành (Xe A):
- Bước 1: Chuẩn bị khung xe mơ hình có sẵn, lắp 4 bánh xe vào 4 động cơ gắn vào
khung xe dưới.
52
Hình 5.2: Lắp khung xe
- Bước 3: Dựa vào sơ đồ mạch điện ở Chương 3 lắp lần lượt mạch Raspberry,
Arduino, mạch điều áp vào khung xe trên và kết nối chúng lại với nhau.
53
- Bước 4: Gắn dây cáp kết nối từ camera với mạch Raspberry, đèn Led kết nối với
mạch Arduino.
Hình 5.4: Kết nối Camera (trái) và đèn Led (phải) - Bước 5: Hoàn thành tổng thể xe tự hành.
Hình 5.5: Mơ hình hồn chỉnh
* Lắp ráp xe cho tính năng kiểm sốt tốc độ và giữ khoảng cách (Xe B):
- Bước 1: Lần lượt lắp các bánh xe và bốn motor vào khung xe dưới tương tự như
mơ hình xe tự hành.
- Bước 2: Lắp mạch Arduino, mạch điều khiển động cơ L298N và pin vào khung
54
- Bước 3: Nối các mạch và motor với nhau bằng dây điện, lắp loa, đèn cảnh báo và
lắp cảm biến.
* Thực hiện chạy thử nghiệm cho từng tính năng:
- Thực hiện cấp nguồn cho xe, nhóm chọn cấp nguồn bằng nguồn điện từ Adapter
Power thay cho pin để quá trình test ổn định hơn. - Chỉnh dịng điện cấp cho xe là 11,3V – 11.8V.
Hình 5.6: Cấp nguồn cho xe tự hành
Hệ thống giữ làn đường:
- Nạp code đã viết trên Geany (phụ lục) vào OpenCV trong Raspberry và chạy. - Trên màn hình Laptop xuất hiện lần lượt các cửa sổ: Origal, Final, Perpective, Stop Sign, Traffic.
55
Lần kiểm tra 1:
- Đặt xe vào Làn đường bên phải giữa hai Lane trắng và quan sát hình ảnh trả về trên màn hình Laptop.
- Kết quả trả về trong cửa sổ Origal là: “Result = 0 ( Move Forwart)”.
- Trong cửa sổ Final trả về giá trị hình ảnh cuối cùng là hai Lane đường màu trắng nằm thẳng hàng với hai đường màu xanh lá cây trái và phải.
Hình 5.8: Chạy thẳng Lần kiểm tra 2: Lần kiểm tra 2:
- Đặt xe lệch hướng ban đầu và quan sát giá trị trả về trên màn hình.
56
- Từ màn hình ta quan sát thấy giá trị Result trả về giá trị Âm, đường Lane màu trắng bị lệch sang hướng bên trái so với đường màu xanh lá cây bên trái và bên phải.
- Nghĩa là xe hiện tại đang lệch sang bên phải làn đường và cần đánh lái sang hướng bên trái.
Lần kiểm tra 3:
- Đặt lệch xe sang hướng ngược lại và tiếp tục quan sát giá trị trên màn hình.
Hình 5.10: Xe lệch trái
- Từ màn hình trên ta quan sát thấy giá trị Result trả về giá trị Dương, đường Lane màu trắng bị lệch sang hướng bên phải so với đường màu xanh lá cây bên trái và bên phải.
- Nghĩa là xe hiện tại đang lệch sang bên trái làn đường và cần đánh lái sang hướng bên phải.
Thực nghiệm trên đường:
57
Hình 5.11: Hình ảnh thử nghiệm lần 1 Kết quả lần thử 1: Kết quả lần thử 1:
- Xe vào đường cua vẫn chạy trong Lane khơng bị văng ra ngồi.
- Xe chạy ổn định, không bị đạp lên Lane trắng.
Cho xe chạy lần 2 và quan sát khả năng bám Lane:
Hình 5.12: Hình ảnh thử nghiệm lần 2 Kết quả lần thử 2: Kết quả lần thử 2:
58
Ưu điểm của tính năng nhận biết làn đường:
- Tính năng cực kỳ hữu ích khi bạn đang lái xe trên đường cao tốc hay đường dài.
- Tính năng cần thiết cho hệ thống giao thông thông minh của thành phố. - Dễ dàng tích hợp vào các xe đang có trên thị trường và xe điện tự lái.
- Nếu trong hình ảnh chỉ thấy được một Lane trắng: Bình thường, chúng ta mong muốn máy ảnh nhìn thấy cả hai vạch làn đường. Tuy nhiên, có những lúc xe bắt đầu đi chệch khỏi làn đường, có thể do logic đánh lái sai lầm hoặc khi làn đường đó uốn cong quá gấp. Tại thời điểm này, máy ảnh có thể chỉ chụp được một vạch làn đường. Đó là lý do tại sao có đoạn mã này để kiểm tra “len(right_fit)>0 và len(left_fit)>0”.
Nhược điểm của tính năng nhận biết làn đường:
- Vì độ phân giải của Camere sử dụng hiện tại thấp nên hiện tượng bị giật khung hình xảy ra nhiều.
- Đoạn đường thẳng đứng: các đoạn đường thẳng đứng thỉnh thoảng được phát hiện khi xe đang quay đầu. Mặc dù chúng không phải là phát hiện sai, vì các đường thẳng đứng có độ dốc vơ hạn, chúng ta khơng thể tính trung bình chúng với độ dốc của các đoạn thẳng khác (nhóm đã chọn bỏ qua chúng). Vì các đường thẳng đứng không phổ biến lắm, nên làm như vậy không ảnh hưởng đến hiệu suất tổng thể của thuật tốn phát hiện làn đường. Ngồi ra, người ta có thể lật tọa độ X và Y của hình ảnh, do đó các đường thẳng đứng có độ dốc bằng 0, có thể được đưa vào giá trị trung bình. Nhưng khi đó các đoạn đường nằm ngang sẽ có độ dốc vơ cùng, điều đó sẽ cực kỳ hiếm. Vì Camera thường chỉ theo cùng hướng với các đường làn, không vng góc với chúng.
- Nhóm chưa kết hợp được cùng lúc nhận hình ảnh từ Camera và cảm biến Lidar, lúc đó hiệu suất cho bài tốn nhận biết làn đường sẽ cao và ổn định hơn.
Hệ thống nhận biết biển báo khi vào hầm:
59
Hình 5.13: Mơ hình đường có biển báo vào hầm Kiểm tra khả năng nhận diện biển báo: Kiểm tra khả năng nhận diện biển báo:
- Cấp nguồn cho xe, đặt biển báo trắng.
Hình 5.14: Kiểm tra khả năng nhận diện biển báo
- Lúc này xe vẫn chạy bám theo Lane đường, đèn Led không sáng. - Thay biển báo trắng thành biển báo tín hiệu vào hầm.
60 - Xe tiếp tục chạy trong Lane.
- Đèn Led sáng màu đỏ.
- Quan sát trên màn hình ta thấy Camera nhận diện chính xác biển báo vào hầm. - Biển báo nằm trong khung bao hình chữ nhật màu đỏ.
Hình 5.16: Kết quả camera truyền về máy tính
- Tiến hành cho xe mơ hình chạy thử nghiệm trên đường.
Hình 5.17: Tiến hành chạy thử
- Ở khoảng cách xa, camera chưa nhận diện được biển báo. Lúc này hình ảnh từ Camera liên tục gửi về cho Raspberry so sánh và xử lí.
61
Hình 5.18: Camera nhận diện được biển báo
- Xe di chuyển lại gần, Camera quan sát thấy biển báo và gửi về cho Raspberry xử