Sau khi nghiên cứu lý thuyết về xử lý ảnh dùng các công cụ sẵn có của Matlab cùng với cấu tạo và nguyên lý hoạt động vi kẹp tôi đã xây dựng lên một hệ điều khiển vi kẹp. Trong phần này tôi xin trình bày về hệ thống thực nghiệm của mình.
Hộp chọn Frames Per Trigger: Hộp chọn cho ta chọn số khung ảnh có thể thu nhận trong một trigger. Giá trị này phụ thuộc vào số khung ta muốn xử lý và phụ thuộc vào tốc độ bắt ảnh của thiết bị thu ảnh. Nếu giá trị này lớn mà tốc độ bắt ảnh của thiết bị không đủ nhanh thì một số khung sẽ bị mờ.
Ví dụ ta có đoạn chương trình sau:
vid=videoinput(„winvideo‟,1,‟YUY2_160x120‟); vid.FramesPerTrigger = 9; triggerconfig(vid,‟manual‟); start(vid); trigger(vid); data=getdata(vid); for i=1:1:9 figure(i); imshow(data(:,:,i)); end
Thực hiện đoạn chương trình trên ta thu được 9 ảnh và hiển thị 9 ảnh thu được lên 9 cửa sổ khác nhau. Quan sát kết quả ta thấy cứ 1 khung rõ sẽ đến hai khung mờ. Và nếu ta lấy ảnh tại vị trí khung mờ (khung thứ 2, 3, 5, 6, 8, 9) ta sẽ không xử lý
được hoặc xử lý sẽ phạm phải những lỗi không mong muốn. (Kết quả khảo sát trên máy ảnh Canon G2 4.0 Mega pixels)
Hình 4.16 Thu 9 ảnh liên tiếp – thực hiện 1 lần trigger
Từ kết quả thực nghiệm và từ yêu cầu thực tế tôi chọn giá trị của tham số này là 1. Nghĩa là bắt một ảnh sau đó xử lý tính toán đưa ra quyết định và tiếp tục bắt ảnh tiếp theo.
Ta thay ví dụ trên bằng ví dụ sau:
vid=videoinput(„winvideo‟,1,‟YUY2_160x120‟); vid.FramesPerTrigger = 1; vid.TriggerrRepeat=9; triggerconfig(vid,‟manual‟); start(vid); for i=1:1:9 trigger(vid); data=getdata(vid); figure(i); imshow(data(:,:,1)); end
Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm
Hình 4.17 Thu 9 ảnh liên tiếp – thực hiện 9 lần trigger
Bằng cách lấy một ảnh trong một trigger ta thấy cả 10 khung đều rất rõ nét.
- Hộp chọn Logging Mode: Hộp thoại này lựa chọn mode thu nhận ảnh, hộp này có 3 giá trị là: memory, disk, disk&memory, ba giá trị này tương ứng với các cách thức thu nhận ảnh vào bộ nhớ, vào đĩa cứng hay cả bộ nhớ và đĩa cứng. Nếu ta chỉ thu nhận ảnh để xử lý thì chọn giá trị của hộp này là memory.
- Hộp chọn Trigger Type: Hộp chọn này có hai giá trị là immediate và manual
Chọn immediate thì dòng dữ liệu ảnh có thể thu được ngay khi thiết bị thu nhận ảnh được start
Chọn manual thì dòng dữ liệu ảnh chưa thể được thu được khi thiết bị thu nhận ảnh được start mà sau đó người dùng phải ra lệnh trigger.
- Hộp chọn Trigger Repeat: Hộp chọn này chọn số lần thực hiện trigger sau khi thiết bị thu nhận ảnh được start. Hết số lần trigger thiết bị thu ảnh tự động stop. Muốn thu ảnh tiếp ta phải thực hiện start lại cho thiết bị. Ngược lại số lần trigger chưa hết thì thiết bị không thể start lại trừ khi ta ra lệnh stop cho thiết bị.
- Hộp chọn Supported video formats: Hộp chọn này ban đầu chứa giá trị default. Nếu ta click vào nút lệnh Get formats thì hộp thoại này sẽ chứa các định dạng video mà
thiết bị thu ảnh có thể hỗ trợ. Khi người dùng không thao tác với hộp chọn này thì thiết bị sẽ lấy giá trị định dạng mặc định.
Sau khi lựa chọn hết các thuộc tính cho thiết bị thu ảnh ta click vào nút lệnh Setup để thực hiện thiết lập các giá trị vừa chọn cho thiết bị thu ảnh.
4.2.3. Giao tiếp giữa chương trình và mạch điều khiển vi kẹp
Trong hệ thống điều khiển vi kẹp có một mạch điện tử dùng để nhận lệnh điều khiển từ máy tính. Trong mạch này có một chip điều khiển MPS, chíp này nhận các giá trị số từ máy tính thông qua cổng nối tiếp sau đó điều khiển bộ biến đổi DA, biến đổi các giá trị số thành các giá trị điện áp tương ứng. Cụ thể bộ biến đổi DA là bộ biến đổi số tương tự 12bit, giá trị điện áp mong muốn cực đại là 5V. Giá trị điện áp cực đại là 5V tương ứng với giá trị số biến đổi là 4095 (giá trị cực đại của 12bit).
Tuy nhiên dữ liệu truyền qua cổng nối tiếp chỉ là các dữ liệu 1 byte, nghĩa là giá trị cực đại có thể đưa ra trong một lần truyền là 255. (Giá trị cực đại của 8 bit). Như vậy để có được một giá trị là 12 bit thì giữa bên phát và bên thu phải có sự thống nhất của định dạng dữ liệu truyền/nhận.
Để nhận được một giá trị số có độ lớn 12 bit thì ta phải thực hiện truyền liên tiếp 2 byte. Độ lớn dữ liệu trong khung truyền nối tiếp chọn là 8 bit (Trong hộp chọn data bit của giao diện hình 4.4 chọn là 8) . Trong đó hai bit cao nhất (bit 6,7) được dùng để nhận dạng thứ tự của giá trị truyền, 6 bit còn lại là các bit dữ liệu tương ứng với 6 bit thấp và 6 bit cao của giá trị số 12 bit cần truyền. Nếu giá trị của hai bit cao là 00 thì byte nhận được là byte thấp, và nếu giá trị của hai bit cao nhất là 11 thì byte đó là byte cao. Nếu trong quá trình truyền bị lỗi, hai bit cao nhất của byte dữ liệu bằng 01 hay 10 thì ta không nhận byte đó và phải truyền lại. Sau khi đã nhận được hai byte đúng liên tiếp nhau thì ghép hai byte đó lại thành một dữ liệu 12 bit.
Việc tách một số 12 bit thành hai số 6 bit để truyền được thực hiện như sau: Bên truyền ta chia số 12 bit cho 64 (26=64) phần nguyên sẽ là byte cao và được truyền trước, phần dư là byte thấp và được truyền sau. Bên nhận thực hiện ngược lại, khi nhận được byte cao thì thực hiện nhân với 64 sau đó cộng với byte thấp kết quả cho ra số 12bit.
ví dụ thực hiện truyền số 4000 qua cổng COM
trước tiên ta chia số 4000 thành hai phần như đã trình bày ở trên 4000 = 62*64+ 32
Như vậy byte cao được truyền đi có dạng là: 11111110 byte thấp sẽ là: 00100000
Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm
bên nhận nhận được hai byte dữ liệu trên và thực hiện việc tách hai bit cao nhất sau đó lấy 6 bit thấp của byte cao nhân với 64 (tương đương với dịch trái 6 bit) rồi cộng với 6 bit của byte thấp được giá trị là 111110100000 = 4000.
4.2.4. Kết quả của chương trình điều khiển vi kẹp
Trở lại giao diện chính của chương trình sau khi đã thiết lập cấu hình cho thiết bị thu nhận ảnh và phương thức truyền dữ liệu qua cổng COM ta có thể bắt đầu điều khiển cho tay kẹp của vi kẹp hoạt động. Trước tiên ta xác định vị trí và kích thước của vật cần kẹp bằng cách click vào nút lệnh . Đợi đến khi bên có trả lời ở của sổ bên trái những thông tin về vật, như vị trí và kích thước. Tiếp theo ta có thể điều khiển tay kẹp bằng hai cách là tự động và bằng tay. Sự lựa chọn này được thực hiện bằng cách chọn một trong hai lựa chọn hay tương ứng là tự động và bằng tay.
Hình 4.18 : Ảnh của một phần vi kẹp chụp qua kính hiển vi
Hình 4.8 ở trên chỉ là một phần của vi kẹp được chụp qua kính hiển vi. Nhìn vào hình ta thấy vật cần kẹp chỉ có thể nằm trong một giới hạn nhỏ ở phần đầu của vi kẹp. Chính vì thể mà ta cũng chỉ quan tâm đến một phần nhỏ ở phần đầu cánh tay của vi kẹp. mục đích làm giảm số điểm ảnh cần tính toán, mà vẫn đạt được kết quả mong muốn. Để thực hiện được điều đó ta dùng hàm imcrop trong công cụ của Matlab để cắt lấy một phần quan trọng nhất, phần mà ta quan tâm nhất trong toàn bộ ảnh của vi kẹp.
Quan sát kỹ hai đầu vi kẹp ta thấy chúng không đồng nhất về màu sắc, cấu tạo nên việc thu nhận ảnh, phát hiện và tách biên sẽ gặp khó khăn.
4.2.4.1. Điều khiển tay kẹp tự động
Trong chế độ điều khiển tự động bằng cách chọn lựa chọn khi ta click chuột vào nút lệnh một cửa sổ khác sẽ hiện lên
Hình 4.19. Quá trình tay kẹp tiến lại kẹp vật
Cửa sổ này cho ta giám sát quá trình chuyển động của hai tay kẹp của vi kẹp tiến lại kẹp
lấy vật. Khi hai tay kẹp này đồng thời cùng tiến đến vật (hình góc dưới bên phải) thì việc kẹp vật kết thúc.
Trong trường hợp vật nằm lệch sang một bên của tay kẹp, thì một trong hai tay kẹp sẽ đến vật trước. Nếu ta cứ tiếp tục điều khiển cho tay kẹp đó chuyển động thì sẽ đẩy vật đi cùng và kết quả thì cũng sẽ kẹp được vật khi vật khi gặp tay kẹp còn lại. Tuy nhiên cách đó không thiết thực, thay vào đó khi một bên tiếp xúc với vật mà bên còn lại chưa đến thì ta dừng việc điều khiển bên tiếp xúc lại, mà chỉ cho bên còn lại chuyển động vào mà thôi. Đến khi bên còn lại cũng tiếp xúc với vật thì dừng lại và việc điều khiển tay kẹp kẹp vật kết thúc.
Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm
4.2.4.2. Điều khiển tay kẹp bằng tay
Trong chế độ điều khiển bằng tay. Chế độ này được chọn khi người dùng chọn khi đó người dùng có thể điều khiển sự đóng mở của từng tay kẹp hoặc cả hai tay kẹp đồng thời.
Hình 4.20. Điều khiển vi kẹp trong chế độ điều khiển bằng tay
Nút lệnh bên trái : Khi người dùng click chuột vào nút này thì tay kẹp bên trái sẽ dịch chuyển về phía trong để kẹp vật.
Hình 4.21. Điều khiển tay trái của vi kẹp
Nút lệnh bên phải : Khi người dùng click chuột vào nút này thì tay kẹp bên phải sẽ dịch chuyển về phía trong để kẹp vật.
Hình 4.22. Điều khiển tay phải của vi kẹp
Nút lệnh ở giữa : Khi người dùng click chuột vào nút này thì đồng thời cả hai tay kẹp sẽ dịch chuyển về phía trong để kẹp vật.
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