Hình 4 .17 Thu 9 ảnh liên tiếp – thực hiện 9 lần trigger
Hình 4.23 Điều khiển cả hai tay kẹp
Với cả ba nút lệnh ở trên mỗi một lần click đầu vi kẹp chỉ chuyển động một lượng tương đối nhỏ nên có thể người dùng click tương đối là nhiều lần thì các cánh tay của vi kẹp mới tiến đến vật.
Nguyễn Văn Thắng – Luận văn thạc sĩ
KẾT LUẬN
Qua quá trình nghiên cứu làm luận văn thạc sĩ với đề tài “Xây dựng hệ giám sát, điều khiển vi kẹp”. Với yêu cầu đặt ra ban đầu là, xây dựng một chương trình điều khiển một vi kẹp kích thước cỡ micro met dựa vào công nghệ thị giác máy tính, tôi đã nghiên cứu,tìm hiểu được những nội dung sau:
- Nghiên cứu được cấu tạo và nguyên lý làm việc của một vi kẹp
- Xây dựng mạch điều khiển vi kẹp. Mạch điều khiển được thiết kế với yêu cầu nhận lệnh từ một chương trình điều khiển của máy tính và đưa ra giá trị điện áp tương ứng để điều khiển vi kẹp.
- Tìm hiểu tổng quan về xử lý ảnh. Những khái niệm và những kỹ thuật cơ bản trong xử lý ảnh. Làm cơ sở cho kỹ thuật thị giác máy tính.
- Tìm hiều các công cụ xử lý ảnh của Matlab, xây dựng chương trình điều khiển bằng giao diện GUI của Matlab.
- Kết quả cuối cùng là một hệ điều khiển vi kẹp giựa trên công nghệ thị giác máy tính. Hệ điều khiển này đã được chạy thử tại viện quốc tế về khoa học vật liệu.
Tuy đã đạt được những kết quả nhất định. Nhưng hệ thống giám sát và điều khiển vi kẹp vẫn còn có nhiều nhược điểm như tốc độ xử lý còn chậm. Hướng phát triển trong tương lai tôi có thể cải tiến hệ thống bằng các ngôn ngữ lập trình khác như C, visual C,… và ứng dụng kỹ thuật PID vào thuật toán điều khiển
Tài liệu tham khảo
Tiếng Việt
1. Th.s Nguyễn Hoàng Hải – Th.s Nguyễn Việt Anh (2005), Lập trình matlab và ứng dụng (dùng cho sinh viên khối khoa học kỹ thuật) NXB KHKT
2. Lương Mạnh Bá – Nguyễn Thanh Thủy Nhập môn xử lý ảnh số NXB KHKT Tiếng Anh
3. Chu Duc Trinh (2007) sensing microgripper for microparticles handing phD thesis delft university of Technology, The Neitherland
4. RGB color space http://www.rgbworld.com/color.html
5. Trợ giúp trực tuyến matlab http://www.mathworks.com/
6. Color principles- hue, saturation, and value
http://ncsu.edu.scivis/lesson/colormodels/color_models2.html#(HSV)
7. Stephen J. Chapman, (2001) “Matlab programming for engineer (second edition)”
8. Matlab toàn tập htttp://www.scribd.com/doc/2540653/matlab_toantap
9. A john Wiley & Son,inc Publication. Tinku Acharya and Ajoy kray. Image proceesing: principles and application
10. Elisabet perez and bahram javidi “image processing techniques for automatic road sign indentification and tracking”
Nguyễn Văn Thắng – Luận văn thạc sĩ mã chương trình điều khiển vi kẹp
Phụ lục
Mã của chương trình điều khiển vi kẹp
Dưới đây là đoạn mã được viết cho đáp ứng click của một vài nút lệnh chính trên các giao diện điều khiển vi kẹp.
1. Mã chương trình cho giao diện cấu hình cho cổng COM
% --- Executes on button press in setup.
function setup_Callback(hObject, eventdata, handles) set(handles.setup,'enable','off');
brindex= get(handles.baudlist,'value');
brcontent=deblank(get(handles.baudlist,'String')); baudrate=str2num(char(brcontent(brindex))); % lay gias tri cua datatosend bit
databitIndex = get(handles.datalist,'Value');
datacontent=deblank(get(handles.datalist,'String')); databit=str2num(char(datacontent(databitIndex))); %lay gia tri cua stop bit
stopIndex=get(handles.stoplist,'Value');
stopcontent=deblank(get(handles.stoplist,'String')); stopbit=str2num(char(stopcontent(stopIndex))); %lay gia tri cua cong
comindex = get(handles.comlist,'Value'); comport=deblank(get(handles.comlist,'String')); comport=char(comport(comindex)); %% s=instrfind('Status','open'); delete(s) %% serial_port=serial(comport,'Baudrate',baudrate,'Databit',databit,'Stopbit',stopbit,'Parity ','none'); % fwrite(s,2); serial_port.InputBufferSize =1; serial_port.Timeout=1000; save ('comfile', 'serial_port'); set(handles.setup,'enable','on'); disp('Da thiet lap xong ');
% --- Executes on button press in Send.
function Send_Callback(hObject, eventdata, handles) clc;
if isempty(dir('comfile.mat'))
disp('Chua thiet lap cau hinh cho cong'); return end load comfile; data_tran = str2num(get(handles.datatosend,'string')); fopen(serial_port); tic
disp('Sending please wait...');
% hàm thực hiện việc đưa ra giá trị điện áp để kiểm tra function dienap_Callback(hObject, eventdata, handles) com_port=handles.port; com_port.InputBufferSize =3; com_port.Timeout=1000; fopen(com_port); v= str2num(get(handles.volt,'String')); if v>5
disp('Gia tri dien ap lon > 5 '); else
data_tran= 819*v;
disp(strcat('Gia tri dien ap la: ', num2str(v), ' (volt)' )); low = round( mod(data_tran , 64));
high= floor(data_tran ./ 64) + 192; %cho hai bit cao nhat bang 1 fwrite(com_port,low);
fwrite(com_port,high); end
fclose(com_port);
2. Mã chương trình cho giao diện thiết lập cấu hình cho thiết bị thu ảnh
% --- Executes on button press in setup.
function setup_Callback(hObject, eventdata, handles) % hObject handle to setup (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) inf=imaqhwinfo('winvideo');
Nguyễn Văn Thắng – Luận văn thạc sĩ mã chương trình điều khiển vi kẹp
if isempty(inf.DeviceIDs)
disp('Chua co thiet bi thu nhan anh dc cai dat'); imaqreset; set(handles.supportedformat,'String','') else s=get(handles.supportedformat,'String'); closepreview; if size(s,1)>1 index=get(handles.supportedformat,'value'); format=char(s(index)); vid=videoinput('winvideo',1,format); else vid=videoinput('winvideo',1); end start(vid); while vid.FramesAcquired<5 end data=getdata(vid); while vid.FramesAvailable>0 end snap=data(:,:,1);%getsnapshot(vid); figure(1); [i,rect]=imcrop(snap); save ('Acquifile','vid','rect'); close (figure(1)); end
% --- Executes on button press in close.
function close_Callback(hObject, eventdata, handles) close(Acquisition);
% --- Executes on button press in cmdgetformats.
function cmdgetformats_Callback(hObject, eventdata, handles) inf=imaqhwinfo('winvideo');
if isempty(inf.DeviceIDs)
disp('Chua co thiet bi thu nhan anh dc cai dat'); set(handles.supportedformat,'Value',1 );
set(handles.supportedformat,'string','Default' ); imaqreset;
else
formats=inf.DeviceInfo.SupportedFormats; set(handles.supportedformat,'string',formats) end
3. Mã chương trình cho giao diện đìều khiển vi kẹp
% --- Executes on button press in cmdObjdectec.
function cmdObjdectec_Callback(hObject, eventdata, handles) rect =[197 318 236 135]; i2=imread('imadd1.bmp');%dung anh 1 , 5 , 8 i2=imcrop(i2,rect); mov = aviread('gripper.avi'); i1=imcrop(mov(1).cdata,rect); iadd=imadd(i1,i2); se90 = strel('line', 4, 90); se0 = strel('line', 4, 0); seD = strel('diamond',1); bw = im2bw(iadd);
bw = imdilate(bw, [se90 se0]); bwfill=imfill(bw,'holes');
BWfinal = imerode(bwfill,seD); imed= edge(bwfill,'sobel');
[B,L] = bwboundaries(BWfinal,'holes'); % imshow(bwfill);hold on;
%xac dinh duuong tron
stats = regionprops(L,'Area','Centroid'); threshold = 0.94;
for k = 1:length(B)
% obtain (X,Y) boundary coordinates corresponding to label 'k' boundary = B{k};
% compute a simple estimate of the object's perimeter delta_sq = diff(boundary).^2;
perimeter = sum(sqrt(sum(delta_sq,2))); if perimeter >0
% obtain the area calculation corresponding to label 'k' area = stats(k).Area;
Nguyễn Văn Thắng – Luận văn thạc sĩ mã chương trình điều khiển vi kẹp
metric = 4*pi*area/perimeter^2; % display the results
metric_string = sprintf('%2.2f',metric);
% mark objects above the threshold with a black circle if (metric >0 ) % threshold
centroid = stats(k).Centroid;
r=fix(centroid(1)- boundary(1,2)) ; %ban kinh duong tron yi2=size(iadd,2);
y0=fix(centroid(1)); x0=fix(centroid(2));
abs1=abs (y0 - yi2 / 2); % xac dinh xem toa do tam co gan giua anh hay khong if abs1<30 & x0>80 break; end end end end handles.x0=x0; handles.y0=y0; handles.r=r;
% chi so khung ben trai va ben phai frameLeft=1; frameRight=1; handles.frameLeft=frameLeft; handles.frameRight =frameRight; handles.mov = mov; handles.i2=i2; guidata(hObject, handles); set(handles.optAuto,'Enable','on'); set(handles.optManual,'Enable','on'); s=get(handles.listbox1,'String'); % s=strvcat(s,'Đã xác định được vật');
s=strvcat(s,strcat('Tọa độ tâm của vật:(',num2str(x0),',',num2str(y0),')')); s=strvcat(s,strcat('Đường kính của vật là:',num2str(2*r)));
set(handles.listbox1,'String',s);
function dk(hObject, eventdata, handles,frameLeft,frameRight) x0=handles.x0; y0=handles.y0; r=handles.r; rect =[197 318 236 135]; % i2=imread('imadd1.bmp');%dung anh 1 , 5 , 8 % i2=imcrop(i2,rect); i2=handles.i2; % mov = aviread('gripper.avi'); mov=handles.mov; se90 = strel('line', 4, 90); se0 = strel('line', 4, 0); seD = strel('diamond',1); Ymax =size(i2,2); Xmax=size(i2,1); imblank(1:Xmax,1:Ymax) = 0; % 'lay anh ben phai
i1=imcrop(mov(frameRight).cdata,rect); ima=imadd(i1,i2);
bw = im2bw(ima);
bw = imdilate(bw, [se90 se0]); bw = imfill(bw,'holes');
bw = imerode(bw ,seD); imed= edge(bw,'sobel');
if (imed(x0,y0+r)==1 | imed(x0,y0+r+1)==1 |imed(x0,y0+r+2)==1 ) imtong(:,y0:Ymax)=imed(:,y0:Ymax);
end
% lay anh ben trai
i1=imcrop(mov(frameLeft).cdata,rect); ima=imadd(i1,i2);
bw = im2bw(ima);
bw = imdilate(bw, [se90 se0]); bw = imfill(bw,'holes');
bw = imerode(bw ,seD); imed= edge(bw,'sobel');
Nguyễn Văn Thắng – Luận văn thạc sĩ mã chương trình điều khiển vi kẹp imtong(:,1:y0)=imed(:,1:y0); end figure(1) ; imshow(imtong) handles.frameLeft=frameLeft; handles.frameRight =frameRight; guidata(hObject,handles);
% --- Executes on button press in cmdRun.
function cmdRun_Callback(hObject, eventdata, handles) x0=handles.x0; y0=handles.y0; r=handles.r; rect =[197 318 236 135]; i2=imread('imadd1.bmp');%dung anh 1 , 5 , 8 i2=imcrop(i2,rect); mov = aviread('gripper.avi'); se90 = strel('line', 4, 90); se0 = strel('line', 4, 0); seD = strel('diamond',1); Ymax =size(i2,2); Xmax=size(i2,1); imblank(1:Xmax,1:Ymax) = 0; left = false; right=false; for i=1:1:60 i1=imcrop(mov(i).cdata,rect); ima=imadd(i1,i2); bw = im2bw(ima);
bw = imdilate(bw, [se90 se0]); bw = imfill(bw,'holes');
bw = imerode(bw ,seD); imed= edge(bw,'sobel'); if ~right
imtong(:,y0:Ymax)=imed(:,y0:Ymax);
if imed(x0 ,y0+r+2 )==0&imed(x0 ,y0+r+1 )==0 & imed(x0 ,y0+r )==0 right=true;
end end if ~ left
imtong(:,1:y0)=imed(:,1:y0);
if imed(x0+2,y0-r )==0 & imed(x0+2,y0-r+1 )==0 & imed(x0+2,y0-r-1 )==0 left=true;
end end
figure(1) ; imshow(imtong) if left & right
break end end s=get(handles.listbox1,'String'); s=strvcat(s,'Đã kẹp được vật'); set(handles.listbox1,'String',s);
% --- Executes on button press in cmdLeft.
function cmdLeft_Callback(hObject, eventdata, handles) frameLeft=handles.frameLeft+3;
frameRight=handles.frameRight;
dk(hObject, eventdata, handles,frameLeft,frameRight);
% --- Executes on button press in cmdRight.
function cmdRight_Callback(hObject, eventdata, handles) frameLeft=handles.frameLeft;
frameRight=handles.frameRight+3;
dk(hObject, eventdata, handles,frameLeft,frameRight);
% --- Executes on button press in cmdBoth.
function cmdBoth_Callback(hObject, eventdata, handles) frameLeft=handles.frameLeft+3;
frameRight=handles.frameRight+3;