520 likes | 618 Views
DESENVOLVIMENTO DE UM MANIPULADOR COM DOIS GRAUS DE LIBERDADE CONTROLADO REMOTAMENTE VIA INTERNET. Por Alberto José Alvares Luiz Sérgio Jordão Romariz Júnior GRACO - Grupo de Automação e Controle - Engenharia Mecânica - UnB http://www.graco.unb.br/robwebcam
E N D
DESENVOLVIMENTO DE UM MANIPULADOR COM DOIS GRAUS DE LIBERDADE CONTROLADO REMOTAMENTE VIA INTERNET Por Alberto José Alvares Luiz Sérgio Jordão Romariz Júnior GRACO - Grupo de Automação e Controle - Engenharia Mecânica - UnB http://www.graco.unb.br/robwebcam alvares@graco.unb.br & luiz@graco.unb.br
Introdução -Teleoperação • Algumas Vantagens do Controle Remoto - Teleoperação: • Mover objetos a distância; • Otimizar o uso de transportes, materiais e pessoas; • Atuar em ambientes perigosos; • Minimizar os custos. • Exemplos de Aplicações na Internet - TeleRobotics: • Telerobot (Un. Western Australia - http://telerobot.mech.uwa.edu.au); • Bradford Robotic Telescope Observatory; • WebRobot - RobWebLink (http://www.graco.unb.br); • Observação do tempo nos EUA.
DESENVOLVIMENTO DE UM MANIPULADOR COM DOIS GRAUS DE LIBERDADE CONTROLADO REMOTAMENTE VIA INTERNET Por Alberto José Alvares Luiz Sérgio Jordão Romariz Júnior GRACO - Grupo de Automação e Controle - Engenharia Mecânica - UnB http://www.graco.unb.br/robwebcam alvares@graco.unb.br & luiz@graco.unb.br
Introdução -Teleoperação • Algumas Vantagens do Controle Remoto - Teleoperação: • Mover objetos a distância; • Otimizar o uso de transportes, materiais e pessoas; • Atuar em ambientes perigosos; • Minimizar os custos. • Exemplos de Aplicações na Internet - TeleRobotics: • Telerobot (Un. Western Australia - http://telerobot.mech.uwa.edu.au); • Bradford Robotic Telescope Observatory; • WebRobot - RobWebLink (http://www.graco.unb.br); • Observação do tempo nos EUA.
Arquitetura do Sistema • Concepção e implementação de um sistema para controlar remotamente um manipulador com 2 graus de liberdade; • Via de controle: Internet; • Posiciona uma câmera de vídeo para adquirir imagens e vídeo “on-line”; • Sistema RobWebCam - Robotic Web Camera.
Internet - TCP/IP • Internet e Linguagens de programação • TCP/IP; • HTML; • CGI; • JAVA. • Teleoperação
Projeto RobWebCam • Considerações de Projeto • Arquitetura aberta e de baixo custo; • Manipulador com 2 GDL; • Manipulador deverá suportar a câmera de vídeo (SunVideo ou QuickCam); • 90º - vertical, 180º - horizontal; • Acionamento por motores de passo.
Projeto RobWebCam • Manipulador • Requisitos Funcionais e Topologias;
Projeto RobWebCam • Dimensionamento da Estrutura;
Projeto RobWebCam • Dimensionamento dos Motores de Passo;
Projeto RobWebCam • Alimentação dos Motores • Transformador; • Fonte de Tensão; • Drive de Potência.
Projeto RobWebCam • Sistema Operacional LINUX: • Multiusuário e multitarefa; • Arquitetura cliente/servidor; • Protocolo TCP/IP (Internet); • Servidor de câmera de vídeo já disponível; • Ter documentação de fácil acesso; • Sistema aberto e de baixo custo; • Facilidade para acessar a porta paralela e serial; • Tem uma boa variedade de compiladores e outros tipos de programas que rodam em sua plataforma do tipo PC, Sparc, Alpha, entre outras.
Projeto RobWebCam • Captura de Vídeo e Imagem • Driver WebCam para Servidor WWW: Tecnologia Serverpush - Netscape; • Câmera SunVideo - Frame Grabber (http://serpens.enm.unb.br); • Câmera QuickCam - Connectix (http://omega.enm.unb.br). • Programas voltados para Internet • CGI - Common Gateway Interface (C++); • Java; • HTML e Servidor WWW.
Programa Interfac.c • #include <fcntl.h> • #include <unistd.h> • #include <errno.h> • #include <stdio.h> • #include <time.h> • /* class Interface versao para Linux / Unix. A classe Interface prove uma base de comunicacao para a classe Motor • controlar um motor de passo ligado a porta paralela. Esta implementacao utiliza o comando "open", e pode ser usada para acesso • a porta paralela sem acesso de ROOT. */ • class Interface { private: int porta; • public: Interface (); // construtor • ~Interface (); // destrutor • void send (int n); • void waiting (int t); }; • Interface :: Interface () • // Construtor abre o acesso a porta paralela do computador • { porta = open ("/dev/lp1",O_WRONLY|O_NONBLOCK,0); • if (porta < 0) { • printf ("Porta nao disponivel!\n"); • exit (0); }} • Interface :: ~Interface () • // Destrutor que fecha o acesso a porta paralela do computador • { close (porta); } • void Interface :: send (int n) • // Envia o inteiro n para a porta paralela • { • char cbuf = (char) n; int ibuf; • if (write (porta,&cbuf,1) != 1) { • printf ("Erro na porta."); • exit (0); }} • void Interface :: waiting (int t) • // Faz uma interrupcao de t milisegundos no sistema • { usleep (t*1000); }
Programa Motor.c • #include "c:\prog\tourino\interfac.cpp" • // Classe que define o objeto motor. Utiliza a classe Interface (interfac.cpp). espera-se que nao seja mudada para a versao Linux. • int motor1_s [4] = {0x01,0x02,0x04,0x08}, • motor2_s [4] = {0x10,0x20,0x40,0x80}, • motor1_d [4] = {0x09,0x03,0x06,0x0C}, • motor2_d [4] = {0x90,0x30,0x60,0xC0}; • class Motor { • private: • int numero,intervalo, tipo_excitacao, excitacao [4], ultima_excitacao; • float precisao; • public: • void set (int n); // define o motor usado • void precision (float p); // define a precisao do motor • void delay (int tempo); // define o intervalo entre passos • void turn (int angle); // gira angulo • void wait (int time); // espera tempo excitado • void sstep (void); // define excitacao simples • void dstep (void); // define excitacao dupla • void off (void); // desliga a excitacao do motor }; • void Motor :: set (int n) • { numero = n; if (tipo_excitacao) dstep (); else sstep (); } • void Motor :: sstep (void) • { if (numero == 0) { excitacao [0] = motor1_s [0] | motor2_s [0]; • excitacao [1] = motor1_s [1] | motor2_s [1]; • excitacao [2] = motor1_s [2] | motor2_s [2]; • excitacao [3] = motor1_s [3] | motor2_s [3]; } • if (numero == 1) { excitacao [0] = motor1_s [0]; • excitacao [1] = motor1_s [1]; • excitacao [2] = motor1_s [2]; • excitacao [3] = motor1_s [3]; } • if (numero == 2) {
Programa CGI • #include <stdio.h> • #include "interfac.C" • #include "motor.C" • #include <string.h> • #include <stdlib.h> • char nome[80] = "teste.mot"; • void Le_comanda (void) • { int inteiro; float real; • FILE *arquivo; char comando[5],parametro [5]; class Motor M; • if ((arquivo = fopen (nome,"rt")) == NULL) { puts ("Arquivo nao existe."); exit (0); } • while (fscanf (arquivo,"%s",&comando) > 0) { • if (strcmp (comando,"S") == 0) { • fscanf (arquivo,"%s",¶metro); • inteiro = atoi (parametro); M.set (inteiro); } • if (strcmp (comando,"P") == 0) { • fscanf (arquivo,"%s",¶metro); • real = atof (parametro); M.precision (real); } • if (strcmp (comando,"D") == 0) { • fscanf (arquivo,"%s",¶metro); • inteiro = atoi (parametro); M.delay (inteiro);} • if (strcmp (comando,"T") == 0) { • fscanf (arquivo,"%s",¶metro); • inteiro = atoi (parametro); M.turn (inteiro);} • if (strcmp (comando,"W") == 0) { • fscanf (arquivo,"%s",¶metro); • inteiro = atoi (parametro); • M.wait (inteiro); } • if (strcmp (comando,"SS") == 0) M.sstep (); • if (strcmp (comando,"DS") == 0) M.dstep (); • if (strcmp (comando,"O") == 0) M.off ();} • fclose (arquivo); } int main (int argc,char *argv []) { • printf("Content-type: text/plain \n\n"); • Le_comanda (); }
Avaliação do Sistema • Testes de Velocidade; • Testes de Acionamento Remoto; • Na UnB; • Fora da Rede da UnB. • Otimizações; • Funcionamento por Um Ano; • Sistema em Processo de Patenteamento.
Conclusão • Inédito no Brasil; • Apto as Aplicações Propostas; • Atendeu aos Requisitos Iniciais; • Possibilidade de Otimizações; • Várias Aplicações Possíveis; • Objetivos Alcançados; • RobWebLink - Controle de Rôbo ABB com 6GL.
Arquitetura do Sistema • Concepção e implementação de um sistema para controlar remotamente um manipulador com 2 graus de liberdade; • Via de controle: Internet; • Posiciona uma câmera de vídeo para adquirir imagens e vídeo “on-line”; • Sistema RobWebCam - Robotic Web Camera.
Internet - TCP/IP • Internet e Linguagens de programação • TCP/IP; • HTML; • CGI; • JAVA. • Teleoperação
Projeto RobWebCam • Considerações de Projeto • Arquitetura aberta e de baixo custo; • Manipulador com 2 GDL; • Manipulador deverá suportar a câmera de vídeo (SunVideo ou QuickCam); • 90º - vertical, 180º - horizontal; • Acionamento por motores de passo.
Projeto RobWebCam • Manipulador • Requisitos Funcionais e Topologias;
Projeto RobWebCam • Dimensionamento da Estrutura;
Projeto RobWebCam • Dimensionamento dos Motores de Passo;
Projeto RobWebCam • Alimentação dos Motores • Transformador; • Fonte de Tensão; • Drive de Potência.
Projeto RobWebCam • Sistema Operacional LINUX: • Multiusuário e multitarefa; • Arquitetura cliente/servidor; • Protocolo TCP/IP (Internet); • Servidor de câmera de vídeo já disponível; • Ter documentação de fácil acesso; • Sistema aberto e de baixo custo; • Facilidade para acessar a porta paralela e serial; • Tem uma boa variedade de compiladores e outros tipos de programas que rodam em sua plataforma do tipo PC, Sparc, Alpha, entre outras.
Projeto RobWebCam • Captura de Vídeo e Imagem • Driver WebCam para Servidor WWW: Tecnologia Serverpush - Netscape; • Câmera SunVideo - Frame Grabber (http://serpens.enm.unb.br); • Câmera QuickCam - Connectix (http://omega.enm.unb.br). • Programas voltados para Internet • CGI - Common Gateway Interface (C++); • Java; • HTML e Servidor WWW.
Programa Interfac.c • #include <fcntl.h> • #include <unistd.h> • #include <errno.h> • #include <stdio.h> • #include <time.h> • /* class Interface versao para Linux / Unix. A classe Interface prove uma base de comunicacao para a classe Motor • controlar um motor de passo ligado a porta paralela. Esta implementacao utiliza o comando "open", e pode ser usada para acesso • a porta paralela sem acesso de ROOT. */ • class Interface { private: int porta; • public: Interface (); // construtor • ~Interface (); // destrutor • void send (int n); • void waiting (int t); }; • Interface :: Interface () • // Construtor abre o acesso a porta paralela do computador • { porta = open ("/dev/lp1",O_WRONLY|O_NONBLOCK,0); • if (porta < 0) { • printf ("Porta nao disponivel!\n"); • exit (0); }} • Interface :: ~Interface () • // Destrutor que fecha o acesso a porta paralela do computador • { close (porta); } • void Interface :: send (int n) • // Envia o inteiro n para a porta paralela • { • char cbuf = (char) n; int ibuf; • if (write (porta,&cbuf,1) != 1) { • printf ("Erro na porta."); • exit (0); }} • void Interface :: waiting (int t) • // Faz uma interrupcao de t milisegundos no sistema • { usleep (t*1000); }
Programa Motor.c • #include "c:\prog\tourino\interfac.cpp" • // Classe que define o objeto motor. Utiliza a classe Interface (interfac.cpp). espera-se que nao seja mudada para a versao Linux. • int motor1_s [4] = {0x01,0x02,0x04,0x08}, • motor2_s [4] = {0x10,0x20,0x40,0x80}, • motor1_d [4] = {0x09,0x03,0x06,0x0C}, • motor2_d [4] = {0x90,0x30,0x60,0xC0}; • class Motor { • private: • int numero,intervalo, tipo_excitacao, excitacao [4], ultima_excitacao; • float precisao; • public: • void set (int n); // define o motor usado • void precision (float p); // define a precisao do motor • void delay (int tempo); // define o intervalo entre passos • void turn (int angle); // gira angulo • void wait (int time); // espera tempo excitado • void sstep (void); // define excitacao simples • void dstep (void); // define excitacao dupla • void off (void); // desliga a excitacao do motor }; • void Motor :: set (int n) • { numero = n; if (tipo_excitacao) dstep (); else sstep (); } • void Motor :: sstep (void) • { if (numero == 0) { excitacao [0] = motor1_s [0] | motor2_s [0]; • excitacao [1] = motor1_s [1] | motor2_s [1]; • excitacao [2] = motor1_s [2] | motor2_s [2]; • excitacao [3] = motor1_s [3] | motor2_s [3]; } • if (numero == 1) { excitacao [0] = motor1_s [0]; • excitacao [1] = motor1_s [1]; • excitacao [2] = motor1_s [2]; • excitacao [3] = motor1_s [3]; } • if (numero == 2) {
Programa CGI • #include <stdio.h> • #include "interfac.C" • #include "motor.C" • #include <string.h> • #include <stdlib.h> • char nome[80] = "teste.mot"; • void Le_comanda (void) • { int inteiro; float real; • FILE *arquivo; char comando[5],parametro [5]; class Motor M; • if ((arquivo = fopen (nome,"rt")) == NULL) { puts ("Arquivo nao existe."); exit (0); } • while (fscanf (arquivo,"%s",&comando) > 0) { • if (strcmp (comando,"S") == 0) { • fscanf (arquivo,"%s",¶metro); • inteiro = atoi (parametro); M.set (inteiro); } • if (strcmp (comando,"P") == 0) { • fscanf (arquivo,"%s",¶metro); • real = atof (parametro); M.precision (real); } • if (strcmp (comando,"D") == 0) { • fscanf (arquivo,"%s",¶metro); • inteiro = atoi (parametro); M.delay (inteiro);} • if (strcmp (comando,"T") == 0) { • fscanf (arquivo,"%s",¶metro); • inteiro = atoi (parametro); M.turn (inteiro);} • if (strcmp (comando,"W") == 0) { • fscanf (arquivo,"%s",¶metro); • inteiro = atoi (parametro); • M.wait (inteiro); } • if (strcmp (comando,"SS") == 0) M.sstep (); • if (strcmp (comando,"DS") == 0) M.dstep (); • if (strcmp (comando,"O") == 0) M.off ();} • fclose (arquivo); } int main (int argc,char *argv []) { • printf("Content-type: text/plain \n\n"); • Le_comanda (); }