精华内容
下载资源
问答
  • 基于MFC的六轴机器人逆解程序,六自由度机器人机械手运动学逆问题反解程序。包含全部源码,可以进行修改,通过更改D-H参数即可实现六轴机器人逆解IK。
  • 基于Matlab的UR5六轴机器人数值解法求逆解逆解定点及画圆)源码 (机器人建模与仿真中的机器人逆运动) 其它关于基于Matlab机器人建模与仿真资料合集请往CSDN博客 “基于Matlab的机器人学建模学习资料大整理”...
  • 基于Matlab的UR5六轴机器人解析解法求逆解逆解定点及画圆)源码 (机器人建模与仿真中的机器人逆运动) 其它关于基于Matlab机器人建模与仿真资料合集请往CSDN博客 “基于Matlab的机器人学建模学习资料大整理”...
  • 基于Matlab的UR5六轴机器人解析解法求逆解逆解定点及画圆)源码 (机器人建模与仿真中的机器人逆运动) 其它关于基于Matlab机器人建模与仿真资料合集请往CSDN博客 “基于Matlab的机器人学建模学习资料大整理”...
  • 本文主要是给大家一个系统的概念,如何用Matlab实现六轴机器人的建模和实现轨迹规划。以后将会给大家讲解如何手写正逆解以及轨迹插补的程序。程序是基于Matlab2016a,工具箱版本为Robotic Toolbox 9.10,需要安装包...

    摘要
    本文主要是给大家一个系统的概念,如何用Matlab实现六轴机器人的建模和实现轨迹规划。以后将会给大家讲解如何手写正逆解以及轨迹插补的程序。程序是基于Matlab2016a,工具箱版本为Robotic Toolbox 9.10
    1.D-H建模
    三个两两相互垂直的XYZ轴构成欧几里得空间,存在六个自由度:沿XYZ平移的三个自由度,绕XYZ旋转的三个自由度。在欧几里得空间中任意线性变换都可以通过这六个自由度完成。
    Denavit-Hartenberg提出的D-H参数模型能满足机器人学中的最小线性表示约定,用4个参数就能描述坐标变换:绕X轴平移距离a;绕X轴旋转角度alpha;绕Z轴平移距离d;绕Z轴旋转角度theta。
    2.标准D-H模型和改进D-H模型
    标准和改进对比图
    对比来看参数并没有改变,标准的 D-H 模型是将连杆的坐标系固定在该连杆的输出端(下一关节),也即坐标系i-1与关节i对齐;改进的 D-H模型 则是将坐标系固定在该连杆的输入端(上一关节),也即坐标系i-1与关节对齐i-1。(具体建模可见后面的博客)
    3.利用 Matlab Robotic Toolbox 建立机器人模型
    alpha:连杆扭角;
    a:连杆长度;
    theta:关节转角;
    d:关节距离;
    offset:偏移

    clear;
    clc;
    %建立机器人模型
    %       theta    d        a        alpha     offset
    L1=Link([0       0.4      0.025    pi/2      0     ]); %定义连杆的D-H参数
    L2=Link([pi/2    0        0.56     0         0     ]);
    L3=Link([0       0        0.035    pi/2      0     ]);
    L4=Link([0       0.515    0        pi/2      0     ]);
    L5=Link([pi      0        0        pi/2      0     ]);
    L6=Link([0       0.08     0        0         0     ]);
    robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','manman'); %连接连杆,机器人取名manman
    robot.plot([0,pi/2,0,0,pi,0]);%输出机器人模型,后面的六个角为输出时的theta姿态

    本段代码取名为代码段1,效果图如下:

    在代码段1的后面加入display函数可以输出模型的一些参数

    robot.display();


    其中表格为D-H参数,grav为重力加速度矢量,base为基坐标系的齐次矩阵,tool为工具坐标系和末端连杆的坐标系之间的变换矩阵。
    在代码段1的后面加入teach指令,则可调整各个关节角度,能够让初学者更好的了解六轴机器人的结构。

    teach(robot);


    4.运动学正逆解
    运动学正解:根据6个关节角结算出末端位姿。
    运动学逆解:根据末端位姿结算出关节角,这里会存在8组逆解,本文中用的反解函数会智能输出最优的一组解。
    正解程序:

    clear;
    clc;
    %建立机器人模型
    %       theta    d        a        alpha     offset
    L1=Link([0       0.4      0.025    pi/2      0     ]); %定义连杆的D-H参数
    L2=Link([pi/2    0        0.56     0         0     ]);
    L3=Link([0       0        0.035    pi/2      0     ]);
    L4=Link([0       0.515    0        pi/2      0     ]);
    L5=Link([pi      0        0        pi/2      0     ]);
    L6=Link([0       0.08     0        0         0     ]);
    robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','manman'); %连接连杆,机器人取名manman
    theta=[0,0,0,0,0,0];%指定的关节角
    p=robot.fkine(theta)%fkine正解函数,根据我们给定的关节角theta,求解出末端位姿p
    q=robot.ikine(p)%ikine逆解函数,根据我们给定的末端位姿p,求解出关节角q

    我们可以查看p和q,对比theta和q,发现是一致的(实际情况中并不是完全一致,会有一点偏差,我这里选的点特殊了)。


    5.轨迹规划
    在实际应用中,我们一般都是知道末端的轨迹,然后使机器人动作。本文的例子是根据给定两个点的值,得到末端位姿,根据末端位姿再来规划轨迹。

    clear;
    clc;
    %建立机器人模型
    %       theta    d        a        alpha     offset
    L1=Link([0       0.4      0.025    pi/2      0     ]); %定义连杆的D-H参数
    L2=Link([pi/2    0        0.56     0         0     ]);
    L3=Link([0       0        0.035    pi/2      0     ]);
    L4=Link([0       0.515    0        pi/2      0     ]);
    L5=Link([pi      0        0        pi/2      0     ]);
    L6=Link([0       0.08     0        0         0     ]);
    robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','manman'); %连接连杆,机器人取名manman
    T1=transl(0.5,0,0);%根据给定起始点,得到起始点位姿
    T2=transl(0,0.5,0);%根据给定终止点,得到终止点位姿
    q1=robot.ikine(T1);%根据起始点位姿,得到起始点关节角
    q2=robot.ikine(T2);%根据终止点位姿,得到终止点关节角
    [q ,qd, qdd]=jtraj(q1,q2,50); %五次多项式轨迹,得到关节角度,角速度,角加速度,50为采样点个数
    grid on
    T=robot.fkine(q);%根据插值,得到末端执行器位姿
    plot3(squeeze(T(1,4,:)),squeeze(T(2,4,:)),squeeze(T(3,4,:)));%输出末端轨迹
    hold on
    robot.plot(q);%动画演示

    这里写图片描述
    蓝色细线就是规划的轨迹,六轴机器人manman将会动态演示从起始点到终止点的过程。
    PS:本文的所有程序都是调用现成的函数,仅为大家建立一个概念,后面的博客将给大家讲解各个函数写法。

    展开全文
  • 六轴机器人matlab写运动学逆解函数(改进DH模型)

    万次阅读 多人点赞 2018-06-23 17:04:53
    本文采用的模型为之前博客“matlab机器人工具箱一般六轴的DH模型和改进DH模型建立与区别”里面的改进DH模型,参数不再重复给出。 基系与工具坐标系关系为: bT0⋅(0T1⋅1T2⋅2T3⋅3T4⋅4T5⋅5T6)⋅6Te=bTebT0⋅...

    1.理论
    本文采用的模型为之前博客“matlab机器人工具箱一般六轴的DH模型和改进DH模型建立与区别”里面的改进DH模型,参数不再重复给出。
    基系与工具坐标系关系为:
    bT00T11T22T33T44T55T66Te=bTe
    将逆运动学问题简化为:
    0T11T22T33T44T55T6=bT01bTe6Te1
    2.转换为下式求解
    2T33T44T5=1T210T11bT01bTe6Te15T61
    左边:

    left =
    [ cos(theta3)*cos(theta4)*cos(theta5) - sin(theta3)*sin(theta5), - cos(theta5)*sin(theta3) - cos(theta3)*cos(theta4)*sin(theta5), cos(theta3)*sin(theta4), a2 + a3*cos(theta3) - d4*sin(theta3)]
    [ cos(theta3)*sin(theta5) + cos(theta4)*cos(theta5)*sin(theta3),   cos(theta3)*cos(theta5) - cos(theta4)*sin(theta3)*sin(theta5), sin(theta3)*sin(theta4),      d4*cos(theta3) + a3*sin(theta3)]
    [                                      -cos(theta5)*sin(theta4),                                         sin(theta4)*sin(theta5),             cos(theta4),                                    0]
    [                                                             0,                                                               0,                       0,                                    1]

    右边:

    right = 
    [ oz*sin(theta2)*sin(theta6) - nz*cos(theta6)*sin(theta2) + nx*cos(theta1)*cos(theta2)*cos(theta6) + ny*cos(theta2)*cos(theta6)*sin(theta1) - ox*cos(theta1)*cos(theta2)*sin(theta6) - oy*cos(theta2)*sin(theta1)*sin(theta6),   ax*cos(theta1)*cos(theta2) - az*sin(theta2) + ay*cos(theta2)*sin(theta1), oz*cos(theta6)*sin(theta2) + nz*sin(theta2)*sin(theta6) - ox*cos(theta1)*cos(theta2)*cos(theta6) - nx*cos(theta1)*cos(theta2)*sin(theta6) - oy*cos(theta2)*cos(theta6)*sin(theta1) - ny*cos(theta2)*sin(theta1)*sin(theta6), px*cos(theta1)*cos(theta2) - pz*sin(theta2) - a1*cos(theta2) + py*cos(theta2)*sin(theta1)]
    [ oz*cos(theta2)*sin(theta6) - nz*cos(theta2)*cos(theta6) - nx*cos(theta1)*cos(theta6)*sin(theta2) - ny*cos(theta6)*sin(theta1)*sin(theta2) + ox*cos(theta1)*sin(theta2)*sin(theta6) + oy*sin(theta1)*sin(theta2)*sin(theta6), - az*cos(theta2) - ax*cos(theta1)*sin(theta2) - ay*sin(theta1)*sin(theta2), oz*cos(theta2)*cos(theta6) + nz*cos(theta2)*sin(theta6) + ox*cos(theta1)*cos(theta6)*sin(theta2) + nx*cos(theta1)*sin(theta2)*sin(theta6) + oy*cos(theta6)*sin(theta1)*sin(theta2) + ny*sin(theta1)*sin(theta2)*sin(theta6), a1*sin(theta2) - pz*cos(theta2) - px*cos(theta1)*sin(theta2) - py*sin(theta1)*sin(theta2)]
    [                                                                                                           ny*cos(theta1)*cos(theta6) - nx*cos(theta6)*sin(theta1) - oy*cos(theta1)*sin(theta6) + ox*sin(theta1)*sin(theta6),                                            ay*cos(theta1) - ax*sin(theta1),                                                                                                           ox*cos(theta6)*sin(theta1) - ny*cos(theta1)*sin(theta6) - oy*cos(theta1)*cos(theta6) + nx*sin(theta1)*sin(theta6),                                                           py*cos(theta1) - px*sin(theta1)]
    [                                                                                                                                                                                                                           0,                                                                          0,                                                                                                                                                                                                                           0,                                                                                         1]
    

    令左右两边相等,求出六个角。、
    逆解顺序如下:
    这里写图片描述
    由于公式比较复杂我仅在此给出想法,各位可自行计算。
    θ1:两式第3行第4列。
    θ3:两式第1行第4列和第2行第4列。
    θ2:两式第1行第4列和第2行第4列。
    θ5:两式第1行第2列和第2行第2列。
    θ4:两式第1行第2列和第2行第2列。
    θ6:两式第3行第1列和第3行第3列。
    3.MATLAB程序
    分两个程序①主函数②function函数
    ①主函数

    clear;
    clc;
    %建立机器人模型
    %       theta    d           a        alpha     offset
    ML1=Link([0       0           0           0          0     ],'modified'); 
    ML2=Link([0       0           0.180      -pi/2       0     ],'modified');
    ML3=Link([0       0           0.600       0          0     ],'modified');
    ML4=Link([0       0.630       0.130      -pi/2       0     ],'modified');
    ML5=Link([0       0           0           pi/2       0     ],'modified');
    ML6=Link([0       0           0          -pi/2       0     ],'modified');
    modrobot=SerialLink([ML1 ML2 ML3 ML4 ML5 ML6],'name','modified');
    modmyt06=mymodfkine(-pi/3,-pi/3,pi/3,-pi/4,pi/4,pi/6);
    modmyikine=mymodikine(modmyt06)

    ②function函数

    function [ikine_t]=mymodikine(Tbe)
    %    ti   di     ai-1     alphai-1 
    MDH=[0   0       0         0;
         0   0       0.180    -pi/2;
         0   0       0.600     0;
         0   0.630   0.130    -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); px=Tbe(1,4); py=Tbe(2,4); pz=Tbe(3,4);
     d4=MDH(4,2);a1=MDH(2,3);a2=MDH(3,3);a3=MDH(4,3);d2=0;d3=0;f1=-pi/2;f3=-pi/2;f4=pi/2;f5=-pi/2;
     %t1(3,4)
     t11=-atan2(-py,px)+atan2((d2-d3)/sin(f1),((px*sin(f1))^2+(py*sin(f1))^2-(d2-d3)^2)^0.5);
     t12=-atan2(-py,px)+atan2((d2-d3)/sin(f1),-((px*sin(f1))^2+(py*sin(f1))^2-(d2-d3)^2)^0.5);
     %t3
     m3_1=pz*sin(f1);
     n3_1=a1-px*cos(t11)-py*sin(t11);
     m3_2=pz*sin(f1);
     n3_2=a1-px*cos(t12)-py*sin(t12);
     t31=-atan2(a2*a3/sin(f3),a2*d4)+atan2((m3_1^2+n3_1^2-a2^2-a3^2-d4^2)/sin(f3),((2*a2*d4*sin(f3))^2+(2*a2*a3)^2-(m3_1^2+n3_1^2-a2^2-a3^2-d4^2)^2)^0.5);
     t32=-atan2(a2*a3/sin(f3),a2*d4)+atan2((m3_1^2+n3_1^2-a2^2-a3^2-d4^2)/sin(f3),-((2*a2*d4*sin(f3))^2+(2*a2*a3)^2-(m3_1^2+n3_1^2-a2^2-a3^2-d4^2)^2)^0.5);
     t33=-atan2(a2*a3/sin(f3),a2*d4)+atan2((m3_2^2+n3_2^2-a2^2-a3^2-d4^2)/sin(f3),((2*a2*d4*sin(f3))^2+(2*a2*a3)^2-(m3_2^2+n3_2^2-a2^2-a3^2-d4^2)^2)^0.5);
     t34=-atan2(a2*a3/sin(f3),a2*d4)+atan2((m3_2^2+n3_2^2-a2^2-a3^2-d4^2)/sin(f3),-((2*a2*d4*sin(f3))^2+(2*a2*a3)^2-(m3_2^2+n3_2^2-a2^2-a3^2-d4^2)^2)^0.5);
     %t2
     m2_1=a2+a3*cos(t31)+d4*sin(f3)*sin(t31);
     n2_1=a3*sin(t31)-d4*sin(f3)*cos(t31);
     m2_2=a2+a3*cos(t32)+d4*sin(f3)*sin(t32);
     n2_2=a3*sin(t32)-d4*sin(f3)*cos(t32);
     m2_3=a2+a3*cos(t33)+d4*sin(f3)*sin(t33);
     n2_3=a3*sin(t33)-d4*sin(f3)*cos(t33);
     m2_4=a2+a3*cos(t34)+d4*sin(f3)*sin(t34);
     n2_4=a3*sin(t34)-d4*sin(f3)*cos(t34);
     t21=atan2(m3_1*m2_1+n2_1*n3_1,m3_1*n2_1-m2_1*n3_1);
     t22=atan2(m3_1*m2_2+n2_2*n3_1,m3_1*n2_2-m2_2*n3_1);
     t23=atan2(m3_2*m2_3+n2_3*n3_2,m3_2*n2_3-m2_3*n3_2);
     t24=atan2(m3_2*m2_4+n2_4*n3_2,m3_2*n2_4-m2_4*n3_2);
     %t5
     m5_1=-sin(f5)*(ax*cos(t11)*cos(t21)+ay*sin(t11)*cos(t21)+az*sin(f1)*sin(t21));
     n5_1=sin(f5)*(ax*cos(t11)*sin(t21)+ay*sin(t11)*sin(t21)-az*sin(f1)*cos(t21));
     m5_2=-sin(f5)*(ax*cos(t11)*cos(t22)+ay*sin(t11)*cos(t22)+az*sin(f1)*sin(t22));
     n5_2=sin(f5)*(ax*cos(t11)*sin(t22)+ay*sin(t11)*sin(t22)-az*sin(f1)*cos(t22));
     m5_3=-sin(f5)*(ax*cos(t12)*cos(t23)+ay*sin(t12)*cos(t23)+az*sin(f1)*sin(t23));
     n5_3=sin(f5)*(ax*cos(t12)*sin(t23)+ay*sin(t12)*sin(t23)-az*sin(f1)*cos(t23));
     m5_4=-sin(f5)*(ax*cos(t12)*cos(t24)+ay*sin(t12)*cos(t24)+az*sin(f1)*sin(t24));
     n5_4=sin(f5)*(ax*cos(t12)*sin(t24)+ay*sin(t12)*sin(t24)-az*sin(f1)*cos(t24));
    
     t51=atan2(((ay*cos(t11)-ax*sin(t11))^2+(m5_1*cos(t31)+n5_1*sin(t31))^2)^0.5,(m5_1*sin(t31)-n5_1*cos(t31))/(sin(f3)*sin(f4)));
     t52=atan2(-((ay*cos(t11)-ax*sin(t11))^2+(m5_1*cos(t31)+n5_1*sin(t31))^2)^0.5,(m5_1*sin(t31)-n5_1*cos(t31))/(sin(f3)*sin(f4)));
     t53=atan2(((ay*cos(t11)-ax*sin(t11))^2+(m5_2*cos(t32)+n5_2*sin(t32))^2)^0.5,(m5_2*sin(t32)-n5_2*cos(t32))/(sin(f3)*sin(f4)));
     t54=atan2(-((ay*cos(t11)-ax*sin(t11))^2+(m5_2*cos(t32)+n5_2*sin(t32))^2)^0.5,(m5_2*sin(t32)-n5_2*cos(t32))/(sin(f3)*sin(f4)));
    
     t55=atan2(((ay*cos(t12)-ax*sin(t12))^2+(m5_3*cos(t33)+n5_3*sin(t33))^2)^0.5,(m5_3*sin(t33)-n5_3*cos(t33))/(sin(f3)*sin(f4)));
     t56=atan2(-((ay*cos(t12)-ax*sin(t12))^2+(m5_3*cos(t33)+n5_3*sin(t33))^2)^0.5,(m5_3*sin(t33)-n5_3*cos(t33))/(sin(f3)*sin(f4)));
     t57=atan2(((ay*cos(t12)-ax*sin(t12))^2+(m5_4*cos(t34)+n5_4*sin(t34))^2)^0.5,(m5_4*sin(t34)-n5_4*cos(t34))/(sin(f3)*sin(f4)));
     t58=atan2(-((ay*cos(t12)-ax*sin(t12))^2+(m5_4*cos(t34)+n5_4*sin(t34))^2)^0.5,(m5_4*sin(t34)-n5_4*cos(t34))/(sin(f3)*sin(f4)));
    
     %t4
     if sin(t51)==0
         t41=0;
     else 
         t41=atan2(((ay*cos(t11)-ax*sin(t11))*sin(f1)*sin(f5))/(-sin(t51)*sin(f3)),(-m5_1*cos(t31)-n5_1*sin(t31))/(sin(t51)));
     end
     if sin(t52)==0 
         t42=0;
     else 
         t42=atan2(((ay*cos(t11)-ax*sin(t11))*sin(f1)*sin(f5))/(-sin(t52)*sin(f3)),(-m5_1*cos(t31)-n5_1*sin(t31))/(sin(t52)));
     end
     if sin(t53)==0 
         t43=0;
     else 
         t43=atan2(((ay*cos(t11)-ax*sin(t11))*sin(f1)*sin(f5))/(-sin(t53)*sin(f3)),(-m5_2*cos(t32)-n5_2*sin(t32))/(sin(t53)));
     end
     if sin(t54)==0 
         t44=0;
     else 
         t44=atan2(((ay*cos(t11)-ax*sin(t11))*sin(f1)*sin(f5))/(-sin(t54)*sin(f3)),(-m5_2*cos(t32)-n5_2*sin(t32))/(sin(t54)));
     end
    
     if sin(t55)==0
         t45=0;
     else 
         t45=atan2(((ay*cos(t12)-ax*sin(t12))*sin(f1)*sin(f5))/(-sin(t55)*sin(f3)),(-m5_3*cos(t33)-n5_3*sin(t33))/(sin(t55)));
     end
     if sin(t56)==0 
         t46=0;
     else 
         t46=atan2(((ay*cos(t12)-ax*sin(t12))*sin(f1)*sin(f5))/(-sin(t56)*sin(f3)),(-m5_3*cos(t33)-n5_3*sin(t33))/(sin(t56)));
     end
     if sin(t57)==0 
         t47=0;
     else 
         t47=atan2(((ay*cos(t12)-ax*sin(t12))*sin(f1)*sin(f5))/(-sin(t57)*sin(f3)),(-m5_4*cos(t34)-n5_4*sin(t34))/(sin(t57)));
     end
     if sin(t58)==0 
         t48=0;
     else 
         t48=atan2(((ay*cos(t12)-ax*sin(t12))*sin(f1)*sin(f5))/(-sin(t58)*sin(f3)),(-m5_4*cos(t34)-n5_4*sin(t34))/(sin(t58)));
     end
     %t6
     e1=nx*sin(t11)-ny*cos(t11);
     f1=ox*sin(t11)-oy*cos(t11);
     t61=atan2((cos(t41)*e1-cos(t51)*sin(t41)*f1),(cos(t41)*f1+cos(t51)*sin(t41)*e1));
     t62=atan2((cos(t42)*e1-cos(t52)*sin(t42)*f1),(cos(t42)*f1+cos(t52)*sin(t42)*e1));
     t63=atan2((cos(t43)*e1-cos(t53)*sin(t43)*f1),(cos(t43)*f1+cos(t53)*sin(t43)*e1));
     t64=atan2((cos(t44)*e1-cos(t54)*sin(t44)*f1),(cos(t44)*f1+cos(t54)*sin(t44)*e1));
    
     e2=nx*sin(t12)-ny*cos(t12);
     f2=ox*sin(t12)-oy*cos(t12);
     t65=atan2((cos(t45)*e2-cos(t55)*sin(t45)*f2),(cos(t45)*f2+cos(t55)*sin(t45)*e2));
     t66=atan2((cos(t46)*e2-cos(t56)*sin(t46)*f2),(cos(t46)*f2+cos(t56)*sin(t46)*e2));
     t67=atan2((cos(t47)*e2-cos(t57)*sin(t47)*f2),(cos(t47)*f2+cos(t57)*sin(t47)*e2));
     t68=atan2((cos(t48)*e2-cos(t58)*sin(t48)*f2),(cos(t48)*f2+cos(t58)*sin(t48)*e2));
    
     ikine_t=[t11 t21 t31 t41 t51 t61;
              t11 t21 t31 t42 t52 t62;
              t11 t22 t32 t43 t53 t63;
              t11 t22 t32 t44 t54 t64
              t12 t23 t33 t45 t55 t65;
              t12 t23 t33 t46 t56 t66;
              t12 t24 t34 t47 t57 t67;
              t12 t24 t34 t48 t58 t68];

    4.运行结果
    给定关节角为:

    (-pi/3,-pi/3,pi/3,-pi/4,pi/4,pi/6)

    正解得到末端位姿:

    modmyt06

    这里写图片描述
    再用modmyt06去进行逆解,结果如下:
    这里写图片描述
    共有8组解,正解回去位姿符合。
    这里写图片描述
    这里写图片描述
    PS:逆解推荐用arctan反解角度,本程序适用于改进DH模型,仅用于学习,不适用于工业应用。

    展开全文
  • 转载: https://blog.csdn.net/jldemanman/article/details/79229312 摘要 本文主要是给大家一个系统的概念,如何用Matlab实现六轴机器人的建模和实现轨迹规划。以后将会给大家讲解如...

             转载:           https://blog.csdn.net/jldemanman/article/details/79229312                
                                                  摘要 
    本文主要是给大家一个系统的概念,如何用Matlab实现六轴机器人的建模和实现轨迹规划。以后将会给大家讲解如何手写正逆解以及轨迹插补的程序。程序是基于Matlab2016a,工具箱版本为Robotic Toolbox 9.10。 
    1.D-H建模 
    三个两两相互垂直的XYZ轴构成欧几里得空间,存在六个自由度:沿XYZ平移的三个自由度,绕XYZ旋转的三个自由度。在欧几里得空间中任意线性变换都可以通过这六个自由度完成。 
    Denavit-Hartenberg提出的D-H参数模型能满足机器人学中的最小线性表示约定,用4个参数就能描述坐标变换:绕X轴平移距离a;绕X轴旋转角度alpha;绕Z轴平移距离d;绕Z轴旋转角度theta。 
    2.标准D-H模型和改进D-H模型 
     
    对比来看参数并没有改变,标准的 D-H 模型是将连杆的坐标系固定在该连杆的输出端(下一关节),也即坐标系i-1与关节i对齐;改进的 D-H模型 则是将坐标系固定在该连杆的输入端(上一关节),也即坐标系i-1与关节对齐i-1。(具体建模可见后面的博客) 
    3.利用 Matlab Robotic Toolbox 建立机器人模型 
    alpha:连杆扭角; 
    a:连杆长度; 
    theta:关节转角; 
    d:关节距离; 
    offset:偏移

    clear;
    clc;
    %建立机器人模型
    %       theta    d        a        alpha     offset
    L1=Link([0       0.4      0.025    pi/2      0     ]); %定义连杆的D-H参数
    L2=Link([pi/2    0        0.56     0         0     ]);
    L3=Link([0       0        0.035    pi/2      0     ]);
    L4=Link([0       0.515    0        pi/2      0     ]);
    L5=Link([pi      0        0        pi/2      0     ]);
    L6=Link([0       0.08     0        0         0     ]);
    robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','manman'); %连接连杆,机器人取名manman
    robot.plot([0,pi/2,0,0,pi,0]);%输出机器人模型,后面的六个角为输出时的theta姿态123456789101112

    本段代码取名为代码段1,效果图如下: 
     
    在代码段1的后面加入display函数可以输出模型的一些参数

     

    robot.display();1

     
    其中表格为D-H参数,grav为重力加速度矢量,base为基坐标系的齐次矩阵,tool为工具坐标系和末端连杆的坐标系之间的变换矩阵。 
    在代码段1的后面加入teach指令,则可调整各个关节角度,能够让初学者更好的了解六轴机器人的结构。

     

    teach(robot);1

     
    4.运动学正逆解 
    运动学正解:根据6个关节角结算出末端位姿。 
    运动学逆解:根据末端位姿结算出关节角,这里会存在8组逆解,本文中用的反解函数会智能输出最优的一组解。 
    正解程序:

     

    clear;
    clc;
    %建立机器人模型
    %       theta    d        a        alpha     offset
    L1=Link([0       0.4      0.025    pi/2      0     ]); %定义连杆的D-H参数
    L2=Link([pi/2    0        0.56     0         0     ]);
    L3=Link([0       0        0.035    pi/2      0     ]);
    L4=Link([0       0.515    0        pi/2      0     ]);
    L5=Link([pi      0        0        pi/2      0     ]);
    L6=Link([0       0.08     0        0         0     ]);
    robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','manman'); %连接连杆,机器人取名manman
    theta=[0,0,0,0,0,0];%指定的关节角
    p=robot.fkine(theta)%fkine正解函数,根据我们给定的关节角theta,求解出末端位姿p
    q=robot.ikine(p)%ikine逆解函数,根据我们给定的末端位姿p,求解出关节角q1234567891011121314

    我们可以查看p和q,对比theta和q,发现是一致的(实际情况中并不是完全一致,会有一点偏差,我这里选的点特殊了)。 
     
     
    5.轨迹规划 
    在实际应用中,我们一般都是知道末端的轨迹,然后使机器人动作。本文的例子是根据给定两个点的值,得到末端位姿,根据末端位姿再来规划轨迹。

     

    clear;
    clc;
    %建立机器人模型
    %       theta    d        a        alpha     offset
    L1=Link([0       0.4      0.025    pi/2      0     ]); %定义连杆的D-H参数
    L2=Link([pi/2    0        0.56     0         0     ]);
    L3=Link([0       0        0.035    pi/2      0     ]);
    L4=Link([0       0.515    0        pi/2      0     ]);
    L5=Link([pi      0        0        pi/2      0     ]);
    L6=Link([0       0.08     0        0         0     ]);
    robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','manman'); %连接连杆,机器人取名manman
    T1=transl(0.5,0,0);%根据给定起始点,得到起始点位姿
    T2=transl(0,0.5,0);%根据给定终止点,得到终止点位姿
    q1=robot.ikine(T1);%根据起始点位姿,得到起始点关节角
    q2=robot.ikine(T2);%根据终止点位姿,得到终止点关节角
    [q ,qd, qdd]=jtraj(q1,q2,50); %五次多项式轨迹,得到关节角度,角速度,角加速度,50为采样点个数
    grid on
    T=robot.fkine(q);%根据插值,得到末端执行器位姿
    plot3(squeeze(T(1,4,:)),squeeze(T(2,4,:)),squeeze(T(3,4,:)));%输出末端轨迹
    hold on
    robot.plot(q);%动画演示123456789101112131415161718192021

     
    蓝色细线就是规划的轨迹,六轴机器人manman将会动态演示从起始点到终止点的过程。 
    PS:本文的所有程序都是调用现成的函数,仅为大家建立一个概念,后面的博客将给大家讲解各个函数写法。
     

    展开全文
  • 六轴机器人控制系统软件设计

    千次阅读 2019-11-17 03:47:43
    六轴机器人控制系统软件设计 这是一款基于Window操作系统,六轴机器人上位机软件 软件功能简介 标记文本 **1. 全新的界面设计 ,将会带来全新的写作体验; 2. DH参数设置; 3. 正解逆解实时运算; 4. 强大...

    六轴机器人控制系统软件设计

    这是一款基于Window操作系统,六轴机器人上位机软件

    软件功能简介

    标记文本
    **1. 全新的界面设计 ,将会带来全新的操作体验;
    2. DH参数设置;
    3. 正解逆解实时运算;
    4. 强大的图形化编程界面,仿工业ABB机器人编程方式;
    5. 可以实现示教再现;
    6. 程序可以备份 还原;
    7. 运动指令的支持: 复制 粘贴 剪切 修改等功能;
    8. 支持单次循环 连续循环 **

    通信协议开放

    支持6轴步进电机控制
    支持8路输入8路输出(可配置成电机控制引脚,扩展到 控制 10轴以上 )

    LL #
    //功能:校零点指令
    //LL 代表协议头; #结尾符号
    //【需要下位机 反馈"ok"】

    MJ X 12.5 Y 0.09 Z 25.25 A 0 B 90 C 0 D 100 S 30 T 1000 = 1252.5 #
    //功能:运动指令(点到点)
    //MJ 代表协议头; XYZABAC代表1-6轴的角度(度);D 滑台位置(mm) S是速度(%) T 加速时间(ms) =是校验码 #结尾符号
    //校验公式= 所有值相加之和
    //【需要下位机 反馈"ok"】

    delay 1000 #
    //功能:延时指令,延时单位毫秒;
    //delay 代表协议头;#结尾符号
    【需要下位机 “%a 255 b 255 ok”
    //a 后边跟着输入信号状态 (8个二进制编码成十进制)
    //b 后边跟着输出信号状态 (8个二进制编码成十进制)

    Set 1 #
    //置位指令,把输出通道1置高电平;
    //Set 代表协议头; #结尾符号
    【需要下位机 “%a 255 b 255 ok”
    //a 后边跟着输入信号状态 (8个二进制编码成十进制)
    //b 后边跟着输出信号状态 (8个二进制编码成十进制)

    Reset 1 #
    //复位指令,把输出通道1置低电平;
    //Reset 代表协议头;#结尾符号
    【需要下位机 “%a 255 b 255 ok”
    //a 后边跟着输入信号状态 (8个二进制编码成十进制)
    //b 后边跟着输出信号状态 (8个二进制编码成十进制)

    WaitDi 1 = 0 #
    //等待指令,等输入通道1为低电平,不满足,会一直等待;
    //WaitDi 代表协议头;#结尾符号
    【需要下位机 “%a 255 b 255 ok”
    //a 后边跟着输入信号状态 (8个二进制编码成十进制)
    //b 后边跟着输出信号状态 (8个二进制编码成十进制)

    WaitDi 1 = 1 #
    //等待指令,等输入通道1为高电平,不满足,会一直等待;
    //WaitDi 代表协议头;#结尾符号
    【需要下位机 “%a 255 b 255 ok”
    //a 后边跟着输入信号状态 (8个二进制编码成十进制)
    //b 后边跟着输出信号状态 (8个二进制编码成十进制)

    F5 #
    //获取输入输出状态;
    //F5 代表协议头; #结尾符号
    【需要下位机 “%a 255 b 255 ok”
    //a 后边跟着输入信号状态 (8个二进制编码成十进制)
    //b 后边跟着输出信号状态 (8个二进制编码成十进制)

    SV 55 #
    //控制舵机角度;
    //SV 代表协议头; #结尾符号
    //55 代表 角度值(单位度)

    Grip 55 #
    //控制抓子开口大小;
    //Grip 代表协议头; #结尾符号
    //55 代表 开口大小值(单位mm)

    [^]: 官网渠道购买

    [^]: 点我下载体验软件

    图片: 软件截图:在这里插入图片描述
    图形仿真界面:图形界面
    D-H参数表:
    在这里插入图片描述
    连接运动控制器:在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    展开全文
  • 在工业过程中需要考虑的根据期望位姿推导关节角度(机械臂逆解),以及根据现有的关节角度推导末端执行器位姿(机械臂正解)。 3.1 空间转换矩阵的理解 3.1.1平移变换 3.1.2旋转变换 除了位置之外,还需要对刚体...
  • 机械臂——六轴机械臂逆解

    万次阅读 多人点赞 2018-09-01 23:57:32
    环境:MATLAB 2017B+Robotics Toolbox 9.10.0 ...注意:这里采用几何法计算机械臂逆解,因此不一定适用于其他六轴机械臂构型。   一、运动学分析 连杆变换是机器人进行运动学分析的基础,其建立主要...
  • 整理出了如下几个计算六轴机械臂正解和逆解的关键点: 01_机器人坐标系和关节的说明 02_算法坐标系的建立 03_D-H参数表的建立 04_FK(正解)算法 05_Matlab辅助计算FK(正解) 06_IK(逆解)算法 07_Matlab辅助计算...
  • %% Compiled by Ezekiel according to robot modeling and control %% 2020/9/25 clear;...%% DH矩阵,DH建模法建立六轴机器人模型 %% th d a alpha L(1) = Link([ 0, 1, 0, pi/2 ], 'qlim','[-pi/4 p
  • 分拣机器人设计与MATLAB仿真

    千次阅读 多人点赞 2020-06-29 17:03:45
      2、求机器人的完整逆解,基本要求是末端实现位姿逆解。   3、利用逆解完成末端路径仿真。 二、建立坐标系,给出D-H参数表 三、推导正运动学,并写出七个齐次变换矩阵   假设现在位于本地参考坐标系Xn-Zn,...
  • 位姿分离逆解算法

    2019-11-24 10:51:24
    大多数工业机器人的几何结构都满足 Pieper 准则,即 3 个相邻关节交于一点或相互平行,其运动学逆解可以得到数量一定的若干组封闭解。对于最后 3 个关节为旋转关节而且轴线相交于一点的自由度机器人,其前 3 个...
  • 机械臂——六轴机械臂构型分析与MATLAB建模

    万次阅读 多人点赞 2018-08-26 14:15:56
    机械臂逆解计算 一、六轴机械臂构型分析 关节机器人,是应用于当前工业领域中最为广泛的工业机器人的构型之一,它也被称作关节型手臂机器人或者关节型机械手臂。它可应用于诸多工业领域,例如喷漆、自动装配、...
  • 六轴机械臂算法-引导篇

    万次阅读 多人点赞 2018-06-02 12:41:09
    最近一直在研究 6轴机械臂算法,整理出了如下几个计算六轴机械臂正解和逆解的关键点: 01_机器人坐标系和关节的说明 02_算法坐标系的建立 03_D-H参数表的建立 04_FK(正解)算法 05_Matlab辅助计算FK(正解) ...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

六轴机器人逆解