修正逆解文章——六轴UR机械臂正逆运动学求解_MATLAB代码(标准DH参数表)

如下参考链接1的作者大大实现了UR5机械臂的正运动学和逆运动学的Matlab代码。但逆解部分在不同版本的Matlab中运行有错误。

本篇文章是MatlabR2016a下完成的,并说明一下原代码错误的原因。

目录

一、参考链接说明

二、UR5机械臂运动学正解

三、UR5机械臂运动学逆解

四、测试代码

五、参考链接1的逆解代码错误原因


参考链接:六轴UR机械臂正逆运动学求解_MATLAB代码(标准DH参数表)

UR机械臂正逆运动学求解

一、参考链接说明

参考链接2的作者实现了UR5机械臂的正运动学和逆运动学的理论推导,给出了求解公式;

参考链接1的作者在参考链接2的基础上,写出了Matlab代码,但作者给出的代码只能在特定的Matlab中运行,如2017b。

二、UR5机械臂运动学正解

function T = zhengyundongxue(theta)
    %已知关节角求变换矩阵
    a=[0,-0.42500,-0.39225,0,0,0];
    d=[0.089159,0,0,0.10915,0.09465,0.08230];
    alpha=[pi/2,0,0,pi/2,-pi/2,0];
 
    
    T01=T_para(theta(1),d(1),a(1),alpha(1));
    T12=T_para(theta(2),d(2),a(2),alpha(2));
    T23=T_para(theta(3),d(3),a(3),alpha(3));
    T34=T_para(theta(4),d(4),a(4),alpha(4));
    T45=T_para(theta(5),d(5),a(5),alpha(5));
    T56=T_para(theta(6),d(6),a(6),alpha(6));
    
    T=T01*T12*T23*T34*T45*T56;
    
end

function T = T_para(theta,d,a,alpha)
    T=[ccc(theta),-sss(theta)*ccc(alpha),sss(theta)*sss(alpha),a*ccc(theta);
        sss(theta),ccc(theta)*ccc(alpha),-ccc(theta)*sss(alpha),a*sss(theta);
        0,sss(alpha),ccc(alpha),d;
        0,0,0,1];
end

function sss=sss(a)
%     sss=sin(a/180*pi);
    sss=sin(a);
end

function ccc=ccc(a)
%     ccc=cos(a/180*pi);
     ccc=cos(a);
end

三、UR5机械臂运动学逆解

function theta=niyundongxue(T)
    %变换矩阵T已知
    %SDH:标准DH参数表求逆解(解析解)
    %部分DH参数表如下,需要求解theta信息
    
    a=[0,-0.42500,-0.39225,0,0,0];
    d=[0.089159,0,0,0.10915,0.09465,0.08230];
    
    alpha=[pi/2,0,0,pi/2,-pi/2,0];% alpha没有用到,故此逆解程序只适合alpha=[pi/2,0,0,pi/2,-pi/2,0]的情况!
    
    nx=T(1,1);ny=T(2,1);nz=T(3,1);
    ox=T(1,2);oy=T(2,2);oz=T(3,2);
    ax=T(1,3);ay=T(2,3);az=T(3,3);
    px=T(1,4);py=T(2,4);pz=T(3,4);
    
    %求解关节角1
    m=d(6)*ay-py;  n=ax*d(6)-px; 
    theta1(1,1)=atan2(m,n)-atan2(d(4),sqrt(m^2+n^2-(d(4))^2));
    theta1(1,2)=atan2(m,n)-atan2(d(4),-sqrt(m^2+n^2-(d(4))^2));
  
    %求解关节角5
    theta5(1,1:2)=acos(ax*sin(theta1)-ay*cos(theta1));
    theta5(2,1:2)=-acos(ax*sin(theta1)-ay*cos(theta1));      
    
    %求解关节角6
    mm=nx*sin(theta1)-ny*cos(theta1); nn=ox*sin(theta1)-oy*cos(theta1);
    %theta6=atan2(mm,nn)-atan2(sin(theta5),0);
    theta6(1,1:2)=atan2(mm,nn)-atan2(sin(theta5(1,1:2)),0);
    theta6(2,1:2)=atan2(mm,nn)-atan2(sin(theta5(2,1:2)),0);
    
    %求解关节角3
    mmm(1,1:2)=d(5)*(sin(theta6(1,1:2)).*(nx*cos(theta1)+ny*sin(theta1))+cos(theta6(1,1:2)).*(ox*cos(theta1)+oy*sin(theta1))) ...
        -d(6)*(ax*cos(theta1)+ay*sin(theta1))+px*cos(theta1)+py*sin(theta1);
    nnn(1,1:2)=pz-d(1)-az*d(6)+d(5)*(oz*cos(theta6(1,1:2))+nz*sin(theta6(1,1:2)));
    mmm(2,1:2)=d(5)*(sin(theta6(2,1:2)).*(nx*cos(theta1)+ny*sin(theta1))+cos(theta6(2,1:2)).*(ox*cos(theta1)+oy*sin(theta1))) ...
        -d(6)*(ax*cos(theta1)+ay*sin(theta1))+px*cos(theta1)+py*sin(theta1);
    nnn(2,1:2)=pz-d(1)-az*d(6)+d(5)*(oz*cos(theta6(2,1:2))+nz*sin(theta6(2,1:2)));
    theta3(1:2,:)=acos((mmm.^2+nnn.^2-(a(2))^2-(a(3))^2)/(2*a(2)*a(3)));
    theta3(3:4,:)=-acos((mmm.^2+nnn.^2-(a(2))^2-(a(3))^2)/(2*a(2)*a(3)));
    
    %求解关节角2
    mmm_s2(1:2,:)=mmm;
    mmm_s2(3:4,:)=mmm;
    nnn_s2(1:2,:)=nnn;
    nnn_s2(3:4,:)=nnn;
    s2=((a(3)*cos(theta3)+a(2)).*nnn_s2-a(3)*sin(theta3).*mmm_s2)./ ...
        ((a(2))^2+(a(3))^2+2*a(2)*a(3)*cos(theta3));
    c2=(mmm_s2+a(3)*sin(theta3).*s2)./(a(3)*cos(theta3)+a(2));
    theta2=atan2(s2,c2);   
    
    %整理关节角1 5 6 3 2
    theta(1:4,1)=theta1(1,1);theta(5:8,1)=theta1(1,2);
    theta(:,2)=[theta2(1,1),theta2(3,1),theta2(2,1),theta2(4,1),theta2(1,2),theta2(3,2),theta2(2,2),theta2(4,2)]';
    theta(:,3)=[theta3(1,1),theta3(3,1),theta3(2,1),theta3(4,1),theta3(1,2),theta3(3,2),theta3(2,2),theta3(4,2)]';
    theta(1:2,5)=theta5(1,1);theta(3:4,5)=theta5(2,1);
    theta(5:6,5)=theta5(1,2);theta(7:8,5)=theta5(2,2);
    theta(1:2,6)=theta6(1,1);theta(3:4,6)=theta6(2,1);
    theta(5:6,6)=theta6(1,2);theta(7:8,6)=theta6(2,2); 
    
    %求解关节角4
    theta(:,4)=atan2(-sin(theta(:,6)).*(nx*cos(theta(:,1))+ny*sin(theta(:,1)))-cos(theta(:,6)).* ...
        (ox*cos(theta(:,1))+oy*sin(theta(:,1))),oz*cos(theta(:,6))+nz*sin(theta(:,6)))-theta(:,2)-theta(:,3);  
    
end

四、测试代码

clc;clear

%% 初始化关节角度
%theta=[1,1/2,1/3,1,1,1];%没有什么含义,随便取的
theta=[1,1/2,1,1,1,1];%没有什么含义,随便取的
%theta=[1,1,1,1,1,1];%没有什么含义,随便取的

%% 求运动学正解
TT=zhengyundongxue(theta)

%% 求运动学逆解
niyundongxue(TT)

五、参考链接1的逆解代码错误原因

按照求解过程,在求解到不同关节角时,得到的解的个数如下:

同样的,

改了这两个地方就好啦。这样,大家勉强能入门了,但如果能知其所以然,推导到其他标准DH系参数,就更好了!!!

  • 24
    点赞
  • 186
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论
ur5机械臂matlab中可以通过建立机器人DH参数来进行建模。可以使用SerialLink函数来定义机器人的参数,包括关节的长度、位置和旋转角度等。比如,可以使用Link函数来定义每个关节的参数,然后将这些关节参数传递给SerialLink函数来创建机器人对象。 例如,可以使用以下代码段来建立ur5机器人的DH参数并进行建模: ``` L1=Link('d',89.2,'a',0, 'alpha',pi/2, 'standard'); L2=Link('d',0, 'a',425,'alpha',0, 'offset',pi/2,'standard'); L3=Link('d',0, 'a',392,'alpha',0, 'standard'); L4=Link('d',109.3,'a',0, 'alpha',-pi/2,'offset',-pi/2,'standard'); L5=Link('d',94.75,'a',0, 'alpha',pi/2, 'standard'); L6=Link('d',82.5, 'a',0, 'alpha',0, 'standard'); robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','Arm6') ``` 然后,可以使用fkine函数来求解解的齐次变换矩阵,即给定关节角度时末端的位姿。可以使用plot函数来显示三维动画,并使用teach函数来显示roll/pitch/yaw angles。 以上是在matlab中进行ur5机械臂建模的简要步骤。具体的参数设置和求解方法可以根据需求进行调整和实现。123 #### 引用[.reference_title] - *1* *3* [【机器人2】基于POE公式的UR5机械臂逆运动学建模求解matlab仿真](https://blog.csdn.net/weixin_43387635/article/details/128044412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [UR5机械臂运动学建模MATLAB](https://blog.csdn.net/m0_68738477/article/details/131006181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kissgoodbye2012

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

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

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

打赏作者

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

抵扣说明:

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

余额充值