Por Samuel Cavalcanti
Primeiro passo que fiz foi baixar/instalar o V-rep
Após ter baixando, assistir as seguintes vídeos aulas:
OBS: as aulas 1 mostra como usar o v-rep no linux mas caso tenha entendido aqui vai
extraia o arquivo .tar.gz e pelo terminal vá até a pasta e execute o arquivo V-rep.sh
assim: ./vrep.sh
O meu objetivo era fazer um seguidor de linha no V-rep utilizando um remote API para programa-lo em C++.
O trabalho foi divido em duas etapas:
esse em toda a sua glória é pepelão azul
Para fazer um papelão azul é simples, pois a humildade está no sangue apesar dele ser azul
Primeiro pegue um seguidor de linha padrão do v-rep
Desmonte-o, pegue apenas apenas as partes importantes: rodas, a base e sensores (apenas dois sensores)
Para fazer isso você precisa ter um certo conhecimento sobre no v-rep:
- O de separar e juntar peças: a função ungroup serve para seprar(desagrupar) e a que está mais em cima do mouse (group) serve para juntar
O Fato de que quase todas todas as peças que realmente influenciam na simulação estão INVISÍVEIS por padrão e para ver
tem que habilitar a opção: Para ter acesso a essa opção, você precisa selecionar a peça em questão e clicar duas vezes cima da peça ou clique na lupazinha no canto superior esquerdo e clique em COMMON
Pronto agora selecione o line_tracer desagrupe as peças dele e comece a deletar tudo menos a base
(Dica: a base se chama line tracer),as rodas (os dynamicJoints NADA DESSAS CADEIAS DEVERAM SER DELETADOS) e não delete também a rodinha da frente(Force_sensor e sua cadeia) com tudo devidamente deletado as coisas ficaram assim:
OBS: deletei o sensor do meio porque eu quis. Sobre dois sensores delete o que lhe covém
deixei também o graph porque ele deixa um rastro amarelo que eu acho legal :)
Se o seu ficou assim, então está quase CLAN!
Agora é necessário mais um conhecimento para fazer o mito (papelao azul) é necessário criar uma peça
do tipo cuboide, siga os passos:
Vá até a barra superior e clique em ADD >> PRIMITIVE SHAPE >> CUBOID
Depois crie um cuboide com essas dimensões:
- X = 1.5000e-01
- Y = 1.1000e-01
- Z = 5.5000e-02
Detalhe: esse e-01 significa 10 elevando a -1 , e-02 = 10^(-2) .....
e o V-rep trabalha como medida padrão o metro ou seja:
- 1.5000e-01 m é igual a 0.15 metros = 15 centímetros
- 1.1000e-01 m é igual a 0.11 metros = 11 centímetros
- 5.5000e-02 m é igual a 0.055 metros = 5.5 centímetros
Depois de criado a peça, precisamos pinta-lo, pois Papelao Azul só é Azul se estiver azul
Selecione o cuboite criado e depois clique na lupazinha de novo e logo de cara vai está
ADJUST COLOR, clique, depois vá em Ambient/Diffuse component e por fim abaixe o vemelho
e o verde para zero assim:
Para terminarmos a primeira etapa junte tudo e modifique o tamanho x e y da base :)
assista essa vídeo aula que mostra como mudar os objetos de lugar
obs: FAÇA AS PAREDES IGUAIS A DO VÍDEO
No caso você deve abaixar mais as rodas, colocar o sensores mais perto de papelão e abaixo dele
no final vai ficar assim (ou proximo disso):
Para editar a base vai precisar de mais um conhecimento de v-rep.
Selecione a base clique de novo na lupazinha depois em View/modifify geometry, ai vai aparecer a seguinte janela:
Desabilite a opção keep proportions, pois você não quer manter as proporções:
-
X= 1.5000e-01
-
Y = 1.1000e-01
-
Agora é só AGRUPAR! para juntar o corpo de papelão com a base selecione as duas peças e depois vai em:
Edit >> Gruoping\Merging >> Group selected shapes
DICA: para selecionar mais de uma peça clique com o botão esquerdo do mouse precionando shift
Deve ficar assim:
Papelão é um seguidor de linha, logo ele precisa seguir uma linha. Caso não saiba fazer uma linha linha clique aqui
Agora você sabe criar papelão e seguimentos de linha, só falta o código.
você já deve ter visto esse video
nele você aprende a configurar o cenario para um remoteAPI
como vamos usar
c++ como liguagem então >> CppRemoteAPI
após ter configurado o cenario vamos mexer no código (main.cpp)
basicamente vamos apagar tudo que não é necessário, vai ficar assim:
somenete o necessario
Dica: Ctrl + C e Ctrl + V
Antes de continuar vale dar uma resalva sobre o manual-vep
principalmente essa parte aqui
que mostra todas as funçoes do Remote API do v-rep para c++
as funções que vamos utilizar são essas:
simxGetObjectHandle
simxReadVisionSensor
simxSetJointTargetVelocity
mais um pouco de conhecimento de v-rep
para todo script imputido você tem que chamar a peça em questão
indicando que é ela que você vai pegar
OK, mais fotos:
eu sinalizei 4 peças que vamos usar: os meus dois sensores de visão e as duas juntas que no caso funciona como
se fosse os motores
no caso a função simxGetObjectHandle serve para isso, pegar um objeto da cena
(OBS: existe uma serie de pre-configurações para estabelecer um remote API, MAS
como já pegamos os aquivos da aula 2 então não seŕa necessario :)
tudo começa pegando as peças
se você foi no site do v-rep e pesquisou sobre as funções que vamos usar
algo que duvido muito que você tenha feito, você vai encontrar essas sintaxes:
Para simGetObjectHandle
simxInt simxGetObjectHandle(simxInt clientID,const simxChar* objectName,simxInt* handle,simxInt operationMode)
Para simSetJointTargetVelocity
simxInt simxSetJointTargetVelocity(simxInt clientID,simxInt jointHandle,simxFloat targetVelocity,simxInt operationMode)
Para simxReadVisionSensor
simxInt simxReadVisionSensor(simxInt clientID,simxInt sensorHandle,simxUChar* detectionState,simxFloat** auxValues,simxInt** auxValuesCount,simxInt operationMode)
mais ou menos é por aqui que você desiste da vida não é mesmo ? Não mais !!
pois agora vou salvar a sua vida meu caro amigo
Vamos lá, começando pelo começo:
função simGetObjectHandle como relmente vai ficar:
simxGetObjectHandle(clientID,(const simxChar*) "A",(simxInt*) & B, (simxInt) simx_opmode_oneshot_wait
A= a Exatamente o nome da peça no V-rep!
B= é a varialvel que você declarou para representar a peça
exemplo: mo meu caso o nome da minha peça que vou pegar é a LeftSensor (pontinho preto)
e o nome que pretendo colocar é sensor_esquerdo como ficaria....
simxGetObjectHandle(clientID,(const simxChar*) "LeftSensor",(simxInt*) &sensor_esquerdo, (simxInt) simx_opmode_oneshot_wait
LEMBREM-SE DE DECLARAR A VARIAVEL QUE VAI RECERBER A PEÇA COMO TIPO int
ex: int sensor_esquerdo;
Detalhe importante: esse simxInt clientID = clientID (PARA QUEM PEGOU OS ARQUVOS DA AULA 2!)
Digamos que você foi um um bom garoto(a) e assim que leu isso escreveu 4 simxGetObjectHandle
pegando as 4 peças que vamos utilizar,então vamos prosseguir
na aula 2 o nosso amigo cria uma if
fazendo a seguinte pergunta:
ao executar a função simxGetObjectHandle deu ruim ?
se sim, então escrever tal objeto não encotrado
se não, escrever objeto encontrado
vamos utilizar a mesma abordagem, damos um ctrl + c e ctrl + v nisso
mudando é claro o nome para as nossas peças
após aprender a inicializar os motores(dynamileftjoint e dynamicrightjoint) e sensores com
simxGetObjectHandle, temos que aprender a setar a velocidade do papelao e fazer ele identificar
a linha
Para fazer o papelão enxergar vamos usar a função simxReadVisionSensor
mas antes precisamos de mais um conhecimento de v-rep, voltado a remotes APIs
simxInt, simxChar, simxFloat são variaveis do proprio v-rep que muitas vezes precisamos declara-las
ok, vamos continuar ao ler a função simxInt simxReadVisionSensor de novo:
simxInt simxReadVisionSensor(simxInt clientID,simxInt sensorHandle,simxUChar* detectionState,simxFloat** auxValues,simxInt** auxValuesCount,simxInt operationMode)
e se formos ao site e procuramos pela função simxReadVisionSensor
vamos encontrar a seguinte descrição:
(SIM, irei faze-lo ir ao site de um jeito ou de outro....)
vemos que temos que declarar ao menos 3 variaveis tipo simx são elas:
// é assim que declara elas
simxUChar* detectionState;
simxFloat* auxValues;
simxInt* auxValuesCount;
se ler a descrição, vai dizer o seguinte:
detectionState vai voltar:
-1, caso algo esteja errado
0, caso não esteja pegando nada
1, caso pegou algo
auxValues volta um vetor de 15 espaços sendo os 5 primeiros espaços para o minimo de intensidade os proximos
5 para a maxima intensidade e os restantes 5 para as intensidade media
OBS: não se preocupe caso não tenha entendido como funciona pois nem eu entendi direito :)
para detectamos que aquela é a cor preta o auxValues[11]
tem que ser menor que 0.3
ou seja:
if(auxValues[11]<0.3) == hora de virar
operationMode segundo o manual-vep e é verdade acredite
o recomendado é fazer duas chamas a primeira chamda usando o:
simx_opmode_streaming
e a segunda usando o: simx_opmode_buffer
vai ficar assim:
primeira chamada:
simxReadVisionSensor(clientID,o nome da sua variavel,NULL,NULL,NULL,simx_opmode_streaming);
isso faz como que o sensor fique streamando
obs: NULL significa nulo, ou seja isso só prepara o sensor dizendo que ta ta na hora de streamar
e a segunda chamada é a que importa ela vai ficar assim:
simxReadVisionSensor(clientID,sua_variavel,&detectionState,&auxValues,&auxValuesCount,simx_opmode_buffer);
if(auxValues[11]<0.3)
{
hora do show
}
agora só falta aprender a setar a velocidade do papelão :))
vamos usar a simxSetJointTargetVelocity
se olharmos pra sintaxe dela vemos que é algo bem simples, por isso vou acrescentar um algo a mais (:
imxSetJointTargetVelocity(simxInt clientID,simxInt jointHandle,simxFloat targetVelocity,simxInt operationMode)
vou traduzir uma coisa: simxInt jointHandle = a varialvel que você declarou
no meu caso quando eu fiz meu simxGetObjectHandle
eu colquei que meu int motor_direito = o DynamicRightJoint
logo o meu simxInt jointHandle é o motor_direito
então no meu caso o código ficou assim:
simxSetJointTargetVelocity(clientID, motor_direito, (simxFloat) velocidade_motor_direito, simx_opmode_streaming);
e esse (simxFloat) velocidade_motor_direito
?
velocidade_motor_direito
foi uma variavel tipo float que criei
e esse (simxFloat)
é uma função serve para converter o float em simxFloat
Agora juntando tudo escrito aqui você pode criar o papelão e executar o codigo
tem um video muito bom, vou passar o link >>Video bom<<