Bước 1: Gắn thiết bị thu hình vào máy tính và cài đặt driver điều khiển + Gắn thiết bị thu hình vào máy tính.
+ Cài đặt driver (trình điều khiển) cho thiết bị (được cho bởi nhà sản xuất).
+ Xem thử hình ảnh video hiện trên máy tính thông qua phần mềm của nhà sản xuất. + Khởi động Matlab.
Bước 2: Chỉ định thông tin phần cứng:
Cần chỉ định cho Matlab biết phần cứng nào dùng để lấy dữ liệu (vì có thể có nhiều camera kết nối tới PC)
Gõ lệnh imaqhwinfo để biết tên các loại thiết bị có thể dùng.
>> imaqhwinfo
ans =
InstalledAdaptors: {'coreco' 'winvideo'} MATLABVersion: '7.5 (R2007b)'
ToolboxVersion: '3.0 (R2007b)'
Tên Loại thiết bị
'coreco' Thiết bị của công ty coreco
‘DCAM’ Các thiết bị dùng chuẩn IEEE 1394
‘dt’ Các thiết bị của Data Translation
‘Matrox’ Các thiết bị của hãng Matrox
‘winvideo’ Các thiết bị dùng chuẩn Windows Driver Model (WDM) hoặc Video for indows (VFW). Bao gồm các loại USB WEBCAM và camera IEEE 1394
Bảng 7.1 – Các loại thiết bị Webcam
Chỉ định thiết bị: Tùy vào loại thiết bị (adaptor name), mỗi thiết bị cùng loại gắn vào PC được đánh số ID, thiết bị thứ nhất có deviceID=1, thiết bị thứ 2 có deviceID=2,…
Để liệt kê xem loại winvideo có bao nhiêu thiết bị gắn vào máy, ta cũng dùng lệnh imaqhwinfo với đối số là winvideo. >> imaqhwinfo('winvideo') ans = AdaptorDllName: [1x81 char] AdaptorDllVersion: '3.0 (R2007b)' AdaptorName: 'winvideo' DeviceIDs: {[1]} DeviceInfo: [1x1 struct]
=> Có một thiết bị với DeviceID là 1. Ta có thể tìm hiểu thêm thông tin về thiết bị này:
>> imaqhwinfo('winvideo',1)
ans =
DefaultFormat: 'YUY2_160x120' DeviceFileSupported: 0
DeviceName: 'USB Video Device' DeviceID: 1
ObjectConstructor: 'videoinput('winvideo', 1)' SupportedFormats: {1x5 cell}
Chương 7: Xây dựng phần mềm điều khiển
Bước 3: Tạo đối tượng đại diện cho luồng dữ liệu video
Để tạo luồng dữ liệu video,dùng lệnh videoinput. Ví dụ
>> vid=videoinput(‘winvideo’,1)
Bước 4: Hiển thị luồng video trên màn hình để xem thử
Sau khi tạo biến tham chiếu luồng video (Matlab gọi là tạo đối tượng video ngõ vào), Ta có thể dùng Matlab để lấy dữ liệu từ thiết bị thu hình (thuật ngữ là “thu thập dữ liệu”). Tuy nhiên, trước khi làm việc này, bạn có thể xem trước luồng video để
chắc rằng thiết bị hoạt động tốt.
Để xem trước luồng dữ liệu video, dùng lệnh preview. Ví dụ: preview(vid)
Để kết thúc xem, dùng lệnh stoppreview. Hoặc để đóng cửa sổ preview, dùng lệnh closepreview(vid)
Bước 5: Cấu hình cho hoạt động trích hình ảnh
Một số thông số hoạt động của biến video mà t a c ó thể thay đổi như
FramesPerTrigger, ReturnedColorspace, FrameGrabInterval, FramesAcquired,…
Bước 6: Lấy dữ liệu hình ảnh
Ta tiến hành theo các bước sau để lấy dữ liệu:
+ Gọi hàm start để bắt đầu. (ví dụ : Start(vid)) . Một số thông số của biến video sẽ bị
khóa thành dạng chỉ đọc.
+ Lấy dữ liệu (hay còn gọi là thu thập dữ liệu): Tùy vào thông số TriggerType, ta có nhiều cách lấy dữ liệu.
+ Trích một ảnh từ luồng video thông qua lệnh getsnapshot.
Bước 7: Xử lý frame ảnh vừa thu được
Ta thực hiện các hàm xử lý ảnh ở trên để nhận dạng và tính toán vị trí cũng như kích thước của đối tượng màu đỏ.
Bước 8: Làm sạch bộ nhớ
Sau khi lấy dữ liệu video, ta có thể giải phóng bớt bộ nhớ bằng các lệnh sau: stop(vid)
flushdata(vid) clear vid
7.3.3 Mặt phẳng ảnh:
Cấu trúc của hệ bám mục tiêu di động gồm hai phần chính. Phần thứ nhất là phần xử
lý ảnh dựa vào chuỗi hình ảnh thu được từ webcam để nhận dạng và tính toán vị trí của
đối tượng quan tâm.
Phần thứ hai là phần điều khiển, dựa vào thông tin vị trí đối tượng nhận được trong mặt phẳng ảnh, tính toán tín hiệu điều khiển robot sao cho đối tượng di chuyển
được duy trì ở một vị trí nhất định trên mặt phẳng ảnh và ở một khoảng cách nhất
định.
Mặt phẳng ảnh là mặt phẳng có gốc nằm phía trên bên trái, trục x là trục nằm ngang, trục y là trục thẳng đứng như hình vẽ.
Hình 7.9 – Mặt phẳng ảnh
Căn cứ vào vị trí dịch chuyển của đối tượng trên mặt phẳng ảnh so với gốc toạđộ
mà ta tính toán các khả năng di chuyển của robot sao cho đối tượng nằm ở một vị trí bất kỳ trên mặt phẳng ảnh.
Chương 7: Xây dựng phần mềm điều khiển
Dựa vào toạ độ x, y của tâm đối tượng nằm trên mặt phẳng ảnh, ta sẽ biết đối
tượng đang ở bên trái hay bên phải của robot, từ đó điều khiển robot quay về phía đối
tượng.
Dựa vào số lượng pixel hay kích thước của đối tượng, ta ước chừng được khoảng cách giữa robot và đối tượng, từ đó điều khiển robot di chuyển tới hay lùi.
Hình vẽ sau mô tả các vị trí tương ứng của đối tượng trên mặt phẳng ảnh tương ứng với điều kiện di chuyển:
Hình 7.10 – Biểu diễn đối tượng di chuyển trên mặt phẳng ảnh
7.3.4 Tập lệnh điều khiển robot:
Dựa vào các kết quả nhận được, ta sẽ gửi tín hiệu điều khiển qua cổng kết nối RS232 để điều khiển robot di động bám đối tượng.
Lệnh Động cơ 1 Động cơ 2 Robot
f Tiến Tiến Đi thẳng
b Lùi Lùi Đi lùi
s Dừng Dừng Dừng lại r Tiến Lùi Rẽ phải l Lùi Tiến Rẽ trái
7.4 Giao diện điều khiển sử dụng GUI của Matlab:
Chương trình được thiết kế bằng giao diện GUI thuộc phần mềm Matlab R2007b.
Hình 7.11 – Giao diện điều khiển viết bằng Matlab
Chú thích:
Connect: Mở cổng COM, kết nối vi điều khiển với Laptop qua RS232
Disconnect: Ngắt kết nối
Manual: Chế độ điều khiển bằng tay, kiểm tra hoạt động của robot
Automatic: Bấm RUN để mở webcam, robot nhận dạng và bám theo mục tiêu màu
đỏ
Chương 8: Kết quả đạt được
CHƯƠNG 8
Kết quả đạt được
Đề tài được đánh dấu hoàn thành bằng việc thiết kế thành công robot tự hành bám
đối tượng. Robot có thể điều khiển từ xa bằng remote và có thể bám theo đối tượng màu
đỏ nằm ở trên một phần của mặt phẳng ảnh mà ta chọn.
Hình ảnh thực tế:
Hình 8.2 – Hình ảnh thực tế
Chương 8: Kết quả đạt được
Hình 8.4 – Hình ảnh thực tế
8.1 Các kết quả đạt được:
Đề tài hoàn thành với những kết quả đạt được so với yêu cầu nhiệm vụ đặt ra:
Đã phân tích tìm hiểu, lựa chọn và thi công mô hình robot tự hành với 4 bánh xe: 2 bánh xe chủ động và 2 bánh tự lượn. Mô hình gọn nhẹ và di chuyển linh hoạt.
Điều khiển bằng tay sử dụng thu phát sóng vô tuyến hoạt động ổn định, có thể điều khiển ở một khoảng cách xa.
Thiết kế robot hoạt động tốt đã đáp ứng được các yêu cầu cơ bản nhất của
robot: đi tiến, đi lùi, rẽ phải, rẽ trái.
Thi công mạch điều khiển động cơ bao gồm khối nguồn, vi điều khiển PIC16F877A và khối giao tiếp RS232. Mạch nhỏ gọn và đơn giản.
Thi công mạch công suất động cơ, mạch công suất động cơ điều khiển tốc độ
(dùng PWM) và chiều quay cho 2 động cơ công suất nhỏ độc lập. Mạch nhỏ
gọn và đơn giản, có thể thay đổi vận tốc của robot bằng remote.
Báo cáo này mô tả hệ thống robot di động bám đối tượng sử dụng công cụ xử
lý ảnh của Matlab. Robot nhận hình ảnh từ webcam tiến hành tính toán tọa
độ tâm, kích cỡ, thiết kế khối giao tiếp RS232 sử dụng GUI của Matlab. Thiết kế mạch điều khiển động cơ sử dụng PIC16F877A. Trong điều kiện ánh sáng bình thường và phông nền không quá phức tạp, hệ thống có thể phát hiện đối
tượng và điều khiển robot bám theo.
Giao diện điều khiển rõ ràng, truyền thông giữa các thiết bị ổn định.
8.2 Hạn chế:
Còn hạn chế trong thiết kế phần cứng (khung xe), phần này còn yếu nên gây khó khăn trong việc di chuyển và động cơ của robot di chuyển tốc độ
chậm do đó không đáp ứng được tốc độ của webcam của robot.
Mạch công suất chưa được cách ly với khối điều khiển, chưa có bảo vệ quá tải.
Giải thuật điều khiển động cơ là vòng hở.
Hệ thống làm việc tốt dưới điều kiện ánh sáng vừa phải, nếu môi trường có
độ sáng quá cao như ánh sáng mặt trời thì hệ làm việc rất kém do màu và độ
sáng của đối tượng luôn thay đổi khi đối tượng thay đổi hướng.
Tốc độ của robot là cốđịnh do chưa xây dựng thuật toán điều khiển tốc độ
robot phù hợp tốc độ dịch chuyển của đối tượng đang theo dõi.
Chương trình điều khiển mới được thử nghiệm trên một số môi trường nhất
định kết quả đạt được là tương đối tốt. Tuy nhiên trong xử lý ảnh vấn đề
nhiễu trong môi trường rất quan trọng do đó cần có thêm nhiều thử nghiệm nữa mới có thể đánh giá được độ tin cậy của kết quả đạt được.
Chương 8: Kết quả đạt được
8.3 Hướng khắc phục các hạn chế và phát triển đề tài:
Khắc phục các nhược điểm cụ thể của mô hình trong đề tài:
Mô hình cơ khí có thể cải tiến chắc chắn hơn, với động cơ công suất lớn hơn để
mang tải nặng.
Mạch công suất động cơ cần thêm phần lấy giá trị dòng điện hồi tiếp để bảo vệ
quá tải. Đồng thời thêm encoder để hồi tiếp tốc độ động cơ về mạch điều khiển.
Phần mềm điều khiển chỉ điều khiển vòng hở vận tốc động cơ bằng điều rộng
xung PWM nên cho đáp ứng vận tốc chưa tốt. Cần nhận tín hiệu hồi tiếp từ
encoder và dùng giải thuật điều khiển vòng kín tốc độ động cơ (như giải thuật PID).
Từ những kiến thức đã thu được trong quá trình thực hiện đề tài, mô hình robot tự hành có thể được phát triển:
Cải tiến kết cấu cơ khí để mang tải hoặc thực hiện các động tác cho ứng dụng cụ thể.
Thêm các cảm biến khác để robot hoạt động chính xác hơn.
Robot chỉ được thử nghiệm trên hệ thống có tốc độ thay đổi chậm, cần phải được thử nghiệm với hệ thống có tốc độ nhanh hơn.
Thay vì dò tìm một vùng đặc biệt trên đối tượng như màu đỏ, màu xanh v..v. Hệ thống cần được cải thiện để dò tìm đối tượng dựa vào các đặc tính kh á c trên đối tượng. Không chỉ màu sắc của đối tượng được sử dụng mà cần quan tâm đến các đặc điểm của cạnh, góc, như vậy sẽ tăng được độ tin cậy cho việc dò tìm và theo dõi đối tượng.
Phần cứng cần bổ sung thêm thuật toán tăng, giảm tốc độ theo sự thay đổi tốc
độ của đối tượng.
Robot sẽ được ứng dụng vào một số công việc cụ thể: robot tự động hút bụi trong nhà, robot lau kính trên các tòa nhà cao tầng, hay robot vận chuyển trong nhà máy…
Tài liệu tham khảo
[1] Alasdair McAndrew. An introduction to Digital Image Processing with Matlab. [2] Associate Professor Joel M. Esposito. Matlab serial communication tutorial.
http://www.usna.edu/Users/weapsys/esposito/ [3] Microchip, Datasheet PIC 16F87XA.
[4] Datasheet L298N.
[5] Quan Quach. Matlab GUI tutorial for beginners.
http://blinkdagger.com/matlab/matlab-gui-graphical-user-interface-tutorial-for- beginers [6] http://www.payitforward.edu.vn/wordpress/tutorials [7] http://www.pyroelectro.com/tutorials [8] http://www.wikipedia.com [9] http://www.picvietnam.com [10] http://www.dientuvietnam.net
Phụ lục
PHỤ LỤC A
Chương trình ñiều khiển robot
//---
// Khối ñiều khiển Robot sử dụng PIC16F877A và L298N // Ngôn ngữ: PIC C Compiler //--- #include <16F877A.h> #device *=16 #device adc=8 #FUSES NOWDT #FUSES HS #FUSES NOPUT #FUSES NOPROTECT #FUSES NODEBUG #FUSES NOBROWNOUT #FUSES NOLVP #FUSES NOCPD #FUSES NOWRT #use delay(clock=20000000) #use rs232(baud=19200,xmit=PIN_C6,rcv=PIN_C7) #use fast_io(b) #use fast_io(d) #byte portb=0x06 #byte portd=0x08 #bit RB4=portb.4 #bit RB5=portb.5 #bit RB6=portb.6 #bit RB7=portb.7 #bit RD0=portd.0 #bit RD1=portd.1 #bit RD2=portd.2
#bit RD3=portd.3 char value; void forward() { RB4=1; RB5=0; RB6=0; RB7=1; } void backward() { RB4=0; RB5=1; RB6=1; RB7=0; } void right() { RB4=1; RB5=0; RB6=1; RB7=0; } void left() { RB4=0; RB5=1; RB6=0; RB7=1; } void stop() { RB4=0;
Phụ lục RB5=0; RB6=0; RB7=0; } #int_RDA void RDA_isr(void) { value=getc(); delay_ms(10); putc(value); switch(value) { case 'f':forward();break; case 'b':backward();break; case 'r':right();break; case 'l':left();break; case 's':stop();break; } } int duty=0; int p; void main() { set_tris_b(0x00); RB4=0; RB5=0; RB6=0; RB7=0; enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); setup_timer_2(T2_DIV_BY_4,82,1); setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(duty); set_pwm2_duty(duty); while(1)
{ if((RD0==0)&&(RD1==0)&&(RD2==1)&&(RD3==1))p=1; else if((RD0==0)&&(RD1==1)&&(RD2==0)&&(RD3==0))p=2; else if((RD0==0)&&(RD1==1)&&(RD2==0)&&(RD3==1))p=3; else if((RD0==0)&&(RD1==1)&&(RD2==1)&&(RD3==0))p=4; else if((RD0==0)&&(RD1==1)&&(RD2==1)&&(RD3==1))p=5; else if((RD0==0)&&(RD1==0)&&(RD2==0)&&(RD3==1)) {duty=78; set_pwm1_duty(duty); set_pwm2_duty(duty); while((RD0==0)&&(RD1==0)&&(RD2==0)&&(RD3==1)); } else if((RD0==0)&&(RD1==0)&&(RD2==1)&&(RD3==0)) {duty=53; set_pwm1_duty(duty); set_pwm2_duty(duty); while((RD0==0)&&(RD1==0)&&(RD2==1)&&(RD3==0)); } else if((RD0==1)&&(RD1==0)&&(RD2==0)&&(RD3==0)) {duty=65; set_pwm1_duty(duty); set_pwm2_duty(duty); while((RD0==1)&&(RD1==0)&&(RD2==0)&&(RD3==0)); } switch(p) { case 1:forward();break; case 2:backward();break; case 3:right();break; case 4:left();break; case 5:stop();break; } } }
Phụ lục
PHỤ LỤC B
Chương trình giao diện GUI trong Matlab gồm chương trình xử lý ảnh và giao tiếp RS232
function varargout = test3(varargin) % TEST3 M-file for test3.fig
% TEST3, by itself, creates a new TEST3 or raises the existing % singleton*.
%
% H = TEST3 returns the handle to a new TEST3 or the handle to % the existing singleton*.
%
% TEST3('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in TEST3.M with the given input arguments. %
% TEST3('Property','Value',...) creates a new TEST3 or raises the
% existing singleton*. Starting from the left, property value pairs are % applied to the GUI before test3_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application % stop. All inputs are passed to test3_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help test3
% Last Modified by GUIDE v2.5 07-Dec-2011 15:26:01
% Begin initialization code - DO NOT EDIT gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @test3_OpeningFcn, ...
'gui_OutputFcn', @test3_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:}); end
% End initialization code - DO NOT EDIT
% --- Executes just before test3 is made visible.
function test3_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn.
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to test3 (see VARARGIN)
% Choose default command line output for test3 handles.output = hObject;
% Update handles structure guidata(hObject, handles);
IsConnect = 0; % 1 = Connect,0 = Disconnect %Declare global variable
global hand; hand = handles;
% Save data.
handles.status_com = IsConnect; guidata(hObject,handles);
% UIWAIT makes test3 wait for user response (see UIRESUME) % uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. function varargout = test3_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output;
% --- Executes on button press in connect_button.
function connect_button_Callback(hObject, eventdata, handles) % hObject handle to connect_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB