【机器人学】2-1.六自由度机器人运动学逆解-协作机器人【附MATLAB代码】

        通过上一篇文章​​​​​​六自由度机器人正解已经获得了机器人各连杆间的转换关系。当知道各个连杆的转角\theta1、\theta2、\theta3、\theta4、\theta5、\theta6时可以求出末端执行器的位姿,这个过程称为正向运动学。这篇文章将讨论逆向运动学,即,给定末端执行器的位姿,求解各连杆的转角。在实际生活中逆向运动学更为实用。

现已知末端姿态矩阵和机器人的运动学模型,求解\theta1、\theta2、\theta3、\theta4、\theta5、\theta6。

已知六轴机器人的D-H参数如下所示:

如果不清楚何为改进的DH参数,可以看我的上一篇博客。【机器人学】1-1.六自由度机器人运动学正解 【附MATLAB代码】

关节1关节2关节3关节4关节5关节6
\alpha09000-9090
a0042539300
d160.700113.39993.6
\theta0900-9000
\beta000000

选用改进型的D-H参数,各矩阵分别如下所示:

        其中

        如果你的机械臂D-H参数结构和我的一致,以上解析解你可以直接使用,如果参数相差不大,可以跟着我的计算思路推导一下你自己的逆解方程,相信你也可以得到正确的结果。

        MATLAB仿真验证

function R=AxisAngle_RotMat(Rxyz)
    theta=(Rxyz(1)^2+Rxyz(2)^2+Rxyz(3)^2)^0.5;
    if(abs(theta)<1e-8)
        R=eye(3);
        return;
    end
    r=Rxyz/theta;

    R=[r(1)^2*(1-cos(theta))+cos(theta) r(1)*r(2)*(1-cos(theta))-r(3)*sin(theta) r(1)*r(3)*(1-cos(theta))+r(2)*sin(theta)
       r(1)*r(2)*(1-cos(theta))+r(3)*sin(theta) r(2)^2*(1-cos(theta))+cos(theta) r(2)*r(3)*(1-cos(theta))-r(1)*sin(theta)
       r(1)*r(3)*(1-cos(theta))-r(2)*sin(theta) r(2)*r(3)*(1-cos(theta))+r(1)*sin(theta) r(3)^2*(1-cos(theta))+cos(theta)];
end

clc;clear;
%带入机器人初始值
d1 = 0.1607;
d2 = 0;
d3 = 0;
d4 = 0.1133;
d5 = 0.099;
d6 = 0.0936;

a1 = 0;
a2 = 0;
a3 = 0.425;
a4 = 0.393;
a5 = 0;
a6 = 0;

%testData1  测试数据 
px = 0.129;
py = 0.157;
pz = 0.858;
rx = 38.05;
ry = 42.96;
rz = -179.77;

posture = [rx/180*pi,ry/180*pi,rz/180*pi];
%轴线表示转换为姿态矩阵转
a = AxisAngle_RotMat(posture);
%目标位置姿态矩阵
nx=a(1,1);ox=a(1,2);ax=a(1,3);
ny=a(2,1);oy=a(2,2);ay=a(2,3);
nz=a(3,1);oz=a(3,2);az=a(3,3);

% 求解关节角1
    t1 = (d6*a(1,3)-px);
    t2 = (d6*a(2,3)-py);
    theta1_1 = atan2(t2,t1) - atan2(d4, sqrt(t1^2+t2^2-d4^2)) ;
    theta1_2 = atan2(t2,t1) - atan2(d4, -sqrt(t1^2+t2^2-d4^2)) ;   
    disp([theta1_1 theta1_2]*180/pi);
% 求解关节角5
    theta5_1 = atan2(sqrt((ny*cos(theta1_1)-nx*sin(theta1_1))^2+(oy*cos(theta1_1)-ox*sin(theta1_1))^2), ax*sin(theta1_1)-ay*cos(theta1_1));
    theta5_2 = atan2(-sqrt((ny*cos(theta1_1)-nx*sin(theta1_1))^2+(oy*cos(theta1_1)-ox*sin(theta1_1))^2), ax*sin(theta1_1)-ay*cos(theta1_1));
    theta5_3 = atan2(sqrt((ny*cos(theta1_2)-nx*sin(theta1_2))^2+(oy*cos(theta1_2)-ox*sin(theta1_2))^2), ax*sin(theta1_2)-ay*cos(theta1_2));
    theta5_4 = atan2(-sqrt((ny*cos(theta1_2)-nx*sin(theta1_2))^2+(oy*cos(theta1_2)-ox*sin(theta1_2))^2), ax*sin(theta1_2)-ay*cos(theta1_2));

    disp([theta5_1 theta5_2 theta5_3 theta5_4]*180/pi);

% 求解关节角6
    theta6_1 = atan2((ox*sin(theta1_1)-oy*cos(theta1_1))/sin(theta5_1), -(nx*sin(theta1_1)-ny*cos(theta1_1))/sin(theta5_1));
    theta6_2 = atan2((ox*sin(theta1_1)-oy*cos(theta1_1))/sin(theta5_2), -(nx*sin(theta1_1)-ny*cos(theta1_1))/sin(theta5_2));
    theta6_3 = atan2((ox*sin(theta1_2)-oy*cos(theta1_2))/sin(theta5_3), -(nx*sin(theta1_2)-ny*cos(theta1_2))/sin(theta5_3));
    theta6_4 = atan2((ox*sin(theta1_2)-oy*cos(theta1_2))/sin(theta5_4), -(nx*sin(theta1_2)-ny*cos(theta1_2))/sin(theta5_4));
    disp([theta6_1 theta6_2 theta6_3 theta6_4]*180/pi);
 
% 求解关节角2,3,4
    q234_1 = atan2(az/sin(theta5_1), (ax*cos(theta1_1)+ay*sin(theta1_1))/sin(theta5_1));
    q234_2 = atan2(az/sin(theta5_2), (ax*cos(theta1_1)+ay*sin(theta1_1))/sin(theta5_2));
    q234_3 = atan2(az/sin(theta5_3), (ax*cos(theta1_2)+ay*sin(theta1_2))/sin(theta5_3));
    q234_4 = atan2(az/sin(theta5_4), (ax*cos(theta1_2)+ay*sin(theta1_2))/sin(theta5_4));
    disp([q234_1 q234_2 q234_3 q234_4]*180/pi);
   
    A_1 = d6*sin(theta5_1)*cos(q234_1)-d5*sin(q234_1)-px*cos(theta1_1)-py*sin(theta1_1);
    B_1 = pz-d1-d5*cos(q234_1)-d6*sin(theta5_1)*sin(q234_1);
    A_2 = -px*cos(theta1_1)-py*sin(theta1_1)-d5*sin(q234_2)+d6*sin(theta5_2)*cos(q234_2);
    B_2 = pz-d1-d5*cos(q234_2)-d6*sin(theta5_2)*sin(q234_2);
    A_3 = -px*cos(theta1_2)-py*sin(theta1_2)-d5*sin(q234_3)+d6*sin(theta5_3)*cos(q234_3);
    B_3 = pz-d1-d5*cos(q234_3)-d6*sin(theta5_3)*sin(q234_3);
    A_4 = -px*cos(theta1_2)-py*sin(theta1_2)-d5*sin(q234_4)+d6*sin(theta5_4)*cos(q234_4);
    B_4 = pz-d1-d5*cos(q234_4)-d6*sin(theta5_4)*sin(q234_4);
%     关节2
    theta2_1 = atan2(A_1^2+B_1^2+a3^2-a4^2, sqrt(abs(4*a3^2*(A_1^2+B_1^2)-(A_1^2+B_1^2+a3^2-a4^2)^2)))-atan2(B_1, A_1);
    theta2_2 = atan2(A_1^2+B_1^2+a3^2-a4^2, -sqrt(abs(4*a3^2*(A_1^2+B_1^2)-(A_1^2+B_1^2+a3^2-a4^2)^2)))-atan2(B_1, A_1);
    theta2_3 = atan2(A_2^2+B_2^2+a3^2-a4^2, sqrt(abs(4*a3^2*(A_2^2+B_2^2)-(A_2^2+B_2^2+a3^2-a4^2)^2)))-atan2(B_2, A_2);
    theta2_4 = atan2(A_2^2+B_2^2+a3^2-a4^2, -sqrt(abs(4*a3^2*(A_2^2+B_2^2)-(A_2^2+B_2^2+a3^2-a4^2)^2)))-atan2(B_2, A_2);
    theta2_5 = atan2(A_3^2+B_3^2+a3^2-a4^2, sqrt(abs(4*a3^2*(A_3^2+B_3^2)-(A_3^2+B_3^2+a3^2-a4^2)^2)))-atan2(B_3, A_3);
    theta2_6 = atan2(A_3^2+B_3^2+a3^2-a4^2, -sqrt(abs(4*a3^2*(A_3^2+B_3^2)-(A_3^2+B_3^2+a3^2-a4^2)^2)))-atan2(B_3, A_3);
    theta2_7 = atan2(A_4^2+B_4^2+a3^2-a4^2, sqrt(abs(4*a3^2*(A_4^2+B_4^2)-(A_4^2+B_4^2+a3^2-a4^2)^2)))-atan2(B_4, A_4);
    theta2_8 = atan2(A_4^2+B_4^2+a3^2-a4^2, -sqrt(abs(4*a3^2*(A_4^2+B_4^2)-(A_4^2+B_4^2+a3^2-a4^2)^2)))-atan2(B_4, A_4);
    disp([theta2_1 theta2_2 theta2_3 theta2_4 theta2_5 theta2_6 theta2_7 theta2_8]*180/pi);

    q23_1 = atan2(-px*cos(theta1_1)-py*sin(theta1_1)-d5*sin(q234_1)+d6*sin(theta5_1)*cos(q234_1)-a3*sin(theta2_1),pz-d1-d5*cos(q234_1)-d6*sin(theta5_1)*sin(q234_1)-a3*cos(theta2_1));
    q23_2 = atan2(-px*cos(theta1_1)-py*sin(theta1_1)-d5*sin(q234_1)+d6*sin(theta5_1)*cos(q234_1)-a3*sin(theta2_2),pz-d1-d5*cos(q234_1)-d6*sin(theta5_1)*sin(q234_1)-a3*cos(theta2_2));
    q23_3 = atan2(-px*cos(theta1_1)-py*sin(theta1_1)-d5*sin(q234_2)+d6*sin(theta5_2)*cos(q234_2)-a3*sin(theta2_3),pz-d1-d5*cos(q234_2)-d6*sin(theta5_2)*sin(q234_2)-a3*cos(theta2_3));
    q23_4 = atan2(-px*cos(theta1_1)-py*sin(theta1_1)-d5*sin(q234_2)+d6*sin(theta5_2)*cos(q234_2)-a3*sin(theta2_4),pz-d1-d5*cos(q234_2)-d6*sin(theta5_2)*sin(q234_2)-a3*cos(theta2_4));
    q23_5 = atan2(-px*cos(theta1_2)-py*sin(theta1_2)-d5*sin(q234_3)+d6*sin(theta5_3)*cos(q234_3)-a3*sin(theta2_5),pz-d1-d5*cos(q234_3)-d6*sin(theta5_3)*sin(q234_3)-a3*cos(theta2_5));
    q23_6 = atan2(-px*cos(theta1_2)-py*sin(theta1_2)-d5*sin(q234_3)+d6*sin(theta5_3)*cos(q234_3)-a3*sin(theta2_6),pz-d1-d5*cos(q234_3)-d6*sin(theta5_3)*sin(q234_3)-a3*cos(theta2_6));
    q23_7 = atan2(-px*cos(theta1_2)-py*sin(theta1_2)-d5*sin(q234_4)+d6*sin(theta5_4)*cos(q234_4)-a3*sin(theta2_7),pz-d1-d5*cos(q234_4)-d6*sin(theta5_4)*sin(q234_4)-a3*cos(theta2_7));
    q23_8 = atan2(-px*cos(theta1_2)-py*sin(theta1_2)-d5*sin(q234_4)+d6*sin(theta5_4)*cos(q234_4)-a3*sin(theta2_8),pz-d1-d5*cos(q234_4)-d6*sin(theta5_4)*sin(q234_4)-a3*cos(theta2_8));
 %    关节3
    theta3_1 = q23_1 - theta2_1;
    theta3_2 = q23_2 - theta2_2;
    theta3_3 = q23_3 - theta2_3;
    theta3_4 = q23_4 - theta2_4;
    theta3_5 = q23_5 - theta2_5;
    theta3_6 = q23_6 - theta2_6;
    theta3_7 = q23_7 - theta2_7;
    theta3_8 = q23_8 - theta2_8;
 %    关节4
    theta4_1 = q234_1 - q23_1;
    theta4_2 = q234_1 - q23_2;
    theta4_3 = q234_2 - q23_3;
    theta4_4 = q234_2 - q23_4;
    theta4_5 = q234_3 - q23_5;
    theta4_6 = q234_3 - q23_6;
    theta4_7 = q234_4 - q23_7;
    theta4_8 = q234_4 - q23_8;

theta_STD = [ 
              theta1_1,theta2_1,theta3_1,theta4_1,theta5_1,theta6_1;
 			  theta1_1,theta2_2,theta3_2,theta4_2,theta5_1,theta6_1;
 			  theta1_1,theta2_3,theta3_3,theta4_3,theta5_2,theta6_2;
 			  theta1_1,theta2_4,theta3_4,theta4_4,theta5_2,theta6_2;
              theta1_2,theta2_5,theta3_5,theta4_5,theta5_3,theta6_3;
 			  theta1_2,theta2_6,theta3_6,theta4_6,theta5_3,theta6_3;
 			  theta1_2,theta2_7,theta3_7,theta4_7,theta5_4,theta6_4;
 			  theta1_2,theta2_8,theta3_8,theta4_8,theta5_4,theta6_4;
             ]*180/pi



由于MATLAB中机器人工具箱对运动学逆解仿真度不够,为此用我自己的模拟机器人测试。没有仿真平台的同学,可以用其他机器人工具箱代替。或其它测试方法。

测试数据1:

图中左边6个参数代表机器人的末端姿态(输入参数),右边6个参数代表6个关节角度(结果)。

MATLAB计算结果1:

 测试数据2:

MATLAB计算结果2:

 测试数据3:

MATLAB计算结果3:

        在工业控制中,由于连杆的DH参数不准确,因此并不能直接将解析解得到的逆解角度直接发送到机器人进行控制,会导致很大的误差, 工业控制中会将机器人进行参数辨识获得准确的DH参数,在进行迭代求解的方式获得关节角度。如果想要学习这方面的知识,请仔细阅读我的第六章博客。

        【机器人学】6-5.六自由度机器人运动学参数辨识-逆运动学迭代解【附MATLAB代码】

下一章:【机器人学】2-2.六自由度机器人运动学逆解-奇异位形分析【附MATLAB代码】-优快云博客文章浏览阅读33次。通过D-H参数,选用改进型的D-H参数,可以得到各个关节间的旋转矩阵。详细请看我的第一篇博客。_六自由度机器人的雅可比矩阵通式。【机器人学】3-1.六自由度机器人速度域-雅克比矩阵【附MATLAB代码】_六自由度机器人的雅可比矩阵通式-优快云博客。下一章:【机器人学】2-3.六自由度机器人运动学逆解-解的存在性与解的选取【附MATLAB代码】里面介绍了两种求解雅可比矩阵的方法,任选一种即可。https://blog.youkuaiyun.com/y12345655/article/details/141528639

        2024-07-15 更新:将求解q2的过程详细化

### 回答1: 抱歉,作为一名语言模型,我无法绘制图像。但我可以为你描述一个简单的网络拓扑图,它可能类似于这样: 在中心,有一个圆形的节点,代表服务器或路由器。从该节点向外伸出几条线,每条线代表一个网络连接。每个连接的末端可能是另一个圆形节点,也可能是一个小圆点,代表计算机或其他设备。 在实际的网络拓扑图中,可能还会有更多的节点、连接和子网。但是这个简单的示例应该足以帮助你理网络拓扑的基本概念。 ### 回答2: 网络拓扑图是一种用图形表示网络结构的工具。它展示了网络中各个节点和它们之间的连接关系。一个简单的网络拓扑图可以如下所示: 在这张图中,我们有四个节点,分别用A、B、C、D表示。这四个节点可以代表计算机、服务器或其他网络设备。这些节点之间的连接关系是通过连线表示的,箭头表示了连接的方向。 在这个例子中,A节点连接到B和C节点,B节点连接到C和D节点,C节点连接到D节点。这种连接方式可以是有线连接,比如以太网线,或者是无线连接,比如Wi-Fi。 这个简单的网络拓扑图展示了一个典型的星型拓扑结构,其中A节点是中心节点,其他节点都与它相连。这种拓扑结构通常用于小型网络,例如家庭网络或办公室网络。 通过网络拓扑图,我们可以清楚地看到网络中各个节点之间的连接关系,帮助我们理和管理网络。此外,它还能够帮助我们确定网络中的瓶颈和故障点,以便更好地优化网络性能或决问题。 总之,网络拓扑图是一种简单而重要的工具,可以帮助我们理和管理网络。它可以根据实际情况进行扩展和调整,以适应更复杂的网络结构。 ### 回答3: 网络拓扑图是用于描述计算机网络中各个设备之间连接关系的图形化表示。以下是一个简单的网络拓扑图的描述: 这个网络拓扑图描述了一个小型办公室网络,其中有5台设备,包括1台路由器、2台台式电脑、1台打印机和1台无线接入点。所有设备都通过以太网连接。 在图的左侧,有一台标有“路由器”的设备,它有多个以太网接口,用于与其他设备连接。从路由器分别连接到两台台式电脑和无线接入点。无线接入点放置在办公室中心,它通过无线信号与其他无线设备通信。 两台台式电脑位于网络中间部分,它们分别通过以太网电缆与路由器相连。这些电脑可以通过路由器互相通信,并与其他设备进行数据交换。 在图的右侧,有一台打印机,它通过以太网连接到路由器。这将使所有网络中的设备都能够与打印机进行通信和共享打印资源。 整个网络拓扑图简单明了,清晰地展示了设备之间的连接关系。它可以帮助人们更好地理网络结构,诊断和决网络问题。
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值