机器人运动学及轨迹规划— (3) 逆运动学方程求解

       上节建立了机器人的DH参数和正运动学方程,本节对该IRB2600机器人求逆过程进行逐步推导,包括所有的运算过程和Matlab代码。        

       对于六自由度的工业机械臂,一般存在八组逆解,即机器人到达笛卡尔空间坐标系中的任意一点都存在八种姿态(在不考虑关节限位的情况下)。工业机器人的逆运动学求解,常用的有数值解和解析解,其中数值解是采用差值(最小二乘法)或逼近的方式得到的一组近似解,通常计算量较大,对于冗余自由度机器人较为适用。而一般的工业机器人在设计的时候会满足pieper准则(后三轴的轴线交于一点:腕部),这种情况下采用解析法(反变换法)来求逆通常较为简单。

       首先定义前文中相邻关节的齐次变换矩阵和变量:

syms c1 c2 c3 c4 c5 c6  s1 s2 s3 s4 s5 s6 a1 a2 a3 d1 d4 d6 nx ny nz ox oy oz ax ay az wx wy wz
T01=[c1,-s1,0,0; s1,c1,0,0; 0,0,1,d1; 0,0,0,1];
T12=[s2,c2,0,a1; 0,0,1,0; c2,-s2,0,0; 0,0,0,1];
T23=[c3,-s3,0,a2; s3,c3,0,0; 0,0,1,0; 0,0,0,1];
T34=[c4,-s4,0,a3; 0,0,1,d4; -s4,-c4,0,0; 0,0,0,1];
T45=[c5,-s5,0,0; 0,0,-1,0; s5,c5,0,0; 0,0,0,1];
T56=[c6,-s6,0,0; 0,0,1,0; -s6,-c6,0,0; 0,0,0,1];

T06=[nx,ox,ax,wx; ny,oy,ay,wy; nz,oz,az,wz; 0,0,0,1];

         然后连乘T01*T12*T23*T34*T45*T56得到一个超级长的变换矩阵,还是很容易化简的。

T01*T12*T23*T34*T45*T56
 
ans =
 
[c6*(s5*(c1*c2*c3 - c1*s2*s3) + c5*(s1*s4 + c4*(c1*c2*s3 + c1*c3*s2))) + s6*(c4*s1 - s4*(c1*c2*s3 + c1*c3*s2)),   c6*(c4*s1 - s4*(c1*c2*s3 + c1*c3*s2)) - s6*(s5*(c1*c2*c3 - c1*s2*s3) + c5*(s1*s4 + c4*(c1*c2*s3 + c1*c3*s2))), c5*(c1*c2*c3 - c1*s2*s3) - s5*(s1*s4 + c4*(c1*c2*s3 + c1*c3*s2)), a1*c1 + a3*(c1*c2*s3 + c1*c3*s2) + d4*(c1*c2*c3 - c1*s2*s3) + a2*c1*s2]
[c6*(s5*(c2*c3*s1 - s1*s2*s3) - c5*(c1*s4 - c4*(c2*s1*s3 + c3*s1*s2))) - s6*(c1*c4 + s4*(c2*s1*s3 + c3*s1*s2)), - s6*(s5*(c2*c3*s1 - s1*s2*s3) - c5*(c1*s4 - c4*(c2*s1*s3 + c3*s1*s2))) - c6*(c1*c4 + s4*(c2*s1*s3 + c3*s1*s2)), c5*(c2*c3*s1 - s1*s2*s3) + s5*(c1*s4 - c4*(c2*s1*s3 + c3*s1*s2)), a1*s1 + a3*(c2*s1*s3 + c3*s1*s2) + d4*(c2*c3*s1 - s1*s2*s3) + a2*s1*s2]
[                                    - c6*(s5*(c2*s3 + c3*s2) - c4*c5*(c2*c3 - s2*s3)) - s4*s6*(c2*c3 - s2*s3),                                         s6*(s5*(c2*s3 + c3*s2) - c4*c5*(c2*c3 - s2*s3)) - c6*s4*(c2*c3 - s2*s3),                     - c5*(c2*s3 + c3*s2) - c4*s5*(c2*c3 - s2*s3),                   d1 + a2*c2 + a3*(c2*c3 - s2*s3) - d4*(c2*s3 + c3*s2)]
[                                                                                                            0,                                                                                                               0,                                                                0,                                                                      1]
 

       在刚体的位姿描述中可以得到T06=

       因为六轴坐标系建立在腕部,将px py pz 用wx wy wz表示。

       我们通过等式T06=T01*T12*T23*T34*T45*T56可以看出,上面Matlab求得的wx wy wz分别为

       可以得到    θ1=atan2(wy,wx) ,同理通过上式可以求得机器人的前三个关节角度,具体推导过程见结尾附图。

       后三个关节角度需要进行矩阵的反变换,将等式T06=T01*T12*T23*T34*T45*T56的两端同时乘以(T03)^{-1}得T36=(T03)^{-1}T06=T34*T45*T56.

       其中(T03)^{-1}

inv(T01*T12*T23)
 
ans =
 
[(c1*c2*s3 + c1*c3*s2)/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2), (c2*s1*s3 + c3*s1*s2)/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2),  (c2*c3 - s2*s3)/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2), -(c2*c3*d1 + a1*c2*s3 + a1*c3*s2 - d1*s2*s3 + a2*c2^2*c3 + a2*c3*s2^2)/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2)]
[(c1*c2*c3 - c1*s2*s3)/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2),  (s1*(c2*c3 - s2*s3))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2), -(c2*s3 + c3*s2)/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2),  (a2*s2^2*s3 - a1*c2*c3 + c2*d1*s3 + c3*d1*s2 + a1*s2*s3 + a2*c2^2*s3)/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2)]
[                                                                                                                                            -s1/(c1^2 + s1^2),                                                                                                                                              c1/(c1^2 + s1^2),                                                                0,                                                                                                                      0]
[                                                                                                                                                            0,                                                                                                                                                             0,                                                                0,                                                                                                                      1]

         T06为 

T06=[nx  ox  ax  wx
     ny  oy  ay  wy
     nz  oz  az  wz 
     0   0   0   1];

        等式左边 (T03)^{-1}T06得到一个超级超级长的矩阵,定义为A.

 inv(T01*T12*T23)*T06
 
ans =
 
[(nx*(c1*c2*s3 + c1*c3*s2))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2) + (nz*(c2*c3 - s2*s3))/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (ny*(c2*s1*s3 + c3*s1*s2))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2), (ox*(c1*c2*s3 + c1*c3*s2))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2) + (oz*(c2*c3 - s2*s3))/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (oy*(c2*s1*s3 + c3*s1*s2))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2), (ax*(c1*c2*s3 + c1*c3*s2))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2) + (az*(c2*c3 - s2*s3))/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (ay*(c2*s1*s3 + c3*s1*s2))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2), (wx*(c1*c2*s3 + c1*c3*s2))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2) - (c2*c3*d1 + a1*c2*s3 + a1*c3*s2 - d1*s2*s3 + a2*c2^2*c3 + a2*c3*s2^2)/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (wz*(c2*c3 - s2*s3))/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (wy*(c2*s1*s3 + c3*s1*s2))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2)]
[   (nx*(c1*c2*c3 - c1*s2*s3))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2) - (nz*(c2*s3 + c3*s2))/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (ny*s1*(c2*c3 - s2*s3))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2),    (ox*(c1*c2*c3 - c1*s2*s3))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2) - (oz*(c2*s3 + c3*s2))/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (oy*s1*(c2*c3 - s2*s3))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2),    (ax*(c1*c2*c3 - c1*s2*s3))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2) - (az*(c2*s3 + c3*s2))/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (ay*s1*(c2*c3 - s2*s3))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2),    (a2*s2^2*s3 - a1*c2*c3 + c2*d1*s3 + c3*d1*s2 + a1*s2*s3 + a2*c2^2*s3)/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (wx*(c1*c2*c3 - c1*s2*s3))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2) - (wz*(c2*s3 + c3*s2))/(c2^2*c3^2 + c2^2*s3^2 + c3^2*s2^2 + s2^2*s3^2) + (s1*wy*(c2*c3 - s2*s3))/(c1^2*c2^2*c3^2 + c1^2*c2^2*s3^2 + c1^2*c3^2*s2^2 + c1^2*s2^2*s3^2 + c2^2*c3^2*s1^2 + c2^2*s1^2*s3^2 + c3^2*s1^2*s2^2 + s1^2*s2^2*s3^2)]
[                                                                                                                                                                                                                                                                                                                                                                 (c1*ny)/(c1^2 + s1^2) - (nx*s1)/(c1^2 + s1^2),                                                                                                                                                                                                                                                                                                                                                                  (c1*oy)/(c1^2 + s1^2) - (ox*s1)/(c1^2 + s1^2),                                                                                                                                                                                                                                                                                                                                                                  (ay*c1)/(c1^2 + s1^2) - (ax*s1)/(c1^2 + s1^2),                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          (c1*wy)/(c1^2 + s1^2) - (s1*wx)/(c1^2 + s1^2)]
[                                                                                                                                                                                                                                                                                                                                                                                                             0,                                                                                                                                                                                                                                                                                                                                                                                                              0,                                                                                                                                                                                                                                                                                                                                                                                                              0,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      1]

         然后等式右边的T34*T45*T56定义为B.

T34*T45*T56
 
ans =
 
[  c4*c5*c6 - s4*s6, - c6*s4 - c4*c5*s6, -c4*s5, a3]
[             c6*s5,             -s5*s6,     c5, d4]
[- c4*s6 - c5*c6*s4,   c5*s4*s6 - c4*c6,  s4*s5,  0]
[                 0,                  0,      0,  1]

令A(2,3)=B(2,3),化简求得θ5.

令A(1,3)=B(1,3),A(3,3)=B(3,3),化简求得θ4.

令A(2,1)=B(2,1),A(2,2)=B(2,2),化简求得θ6.

详细计算过程如下:

1、其中T12和T56的修改是因为在机器人的2轴和6轴均有一定角度的初始偏置,经计算验证得到的结论是:无论是否将DH参数中的初始偏置角度代入,均不影响逆解方程的结果。

2、对于θ2的角度计算用到了以下万能公式:

将计算得到的逆解通式输入Matlab:

function [ikine_t]=mymodikine(Tbe)
%    ti     di        ai-1      alphai-1 
MDH=[0      0.445     0              0;
     0      0         0.150      -pi/2;
     0      0         0.700          0;
     0      0.795     0.115       -pi/2;
     0      0         0            pi/2;
     0      0         0          -pi/2];
 nx=Tbe(1,1); ny=Tbe(2,1); nz=Tbe(3,1); 
 ox=Tbe(1,2); oy=Tbe(2,2); oz=Tbe(3,2); 
 ax=Tbe(1,3); ay=Tbe(2,3); az=Tbe(3,3); 
 wx=Tbe(1,4); wy=Tbe(2,4); wz=Tbe(3,4);
 d1=0.445; d4=0.795;  
 a1=0.150;  a2=0.700;   a3=0.115;
 %t1
 t11=atan2(wy,wx);
 t12=atan2(-wy,-wx);
 %t2
 k11=wx/cos(t11)-a1;
 k12=wx/cos(t12)-a1;

 k3=wz-d1;
 K11=(k11*k11+k3*k3+a2*a2-d4*d4-a3*a3)/2/a2;
 K12=(k12*k12+k3*k3+a2*a2-d4*d4-a3*a3)/2/a2;
 t21=atan2(K11/(sqrt(k11*k11+k3*k3)),sqrt((k11*k11+k3*k3-K11*K11)/(k11*k11+k3*k3)))-atan2(k3,k11);
 t22=atan2(K12/(sqrt(k12*k12+k3*k3)),sqrt((k12*k12+k3*k3-K12*K12)/(k12*k12+k3*k3)))-atan2(k3,k12);
 t23=atan2(K11/(sqrt(k11*k11+k3*k3)),-sqrt((k11*k11+k3*k3-K11*K11)/(k11*k11+k3*k3)))-atan2(k3,k11);
 t24=atan2(K12/(sqrt(k12*k12+k3*k3)),-sqrt((k12*k12+k3*k3-K12*K12)/(k12*k12+k3*k3)))-atan2(k3,k12);


 
 %t3
 A1=(a3*(k11-a2*sin(t21))-d4*(k3-a2*cos(t21)))/(d4*d4+a3*a3);
 B1=(a3*(k3-a2*cos(t21))+d4*(k11-a2*sin(t21)))/(d4*d4+a3*a3); 
 A2=(a3*(k12-a2*sin(t22))-d4*(k3-a2*cos(t22)))/(d4*d4+a3*a3);
 B2=(a3*(k3-a2*cos(t22))+d4*(k12-a2*sin(t22)))/(d4*d4+a3*a3);
 A3=(a3*(k11-a2*sin(t23))-d4*(k3-a2*cos(t23)))/(d4*d4+a3*a3);
 B3=(a3*(k3-a2*cos(t23))+d4*(k11-a2*sin(t23)))/(d4*d4+a3*a3); 
 A4=(a3*(k12-a2*sin(t24))-d4*(k3-a2*cos(t24)))/(d4*d4+a3*a3);
 B4=(a3*(k3-a2*cos(t24))+d4*(k12-a2*sin(t24)))/(d4*d4+a3*a3);
 
 
 t31=atan2(A1,B1)-t21;
 t32=atan2(A2,B2)-t22;
 t33=atan2(A3,B3)-t23;
 t34=atan2(A4,B4)-t24;
 
 
 
  %t5
  r51=ax*cos(t11)*cos(t21+t31)-az*sin(t21+t31)+ay*sin(t11)*cos(t21+t31);
  r52=ax*cos(t12)*cos(t22+t32)-az*sin(t22+t32)+ay*sin(t12)*cos(t22+t32);
  r53=ax*cos(t11)*cos(t23+t33)-az*sin(t23+t33)+ay*sin(t11)*cos(t23+t33);
  r54=ax*cos(t12)*cos(t24+t34)-az*sin(t24+t34)+ay*sin(t12)*cos(t24+t34);
  t51=atan2(-sqrt(1-r51*r51),r51);
  t52=atan2(-sqrt(1-r52*r52),r52);
  t53=atan2(-sqrt(1-r53*r53),r53);
  t54=atan2(-sqrt(1-r54*r54),r54);
  t55=atan2(sqrt(1-r51*r51),r51);
  t56=atan2(sqrt(1-r52*r52),r52);
  t57=atan2(sqrt(1-r53*r53),r53);
  t58=atan2(sqrt(1-r54*r54),r54);
 
  
  %t4
  t41=atan2(ax*sin(t11)-ay*cos(t11),ax*cos(t11)*sin(t21+t31)+az*cos(t21+t31)+ay*sin(t11)*sin(t21+t31));
  t42=atan2(ax*sin(t12)-ay*cos(t12),ax*cos(t12)*sin(t22+t32)+az*cos(t22+t32)+ay*sin(t12)*sin(t22+t32));
  t43=atan2(ax*sin(t11)-ay*cos(t11),ax*cos(t11)*sin(t23+t33)+az*cos(t23+t33)+ay*sin(t11)*sin(t23+t33));
  t44=atan2(ax*sin(t12)-ay*cos(t12),ax*cos(t12)*sin(t24+t34)+az*cos(t24+t34)+ay*sin(t12)*sin(t24+t34));
  t45=atan2(-(ax*sin(t11)-ay*cos(t11)),-(ax*cos(t11)*sin(t21+t31)+az*cos(t21+t31)+ay*sin(t11)*sin(t21+t31)));
  t46=atan2(-(ax*sin(t12)-ay*cos(t12)),-(ax*cos(t12)*sin(t22+t32)+az*cos(t22+t32)+ay*sin(t12)*sin(t22+t32)));
  t47=atan2(-(ax*sin(t11)-ay*cos(t11)),-(ax*cos(t11)*sin(t23+t33)+az*cos(t23+t33)+ay*sin(t11)*sin(t23+t33)));
  t48=atan2(-(ax*sin(t12)-ay*cos(t12)),-(ax*cos(t12)*sin(t24+t34)+az*cos(t24+t34)+ay*sin(t12)*sin(t24+t34)));
  
  %t6
  
  t61=atan2(ox*cos(t11)*cos(t21+t31)-oz*sin(t21+t31)+oy*sin(t11)*cos(t21+t31),-(nx*cos(t11)*cos(t21+t31)-nz*sin(t21+t31)+ny*sin(t11)*cos(t21+t31)));
  t62=atan2(ox*cos(t12)*cos(t22+t32)-oz*sin(t22+t32)+oy*sin(t12)*cos(t22+t32),-(nx*cos(t12)*cos(t22+t32)-nz*sin(t22+t32)+ny*sin(t12)*cos(t22+t32)));
  t63=atan2(ox*cos(t11)*cos(t23+t33)-oz*sin(t23+t33)+oy*sin(t11)*cos(t23+t33),-(nx*cos(t11)*cos(t23+t33)-nz*sin(t23+t33)+ny*sin(t11)*cos(t23+t33)));
  t64=atan2(ox*cos(t12)*cos(t24+t34)-oz*sin(t24+t34)+oy*sin(t12)*cos(t24+t34),-(nx*cos(t12)*cos(t24+t34)-nz*sin(t24+t34)+ny*sin(t12)*cos(t24+t34)));
  t65=atan2(-(ox*cos(t11)*cos(t21+t31)-oz*sin(t21+t31)+oy*sin(t11)*cos(t21+t31)),(nx*cos(t11)*cos(t21+t31)-nz*sin(t21+t31)+ny*sin(t11)*cos(t21+t31)));
  t66=atan2(-(ox*cos(t12)*cos(t22+t32)-oz*sin(t22+t32)+oy*sin(t12)*cos(t22+t32)),(nx*cos(t12)*cos(t22+t32)-nz*sin(t22+t32)+ny*sin(t12)*cos(t22+t32)));
  t67=atan2(-(ox*cos(t11)*cos(t23+t33)-oz*sin(t23+t33)+oy*sin(t11)*cos(t23+t33)),(nx*cos(t11)*cos(t23+t33)-nz*sin(t23+t33)+ny*sin(t11)*cos(t23+t33)));
  t68=atan2(-(ox*cos(t12)*cos(t24+t34)-oz*sin(t24+t34)+oy*sin(t12)*cos(t24+t34)),(nx*cos(t12)*cos(t24+t34)-nz*sin(t24+t34)+ny*sin(t12)*cos(t24+t34)));


  ikine_t=[ t11 t21 t31 t41 t51 t61
            t12 t22 t32 t42 t52 t62
            t11 t23 t33 t43 t53 t63
            t12 t24 t34 t44 t54 t64
            t11 t21 t31 t45 t55 t65
            t12 t22 t32 t46 t56 t66
            t11 t23 t33 t47 t57 t67
            t12 t24 t34 t48 t58 t68]*57.3;

联合上一节的正运动学方程将各关节设置为(25°,3°,10°,-45°, -10°,120°),得到此时腕部的齐次变换矩阵为

theta1 = theta(1,1);
theta2 = theta(1,2);
theta3 = theta(1,3);
theta4 = theta(1,4);
theta5 = theta(1,5);
theta6 = theta(1,6);
%    theta        d       a         alpha
MDH=[theta1       0.445      0              0;
     theta2-pi/2    0        0.150      -pi/2;
     theta3         0        0.700          0;
     theta4        0.795     0.115      -pi/2;
     theta5         0        0           pi/2;
     theta6-pi      0        0         -pi/2];
 
 T01=[cos(MDH(1,1))         -sin(MDH(1,1))           0                    0;
      sin(MDH(1,1))         cos(MDH(1,1))            0                    0;
      0                     0                        1             MDH(1,2);
      0                     0                        0                   1];
 T12=[cos(MDH(2,1))         -sin(MDH(2,1))           0             MDH(2,3);
      0                     0                        1                    0;
      -sin(MDH(2,1))        -cos(MDH(2,1))           0                    0;
      0                     0                        0                   1];
 T23=[cos(MDH(3,1))         -sin(MDH(3,1))           0             MDH(3,3);
      sin(MDH(3,1))         cos(MDH(3,1))            0                    0;
      0                     0                        1                    0;
      0                     0                        0                   1];
 T34=[cos(MDH(4,1))         -sin(MDH(4,1))           0             MDH(4,3);
      0                     0                        1             MDH(4,2);
      -sin(MDH(4,1))        -cos(MDH(4,1))           0                    0
      0                     0                        0                   1];
 T45=[cos(MDH(5,1))         -sin(MDH(5,1))           0                    0;
      0                     0                        -1                   0;
      sin(MDH(5,1))         cos(MDH(5,1))            0                    0;
      0                     0                        0                   1];
 T56=[cos(MDH(6,1))         -sin(MDH(6,1))           0                    0;
      0                     0                        1                    0;
      -sin(MDH(6,1))        -cos(MDH(6,1))           0                    0;
      0                     0                        0                   1];
% 腕部到法兰
 T6TCP=[1                   0                        0                    0;
        0                   1                        0                    0;
        0                   0                        1                0.085;
        0                   0                        0                   1];
    
%   T06=T01*T12*T23*T34*T45*T56*T6TCP;
T06=T01*T12*T23*T34*T45*T56;
  
theta=[25*pi/180,3*pi/180,10*pi/180,-45*pi/180,-10*pi/180,120*pi/180];
T06

%//


%输出结果

T06 =

   -0.5365   -0.0432    0.8428    0.8946
    0.8097    0.2552    0.5285    0.4172
   -0.2379    0.9659   -0.1019    1.0773
         0         0         0    1.0000

将求得的齐次变换矩阵代入逆解得到: 

MDH=[0      0.445     0              0;
     0      0         0.150      -pi/2;
     0      0         0.700          0;
     0      0.795     0.115       -pi/2;
     0      0         0            pi/2;
     0      0         0          -pi/2];
 nx=Tbe(1,1); ny=Tbe(2,1); nz=Tbe(3,1); 
 ox=Tbe(1,2); oy=Tbe(2,2); oz=Tbe(3,2); 
 ax=Tbe(1,3); ay=Tbe(2,3); az=Tbe(3,3); 
 wx=Tbe(1,4); wy=Tbe(2,4); wz=Tbe(3,4);
 d1=0.445; d4=0.795;  
 a1=0.150;  a2=0.700;   a3=0.115;
 %t1
 t11=atan2(wy,wx);
 t12=atan2(-wy,-wx);
 %t2
 k11=wx/cos(t11)-a1;
 k12=wx/cos(t12)-a1;

 k3=wz-d1;
 K11=(k11*k11+k3*k3+a2*a2-d4*d4-a3*a3)/2/a2;
 K12=(k12*k12+k3*k3+a2*a2-d4*d4-a3*a3)/2/a2;
 t21=atan2(K11/(sqrt(k11*k11+k3*k3)),sqrt((k11*k11+k3*k3-K11*K11)/(k11*k11+k3*k3)))-atan2(k3,k11);
 t22=atan2(K12/(sqrt(k12*k12+k3*k3)),sqrt((k12*k12+k3*k3-K12*K12)/(k12*k12+k3*k3)))-atan2(k3,k12);
 t23=atan2(K11/(sqrt(k11*k11+k3*k3)),-sqrt((k11*k11+k3*k3-K11*K11)/(k11*k11+k3*k3)))-atan2(k3,k11);
 t24=atan2(K12/(sqrt(k12*k12+k3*k3)),-sqrt((k12*k12+k3*k3-K12*K12)/(k12*k12+k3*k3)))-atan2(k3,k12);


 
 %t3
 A1=(a3*(k11-a2*sin(t21))-d4*(k3-a2*cos(t21)))/(d4*d4+a3*a3);
 B1=(a3*(k3-a2*cos(t21))+d4*(k11-a2*sin(t21)))/(d4*d4+a3*a3); 
 A2=(a3*(k12-a2*sin(t22))-d4*(k3-a2*cos(t22)))/(d4*d4+a3*a3);
 B2=(a3*(k3-a2*cos(t22))+d4*(k12-a2*sin(t22)))/(d4*d4+a3*a3);
 A3=(a3*(k11-a2*sin(t23))-d4*(k3-a2*cos(t23)))/(d4*d4+a3*a3);
 B3=(a3*(k3-a2*cos(t23))+d4*(k11-a2*sin(t23)))/(d4*d4+a3*a3); 
 A4=(a3*(k12-a2*sin(t24))-d4*(k3-a2*cos(t24)))/(d4*d4+a3*a3);
 B4=(a3*(k3-a2*cos(t24))+d4*(k12-a2*sin(t24)))/(d4*d4+a3*a3);
 
 
 t31=atan2(A1,B1)-t21;
 t32=atan2(A2,B2)-t22;
 t33=atan2(A3,B3)-t23;
 t34=atan2(A4,B4)-t24;
 
 
 
  %t5
  r51=ax*cos(t11)*cos(t21+t31)-az*sin(t21+t31)+ay*sin(t11)*cos(t21+t31);
  r52=ax*cos(t12)*cos(t22+t32)-az*sin(t22+t32)+ay*sin(t12)*cos(t22+t32);
  r53=ax*cos(t11)*cos(t23+t33)-az*sin(t23+t33)+ay*sin(t11)*cos(t23+t33);
  r54=ax*cos(t12)*cos(t24+t34)-az*sin(t24+t34)+ay*sin(t12)*cos(t24+t34);
  t51=atan2(-sqrt(1-r51*r51),r51);
  t52=atan2(-sqrt(1-r52*r52),r52);
  t53=atan2(-sqrt(1-r53*r53),r53);
  t54=atan2(-sqrt(1-r54*r54),r54);
  t55=atan2(sqrt(1-r51*r51),r51);
  t56=atan2(sqrt(1-r52*r52),r52);
  t57=atan2(sqrt(1-r53*r53),r53);
  t58=atan2(sqrt(1-r54*r54),r54);
 
  
  %t4
  t41=atan2(ax*sin(t11)-ay*cos(t11),ax*cos(t11)*sin(t21+t31)+az*cos(t21+t31)+ay*sin(t11)*sin(t21+t31));
  t42=atan2(ax*sin(t12)-ay*cos(t12),ax*cos(t12)*sin(t22+t32)+az*cos(t22+t32)+ay*sin(t12)*sin(t22+t32));
  t43=atan2(ax*sin(t11)-ay*cos(t11),ax*cos(t11)*sin(t23+t33)+az*cos(t23+t33)+ay*sin(t11)*sin(t23+t33));
  t44=atan2(ax*sin(t12)-ay*cos(t12),ax*cos(t12)*sin(t24+t34)+az*cos(t24+t34)+ay*sin(t12)*sin(t24+t34));
  t45=atan2(-(ax*sin(t11)-ay*cos(t11)),-(ax*cos(t11)*sin(t21+t31)+az*cos(t21+t31)+ay*sin(t11)*sin(t21+t31)));
  t46=atan2(-(ax*sin(t12)-ay*cos(t12)),-(ax*cos(t12)*sin(t22+t32)+az*cos(t22+t32)+ay*sin(t12)*sin(t22+t32)));
  t47=atan2(-(ax*sin(t11)-ay*cos(t11)),-(ax*cos(t11)*sin(t23+t33)+az*cos(t23+t33)+ay*sin(t11)*sin(t23+t33)));
  t48=atan2(-(ax*sin(t12)-ay*cos(t12)),-(ax*cos(t12)*sin(t24+t34)+az*cos(t24+t34)+ay*sin(t12)*sin(t24+t34)));
  
  %t6
  
  t61=atan2(ox*cos(t11)*cos(t21+t31)-oz*sin(t21+t31)+oy*sin(t11)*cos(t21+t31),-(nx*cos(t11)*cos(t21+t31)-nz*sin(t21+t31)+ny*sin(t11)*cos(t21+t31)));
  t62=atan2(ox*cos(t12)*cos(t22+t32)-oz*sin(t22+t32)+oy*sin(t12)*cos(t22+t32),-(nx*cos(t12)*cos(t22+t32)-nz*sin(t22+t32)+ny*sin(t12)*cos(t22+t32)));
  t63=atan2(ox*cos(t11)*cos(t23+t33)-oz*sin(t23+t33)+oy*sin(t11)*cos(t23+t33),-(nx*cos(t11)*cos(t23+t33)-nz*sin(t23+t33)+ny*sin(t11)*cos(t23+t33)));
  t64=atan2(ox*cos(t12)*cos(t24+t34)-oz*sin(t24+t34)+oy*sin(t12)*cos(t24+t34),-(nx*cos(t12)*cos(t24+t34)-nz*sin(t24+t34)+ny*sin(t12)*cos(t24+t34)));
  t65=atan2(-(ox*cos(t11)*cos(t21+t31)-oz*sin(t21+t31)+oy*sin(t11)*cos(t21+t31)),(nx*cos(t11)*cos(t21+t31)-nz*sin(t21+t31)+ny*sin(t11)*cos(t21+t31)));
  t66=atan2(-(ox*cos(t12)*cos(t22+t32)-oz*sin(t22+t32)+oy*sin(t12)*cos(t22+t32)),(nx*cos(t12)*cos(t22+t32)-nz*sin(t22+t32)+ny*sin(t12)*cos(t22+t32)));
  t67=atan2(-(ox*cos(t11)*cos(t23+t33)-oz*sin(t23+t33)+oy*sin(t11)*cos(t23+t33)),(nx*cos(t11)*cos(t23+t33)-nz*sin(t23+t33)+ny*sin(t11)*cos(t23+t33)));
  t68=atan2(-(ox*cos(t12)*cos(t24+t34)-oz*sin(t24+t34)+oy*sin(t12)*cos(t24+t34)),(nx*cos(t12)*cos(t24+t34)-nz*sin(t24+t34)+ny*sin(t12)*cos(t24+t34)));


  ikine_t=[ t11 t21 t31 t41 t51 t61
            t12 t22 t32 t42 t52 t62
            t11 t23 t33 t43 t53 t63
            t12 t24 t34 t44 t54 t64
            t11 t21 t31 t45 t55 t65
            t12 t22 t32 t46 t56 t66
            t11 t23 t33 t47 t57 t67
            t12 t24 t34 t48 t58 t68]*57.3;

Tbe=[-0.5365   -0.0432    0.8428    0.8946
      0.8097    0.2552    0.5285    0.4172
     -0.2379    0.9659   -0.1019    1.0773
      0         0         0         1.0000];

ikine_t

%///
%输出结果

ikine_t =

   25.0040    2.9975   10.0005  -45.0108   -9.9961  120.0217
 -155.0093  -93.3535  -21.4919    7.4515  -71.2102 -106.9829
   25.0040  102.8794 -173.5506 -172.7646  -76.6684 -106.2506
 -155.0093  -28.5017 -142.0582   25.0538  -16.8536 -128.6682
   25.0040    2.9975   10.0005  135.0024    9.9961  -59.9916
 -155.0093  -93.3535  -21.4919 -172.5617   71.2102   73.0304
   25.0040  102.8794 -173.5506    7.2486   76.6684   73.7627
 -155.0093  -28.5017 -142.0582 -154.9594   16.8536   51.3451

 在RobotStudio中示教相同点位对比验证,各组轴配置与逆解的关节角度一致。

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Horo321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值