Vinicius Mariano Gonçalves
Considere o robô ao lado, com uma junta rotativa e uma prismática.
Considere que quando \(q_1=0\) o eixo \(z_e\) esteja alinhado com \(x_0\).
Considere que quando \(q_2=0\) o centro do referencial \(\mathcal{F}_e\) seja o ponto \(P\).
O desenho mostra o sentido positivo de rotação/translação das duas juntas.
Calcule a cinemática direta dele para efetuador, ou seja, a MTH \(H_0^{e}(q)\).
Considere o manipulador abaixo, com três juntas rotativas.
Considere que o eixo \(x_0\) está alinhado com a linha da primeira junta, e que um deslocamento em \(z_0\) faz o centro do referencial \(\mathcal{F}_0\) ir para essa linha.
Considere também que as linhas das duas primeiras juntas são paralelas, e que a segunda e terceira linha são ortogonais.
(a) Crie os quatro referenciais de Denavit-Hartenberg.
(b) Derive os \(3 \times 4 = 12\) parâmetros.
(c) Usando esses referenciais, calcule a cinemática direta do referencial \(\mathcal{F}_0\) para o referencial do efetuator, \(\mathcal{F}_e\).
Um referencial de Denavit-Hartenberg tem que ter seu centro necessariamente dentro do elo em que está grudado? Justifique.
Podemos ter dois referenciais de Denavit-Hartenberg, para um mesmo robô, distintos que têm o mesmo centro? Justifique.
Sabemos que uma transformação entre dois referenciais genéricos exige, no mínimo 6 números.
Sabendo disso, explique o porquê da transformação entre dois referenciais de Denavit-Hartenberg necessitar de menos parâmetros (no caso, 4).
Podemos sempre garantir que o problema de cinemática inversa tem solução? Justifique.
Considere o cenário ao lado, que pode ser criado pelo código a seguir no UAIBot:
import uaibot as ub
import numpy as np
#Cria o cenário
robot = ub.Robot.create_abb_crb(ub.Utils.trn([0,0,0.2]))
texture_table = ub.Texture(
url='https://raw.githubusercontent.com/viniciusmgn/uaibot_content/master/contents/Textures/rough_metal.jpg',
wrap_s='RepeatWrapping', wrap_t='RepeatWrapping', repeat=[1, 1])
material_table = ub.MeshMaterial(texture_map=texture_table, roughness=1, metalness=1, opacity=1)
table1 = ub.Box(name="table1", htm = ub.Utils.trn([0.8,0,0.15]), width=0.5, depth=0.5, height=0.4, mesh_material=material_table)
table2 = ub.Box(name="table2", htm = ub.Utils.trn([0,-0.8,0.15]), width=0.5, depth=0.5, height=0.4, mesh_material=material_table)
table3 = ub.Box(name="table3", htm = ub.Utils.trn([0,0,0.1]), width=0.3, depth=0.3, height=0.2, mesh_material=material_table)
obstacle = ub.Box(name="obstacle", htm = ub.Utils.trn([0.8,-0.8,0.5]), width=0.6, depth=0.6, height=1, mesh_material=material_table)
material_cube = ub.MeshMaterial(roughness=1, metalness=1, opacity=1, color="purple")
cube = ub.Box(name="cube", htm = ub.Utils.trn([0.8,0,0.4]), width=0.1, depth=0.1, height=0.1, mesh_material=material_cube)
sim = ub.Simulation.create_sim_factory([robot, table1, table2, table3, obstacle, cube])
Crie um código no UAIBot para que ele pegue o bloco roxo em uma mesa e entregue na outra, sem bater nos obstáculos. O robô deve pegar e entregar o objeto por cima!
Use a cinemática inversa e interpolação linear, tal qual como neste exemplo da Aula 3.
Use a função robot.attach_object(cube) para fazer o efetuador pegar o objeto quando estiver na pose correta.
A função ikm aceita um parâmetro q0, tentando encontrar uma configuração na cinemática inversa próxima de q0. Use isso a seu favor.