Các bước thu thập ảnh bằng webcam

Một phần của tài liệu Thiết kế phần cơ sở của robot tự hành (Trang 78)

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 Mt phng 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 Tp lệnh điều khin 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 khin s dng GUI ca 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 Hn 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 khc phc các hn 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 liu tham kho

[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 ñiu khin 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 din GUI trong Matlab gm chương trình xnh 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

Một phần của tài liệu Thiết kế phần cơ sở của robot tự hành (Trang 78)