Xe tự hành đang dần trở thành một phần quan trọng của ngành công nghiệp ô tô. Nhiều người tin rằng xe hoàn toàn tự động sẽ sớm được lái cùng với con người, và các công ty công nghệ đang trong cuộc đua để triển khai xe tự động hoàn toàn. Vào tháng 12 năm 2018, Waymo, công ty phát triển từ dự án xe tự lái của Google, chính thức bắt đầu dịch vụ xe tự lái thương mại tại các vùng ngoại ô của Phoenix. Các công ty như May Mobility, Drive.ai và Uber đang theo đuổi con đường tương tự.
Xe tự hành có thể có vẻ như một tầm nhìn lớn, nhưng xe bán tự động đã xuất hiện giữa chúng ta. Các xe mới của Tesla có tính năng Tesla Autopilot, có khả năng nhận diện và theo dõi làn đường, kiểm soát hành trình thích ứng và tự đỗ xe. Khả năng nhận diện và theo dõi làn đường trên đường là một trong nhiều điều kiện tiên quyết cho xe không người lái. Mặc dù nhận diện làn đường có vẻ như là một vấn đề khó khăn, bạn có thể bắt đầu phát triển các thuật toán nhận diện và theo dõi làn đường với nền tảng phần cứng NVIDIA Jetson Nano.
Jetson Nano COM có kích thước hơi lớn hơn Raspberry Pi 3, nhưng nó có thể chạy các mạng nơ-ron song song với sức mạnh 472 Gflops. Điều này khoảng 22 lần mạnh hơn Raspberry Pi 3 và rất tiết kiệm năng lượng, chỉ tiêu thụ khoảng 5 W. Bo mạch này hoàn hảo cho các ứng dụng AI nhúng chạy trên nhân Linux được tối ưu hóa. Nó có đủ sức mạnh xử lý và bộ nhớ trên bo cho các ứng dụng xử lý hình ảnh và video chất lượng cao. Các tính năng chính của Jetson Nano bao gồm:
Dự án này đòi hỏi chúng ta cần một Jetson Nano COM hoặc bảng phát triển và một camera CSI (camera CSI Raspberry Pi v2 hoạt động tốt). Tôi sẽ trình bày ứng dụng này sử dụng bảng phát triển Nano, nhưng bạn có thể dễ dàng xây dựng một bảng cơ sở tùy chỉnh cho Nano COM và triển khai ứng dụng này. Camera CSI sẽ được kết nối với cổng camera trên Jetson Nano, mặc dù bạn có thể sử dụng camera USB hoặc camera IP. Dưới đây là những yêu cầu cần thiết để dự án này hoạt động thành công:
Quá trình triển khai đầy đủ cho dự án này có thể tìm thấy trên GitHub. Hãy theo dõi các bước tiếp theo để có một bản demo của dự án này hoạt động. Những bước này là các bước xử lý hình ảnh quan trọng nhằm mục đích làm cho việc nhận diện làn đường chính xác hơn.
Bước đầu tiên của hệ thống phát hiện làn đường của chúng tôi là có khả năng đọc hình ảnh trực tiếp từ camera. Đối với những người dùng mới làm việc với Jetson Nano, việc làm việc với camera có thể sẽ khó khăn. Vì vậy, chúng tôi sẽ sử dụng thư viện NanoCamera. Thư viện này không phải là lựa chọn tốt nhất cho một ứng dụng cấp độ sản xuất, nhưng nó hoạt động cho một ứng dụng đơn giản như được hiển thị ở đây.
Đầu tiên, cài đặt thư viện bằng pip:
Đọc hình ảnh trực tiếp từ camera:
Để làm cho hình ảnh mượt mà hơn và loại bỏ nhiễu không mong muốn, chúng ta có thể áp dụng làm mờ Gaussian. Điều này liên quan đến việc tính giá trị của mỗi điểm ảnh như một trung bình có trọng số của các điểm ảnh xung quanh.
OpenCV bao gồm một hàm để áp dụng làm mờ Gaussian cho một hình ảnh:
Sau khi làm mờ Gaussian, hình ảnh vẫn ở dạng RGB và cần được chuyển đổi sang không gian màu HSV. Việc tách màu sẽ được sử dụng để loại bỏ các màu không mong muốn khỏi hình ảnh. Một khi hình ảnh ở trong HSV, chúng ta có thể “loại bỏ” tất cả các màu không cần thiết khỏi hình ảnh bằng cách chỉ định một phạm vi màu xám.
Dãn nở thêm các pixel vào biên của các đối tượng trong hình ảnh. Áp dụng dãn nở cho hình ảnh sẽ giúp đóng các khoảng trống lỏng lẻo trong các hình ảnh đường kẻ.
Để phát hiện các đường kẻ, chúng ta có thể sử dụng một kỹ thuật gọi là phát hiện cạnh Canny. Phát hiện cạnh Canny có thể được sử dụng để trích xuất thông tin cấu trúc hữu ích từ một đối tượng. Thư viện OpenCV cung cấp một chức năng phát hiện cạnh Canny có thể được sử dụng để phát hiện các cạnh trong một hình ảnh. Để phát hiện Canny hoạt động, chúng ta cần cung cấp ngưỡng tối thiểu và tối đa. OpenCV thường khuyến nghị giá trị là (100, 200) hoặc (200, 400), vì vậy chúng tôi đang sử dụng (200, 400).
Hình ảnh đầu ra cạnh Canny chứa một số nhiễu. Tất cả thông tin khác ngoài làn đường trong hình ảnh có thể được phân lập bằng cách giảm khu vực quan tâm. Khi thực hiện nhận dạng làn đường và điều hướng, chúng ta không nhất thiết cần phải xem toàn bộ hình ảnh. Một cách dễ dàng để làm điều này chỉ là cắt bỏ nửa trên của hình ảnh.
Mã cho việc giảm khu vực quan tâm là:
Sau khi khu vực quan tâm được thu hẹp, các làn đường trở nên rõ ràng với bốn đường kẻ biệt lập. Tuy nhiên, máy tính không biết rằng những đường này đại diện cho ranh giới của hai làn đường. Vì vậy, chúng ta cần một cách để trích xuất tọa độ cho những đường kẻ làn đường này. Biến đổi Hough là một kỹ thuật được sử dụng trong xử lý ảnh để trích xuất các đặc điểm như đường thẳng, hình tròn và hình elip. Nó có thể được sử dụng để tìm các đường thẳng từ một số điểm ảnh dường như tạo thành một đường. Điều này có thể được thực hiện với hàm HoughLinesP trong OpenCV. Hàm này vừa vặn nhiều đường qua tất cả các điểm ảnh trắng và trả về bộ đường thẳng có khả năng cao nhất tuân theo một số ràng buộc ngưỡng tối thiểu.
Đây là mã của chúng tôi phát hiện các đoạn đường sử dụng Biến đổi Hough. Hầu hết các tham số sử dụng ở đây có thể được xác định thông qua thử nghiệm và sai sót hoặc bằng cách chọn các tham số từ hình ảnh tham khảo.
Đầu ra của hàm detect_line_segments() tạo ra một tập hợp các đoạn đường nhỏ với tọa độ điểm cuối (x1, y1) và (x2, y2). Chúng ta cần tìm một cách để kết hợp chúng thành chỉ hai đường cho đường làn trái và phải, nhưng làm thế nào để đạt được điều đó? Một cách là phân loại các đoạn đường này theo độ dốc của chúng.
Tất cả các đường kẻ làn trái có độ dốc dương, và các đoạn đường thuộc về làn đường bên phải có độ dốc âm. Dựa trên hai nhóm mới này, chúng ta có thể lấy trung bình của các độ dốc và giao điểm của các đoạn đường để có được độ dốc và giao điểm của các đường làn trái và phải. Điều này được thực hiện với hàm average_slope_intercept():
Hàm make_points() là một hàm hỗ trợ cho hàm average_slope_intercept(), nó nhận độ dốc và giao điểm của một đường, và trả về các điểm cuối của đoạn đường. Tại thời điểm này, chúng ta đã có các đường làn!
Tại thời điểm này, đầu ra từ hàm này sẽ được đưa vào một thuật toán khác để kiểm soát tốc độ và hướng đi của xe. Để làm điều này, một góc lái có thể được tính toán từ các đường làn được phát hiện và sau đó được truyền đến một bộ điều khiển PID để giảm thiểu góc lái và giữ cho xe ở trung tâm.
Mặc dù việc này được thực hiện với một bảng phát triển Nano, cùng một đoạn mã cung cấp một điểm khởi đầu để triển khai một hệ thống trong một hệ thống xử lý ảnh nhúng cho môi trường sản xuất. Để làm điều này, bạn cần xây dựng một bảng cơ sở thực sự cho Jetson Nano. Điều này dễ dàng nhất khi bạn sử dụng công cụ thiết kế điện tử mô-đun trong ứng dụng Upverter Board Builder. Bằng cách áp dụng cách tiếp cận mô-đun, bạn có thể dễ dàng tùy chỉnh một bảng cơ sở cho Jetson Nano, camera và các cảm biến khác cho nhận dạng làn đường.
Công cụ thiết kế điện tử mô-đun trong Upverter cung cấp cho bạn quyền truy cập vào một loạt các COM tiêu chuẩn của ngành và mô-đun phổ biến mà không cần tải xuống hoặc cài đặt bất kỳ phần mềm mới nào. Bạn có thể tạo ra phần cứng đạt cấp độ sản xuất cho nhiều ứng dụng, bao gồm nhận dạng làn đường và các nhiệm vụ xử lý ảnh khác với Jetson Nano, sử dụng giao diện người dùng kéo và thả. Nếu hệ thống của bạn cần thêm chức năng, bạn có thể bao gồm kết nối không dây, một loạt cảm biến, và nhiều hơn nữa.
Hãy xem một số câu chuyện thành công của khách hàng Gumstix hoặc liên hệ với chúng tôi ngay hôm nay để tìm hiểu thêm về sản phẩm, công cụ thiết kế, và dịch vụ của chúng tôi.