................................................................... 42
Figura 14: Resumo da arquitetura bsica ................................................................. 42
Figura 15: Campo de viso alcanado pelo Kinect ................................................. 43
Figura 16: Holograma projetado pelo Kinect para leitura de profundidade. ............ 44
Figura 17: Mtodo de identificao 3D por luz estruturada. ...................................... 44
Figura 18: Arquitetura da API OpenNI ....................................................................... 47
Figura 19: Arquitetura montada para identificao dos comandos de comunicao do
controlador ED-MK4 com o RoboTalk . ................................................................ 49
Figura 20: Cdigo de comunicao serial do MATLAB com o ED-MK4 .................... 51
Figura 21: Cdigo de insero do comando "0D" no final de cada instruo de
execuo. .................................................................................................................. 52
Figura 22: Cdigo de recebimento de dados serial via Matlab .................................. 52
Figura 23: Representao vetorial das juntas do rob ED-7220C ............................ 53
Figura 24: Configurao dos parmetros de D-H na Robotics Toolbox .................... 54
Figura 25: Representao grfica do rob ED-7220C via Robotics Toolbox ............ 55
Figura 26: rea de trabalho definida no laboratrio de robtica para execuo de
testes ......................................................................................................................... 56
Figura 27: Cenrio de testes completo ...................................................................... 57
Figura 28: Cdigo de captura da imagem RGB e matriz de profundidade. ............... 57
Figura 29: Distancia do Kinect at rea de trabalho do rob .................................. 58
Figura 30: Pr-processamento da imagem vista pelo Kinect .................................. 59
Figura 31: Comando para corte da figura RGB e de profundidade via Matlab ....... 60
Figura 32: Cdigo que efetua o espelhamento da imagem RGB e o da matriz de
profundidade. ............................................................................................................ 61
Figura 33: Cdigo de identificao do objeto vermelho. ............................................ 61
Figura 34: Identificao do centride de um objeto. .................................................. 62
Figura 35: Medidas da rea de trabalho e distncia da base do rob at rea de
trabalho. .................................................................................................................... 63
Figura 36: Comprimento da rea de trabalho ............................................................ 64
Figura 37: Distancia entre o Kinect e a rea de trabalho em viso lateral. ............. 64
Figura 38: Cdigo de controle do eixo da base ......................................................... 67
Figura 39: Tela de controle de busca dos objetos. .................................................... 68
Figura 40: Script de comando para conexo via serial e transpor o sistema de
controle do ED-MK4 para modo HOST. ................................................................. 69
Figura 41: Rob virtual criado via Robotic Toolbox atravs do drivebot. ................... 70
Figura 42: Rob ED-7220C efetuado a pega do objeto. ......................................... 71
10
Figura 43: Imagem gerada pela cmera RGB do Kinect. ....................................... 72
Figura 44: Viso superior da rea de trabalho com o objeto vermelho a ser
identificado na localizao inferior. ............................................................................ 73
Figura 45: Viso superior da rea de trabalho com o objeto vermelho a ser
identificado na localizao central. ............................................................................ 74
Figura 46: Viso superior da rea de trabalho com o objeto vermelho a ser
identificado na localizao superior. .......................................................................... 74
11
SUMRIO
1 INTRODUO ................................................................................................... 12
2 FUNDAMENTAO TERICA ......................................................................... 15
2.1 ROBTICA .................................................................................................. 15
2.1.1. Robtica Industrial........................................................................................ 15
2.1.2. Classificao dos robs ............................................................................... 17
2.1.3. Modelagem Cinemtica ................................................................................ 18
2.1.4. Cinemtica direta ......................................................................................... 20
2.1.5. Cinemtica inversa ....................................................................................... 20
2.1.6. Notao de Denavit-Hartenberg ................................................................... 21
2.1.7. Nveis de Controle Robtico ......................................................................... 22
2.1.8. ED-7220C .................................................................................................. 24
2.2 ENGENHARIA REVERSA ........................................................................... 30
2.3 VISO COMPUTACIONAL .......................................................................... 32
2.3.1. Imagem Digital ............................................................................................. 33
2.3.2. Processamento de Imagem Digital............................................................... 34
2.3.3. Limiarizao (Threholding) ........................................................................... 35
2.3.4. Reconhecimento de Objetos ........................................................................ 37
2.3.5. Luz Estruturada ............................................................................................ 39
2.4. KINECT
...................................................................................................... 41
2.5 MATLAB
..................................................................................................... 45
2.6 ROBOTICS TOOLBOX ................................................................................ 46
2.7 OPENNI ....................................................................................................... 46
3 METODOLOGIA ................................................................................................. 48
3.1 ENGENHARIA REVERSA DA COMUNICAO ......................................... 48
3.2 ROBOTICS TOOLBOX ................................................................................ 53
3.3 KINECT ..................................................................................................... 55
3.4 PROCESSAMENTO DA IMAGEM ............................................................... 59
3.5 REFERENCIA DO PONTO DE VISO ........................................................ 63
3.6 CONTROLE DO ROB ED-7220C ........................................................... 66
4 RESULTADOS E DISCUSSES ........................................................................ 69
4.1 COMUNICAO SERIAL ............................................................................ 69
4.2 ROBOTICS TOOLBOX ................................................................................ 70
4.3 RECONHECIMENTO DO OBJETO ............................................................. 71
5 CONCLUSO ..................................................................................................... 76
6 REFERNCIAS .................................................................................................. 77
ANEXOS ................................................................................................................... 80
12
1 INTRODUO
A disciplina de robtica tem o objetivo de prover o conhecimento no
desenvolvimento e anlise de modelos de robs industriais e a programao de
robs manipuladores, com esse intuito a Faculdade Assis Gurgacz disponibiliza em
seu laboratrio de robtica um rob didtico, porm esse rob didtico desenvolvido
pela empresa coreana ED-Laboratory fornece um software proprietrio para
controle, simulao e testes, tendo limitadas opes de integrao a outros meios de
controle via software, impedindo assim a interao do rob a projetos criados em
diversas outras disciplinas correlatas.
Esse impedimento estende-se tambm a prpria disciplina de robtica, onde o
ensino da interao do rob com o ambiente de extrema importncia,
principalmente pela concepo de utilizao de robs, onde h a necessidade de ser
flexvel na atuao em ambientes dinmicos de forma robusta e verstil mantendo-
se operacional diante de mudanas em ambientes no estruturados.
Outro problema a falta de uma plataforma que propicie desenvolvimentos
integrados entre robtica e viso computacional, onde geralmente o ensino fica
restrito a simulaes via software, impedindo assim, um modelo que poderia
potencializar a elaborao de trabalhos mais sofisticados na rea robtica e no
campo da viso computacional.
A robtica, segundo estudos realizados no Japo e EUA, deve ser uma das
10 linhas de pesquisa com mais trabalhos, a nvel mundial, nas prximas dcadas.
O avano tecnolgico tem permitido a realizao de clculos computacionais
necessrios em tempo real, e este fato tem possibilitado que novas descobertas e
aplicaes possam ser feitas em sistemas de robtica, tornando essa rea uma
fonte quase que inesgotvel de pesquisa.
13
Nesse contexto surge a necessidade de ambientes de testes e simulao
onde as ferramentas propiciem potencializar o conhecimento e a difuso da
pesquisa no mbito da robtica, principalmente pelo fato de reas como a da
inteligncia artificial, sistema de controles avanados, sensores e atuadores,
controle de processo, programao, redes, micro controladores, identificao de
sistemas, entre outras, possam unir-se para como foi dito anteriormente propiciar
trabalhos mais sofisticados.
Para permitir a utilizao desse trabalho para futuros projetos, sero
disponibilizados comandos via MATLAB
enquanto sensor (sendo este um sensor por sistema de viso computacional
comercializado como controle para videogames pela empresa Microsoft
), pois para
referenciar um rob, so utilizados inmeros sensores que em ambientes no
estruturados podem no ser efetivos, e que o Kinect pelo sensoriamento de
profundidade um passo alm dos sistemas de viso computacional que tem esta
restrio.
Com isso, o tema escolhido para esse trabalho, baseia-se na grande
relevncia tanto para o ambiente industrial como acadmico na atual conjuntura
mundial.
O trabalho tem como objetivo desenvolver um sistema que controle o rob
didtico ED-7220C atravs do software MATLAB
efetuando o reconhecimento de
objetos de forma referenciada a partir do Kinect
onde o objetivo do
produto fazer com que o jogador seja capaz de controlar os jogos apenas como o
prprio corpo.
O Kinect
que esta interface no est criptografada [14], fato que facilitou desde o incio sua
utilizao fora do XBOX.
42
Fonte [17]
Figura 12: Arquitetura bsica do Kinect
O Kinect
a possibilidade de
execuo de arquivos texto contendo uma seqncia de instrues definidas pelo
usurio. Esses arquivos texto, que tm extenso '.m', podem ser criados e editados
dentro ou fora do seu ambiente [20].
46
2.6 ROBOTICS TOOLBOX
A Robotics Toolbox uma ferramenta computacional de modelagem e
controle de robs industriais desenvolvida por Peter Corke e disponvel sob licena
LGPL.
A Robotics Toolbox proporciona muitas funes teis para o estudo e
simulao com brao robtico, por exemplo, cinemtica, dinmica e gerao de
trajetria. O Toolbox baseado em um mtodo generalista para representar a
cinemtica e a dinmica dos elos dos manipuladores.
Estes parmetros so encapsulados em objetos no MATLAB, onde o objeto
rob pode ser criado pelo usurio para representar qualquer elo do manipulador,
sendo tambm fornecida uma srie de exemplos para estudo de robs, como o
Puma 560 e o brao de Stanford, entre outros. O Toolbox tambm fornece funes
para a manipulao e converso entre tipos de dados, tais como vetores,
transformaes homogneas e unidades geomtricas que so necessrios para
representao tridimensional tanto para a posio quanto orientao [21].
2.7 OPENNI
OpenNI (Interao Natural Open) uma multi-linguagem, framework multi-
plataforma que define APIs (Interface de Programao de Aplicativos) para escrever
aplicaes utilizando Interao Natural.
O principal objetivo do OpenNI formar uma API padro que permite a
integrao de diversos sensores, entre eles os de audio e de viso. Com esse
framework possivel efetuar a integrao com o Matlab
poderosa ferramenta
APLICAO pode ser substituido por MATLAB
Fonte [
framework possivel efetuar a integrao com o Matlab
oderosa ferramenta
Na Figura
APLICAO pode ser substituido por MATLAB
Fonte [22]
framework possivel efetuar a integrao com o Matlab
oderosa ferramenta para controle de sistemas roboticos.
Na Figura 17 demostrado a arquitetura bsica da API, onde a informao de
APLICAO pode ser substituido por MATLAB
framework possivel efetuar a integrao com o Matlab
para controle de sistemas roboticos.
demostrado a arquitetura bsica da API, onde a informao de
APLICAO pode ser substituido por MATLAB
Figura 17: Arquitetura da API OpenNI
framework possivel efetuar a integrao com o Matlab
para controle de sistemas roboticos.
demostrado a arquitetura bsica da API, onde a informao de
APLICAO pode ser substituido por MATLAB
: Arquitetura da API OpenNI
framework possivel efetuar a integrao com o Matlab
para controle de sistemas roboticos.
demostrado a arquitetura bsica da API, onde a informao de
APLICAO pode ser substituido por MATLAB
.
: Arquitetura da API OpenNI
framework possivel efetuar a integrao com o Matlab
, 2008. Universidade
Federal Fluminense - UFF - Centro Tecnolgico, Niteri/RJ. Disponvel em :
<http://www.telecom.uff.br/pet/petws/downloads/apostilas/MATLAB.pdf>. Acessado
em Novembro de 2011
[21] CORKE, P., Robotics, Vision and Control: Fundamental Algorithms in
MATLAB, SPRINGER, 2011
[22] OpenNI User Guide. OpenNI organization. Disponvel em:<
http://75.98.78.94/images/stories/pdf/OpenNI_UserGuide_v4.pdf>. Acessado em
Novembro de 2011.
[23] MAIA, J. S.; SIQUEIRA, T. A. Controle remoto de um brao robtico atravs
de um navegador web. 2006. Trabalho de Concluso de Curso (Graduao em
Cincia da Computao) Departamento de Cincia da Computao. Instituto de
Ensino Superior Planalto, Braslia.
[24] SEVERINO, E. C. Joystick para Controle do Brao Mecnico ED-7220C.
2005. Trabalho de Concluso de Curso (Graduao em Engenharia da Computao)
Ncleo de Cincias Exatas e Tecnolgicas NCET. Centro Universitrio Positivo
UNICENP, Curitiba.
[25] Tutorial - KINECT + MATLAB. Disponvel em:
<https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=1q5Fg55dr
Ass4ZFQh4KLzusQZHmJ28F5fcUBQX4A_Qs_AP-qH2K01DLru1jo3&hl=pt_BR>
Acessado em: 10/04/2011.
[26] WOLF, C.; JOLION, J.-M. Model base d text detection in images and videos:
a learning approach. Laboratoire dInfoRmatique en Images et Systmes
dinformation, Palmas, TO,Maro 2004.
[27] REISS, M. L. L;TOMMSELLI A. M. G. Reconstruo 3d Por Luz Estruturada:
Calibrao Dos Vetores Diretores Dos Feixes De Padres Projetados. Artigo
Universidade Estadual Paulista UNESP SO PAULO
ANEXO
Anexo 1
Anexo 2
imagem.
%OBS: NECESSARIO EFETUAR A CONEXO COMO ROBO
%envia_comando_robo_arm('th',1,0);
%envia_comando_robo_arm('hh',0,0);
%envia_comando_robo_arm('pd,F,0',0,0)
%envia_comando_robo_arm('mc',0,0)
function
ROBO_________________________________
ANEXOS
Anexo 1 Fluxograma do trabalho proposto
xo 2 Script de controle do rob, controle do Kinect e processamento
imagem.
%OBS: NECESSARIO EFETUAR A CONEXO COMO ROBO
%envia_comando_robo_arm('th',1,0);
%envia_comando_robo_arm('hh',0,0);
%envia_comando_robo_arm('pd,F,0',0,0)
%envia_comando_robo_arm('mc',0,0)
function ScriptVisionComputerTCC_v2( viEscolha )
%% _____________________CONFIGURAO DO
ROBO_________________________________
%COMO O TOOLBOX NOVO com os dados CERRRTTTTOOOS
%%D&H Theta Di Ai Alpha R/P
L(1)=Link([0 0.37 0.02
L(2)=Link([0 0 0.22 0 0]);
L(3)=Link([0 0 0.22 0 0]);
L(4)=Link([0 0 0
L(5)=Link([0 0.080 0 0 0]);
robo = Serial
Fluxograma do trabalho proposto
Script de controle do rob, controle do Kinect e processamento
%OBS: NECESSARIO EFETUAR A CONEXO COMO ROBO
%envia_comando_robo_arm('th',1,0);
%envia_comando_robo_arm('hh',0,0);
%envia_comando_robo_arm('pd,F,0',0,0)
%envia_comando_robo_arm('mc',0,0)
ScriptVisionComputerTCC_v2( viEscolha )
%% _____________________CONFIGURAO DO
ROBO_________________________________
%COMO O TOOLBOX NOVO com os dados CERRRTTTTOOOS
%%D&H Theta Di Ai Alpha R/P
L(1)=Link([0 0.37 0.02
=Link([0 0 0.22 0 0]);
L(3)=Link([0 0 0.22 0 0]);
L(4)=Link([0 0 0
L(5)=Link([0 0.080 0 0 0]);
robo = SerialLink(L,
Fluxograma do trabalho proposto
Script de controle do rob, controle do Kinect e processamento
%OBS: NECESSARIO EFETUAR A CONEXO COMO ROBO
%envia_comando_robo_arm('th',1,0);
%envia_comando_robo_arm('hh',0,0);
%envia_comando_robo_arm('pd,F,0',0,0)
%envia_comando_robo_arm('mc',0,0)
ScriptVisionComputerTCC_v2( viEscolha )
%% _____________________CONFIGURAO DO
ROBO_________________________________
%COMO O TOOLBOX NOVO com os dados CERRRTTTTOOOS
%%D&H Theta Di Ai Alpha R/P
L(1)=Link([0 0.37 0.02
=Link([0 0 0.22 0 0]);
L(3)=Link([0 0 0.22 0 0]);
L(4)=Link([0 0 0
L(5)=Link([0 0.080 0 0 0]);
Link(L, 'name'
Fluxograma do trabalho proposto
Script de controle do rob, controle do Kinect e processamento
%OBS: NECESSARIO EFETUAR A CONEXO COMO ROBO
%envia_comando_robo_arm('th',1,0);
%envia_comando_robo_arm('hh',0,0);
%envia_comando_robo_arm('pd,F,0',0,0)
%envia_comando_robo_arm('mc',0,0)
ScriptVisionComputerTCC_v2( viEscolha )
%% _____________________CONFIGURAO DO
ROBO_________________________________
%COMO O TOOLBOX NOVO com os dados CERRRTTTTOOOS
%%D&H Theta Di Ai Alpha R/P
L(1)=Link([0 0.37 0.02
=Link([0 0 0.22 0 0]);
L(3)=Link([0 0 0.22 0 0]);
L(4)=Link([0 0 0
L(5)=Link([0 0.080 0 0 0]);
'name', 'ED7220'
Script de controle do rob, controle do Kinect e processamento
%OBS: NECESSARIO EFETUAR A CONEXO COMO ROBO
ScriptVisionComputerTCC_v2( viEscolha )
%% _____________________CONFIGURAO DO
%COMO O TOOLBOX NOVO com os dados CERRRTTTTOOOS
%%D&H Theta Di Ai Alpha R/P
L(1)=Link([0 0.37 0.02 -pi/2 0]);
=Link([0 0 0.22 0 0]);
L(3)=Link([0 0 0.22 0 0]);
L(4)=Link([0 0 0 -pi/2 0]);
L(5)=Link([0 0.080 0 0 0]);
'ED7220');
Script de controle do rob, controle do Kinect e processamento
%COMO O TOOLBOX NOVO com os dados CERRRTTTTOOOS
%%D&H Theta Di Ai Alpha R/P
pi/2 0]); %BASE
=Link([0 0 0.22 0 0]); %OMBRO
L(3)=Link([0 0 0.22 0 0]); %COTOVELO
pi/2 0]); %PUNHO
L(5)=Link([0 0.080 0 0 0]); %ROTA
Script de controle do rob, controle do Kinect e processamento
%BASE
%OMBRO
%COTOVELO
%PUNHO
OTAO
80
Script de controle do rob, controle do Kinect e processamento da
80
da
81
%% _____________________IDENTIFICAO DA
IMAGEM______________________________
% Instancia as configuraes do kinect
context =
mxNiCreateContext('C:\Users\Hamilton\Documents\kinect\kinect\Config\Samples
Config.xml');
width = 640;
height = 480;
option.adjust_view_point = true;
[rgb, depth] = mxNiImage(context, option);
%Desaloca memoria criada pelo objeto context
mxNiDeleteContext(context);
% Efetua o corte da imagem, para mapear apenas o local de interesse
vmRGB = imcrop(rgb,[303 188 31 18]);
vmDEPTH = imcrop(depth,[303 188 31 18]);
%Invertendo a imagem, espelhando no eixo X para ficar igual ao mundo
real
vmRGB_inv=vmRGB;
[a b c]=size(vmRGB_inv);
for i=1:b
vmRGB_inv(:,i,:)=vmRGB(:,b-i+1,:);
end
vmDEPTH_inv=vmDEPTH;
[a b c]=size(vmDEPTH_inv);
for i=1:b
vmDEPTH_inv(:,i,:)=vmDEPTH(:,b-i+1,:);
end
%% _______________PARA INDETIFICAR O OBJETO DE COR
VERMELHA__________________
if(viEscolha == 1)
disp('Objeto VERMELHO a ser identificado, aguarde...');
voObjetoVermelho = imsubtract(vmRGB_inv(:,:,1),
rgb2gray(vmRGB_inv));
t = graythresh(voObjetoVermelho);
% IM2BW - Converter imagem a imagem binria, com base no limite
bw = im2bw(voObjetoVermelho,t*0.9);
%Remover todos os pixels menos de 50px
voObjetoVermelho = bwareaopen(bw,50);
% Centroid - 1-por-Q vetor que especifica o centro de massa da
regio.
% Note-se que o primeiro elemento de Centroid a coordenada
% horizontal (ou coordenada x) do centro de massa, eo segundo
elemento
% a coordenada vertical (ou y-coordenada). Todos os outros
elementos
% da Centroid esto em ordem de dimenso
try
bw2 = imfill(voObjetoVermelho,'holes');
s = regionprops(bw2, 'centroid');
centroids = cat(1, s.Centroid);
catch
82
centroids = [1 1]; %Para no da error
end
viCentroide = vmDEPTH_inv(1,(round(centroids(1))))
%Caso o centroide encontrado seja 0 deslocar o centroide para
direita
%procurando um valor diferente de 0
viIncremento = 0;
if(viCentroide == 0)
while(viCentroide == 0)
viCentroide =
vmDEPTH_inv(round(centroids(2)),round(centroids(1)+viIncremento));
viIncremento = viIncremento + 1;
end
disp('Valor encontrado diferente de 0: ')
disp(viCentroide)
end
%Calculos para definir posio no eixo X do plano do Robo (MOTOR F)
%A distancia entre o kinect e a coordenada 0 do eixo X se da a
posio 2480mm
%ento:
viCoordenadaXmm = (2480 - double(viCentroide))/1000
%Calculo da coordenada Y
% 21 cm garra do centro da base
% 26 cm da base ao inicio da area de trabalho
% 41 cm da base ao termino da area de trabalho
%
% 44 cm da base nas extremidades
% 31 cm da base nas pontas internas
%
% EXEMPLO:
% 15cm - 33 pixel
% x - 29 pixel
%
% x = 13.1818
%
% 13.1818cm + 26cm = 39.1818cmm
%Convertendo pixel em metros
% 33 = COmprimento da figura em pixel
% 15 = Comprimento da area de trabalho em cm
% 26 = distancia da base ao inicio da area de trabalho
viConvYmetros = ((((round(centroids(1))*15))/33)+26)/100
viCoordenadaYmm = sqrt(0.125^2+viConvYmetros^2) %Pitagoras c^2 =
a^2+b^2
%EFETUANDO A CINEMATICA INVERSA
T = transl(double(viCoordenadaXmm),double(viCoordenadaYmm),
0.29)*trotx(0)*troty(pi)*trotz(pi/2);
qi = robo.ikine(T, [0 0 0 0 0], [1 1 1 1 1 0])
viCoordenadaMotorEParcial = (round((((3174*(qi(2)))/1.4835))))
viETeste = viCoordenadaMotorEParcial*(-1)
83
%TRATAMENTO DO MOTOR E
if(viETeste >= 160)
viCoordenadaMotorE = viCoordenadaMotorEParcial - 300
%CONVERTENDO PARA PUSOS E ENVIANDO PARA O ROBO
viCoordenadaMotorF = (round((7100*qi(1))/2.7052))
if(viCoordenadaMotorF < 0)
viCoordenadaMotorF = viCoordenadaMotorF * (-1)
end
viDistancia = 1;
end
if(viETeste >= 20 && viETeste <= 100)
viCoordenadaMotorE = viCoordenadaMotorEParcial - 900
%CONVERTENDO PARA PUSOS E ENVIANDO PARA O ROBO
viCoordenadaMotorF = (round((7100*qi(1))/2.7052))+100
if(viCoordenadaMotorF < 0)
viCoordenadaMotorF = viCoordenadaMotorF * (-1)
end
viDistancia = 2;
end
if(viETeste <= 19)
viCoordenadaMotorE = viCoordenadaMotorEParcial - 1500
%CONVERTENDO PARA PUSOS E ENVIANDO PARA O ROBO
viCoordenadaMotorF = (round((7100*qi(1))/2.7052))
if(viCoordenadaMotorF < 0)
viCoordenadaMotorF = viCoordenadaMotorF * (-1)
end
viDistancia = 3;
end
end
%% _______________PARA INDETIFICAR O OBJETO DE COR
AZUL__________________
if(viEscolha == 2)
disp('Objeto AZUL a ser identificado, aguarde...');
voObjetoAzul = imsubtract(vmRGB_inv(:,:,3), rgb2gray(vmRGB_inv));
t = graythresh(voObjetoAzul);
% IM2BW - Converter imagem a imagem binria, com base no limite
bw = im2bw(voObjetoAzul,t*0.9);
%Remover todos os pixels menos de 300px
voObjetoAzul = bwareaopen(bw,50);
% Centroid - 1-por-Q vetor que especifica o centro de massa da
regio.
% Note-se que o primeiro elemento de Centroid a coordenada
% horizontal (ou coordenada x) do centro de massa, eo segundo
elemento
% a coordenada vertical (ou y-coordenada). Todos os outros
elementos
% da Centroid esto em ordem de dimenso
84
try
bw2 = imfill(voObjetoAzul,'holes');
s = regionprops(bw2, 'centroid');
centroids = cat(1, s.Centroid);
catch
centroids = [1 1]; %Para no da error
end
viCentroide = vmDEPTH_inv(1,(round(centroids(1))))
%Caso o centroide encontrado seja 0 deslocar o centroide para
direita
%procurando um valor diferente de 0
viIncremento = 0;
if(viCentroide == 0)
while(viCentroide == 0)
viCentroide =
vmDEPTH_inv(round(centroids(2)),round(centroids(1)+viIncremento));
viIncremento = viIncremento + 1;
end
disp('Valor encontrado diferente de 0: ')
disp(viCentroide)
end
viCoordenadaXmm = (2480 - double(viCentroide))/1000
viConvYmetros = ((((round(centroids(1))*15))/33)+26)/100
viCoordenadaYmm = sqrt(0.125^2+viConvYmetros^2) %Pitagoras c^2 =
a^2+b^2
%EFETUANDO A CINEMATICA INVERSA
T = transl(double(viCoordenadaXmm),double(viCoordenadaYmm),
0.29)*trotx(0)*troty(pi)*trotz(pi/2);
qi = robo.ikine(T, [0 0 0 0 0], [1 1 1 1 1 0])
viCoordenadaMotorEParcial = (round((((3174*(qi(2)))/1.4835))))
viETeste = viCoordenadaMotorEParcial*(-1)
%TRATAMENTO DO MOTOR E
if(viETeste >= 160)
viCoordenadaMotorE = viCoordenadaMotorEParcial - 300
%CONVERTENDO PARA PUSOS E ENVIANDO PARA O ROBO
viCoordenadaMotorF = (round((7100*qi(1))/2.7052))
if(viCoordenadaMotorF < 0)
viCoordenadaMotorF = viCoordenadaMotorF * (-1)
end
viDistancia = 1;
end
if(viETeste >= 20 && viETeste <= 100)
viCoordenadaMotorE = viCoordenadaMotorEParcial - 900
%CONVERTENDO PARA PUSOS E ENVIANDO PARA O ROBO
viCoordenadaMotorF = (round((7100*qi(1))/2.7052))+100
85
if(viCoordenadaMotorF < 0)
viCoordenadaMotorF = viCoordenadaMotorF * (-1)
end
viDistancia = 2;
end
if(viETeste <= 19)
viCoordenadaMotorE = viCoordenadaMotorEParcial - 1500
%CONVERTENDO PARA PUSOS E ENVIANDO PARA O ROBO
viCoordenadaMotorF = (round((7100*qi(1))/2.7052))
if(viCoordenadaMotorF < 0)
viCoordenadaMotorF = viCoordenadaMotorF * (-1)
end
viDistancia = 3;
end
end
%% _______________TRATAMENTO DOS DADOS PARA ENVIO DO
ROBO__________________
%------ PREPARANDO POSICAO -------
envia_comando_robo_arm('pd,C,300',0,0);
pause(0.3);
envia_comando_robo_arm('pd,B,200',0,0);
pause(0.3);
envia_comando_robo_arm('pd,D,500',0,0);
pause(0.3);
envia_comando_robo_arm('mc',0,0);
pause(0.3);
envia_comando_robo_arm('go',0,0);
pause(0.3);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento C e D');
end
%MOTOR F
str1 = {'pd,F,'}; % 1 PARTE DO COMANDO
str2 = num2str(viCoordenadaMotorF); % CONVERTE VALOR PARA
TIPO NUMERICO E CRIA A 2 PARTE DO COMANDO
str_int = strcat(str1,str2); % CONCATENA AS STRINGS
str_int_char = char(str_int); % CONVERTE O STR_INT
PARA TIPO CHAR
86
envia_comando_robo_arm(str_int_char,0,0) % ENVIA COMANDO PARA A
FUNCAO DE CONTROLE DO ROBO
pause(0.3);
envia_comando_robo_arm('mc',0,0)
%Retorna a posio incial
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento F');
end
%MOTOR E
str1 = {'pd,E,'}; % 1 PARTE DO COMANDO
str2 = num2str(viCoordenadaMotorE); % CONVERTE VALOR PARA
TIPO NUMERICO E CRIA A 2 PARTE DO COMANDO
str_int = strcat(str1,str2); % CONCATENA AS STRINGS
str_int_char = char(str_int); % CONVERTE O STR_INT
PARA TIPO CHAR
envia_comando_robo_arm(str_int_char,0,0) % ENVIA COMANDO PARA A
FUNCAO DE CONTROLE DO ROBO
pause(0.3);
envia_comando_robo_arm('mc',0,0)
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento E');
end
if(viDistancia == 1)
envia_comando_robo_arm('pd,D,-400',0,0);
end
if(viDistancia == 2)
envia_comando_robo_arm('pd,D,-250',0,0);
end
if(viDistancia == 3)
envia_comando_robo_arm('pd,D,100',0,0);
end
pause(0.3);
envia_comando_robo_arm('mc',0,0);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento D');
end
pause(0.3);
envia_comando_robo_arm('gc',0,0);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
87
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino Garra');
end
%DEPOSITA OBJETO -----------------------
pause(0.3)
envia_comando_robo_arm('pd,D,800',0,0);
pause(0.3)
envia_comando_robo_arm('mc',0,0)
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento D');
end
%MOTOR F
viCoordenadaMotorF = viCoordenadaMotorF*(-1)
str1 = {'pd,F,'}; % 1 PARTE DO COMANDO
str2 = num2str(viCoordenadaMotorF); % CONVERTE VALOR PARA
TIPO NUMERICO E CRIA A 2 PARTE DO COMANDO
str_int = strcat(str1,str2); % CONCATENA AS STRINGS
str_int_char = char(str_int); % CONVERTE O STR_INT
PARA TIPO CHAR
envia_comando_robo_arm(str_int_char,0,0) % ENVIA COMANDO PARA A
FUNCAO DE CONTROLE DO ROBO
pause(0.3);
envia_comando_robo_arm('mc',0,0)
%Retorna a posio incial
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento F');
end
%MOTOR E
str1 = {'pd,E,'}; % 1 PARTE DO COMANDO
str2 = num2str(viCoordenadaMotorE); % CONVERTE VALOR PARA
TIPO NUMERICO E CRIA A 2 PARTE DO COMANDO
str_int = strcat(str1,str2); % CONCATENA AS STRINGS
str_int_char = char(str_int); % CONVERTE O STR_INT
PARA TIPO CHAR
envia_comando_robo_arm(str_int_char,0,0) % ENVIA COMANDO PARA A
FUNCAO DE CONTROLE DO ROBO
pause(0.3);
envia_comando_robo_arm('mc',0,0)
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
88
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento E');
end
if(viDistancia == 1)
envia_comando_robo_arm('pd,D,-400',0,0);
end
if(viDistancia == 2)
envia_comando_robo_arm('pd,D,-250',0,0);
end
if(viDistancia == 3)
envia_comando_robo_arm('pd,D,100',0,0);
end
pause(0.3);
envia_comando_robo_arm('mc',0,0);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento D');
end
pause(0.3);
envia_comando_robo_arm('go',0,0);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino entrega');
end
pause(0.3)
envia_comando_robo_arm('pd,D,800',0,0);
pause(0.3)
envia_comando_robo_arm('mc',0,0)
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento D');
end
%--------------------------------------------
disp('Aguarde 3 segundos...');
pause(3);
envia_comando_robo_arm('pd,F,0',0,0);
pause(0.3);
envia_comando_robo_arm('pd,E,0',0,0);
pause(0.3);
89
envia_comando_robo_arm('pd,D,0',0,0);
pause(0.3);
envia_comando_robo_arm('pd,E,0',0,0);
pause(0.3);
envia_comando_robo_arm('mc',0,0);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
while(viTerminomovimento ~= '0')
pause(0.5);
viTerminomovimento = envia_comando_robo_arm('sa',0,1);
disp('Aguardando termino do movimento D');
end
%PARA TODOS OS MOTORES
disp('Desligando os motores')
envia_comando_robo_arm('MA',0,0);
pause(0.3);
envia_comando_robo_arm('MA',0,0);
pause(0.3);
envia_comando_robo_arm('MA',0,0);
pause(0.3);
envia_comando_robo_arm('MA',0,0);
pause(0.3);
envia_comando_robo_arm('MA',0,0);
pause(0.3);
end
Anexo 3 Script de controle do ED-MK4
%Funo responsavel por envio de comandos para o robo arm ed-7220-4
%Data da ultima atualizao: 23/03/2011
%Autor: Hamilton Sena
%Curso: Engenharia de controle e Automao
%Licensa: GPL
%Foma de usar o script:
%envia_comando_robo_arm('Comando',Comunicar Serial)
%Exemplo: envia_comando_robo_arm('th',1);
%SE 1 = efetua a comunicao com a serial
%SE 0 = No efetua a comunicao serial
%infos:
% th -> Passa o robo para modo host
% hh -> Inicializa o robo
function [ viResp ] = envia_comando_robo_arm( vsComando, viStatusCom,
viLeitura )
%Se for passado o valor 1 ser efuado a conexo com a porta serial.
global voSerial;
if (viStatusCom == 1)
90
try
voSerial = serial('COM1');
%'Terminator', 'CR/LF','FlowControl','hardware'
%O flag a ser utilizado para funcionar a leitura
set(voSerial, 'BaudRate', 9600, 'Parity', 'odd', 'StopBit', 2,
'DataBits', 7, 'Timeout', 1000, 'requesttosend' ,'on', 'Terminator',
'CR/LF', 'FlowControl' ,'hardware', 'DataTerminalReady', 'off');
fopen(voSerial);
catch
disp('Erro ao abrir a COM1');
disp('Fechando COM1');
newobjs = instrfind
fclose(newobjs);
end
end
vcComandoDec=(vsComando);
vcComandoDec=dec2hex(vcComandoDec); %converte o comando para
hexadecimal
%---------------------------------------------
%Adiciona o comando D0 que representa o \r no final do comando
vcComandoDec((length(vcComandoDec)+1),1)='0';
vcComandoDec((length(vcComandoDec)),2)='D';
%---------------------------------------------
vcComandoDec2=hex2dec(vcComandoDec); %converte de hexadecimal para seu
respectivo valor em decimal
try
fwrite(voSerial,vcComandoDec2); %envia o comando para o robo
%CASO QUEIRA RECEBER A RESPOSTA DO COMANDO DESCOMENTE AS LINHAS
%ABAIXO, CASO COMANDO ENVIADO NO ENVIE RESPOSTA, O PROGRAMA FICA
%TENTANDO LER, NECESSARIO CRIAR UMA ROTINA PARA EVITAR A LEITURA DE
%COMANDOS SEM RESPOSTAS
if (viLeitura == 1)
pause(0.3);
%voSerial.BytesAvailable;
if(voSerial.BytesAvailable == 2)
resultado = fread(voSerial,1); %COMANDO EFETUADO PARA
LEITURA
%disp(hex2num(dec2hex(resultado))); %COMANDO EFETUADO
MOSTRAR LEITURA
%voSerial.BytesAvailable
%disp(resultado);
%disp(int2str(resultado(1)-48))
vsPosicao = int2str(resultado(1)-48);
viResp = vsPosicao;
end
if(voSerial.BytesAvailable == 3)
resultado = fread(voSerial,2); %COMANDO EFETUADO PARA
LEITURA
%disp(dec2hex(resultado)); %COMANDO EFETUADO MOSTRAR
LEITURA
%voSerial.BytesAvailable
if(resultado(1) == 45)
%disp(strcat('-',int2str(resultado(2)-48)))
91
vsPosicao = strcat('-',int2str(resultado(2)-48));
viResp = vsPosicao;
else
vsPosicao = strcat(int2str(resultado(1)-
48),int2str(resultado(2)-48));
viResp = vsPosicao;
end
end
if(voSerial.BytesAvailable == 4)
resultado = fread(voSerial,3); %COMANDO EFETUADO PARA
LEITURA
%disp(dec2hex(resultado)); %COMANDO EFETUADO MOSTRAR
LEITURA
%voSerial.BytesAvailable
if(resultado(1) == 45)
vsPosicao = strcat('-',int2str(resultado(2)-48),
int2str(resultado(3)-48));
viResp = vsPosicao;
else
vsPosicao = strcat(int2str(resultado(1)-
48),int2str(resultado(2)-48), int2str(resultado(3)-48));
viResp = vsPosicao;
end
end
if(voSerial.BytesAvailable == 5)
resultado = fread(voSerial,4); %COMANDO EFETUADO PARA
LEITURA
%disp(dec2hex(resultado)); %COMANDO EFETUADO MOSTRAR
LEITURA
%voSerial.BytesAvailable
%disp(resultado);
if(resultado(1) == 45)
vsPosicao = strcat('-',int2str(resultado(2)-48),
int2str(resultado(3)-48), int2str(resultado(4)-48));
viResp = vsPosicao;
else
vsPosicao = strcat(int2str(resultado(1)-
48),int2str(resultado(2)-48), int2str(resultado(3)-48),
int2str(resultado(4)-48));
viResp = vsPosicao;
end
end
if(voSerial.BytesAvailable == 6)
resultado = fread(voSerial,5); %COMANDO EFETUADO PARA
LEITURA
%disp(dec2hex(resultado)); %COMANDO EFETUADO MOSTRAR
LEITURA
%voSerial.BytesAvailable
%disp(resultado);
if(resultado(1) == 45)
vsPosicao = strcat('-',int2str(resultado(2)-48),
int2str(resultado(3)-48), int2str(resultado(4)-48), int2str(resultado(5)-
48));;
viResp = vsPosicao;
else
vsPosicao = strcat(int2str(resultado(1)-
48),int2str(resultado(2)-48), int2str(resultado(3)-48),
int2str(resultado(4)-48),int2str(resultado(5)-48));
92
viResp = vsPosicao;
end
end
if(voSerial.BytesAvailable >= 8)
resultado = fread(voSerial,7); %COMANDO EFETUADO
PARA LEITURA
viResp = vsPosicao;
%disp(resultado);
end
end
flushinput(voSerial);% Flush na serial
catch
viResp = 1; %informa que o comando deu erro
disp('OCORREU ALGUM ERRO');
end
end