Académique Documents
Professionnel Documents
Culture Documents
DE ROBÔS MANIPULADORES
Project of a programming language for robots manipulators
Abstract: This article presents a proposal for a programming language for the
motion for a robot manipulator with three degrees of freedom. The language has
textual characteristics in Portuguese and was based on the physical structure of a
manipulator robot built by students of Control Engineering and Automation of the
FAJ.
Key-words: Compilers; programming language ; Commands.
1
1. INTRODUÇÃO
2
2. TIPOS DE LINGUAGEM DE PROGRAMAÇÃO DE ROBÔS
3
3. ESTRUTURA DA LINGUAGEM PARA PROGRAMAÇÃO DE ROBÔS
MANIPULADORES E SUAS CARACTERISTICAS
5
FECHAR: Comando associado ao servo-motor GARRA. Esse comando
permite que o motor associado faça um movimento de fechamento da garra.
6
Braço
Articulação
Punho
Articulação
Garra
Base
Articulação
7
4. COMO A LINGUAGEM DE PROGRAMAÇÃO DE ROBÔS
MANIPULADORES PODERÁ SER USADA
M2 = LEVANTAR; ABAIXAR
M3 = LEVANTAR; ABAIXAR
M4 = ABRIR; FECHAR
8
Estes comandos podem ser associados produzindo uma sequência de
movimentos. A seguir apresentamos alguns exemplos de como esses comandos
poderão ser atribuídos ao robô manipulador através de digitações de códigos
propostos pela linguagem:
GIRAR BASE 30
ABAIXAR ANTEBRACO 20
LEVANTAR ANTEBRACO 10
ABAIXAR PUNHO 40
LEVANTAR PUNHO 30
ABRIR GARRA 50
FECHAR GARRA 40
9
A figura abaixo refere-ser ao robô manipulador em seu estado inicial. Após
todas as operações em que o robô foi incumbido ele volta ao seu estado de origem e
está pronto para receber novas instruções de seu programador.
10
A figura abaixo simula que o robô tenha recebido um comando para girar sua
base. Notamos que houve um deslocamento horizontal à esquerda (olhando o robô
de frente). Obs. Essa simulação foi feita manualmente e o comando associado
refere-se a base do robô.
11
5. IMPLEMENTAÇÃO DA LINGUAGEM PARA PROGRAMAÇÃO DE ROBÔS
MANIPULADORES PROPOSTA
Na primeira etapa foi estudado sobre a análise léxica, ou seja, onde são
verificadas as sentenças de caracteres digitados pelo programador. Aqui definimos
através de algoritmos a verificação e validação dos caracteres de entradas
denominados em tokens de entrada. Foi feito a separação desses tokens e depois a
validação dos mesmos. Nota-se que o protótipo aceita que seja digitado quaisquer
termos porém, valida-os apenas os termos corretos de acordo com a sintaxe da
linguagem.
12
Figura 5 – Protótipo de um Compilador para linguagem de programação robótica
13
Esse trecho descrito acima é realizado pela função atribuída ao botão 1, que segue
abaixo:
14
Linha 6: a variável criada para armazenar a quantidade de letras recebe o
tamanho total de letras do comando digitado
Linha 8: instanciação de variável do tipo inteira para guardar a posição do
primeiro espaço em branco que for encontrado no comando de entrada digitado
Linha 9: nesse momento ocorre a divisão da primeira palavra a partir do
comando digitado, o método SubString separa a string de entrada, desde seu início
(posição 1) até a posição do espaço em branco -1. Esse conteúdo, que representa a
primeira palavra é armazenada na variável estática "palavra1" criada anteriormente
no escopo geral da aplicação.
Linha 11: instanciação de variável auxiliar do tipo AnsiString para pegar as
informações somente da segunda palavra em diante, ela é gerada a partir da
SubString da posição do primeiro espaço em branco até o final do comando de
entrada, com isso representa a segunda e terceira palavra digitada.
Linha 12: a variável que armazena a posição do espaço em branco é
novamente utilizada, mas agora medirá a posição com base na variável auxiliar
criada anteriormente, ou seja, da segunda palavra em diante ela pegará a posição
do próximo espaço em branco para divisão.
Linha 14: a segunda palavra é dividida tendo como base a variável auxiliar
pegando desde seu início (posição 1) até a ocorrência do espaço em branco - 1
Linha 15: a terceira palavra é dividida utilizando a marcação do espaço em
branco + 1 (que estará posicionado no início da terceira palavra) até o final do
comando digitado.
Linhas 17, 18 e 19: por fim, as palavras divididas são adicionadas uma a uma
na lista (ListBox1) que aparecem à direita.
Feito esse procedimento, as palavras estão prontas para seguir até a próxima
fase, a análise sintática, onde serão comparadas e o sistema retornará um resultado
dizendo se são válidas ou não.
15
7. PROCEDIMENTOS PARA A ANÁLISE SINTATICA
17
Linha 17: o comando while fará a leitura do arquivo em questão, nesse caso o
dicionário de verbos (ações do robô representadas pelo primeiro comando de
entrada), até que encontre o seu fim (!feof)
Linha 19: com a leitura até o final do arquivo o comando fgets realiza a
captação dos dados linha a linha armazenando os dados na variável "palavra
Dicionário" criada anteriormente, de seu tamanho "10" para o arquivo relacionado.
Linha 21: instanciação da variável booleana "igual" para verificar o retorno da
função SameText a qual compara duas palavras passadas como parâmetro e
retorna falso ou verdadeiro. Com isso, dependendo do seu retorno, o comando if
atribuirá, caso verdadeiro (palavra digitada igual a palavra da lista de verbos no
dicionário), verdadeiro para a variável (linha 23) "verboOK" indicando que os dois
textos são iguais.
Linha 27: ao final é realizado o fechamento do arquivo
18
1. if(verboOK && substantivoOK && numeralOK)
2. {
3. if(UpperCase(palavra1) == "GIRAR" && UpperCase(palavra2) == "BASE")
4. {
5. ShowMessage("Sentença válida!");
6. }
7. else if(UpperCase(palavra1) == "ABRIR" && UpperCase(palavra2) ==
"GARRA")
8. {
9. ShowMessage("Sentença válida!");
10. }
11. else if(UpperCase(palavra1) == "FECHAR" && UpperCase(palavra2) ==
"GARRA")
12. {
13. ShowMessage("Sentença válida!");
14. }
15. else if(UpperCase(palavra1) == "ABAIXAR" && UpperCase(palavra2) ==
"ANTEBRACO")
16. {
17. ShowMessage("Sentença válida!");
18. }
19. else if(UpperCase(palavra1) == "LEVANTAR" && UpperCase(palavra2)
== "ANTEBRACO")
20. {
21. ShowMessage("Sentença válida!");
22. }
23. else
24. {
25. ShowMessage("Sentença inválida!\nCorrija as associações:\n\nGIRAR
é uma comando associado somente à BASE\nABRIR e FEHCAR são comandos
associados somente à GARRA\nABAIXAR E LEVANDAR são comandos associados
somente ao ANTEBRACO");
26. }
19
27. }
20
9. DIAGRAMA USE CASE DO SOFTWARE
21
10. DIAGRAMA DFA DO SOFTWARE
11. CONCLUSÃO
22
12. REFERÊNCIAS BIBLIOGRÁFICAS
23
ANEXO – CÓDIGO FONTE DO SOFTWARE ELABORADO NO ARTIGO
#include <vcl.h>
#include<stdlib>
#include<string>
#include<cstdio>
using namespace std;
#pragma hdrstop
#include "TCC.h"
#include "Ajuda.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int qtdeLetras;
AnsiString entrada = Edit1->Text;
24
qtdeLetras = entrada.Length();
ListBox1->Items->Add(palavra1);
ListBox1->Items->Add(palavra2);
ListBox1->Items->Add(palavra3);
}
//---------------------------------------------------------------------------
FILE *dicionarioVerbos;
dicionarioVerbos = fopen("verbos.txt", "r");
if(dicionarioVerbos == NULL )
{
ShowMessage("Erro ao abrir arquivo!");
25
return;
}
else
{
while(!feof(dicionarioVerbos))
{
fgets(palavraDicionario, 10, dicionarioVerbos);
if(dicionarioSubstantivos == NULL )
{
ShowMessage("Erro ao abrir arquivo!");
return;
}
else
{
while(!feof(dicionarioSubstantivos))
{
fgets(palavraDicionario, 15, dicionarioSubstantivos);
26
Boolean igual = SameText(palavraDicionario,palavra2+"\n");
if(igual == true)
{
substantivoOK = true;
}
}
}
fclose(dicionarioSubstantivos);
//FINAL LEITURA DOS SUBSTANTIVOS E COMPARAÇÃO
27
{
ShowMessage("Sentença válida!");
}
else if(UpperCase(palavra1) == "ABAIXAR" && UpperCase(palavra2) ==
"ANTEBRACO")
{
ShowMessage("Sentença válida!");
}
else if(UpperCase(palavra1) == "LEVANTAR" && UpperCase(palavra2) ==
"ANTEBRACO")
{
ShowMessage("Sentença válida!");
}
else if(UpperCase(palavra1) == "ABAIXAR" && UpperCase(palavra2) ==
"PUNHO")
{
ShowMessage("Sentença válida!");
}
else if(UpperCase(palavra1) == "LEVANTAR" && UpperCase(palavra2) ==
"PUNHO")
{
ShowMessage("Sentença válida!");
}
else
{
ShowMessage("Sentença inválida!\nCorrija as associações:\n\nGIRAR é
uma comando associado somente à BASE\nABRIR e FECHAR são comandos
associados somente à GARRA\nABAIXAR E LEVANTAR são comandos associados
somente ao ANTEBRACO E AO PUNHO");
}
}
else
28
{
if(verboOK == false)
ShowMessage("Sentença inválida! Corrija o primeiro termo!");
if(substantivoOK == false)
ShowMessage("Sentença inválida! Corrija o segundo termo!");
if(numeralOK == false)
ShowMessage("Sentença inválida! Corrija o terceiro termo!");
}
}
//---------------------------------------------------------------------------
Edit1->Text = "";
}
//---------------------------------------------------------------------------
29