Exercício 3: Manipulador 3R. SIMULAÇÃO VIA SOFTWARE do Espaço de trabalho no plano X-Y.
O aluno deverá alterar o código apresentado para o manipulador
e adaptá-lo para um manipulador 3R. As equações de
e
(posição do efetuador final) foram encontradas no Exercício 2 desta atividade, pelo método geométrico. Os seguintes dados devem ser utilizados:
- Comprimento elo 1: L1 = 12 (u.a.)
- Comprimento elo 2: L2
(u.a.)
- Comprimento elo 3: L3 = 7 (u.a.)
Possibilidades de valores dos ângulos de juntas:
- Theta1: de 0 a
- Theta2: de 0 a
- Theta3: de 0 a
Sugestão: o aluno deverá programar primeiramente o código do exemplo para um manipulador 2R (Exercício 1) para ter certeza que seu código está validado e, só depois, abrir um novo arquivo e programar o 3R.
Passo 1
O que o enunciado pede e quais são os dados fornecidos.
- Pedida: adaptar o código de um manipulador planar 2R para um manipulador planar 3R e simular (computar e desenhar) o espaço de trabalho no plano
do efetuador final. - Dados (pegados do enunciado):
- Comprimentos:
(u.a.), (u.a.), (u.a.). - Limites dos ângulos das juntas:
-
varia de a . -
varia de a . -
varia de a .
-
- Comprimentos:
- O objetivo prático para a prova: gerar um conjunto de pontos
alcançáveis pelo efetuador e exibir graficamente o espaço de trabalho (por exemplo, um scatter plot ou imagem preenchida).
Observação: nada mais é necessário do enunciado (não há figura faltando). Vou agora mostrar passo a passo como obter as fórmulas e como transformar isso em código que você pode executar (por exemplo em MATLAB/Octave).
Passo 2
Equações de cinemática direta (forward kinematics) do manipulador 3R — dedução geométrica, com explicação didática.
- Ideia geométrica simples: cada elo contribui com um vetor no plano. A posição do efetuador é a soma vetorial dos três elos apontando nas direções dadas pelos ângulos acumulados.
- Se as juntas são rotacionais em série, o ângulo absoluto do segundo elo é
e o do terceiro é . - Portanto a coordenada
do efetuador é a soma das projeções horizontais dos três elos e a coordenada é a soma das projeções verticais:
- Explicação das variáveis:
-
são os comprimentos dos elos (unidades arbitrárias). -
são os ângulos das juntas, medidos em radianos ao usar funções trigonométricas no código. - A função
e retornam as projeções do comprimento do elo ao longo dos eixos e , respectivamente.
-
- Observação prática: no código costuma-se trabalhar com graus no laço de varredura por ser mais intuitivo, mas ao calcular
e é preciso converter para radianos usando a relação .
Passo 3
Como discretizar os ângulos (amostragem) e trade-offs (resolução vs tempo/memória).
- Escolha de passo padrão:
é uma boa resolução para visualizar bem o espaço de trabalho, porém gera muitos pontos: número de combinações para é , idem para , e para com graus é . Produto: pontos — pesado, mas geralmente aceitável em máquinas modernas. - Reduzir o passo para
dá ~187k pontos (bem mais rápido). Se a memória for um problema, use ou . - Estratégia prática: começar com passo maior (por exemplo
) para validar o código e depois refinar para se precisar de maior resolução. - Importante: use vetorização quando possível ou elimine pontos duplicados (por exemplo arredondar e aplicar
unique) antes de plotar — isso reduz custo de plotagem.
Passo 4
Algoritmo passo a passo para gerar e desenhar o espaço de trabalho (forma imperativa fácil de acompanhar).
- Definir
. - Definir vetores de ângulo em graus:
de a com passo escolhido, de a , de a . - Converter esses vetores para radianos:
. - Fazer laços aninhados (ou usar
) para gerar todas as combinações . - Para cada tripla, calcular
e usando as fórmulas do Passo 2. - Acumular os pontos
num array. - Opcional: arredondar os pontos a um número razoável de casas (ex.: 4 casas decimais) e eliminar duplicatas.
- Plotar os pontos com
plot/scatterusandoaxis equalpara visualizar corretamente as distâncias. - (Opcional) Desenhar também o contorno (convex hull) ou algumas configurações do manipulador para validação visual.
Passo 5
Dicas práticas de implementação e validação (truques que facilitam muito na prova ou tarefa prática).
- Validação incremental: primeiro faça o código com
(caso 2R). Se o resultado bater com o seu exercício anterior 2R, então reative para 3R. - Para economizar memória, não armazene todos os pontos com muita precisão: arredonde e aplique
unique. - Se for usar laços triplos (mais simples de entender), use pré-alocação do array ou escreva os pontos em uma matriz grande com índice incremental — evita alocação dinâmica lenta.
- Se desejar velocidade: usar
ndgrid+ operações element-wise e depois transformar em vetor (com(:)) é bastante rápido em MATLAB/Octave. - Para plotagem fina: usar
'MarkerSize',1e'.'para scatter; para preencher o interior do workspace pode-se usarscatter+convhullou técnicas de imagem binária.
Passo 6
Um exemplo de como desenhar uma configuração do manipulador (para testar se as fórmulas estão corretas).
- Dados
(em rad): - Ponto da junta 0 (base):
. - Ponto da junta 1:
. - Ponto da junta 2:
. - Efetuador
.
- Ponto da junta 0 (base):
- Para visualizar: plotar linhas entre
e marcar as juntas com círculos. Isso confirma geometricamente que a cinemática direta está correta.
Passo 7
Avisos finais e sugestões de parâmetros para a prova/tarefa.
- Comece com passo
para depurar. Se tudo certo, rode com para o resultado final. - Se precisar entregar uma figura limpa, salve a imagem com
print -dpngousaveas. - Se o computador ficar lento ao plotar 1,5M pontos, reduza o marcador ou aplique
uniquepara remover pontos repetidos.
Resposta
% Código MATLAB/Octave para calcular e desenhar o espaço de trabalho do manipulador 3R
% (Ajuste “step_deg” para controlar resolução: 1 = fino, 2 = mais rápido)
L1 = 12;
L2 = 9;
L3 = 7;
% (Ajuste “step_deg” para controlar resolução: 1 = fino, 2 = mais rápido)
L1 = 12;
L2 = 9;
L3 = 7;
% resolução em graus (mude para 1, 2, 3 conforme necessidade)
step_deg = 1;
step_deg = 1;
t1_deg = 0:step_deg:90;
t2_deg = 0:step_deg:90;
t3_deg = 0:step_deg:180;
t2_deg = 0:step_deg:90;
t3_deg = 0:step_deg:180;
% converter para radianos
deg2rad = pi/180;
t1 = t1_deg * deg2rad;
t2 = t2_deg * deg2rad;
t3 = t3_deg * deg2rad;
deg2rad = pi/180;
t1 = t1_deg * deg2rad;
t2 = t2_deg * deg2rad;
t3 = t3_deg * deg2rad;
% Método vetorizado com ndgrid (mais rápido que loops aninhados em MATLAB)
[T1, T2, T3] = ndgrid(t1, t2, t3);
[T1, T2, T3] = ndgrid(t1, t2, t3);
% calcular coordenadas X e Y usando as fórmulas da cinemática direta
Xall = L1cos(T1) + L2cos(T1 + T2) + L3cos(T1 + T2 + T3);
Yall = L1sin(T1) + L2sin(T1 + T2) + L3sin(T1 + T2 + T3);
Xall = L1cos(T1) + L2cos(T1 + T2) + L3cos(T1 + T2 + T3);
Yall = L1sin(T1) + L2sin(T1 + T2) + L3sin(T1 + T2 + T3);
% transformar em vetores coluna
Xvec = Xall(😃;
Yvec = Yall(😃;
Xvec = Xall(😃;
Yvec = Yall(😃;
% reduzir duplicatas: arredondar para evitar diferenças numéricas muito pequenas
pts = unique(round([Xvec, Yvec], 4), ‘rows’);
pts = unique(round([Xvec, Yvec], 4), ‘rows’);
% plot do espaço de trabalho
figure(‘Color’,‘w’);
plot(pts(:,1), pts(:,2), ‘.’, ‘MarkerSize’, 1);
axis equal;
grid on;
xlabel(‘X (u.a.)’);
ylabel(‘Y (u.a.)’);
title(sprintf(‘Espaço de trabalho 3R (L = [%d, %d, %d], passo = %d^\circ)’, L1, L2, L3, step_deg));
figure(‘Color’,‘w’);
plot(pts(:,1), pts(:,2), ‘.’, ‘MarkerSize’, 1);
axis equal;
grid on;
xlabel(‘X (u.a.)’);
ylabel(‘Y (u.a.)’);
title(sprintf(‘Espaço de trabalho 3R (L = [%d, %d, %d], passo = %d^\circ)’, L1, L2, L3, step_deg));
% Opcional: desenhar algumas configurações do manipulador para checar geometria
% escolha algumas triplas de ângulos para visualizar
sample_angles_deg = [0 0 0; 45 45 90; 90 0 180]; % cada linha: [t1 t2 t3] em graus
hold on;
for k = 1:size(sample_angles_deg,1)
th = sample_angles_deg(k,:) * deg2rad;
p0 = [0,0];
p1 = p0 + [L1cos(th(1)), L1sin(th(1))];
p2 = p1 + [L2cos(th(1)+th(2)), L2sin(th(1)+th(2))];
p3 = p2 + [L3cos(th(1)+th(2)+th(3)), L3sin(th(1)+th(2)+th(3))];
plot([p0(1) p1(1) p2(1) p3(1)], [p0(2) p1(2) p2(2) p3(2)], ‘-o’, ‘LineWidth’, 1.2, ‘MarkerSize’, 4);
end
legend({‘Pontos do espaço de trabalho’,‘Configurações exemplo’}, ‘Location’, ‘bestoutside’);
hold off;
% escolha algumas triplas de ângulos para visualizar
sample_angles_deg = [0 0 0; 45 45 90; 90 0 180]; % cada linha: [t1 t2 t3] em graus
hold on;
for k = 1:size(sample_angles_deg,1)
th = sample_angles_deg(k,:) * deg2rad;
p0 = [0,0];
p1 = p0 + [L1cos(th(1)), L1sin(th(1))];
p2 = p1 + [L2cos(th(1)+th(2)), L2sin(th(1)+th(2))];
p3 = p2 + [L3cos(th(1)+th(2)+th(3)), L3sin(th(1)+th(2)+th(3))];
plot([p0(1) p1(1) p2(1) p3(1)], [p0(2) p1(2) p2(2) p3(2)], ‘-o’, ‘LineWidth’, 1.2, ‘MarkerSize’, 4);
end
legend({‘Pontos do espaço de trabalho’,‘Configurações exemplo’}, ‘Location’, ‘bestoutside’);
hold off;