-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinvKinPhantom.m
More file actions
62 lines (48 loc) · 1.85 KB
/
invKinPhantom.m
File metadata and controls
62 lines (48 loc) · 1.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
%{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Cinematica inversa para robot Phantom X
Por: Maria Alejandra Arias Frontanilla
Entradas:
T: Matriz 4x4 con posición y orientación de la herramienta
l: Longitud de eslabones
Salida:
q: Matriz 2x4 con valores de las 4 articulaciones en grados.
Row 1: codo abajo
Row 2: codo arriba
[q1d q2d q3d q4d]
[q1u q2u q3u q4u]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%}
function q = invKinPhantom(T, l)
%Cálculo de la primera articulación en radianes
q(1,1) = atan2(T(2,4), T(1,4));
q(2,1) = q(1,1);
%Desacople de muñeca:
%Cálculo de la posición de la muñeca W
Pos_w = T(1:3, 4) - l(4)*T(1:3, 3)
%Solución de mecanismo 2R para q2 y q3
h = Pos_w(3) - l(1)
r = sqrt(Pos_w(1)^2 + Pos_w(2)^2)
D = (r^2+h^2-l(2)^2-l(3)^2)/(2*l(2)*l(3))
% Codo abajo:
%Tercera articulación en radianes
q(1,3) = acos((r^2+h^2-l(2)^2-l(3)^2)/(2*l(2)*l(3)));
%Segunda articulación en radianes sin offset
q(1,2) = atan2(h,r) - atan2(l(3)*sin(q(1,3)), l(2)+l(3)*cos(q(1,3)));
%Teniendo en cuenta offset en la segunda articulación
q(1,2) = q(1,2) - pi/2;
%Codo arriba:
% %Tercera articulación en radianes: negativo de codo abajo para q3
q(2,3) = -q(1,3);
%Segunda articulación en radianes sin offset
q(2,2) = atan2(h,r) + atan2(l(3)*sin(q(1,3)), l(2)+l(3)*cos(q(1,3)));
%Teniendo en cuenta offset en la segunda articulación
q(2,2) = q(2,2) - pi/2;
%Obtención de valor de cuarta articulación usando vector |a| de T
phi = atan2(T(3,3), sqrt(T(1,3)^2 +T(2,3)^2)) - pi/2;
q(1,4) = phi - q(1,2) -q(1,3);
q(2,4) = phi - q(2,2) -q(2,3);
if ~isreal(q(1,3))
q(:,:) = NaN;
end
end