Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Considere o robot móvel disponível para esta unidade curricular. Este desloca-se num
plano horizontal por intermédio de duas rodas motrizes diferenciais e com uma terceira roda
livre para apoio.
Determinação do IP do robot:
Começa-se por descarregar e descomprimir a parta com o firmware a utilizar (disponível nos
Conteúdos da Unidade Curricular). De seguida, executa-se o programa Visual Studio Code e
abre-se a pasta descomprimida indo a File → Open Folder.
Na lista que aparece do lado esquerdo seleciona-se o ficheiro min.cpp. Nas linhas 315 e 316,
remove-se as barras inicias “//” e substitui-se os “XXXX” pelo SSID da rede wireless a utilizar
(TP-Link_28CD) na linha 315 e pela chave de acesso (49871005) na linha 316.
Feito isto, liga-se o robot ao computador com um cabo USB e compila-se e descarrega-se o
firmware clicando na seta (→) presente na barra azul presente na parte inferior do ecrã.
Começa-se por descarregar e descomprimir a pasta com o software a utilizar (disponível nos
Conteúdos da Unidade Curricular). Deve-se, depois, abrir o ficheiro com o nome PCRobot.exe.
Deve aparecer o quadro seguinte onde, no item Ports (COM & LPT), podemos ver a porta série,
neste caso a COM4:
Introduzindo-se esse valor no campo COM Port e pressionando o botão Open deveremos ter a
ligação ao robot por cabo. Antes de efetuar esta ligação deve fechar o programa Visual Studio
Code para que este liberte a porta série.
Movimentar o robot em linha reta de modo a determinar a relação entre os impulsos gerados
pelos sensores nas rodas e o deslocamento linear de cada roda (k):
1. Pressionar o botão Clear Enc para colocar a zero as somas das contagens dos
impulsos do enconder Senc 1 e Senc 2;
2. Escrever um valor para PMW 1 e PMW 2 na coluna Write (por exemplo, -30 e -30)
e pressionar Set PWM;
3. Para pôr o robot em movimento, pressionar Set State ao lado do valor 201,
colocando o robot no estado 201 onde se aplica os valores de PWM nos motores;
4. Para parar o robot, pressionar Set State ao lado do valor 200.
5. Usando os valores obtidos para Senc 1 e Senc 2, calcular a constante que relaciona
os impulsos com a distância percorrida (k):
Valores obtidos:
Senc 1: - 4473
Senc 2: - 4222
Distância percorrida pelo robot (d): 23,5 cm (medido com régua)
k i . Senc i=d
Nota: O sinal negativo apenas serve para indicar que o robot andou para trás.
Movimentar o robot apenas com velocidade angular e determinar o valor da distância entre as
rodas (b):
1. Escrever um valor para PMW 1 e PMW 2 na coluna Write (por exemplo, -30 e 30).
Pressionar Set PWM e deixar o robot fazer uma volta completa (2π radianos).
Valores obtidos:
Senc 1: - 7446
Senc 2: 6597
d1 −d 2 ( k 1 ) × ( Senc 1 ) −(k 2) ×( Senc 2)
ΔΘ = ( ¿ ) ΔΘ= (¿)
b b
Verificar que pode efetuar movimentos compostos (ou seja, em que simultaneamente
possuem translação e rotação) e, com uma só experiência, determinar os parâmetros das
alíneas anteriores (k e b).
2. Definições de variáveis:
i. Ir ao ficheiro robot.cpp e, na parte onde diz robot_t, alterar os valores apresentados nas
variáveis pulses_to_meters e wheel_dist:
k 1 +k 2 0,005254+0,005566
pulses_to_meters = = = 0,00541 cm = 0,0000541 m
2 2
wheel_dist = 12,22 cm = 0,1222 m (é o valor real de b, calculado anteriormente
[0,1207 m], medido com a régua)
ii. No ficheiro robot.h está definida a classe Robot_t e pode-se ver as variáveis associadas
ao robot, onde:
Pode-se ver os valores calculados para x, y e theta (ϴ) na tabela de variáveis presente no
programa PCRobot. Para inicializar estas
variáveis com um determinado valor,
insira o mesmo na coluna da direita e
pressione o botão Set XYϴ.
Para atuar no robot de alguma forma deve-se utilizar o código presente no ficheiro control.cpp
onde pode criar estados com as atuações pretendidas e, através do programa no computador,
colocar o robot nesse estado (ver exercício 4).
É também útil ver o código presente no procedimento real_loop, dentro do ficheiro main.cpp.
Este código é executado periodicamente, a uma frequência muito elevada, e chama os
procedimentos e funções referidas anteriormente (ver exercício 3).
Encontrar a relação média entre o valor do PWM aplicado e a velocidade linear do robot em
m/s (Kf):
i) Aplicar um determinado valor de PWM nas duas rodas e ler o valor dos impulsos
gerados em cada ciclo de 40 ms (Enc1 e Enc2 em PCRobot).
ii) Converter os valores da alínea anterior para m/s, primeiro convertendo para m/ciclo
e depois para m/s.
Enc 1 −52
m/ciclo1 = = −3 = −1300
40 40 x 10
Enc 2 −50
m/ciclo2 = = = −1250
40 40 x 10−3
m/s1
=
valor de kf, que corresponde ao declive do gráfico, é de 468 para a roda 1 e 470 para a roda 2.
Considera-se o valor médio: 469.
3.a. O ganho calculado na alínea anterior (kf) será o bloco de Feedforward da figura seguinte:
Desta forma o motor pára rapidamente devido ao atrito. Noutras situações, pode não ser o
mais adequado (por exemplo querer manter o robot parado mesmo numa descida ou subida).
i) Depois, definimos a
velocidade linear como
sendo 0,05 m/s.
No código, a velocidade linear “v” e angular “w” são convertidas em velocidades nas rodas:
Com este controlo apenas baseado no Feedforward, é possível ter velocidades ligeiramente
diferentes em cada roda e é muito fácil perturbar a velocidade de cada roda.
ii) Calcule para uma velocidade linear de 0,05 m/s qual o número de impulso por
ciclo que deve ter em cada roda.
Nas equações anteriores, substituir o “robot.v” por 0,05 e o “DISTWHEELS” por 0,1222. Como
não há velocidade angular, a velocidade nas duas rodas vai dar igual, por isso pode-se
introduzir logo no PCRobot a velocidade linear (no campo “v”) de 0,05 m/s.
Feito isto, regista-se os valores de “Enc1” e “Enc2” fornecido pelo programa após colocar o
robot em movimento com 0,05 m/s.
ii) Introduza agora um valor para o ganho, por exemplo Kp = 300. Observe o valor
obtido em regime permanente para os impulsos por ciclo para diferentes valores de
ganho. Repare que, neste robot, a diferença entre ter as rodas no ar e pousadas não
é significativa (não é sempre assim em todos os robots). Suba o ganho em passos de
300 a 500 e observe os diferentes valores em regime permanente e as oscilações
quando se passa de uma referência 0 m/s para 0.05 m/s. Quando começar a oscilar
bastante, anote o valor. Assuma um valor bastante mais baixo (seja ¼ deste valor)
para se ter uma boa margem de segurança.
iii) Altera agora a constante relacionada com a integração (K i), iniciando em 1000,
incrementando com passos de 1000 e observando a resposta a variações na
velocidade de referência em 0 m/s e 0,05 m/s. Escolha um valor que não gere sobre
elongações nem oscilações.
iv) Introduza agora novamente o valor de Kf. Observe que agora temos uma sobre
elongação forte.
4. Fazer com que o robot percorra a linha preta num único estado (100)
Num dos estados em control(.), implementar um controlador que impõe uma velocidade linear
“v” constante e uma velocidade angular “w” que varia em função da leitura dos sensores de
linha de modo que o robot consiga seguir uma linha. As leituras dos sensores (IR 1 a 5) estão
disponíveis num vetor IRLine.IR_values[0 a 4].
4.a. Começar, por exemplo, por usar apenas os dois sensores de cada extremidade e um
novo estado 100:
4.b. Aumente a velocidade linear até ao limite máximo que conseguir sem que o robot perca
a linha:
4.c. Observando os valores das leituras dos sensores repare que existe uma pequena zona na
transição entre preto e branco que o sensor dá uma leitura intermédia entre os valores de
branco e preto.
Usando este facto faça agora um controlador que use o sensor do meio e siga a borda
interior da linha:
Criar um estado 99 para apenas inicializar a posição e orientação do robot, variáveis “robot.x”,
“robot.y” e “robot.theta” no valor zero correspondente ao início da primeira reta mais longa,
ou seja estamos, a considerar que o referencial cartesiano tem o eixo x coincidente com essa
reta e a origem nesse ponto. De seguida, passar logo para o estado 100.
Acrescente mais regras de transição de estado e os respetivos estados de modo que o robot
passe para o estado 101 um pouco antes de chegar à curva, para o 102 um pouco depois de
sair da curva e assim sucessivamente. Desta forma o robot sabe sempre em que parte da pista
está. Crie também um estado final em que o robot pare sensivelmente a meio da reta inicial.
6. Equações de odometria:
Aproveitando o facto de saber em que parte da pista está o robot pode, nas retas, ter alguma
certeza sobre o ângulo e uma das coordenadas, usando os impulsos apenas para estimar a
outra coordenada. Veja o procedimento odometry e atue em conformidade.
Teste agora, em alguns estados, movimentar o robot sem usar a linha, ou seja, por exemplo
quando entrar num estado correspondente a uma curva, aplicar uma velocidade linear e
angular constantes e com um valor que leve o robô ao início da próxima reta, ignorando os
sensores de linha. Teste
a sua eficiência
tapando a linha com
uma folha.
8. Movimentar o robot para um ponto com coordenadas (x,y)
9. Utilize o procedimento da alínea anterior para navegar em zonas sem linhas ou com as
linhas interrompidas.