Các hình ảnh khi thực nghiệm

Một phần của tài liệu Nghiên cứu hệ thống quan sát cho xe trong việc xác định tình trạng giao thông đồ án tốt nghiệp ngành công nghệ kỹ thuật ô tô (Trang 58)

- Khi xe đi đúng làn đường, chương trình sẽ gửi tín hiệu kiểu số xuống arduino. Từ tín hiệu đó arduino sẽ thực hiện điều khiển motor DC đứng yên đồng thời làm đèn led báo hiệu xe đi đúng làn đường sáng lên.

54

Hình 5. 4 Xe đi đúng làn đường ngoài đường nhựa

- Khi xe lệch phải , chương trình sẽ gửi tín hiệu kiểu số xuống arduino. Từ tín hiệu đó arduino sẽ thực hiện điều khiển motor DC đánh lái sang trái sau đó dừng một thời gian rồi đánh lái sang phải để giúp xe đi đúng làn đường, đồng thời làm đèn led báo hiệu xe lệch phải sáng lên.

55

Hình 5. 6 Xe đi lệch phải ngoài đường nhựa

- Khi xe lệch trái, chương trình sẽ gửi tín hiệu kiểu số xuống arduino. Từ tín hiệu đó arduino sẽ thực hiện điều khiển motor DC đánh lái sang phải sau đó dừng một thời gian rồi đánh lái sang trái để giúp xe đi đúng làn đường, đồng thời làm đèn led báo hiệu xe lệch phải sáng lên.

56

Hình 5. 8 Xe đi lệch trái ngoài đường nhựa

57

Hình 5. 10 Xe không nhận được làn đường do mờ

Khi có vật cản phía trước: Matlab sẽ lấy tín hiệu từ cảm biến siêu âm tính khoảng

cách thông qua giao tiếp serial port và hiện thị khoảng cách đó lên màn hình Laptop. Nếu khoảng cách bé hơn 40 cm thì đèn led báo hiệu khoảng cách đến vật cản sẽ sáng lên và ngược lại

Hình 5. 11 Nhận dạng vật cản và hiển thị khoảng cách lên màn hình

Khi có người đi bộ: matlab sẽ xử lý ảnh và vẽ một hình hộp chữ nhật xung quanh

58

Hình 5. 12 Nhận dạng người đi bộ

Khi có người và vật cản: thì matlab sẽ xử lý giúp ta nhận dạng được vật cản và vẽ

hộp xung quanh nó bằng màu xanh lá và hiển thị khoảng cách đo được từ cảm biến siêu âm đồng thời nó giúp ta vẽ vẽ một hình hộp chữ nhật xung quanh người để giúp ta nhận biết dễ dàng hơn.

59

Hình 5. 14 Nhận dạng vật cản là chiếc xe thông qua một ảnh từ điện thoại

60

Hình 5. 16 Nhận biết được xe thực tế

61

Hình 5. 18 Nhận dạng được xe và người chuyển động

62

63

Chương 6 KẾT LUẬN

Qua khoảng thời gian qui định thực hiện đề tài, tuy gặp nhiều khó khăn khách quan nhưng người thực hiện đề tài đã cố gắng rất nhiều, mặt dù đề tài đáp ứng yêu cầu đặt ra ban đầu nhưng kết quả đạt được vẫn chưa như kỳ vọng. Sau khi hoàn thành, đề tài thể hiện những kết quả đạt được và chưa được như sau:

Những điều đạt được:

 Ứng dụng được phần mềm Matlab để thu thập, nhận diện và xử lý ảnh ở mức cơ bản dựa vào hình ảnh thu thập được thông qua webcam.

 Xuất được tín hiệu điều khiển và cảnh bào cho người lái biết vị trí của xe so với vị trí mục tiêu.

 Nhận dạng được người đi bộ và vật cản màu đỏ.

 Tính được khoảng cách từ cảm biến siêu âm nhờ lập trình arduino.  Hiển thị khoảng cách đo được từ cảm biến siêu âm lên màn hình.  Điều khiển motor DC đánh lái khi xe đi lệch làn đường .

 Làm cơ sở để thực hiện các đề tài tiếp theo có liên quan đến xử lý ảnh và nhận dạng làn đường, điều khiển xe tự động.

 Người thực hiện đề tài đã lĩnh hội được một lượng lớn kiến thức hoàn toàn mới và bổ ích.

Những điều chưa đạt được:

 Đề tài chỉ thực hiện ở mức độ cơ bản nên chưa thể ứng dụng vào thực tiễn.  Hiển thị khoảng cách và vấn đề nhận dạng làn đường ở những đoạn đường

cong, có chướng ngại vật.

 Nhận dạng và xử lý làn đường có nhiều tín hiệu giao thông cảnh báo.  Nhận dạng và xử lý trên những làn đường không có vạch kẻ đường.

 Điều khiển xe mô hình chạy đúng làn và hiển thị khoảng cách vật cản còn nhiều hạn chế do dùng cảm biến siêu âm SRF-05 có khoảng nhận dạng nhỏ hơn 3m là quá ngắn. Đồng thời do nhiễu nên việc hiển thị khoảng cách đến vật cản đôi khi không chính xác.

64  Nhận dạng làn đường và điều khiển còn chậm không đáp ứng được thời gian

thực.

Hướng phát triển đề tài:

Đề tài hệ thống quan sát cho xe trong việc phát hiện tình trạng giao thông là một đề tài tạo cơ sở cho việc phát triển xe tự động. Do đề tài được thực hiện trên xe mô hình với kích thước lớn nên có thể phát triển để có thể giúp xe mô hình này thành xe tự hành từ đó tạo tiền đề cho phát triển ô tô tự hành mai sau.

Để có thể phát triển thành xe mô hình tự hành thì cần thêm một số yếu tố sau: - Điều khiển cơ cấu lái tối ưu hơn để giúp xe vận hành dễ dàng.

- Kết hợp với xử lý ảnh để nhận biết các tín hiệu giao thông như biển báo, đèn tín hiệu …

- Kết hợp xử lý ảnh và các cảm biến va chạm, radar để quét vật thể 3D nhận dạng chính xác các vật cản, và thêm cảm biến giúp tính toán khoảng cách một cách chính xác để giúp chúng ta có thể xác định chính xác được tọa độ khoảng cách để từ đó đưa ra tính hiệu điều khiển lái chính xác hơn làm tiền đề cho phát triển xe tự động lái.

- Kết hợp hệ thống cảnh báo va chạm, phanh khẩn cấp nếu có vật cản bất ngờ, hệ thống tự đổ xe..

- Phát triển hệ thống giao tiếp giữa các hệ thống kể trên với nhau để đưa ra tín hiệu điều khiển hệ thống lái được chính xác.

65

TÀI LIỆU THAM KHẢO

[1] Trần Quang Khánh, Matlab ứng dụng, Nxb Khoa học kỹ thuật, 2010.

[2] TS.Hồ Văn Sung, Xử lý ảnh số - Lý thuyết và thực hành với Matlab, Nxb Khoa học kỹ thuật, 2013.

[3] The mathWork Inc, Image Processing Toolbox, 2013.

[4] http://www.mathworks.com [5] http://autocarvietnam.vn [6]https://suryatejacheedella.wordpress.com [7] https://stackoverflow.com [8] http://www.mathworks.com/help/images/functionlist.html [9]https://www.arduino.cc/ [10]http://arduino.vn/ [11]https://www.youtube.com/watch?v=UYWeKpke6a8

66 PHỤ LỤC A. Chương trình chính : clear all close all delete(instrfind);

DrawPoly = 1; % Set 0 de ve duong line.

NumRows = 120; % So hang trong vung anh xu ly. MaxLaneNum = 20; % So lan duong toi da de tich luy.

ExpLaneNum = 2; % So lan duong duoc tim trong khung hinh. Rep_ref = zeros(ExpLaneNum, MaxLaneNum); % Line luu tru. Count_ref = zeros(1, MaxLaneNum); % Dem mang luu tru.

TrackThreshold = 75; % Su thay doi toi da cho phep trong khoang cach giua

% hai lan duong.

LaneColors = single([0 0 0;1 1 0; 1 1 0; 1 1 1;1 1 1]); % So khung anh toi thieu de nhan dang.

frameFound = 5;

% So khung anh toi da trong nhan dang. frameLost = 20;

% Cho gia tri Rho 35:45 startIdxRho_R = 415; NumRhos_R = 51;

% Cho gia tri Theta -90:-70deg startIdxTheta_R = 1;

NumThetas_R = 21;

% Cho gia tri Rho 379:415 startIdxRho_L = 380; NumRhos_L = 36;

% Cho gia tri Theta 55:85deg startIdxTheta_L = 146;

67 NumThetas_L = 21;

% Hien thi duong line offset.

offset = int32([0, NumRows, 0, NumRows]);

%%

% Tao doi tuong |VideoFileReader| de doc video tu file.

hVideoSrc = imaq.VideoDevice('winvideo',1,'YUY2_640x480', ... 'ROI', [140 1 360 240], ... 'ReturnedColorSpace', 'rgb'); %imaq.VideoDevice('winvideo',2,'RGB24_640x480', ... %vision.VideoFileReader('viplanedeparture.avi'); %%

% Tao doi tuong |ColorSpaceConverter| de chuyen anh RGB sang anh cuong do.

hColorConv1 = vision.ColorSpaceConverter( ...

'Conversion', 'RGB to intensity');

%%

% Tao doi tuong giup nhan dang nguoi

peopleDetector = vision.PeopleDetector('ClassificationThreshold',... 0,'MergeDetections',false);

%%

% Tao |ImageFilter| de thuc hien loc 2-D FIR de xac dinh bien trong video.

hFilter2D = vision.ImageFilter( ...

'Coefficients', [-1 0 1], ...

'OutputSize', 'Same as first input', ... 'PaddingMethod', 'Replicate', ...

'Method', 'Correlation');

%%

% Tao |Autothresholder| de chuyen doi anh cuong do sang anh nhi phan. hAutothreshold = vision.Autothresholder;

68 %%

% Tao |HoughTransform| de tao duong thang duoc dinh nghia trong bd Hough. hHough = vision.HoughTransform( ... 'ThetaRhoOutputPort', true, ... 'OutputDataType', 'single'); %%

% Tao |LocalMaximaFinder| de tim dinh trong matran bien doi Hough. hLocalMaxFind1 = vision.LocalMaximaFinder( ... 'MaximumNumLocalMaxima', ExpLaneNum, ... 'NeighborhoodSize', [301 81], ... 'Threshold', 1, ... 'HoughMatrixInput', true, ... 'IndexDataType', 'uint16');

% Tao doi tuong |HoughLines| de tim toa do Decac cua duong thang duoc xac

% dinh trong dau duong.

hHoughLines1 = vision.HoughLines('SineComputation', 'Trigonometric function');

%% thiet lap giao tiep voi arduino thong qua serial port a=arduino('com3');

s= serial ('com4', 'BaudRate',115200,'Terminator','LF','Timeout',10); fopen (s); %%

% Dinh nghia tham so de chen text vao trong canh bao lan duong. warnText = {sprintf('Ben phai'), '', sprintf('Ben trai')}; warnTextLoc = [120 170;-1 -1; 2 170];

hVideoOut = vision.VideoPlayer;

69

%%

% Khoi tao bien trong vong lap. Frame = 0; NumNormalDriving = 0; OutMsg = int8(-1); OutMsgPre = OutMsg;

%% Vong lap xu ly.

% Tao vong lap phat hien lan duong trong video nhap vao. % Vong lap nay dung nhung doi tuong da duoc tao.

warningTextColors = {[1 0 0], [1 0 0], [0 0 0], [0 0 0]};

while true

RGB = step(hVideoSrc); %% nhan dang nguoi

[bbox,score] = step(peopleDetector,RGB);

[selectedBbox,selectedScore] = selectStrongestBbox(bbox,score); %% nhan dang vat can mau do

diff_im = imsubtract(RGB(:,:,1), rgb2gray(RGB)); diff_im = medfilt2(diff_im, [3 3]);

% chuyen doi mau toi thanh ket qua nhi phan diff_im = im2bw(diff_im,0.18);

diff_im = bwareaopen(diff_im,300);

% tong hop cac thanh phan trong diem anh bw = bwlabel(diff_im, 8);

stats = regionprops(bw, 'BoundingBox', 'Centroid'); a1='Cm';

c= fscanf(s); %c='22';

label_str = strcat(c,a1);

%% boundingbox vat can va hien thi khoang cach for object = 1:length(stats)

bbox = stats(object).BoundingBox; bc = stats(object).Centroid;

70 RGB = insertShape(RGB, 'Rectangle',bbox, 'Color',

'green','LineWidth',2);

RGB = insertText(RGB,[bc(1), bc(2)], label_str, ... 'FontSize',20, 'BoxOpacity', 1); end

% bounding box nguoi

RGB = insertObjectAnnotation(RGB,'rectangle',selectedBbox,... cellstr(num2str(selectedScore)),'Color','r');

%%

% Chon vung duoi cua video dau vao (dinh nghia vung quan sat) Imlow = RGB(NumRows+1:end, :, :);

% Phat hien bien va bien doi Hough.

Imlow = step(hColorConv1, Imlow); % Chuyen anh RGB sang anh cuong do.

I = step(hFilter2D, Imlow);

% Bao hoa cac gia tri giua 0 va 1. I(I < 0) = 0;

I(I > 1) = 1;

Edge = step(hAutothreshold, I);

[H, Theta, Rho] = step(hHough, Edge);

% Phat hien dinh. H1 = H;

% Mo rong ma tran H voi theta < -78 do va theta >= 78 do. H1(:, 1:12) = 0;

H1(:, end-12:end) = 0;

Idx1 = step(hLocalMaxFind1, H1); Count1 = size(Idx1,1);

% Chon Rhos va Thetas tuong ung voi dinh. Line = [Rho(Idx1(:, 2)); Theta(Idx1(:, 1))];

Enable = [ones(1,Count1) zeros(1, ExpLaneNum-Count1)];

% Theo doi tap hop cac dau phan cach lan duong.

71 MaxLaneNum, ExpLaneNum, Enable, Line, ...

TrackThreshold, frameFound+frameLost);

% Chuyen duong thang tu toa do Polar sang Cartesian.

Pts = step(hHoughLines1, Rep_ref(2,:), Rep_ref(1,:), Imlow);

% Lan duong trai va phai.

[TwoValidLanes, NumNormalDriving, TwoLanes, OutMsg] = ...

videodeparturewarning(Pts, Imlow, MaxLaneNum, Count_ref, ... NumNormalDriving, OutMsg);

% Dien giai: 0 = Right lane departure,

% 1 = Normal driving, 2 = Left lane departure % Output

Frame = Frame + 1; if Frame >= 5

TwoLanes1 = TwoLanes + [offset; offset]'; if DrawPoly && TwoValidLanes

if TwoLanes(4,1) >= 239 Templ = TwoLanes1(3:4, 1); else Templ = [0 239]'; end if TwoLanes(4,2) >= 239 Tempr = TwoLanes1(3:4, 2); else Tempr = [359 239]'; end

Pts_poly = [TwoLanes1(:,1); Templ; Tempr; ... TwoLanes1(3:4,2); TwoLanes1(1:2,2)]; % Ve lan duong. RGB = insertShape(RGB,'FilledPolygon',Pts_poly.',... 'Color',[1 1 1],'Opacity',0.0); end % Ve duong line.

72 RGB = insertShape(RGB,'Line',TwoLanes1',...

'Color',{'yellow','yellow'}); % Chen text canh bao.

txt = warnText{OutMsg+1}; txtLoc = warnTextLoc(OutMsg+1, :); txtColor = single(warningTextColors{mod(Frame-1,4)+1}); RGB = insertText(RGB,txtLoc,txt,'TextColor', txtColor, ... 'FontSize',20, 'BoxOpacity', 0);

%% truyen tin hieu lech trai lech phai xuong arduino thong qua serial port % lech trai if (OutMsg == 0) writeDigitalPin (a,2,1) writeDigitalPin (a,12,0) writeDigitalPin (a,13,1) writePWMVoltage (a, 3,5) pause (0.1) writeDigitalPin (a,12,0) writeDigitalPin (a,13,0) %writePWMVoltage (a,2,0) pause (0.5) writeDigitalPin (a,12,1) writeDigitalPin (a,13,0) writePWMVoltage (a, 3,5) pause(0.05) writeDigitalPin (a,12,0) writeDigitalPin (a,13,0) writePWMVoltage (a, 3,0)

elseif (OutMsg == 1 | OutMsg == 2)

writeDigitalPin (a,2,0) end

73 if (OutMsg == 1) writeDigitalPin (a,4,1); writeDigitalPin (a,12,0); writeDigitalPin (a,13,0); %writePWMVoltage (a,2,0); elseif (OutMsg == 0 | OutMsg == 2) writeDigitalPin (a,4,0) end if (OutMsg == 2) %led sang writeDigitalPin (a,8,1) %dieu khien motor

writeDigitalPin (a,12,1) writeDigitalPin (a,13,0) writePWMVoltage (a,3,5) pause (0.1) writeDigitalPin (a,12,0) writeDigitalPin (a,13,0) %writePWMVoltage (a,3,0) pause (0.5) writeDigitalPin (a,12,0) writeDigitalPin (a,13,1) writePWMVoltage (a,3,5) pause(0.05) writeDigitalPin (a,12,0) writeDigitalPin (a,13,0)

elseif (OutMsg == 0 | OutMsg == 1) %led tat

writeDigitalPin (a,8,0) %writePWMVoltage (a,2,0) end

74 OutMsgPre = OutMsg; step(hVideoOut,RGB); end release(hVideoSrc);

% dong giao tiep voi cong com fclose(s);

B. Xác định dấu phân cách trái / phải

function [TwoValidLanes, NumNormalDriving, TwoLanes, OutMsg] = ... videodeparturewarning(Pts, Imlow, MaxLaneNum, Count_ref, ...

NumNormalDriving, OutMsg)

% hObject handle to exit_pushbutton7 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) Dis_inf = size(Imlow, 2); % Width of image

Halfwidth = Dis_inf * 0.5; Left_dis = single(intmax('int16')); Left_pts = zeros(4, 1); Right_dis = single(intmax('int16')); Right_pts = zeros(4, 1); Pts = Pts(:, [2 1 4 3])'; for i = 1:MaxLaneNum

% Pick the column corresponding to the point closer to the top if Pts(1, i) >= Pts(3, i) ColNum = Pts(2, i); else ColNum = Pts(4, i); end if Count_ref(i) >= 5

centerDis = abs(Halfwidth - ColNum); else

centerDis = Dis_inf; end

75 if (Halfwidth - ColNum) >= 0 % left lane

if centerDis < Left_dis Left_dis = centerDis; Left_pts = Pts(:, i); end

else % right lane if centerDis < Right_dis Right_dis = centerDis; Right_pts = Pts(:, i); end end end % Departure detection if Left_dis < Dis_inf TmpLeftPts = Left_pts; else TmpLeftPts = zeros(4, 1); end if Right_dis < Dis_inf TmpRightPts = Right_pts; else TmpRightPts = zeros(4, 1); end

TwoLanes = int32([TmpLeftPts TmpRightPts]); % Check whether both lanes are valid

Check1 = (TwoLanes(1,:) ~= TwoLanes(3,:)) | ... (TwoLanes(2,:) ~= TwoLanes(4,:));

Check2 = (abs(TwoLanes(1,:) - TwoLanes(3,:)) + ... abs(TwoLanes(2,:) - TwoLanes(4,:))) >= 10;

TwoValidLanes = (Left_dis <= Dis_inf) && (Right_dis <= Dis_inf) && ...

all((TwoLanes(1,:)>=0) & Check1 & Check2);

Diswarn = Dis_inf * 0.4; % Distance threshold for departure warning if Left_dis < Diswarn && Left_dis <= Right_dis

76 elseif Right_dis < Diswarn && Left_dis > Right_dis

RawMsg = 0; else

RawMsg = 1; end

% Meaning of Raw Masseage: 0 = Right lane departure,

% 1 = Normal driving, 2 = Left lane departure

% The following code combines left-right departure to left departure and

% right-left departure to right departure. It utilizes the fact that there

% must be at least 4 frames of normal driving between a left departure

% warning and a right departure warning.

NumNormalDriving = NumNormalDriving + (RawMsg == 1); RawMsg = int8(RawMsg);

if RawMsg == int8(1) || NumNormalDriving >= 4 OutMsg = RawMsg;

end % else keep old OutMsg if RawMsg ~= int8(1) NumNormalDriving = 0; end TwoLanes = TwoLanes([2 1 4 3], :); C. Xác định dấu chỉ làn đường.

function [Rep_ref, Count_ref] = videolanematching(Rep_ref, Count_ref, ...

MaxLaneNum, ExpLaneNum, Enable, Line, ...

TrackThreshold, CountUpperThresh)

77 for i = 1:MaxLaneNum

for j = 1:ExpLaneNum

if Count_ref(i) > 0 && Enable(j) == 1

List(i, j) = abs(Line(1, j)' - Rep_ref(1,i)) + ... abs(Line(2, j)' - Rep_ref(2, i)) * 200;

end end end

% Find the best matches between the current lines and those in the % repository.

%Match_dis = intmax('int16')*ones(1, MaxLaneNum, 'int16'); Match_dis = double(intmax('int16'))*ones(1, MaxLaneNum); Match_list = zeros(2, MaxLaneNum);

for i = 1:ExpLaneNum if i > 1

% Reset the row and column where the minimum element lies on. List(rowInd, :) = double(intmax('int16')) * ones(1,

ExpLaneNum);

List(:, colInd) = double(intmax('int16')) * ones(MaxLaneNum, 1);

end

% In the 1st iteration, find minimum element (corresponds to % best matching targets) in the distance matrix. Then, use the % updated distance matrix where the minimun elements and their % corresponding rows and columns have been reset.

[Val, Ind] = min(List(:));

[rowInd colInd] = ind2sub(size(List), Ind); Match_dis(i) = Val;

Match_list(:,i) = [rowInd colInd]'; end

% Update reference target list.

% If a line in the repository matches with an input line, replace % it with the input one and increase the count number by one; % otherwise, reduce the count number by one. The count number is % then saturated.

78 for i = 1:ExpLaneNum

if Match_dis(i) > TrackThreshold

% Insert in an unused space in the reference target list NewInd = find(Count_ref < 0, 1);

Rep_ref(:, NewInd) = Line(:, Match_list(2, i)); Count_ref(NewInd) = Count_ref(NewInd) + 2; else

% Update the reference list

Rep_ref(:, Match_list(1, i)) = Line(:, Match_list(2, i)); Count_ref(Match_list(1, i)) = Count_ref(Match_list(1, i)) + 2; end

end

Count_ref(Count_ref < 0) = 0;

Count_ref(Count_ref > CountUpperThresh) = CountUpperThresh;

D. Code Arduino

// them thu vien va khai bao cac chan cua cam bien sieu am #include <NewPing.h> #define TRIGGER_PIN 12 #define ECHO_PIN 13 #define MAX_DISTANCE 300 #define led_distance 11

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { Serial.begin(115200); pinMode (led_distance,OUTPUT); } void loop() { delay(1000); //Serial.print("Ping: "); Serial.println(sonar.ping_cm()); // Serial.println("cm"); if ( sonar.ping_cm ()<20) { digitalWrite(led_distance ,HIGH);

79 } else if (sonar.ping_cm ()> 20) { digitalWrite(led_distance ,LOW); } }

Một phần của tài liệu Nghiên cứu hệ thống quan sát cho xe trong việc xác định tình trạng giao thông đồ án tốt nghiệp ngành công nghệ kỹ thuật ô tô (Trang 58)

Tải bản đầy đủ (PDF)

(84 trang)