【MATLAB】五自由度机械臂运动学逆解(数值法——牛顿迭代)实现

引言

本篇为五轴机械臂的数值法实现,同时,本方法可应用于六轴、七轴手臂的逆解。
数值法的好处:给定起始与目标位姿,能够自动迭代出最优解,无多解问题
关于解析法的实现,可以看我之前的博客:https://blog.csdn.net/qq_43557907/article/details/122707124
本篇文章是记录我个人在学习时的一些记录,如果各位有发现错误,麻烦在评论区批评或指出,我会第一时间改正,与大家共同学习,谢谢。

一、牛顿迭代

以下是牛顿迭代的基本公式,具体原理可以去B站搜。
在这里插入图片描述

二、构建雅可比矩阵

根据以上思想,
在这里插入图片描述

三、求解思路

在这里插入图片描述

四、MATLAB实现

这里只贴出关键部分,不再赘述

% 牛顿迭代求解逆运动学
syms theta1 theta2 theta3 theta4 theta5; % 定义变量
theta = [theta1 theta2 theta3 theta4 theta5];
T = roboarm_fkine(theta, alpha, d, a);
F = T - T_new;
f1 = F(1,1);f2 = F(1,2);f3 = F(1,3);f4 = F(1,4);
f5 = F(2,1);f6 = F(2,2);f7 = F(2,3);f8 = F(2,4);
f9 = F(3,1);f10 = F(3,2);f11 = F(3,3);f12 = F(3,4);
f = [f1;f2;f3;f4;f5;f6;f7;f8;f9;f10;f11;f12];
i = 1;% 迭代次数
while(i < 1000)
    J_k = subs(jacobian(f, theta), theta, theta_k);
    f_k = subs(f, theta, theta_k);
    theta_k = vpa((theta_k' - pinv(J_k) * f_k)', 4);
    i = i + 1;
    if(norm(f_k) < 0.0001)
        fprintf('Solution has converged');
        break;
    end
end

五、验证

迭代后得出的角度:
在这里插入图片描述
目标角度:
在这里插入图片描述
可以看见基本吻合。

参考文献

[1] 张栩曼, 张中哲, 王燕波, 等. 基于空间六自由度机械臂的逆运动学数值解法[J]. 导弹与航天运载技术, 2016 (3): 81-84.
[2] 机器人学导论
[3] 牛顿迭代法求解工业机械人运动学逆解(改进DH模型)https://blog.csdn.net/libizhide/article/details/106078575

  • 13
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
以下是一个简单的六自由度机械臂运动学逆解Matlab代码示例,适用于带有旋转关节和平移关节的机械臂。 假设机械臂共有6个关节,分别为q1、q2、q3、q4、q5、q6,末端执行器的位置为[x, y, z],末端执行器的姿态为[R11, R12, R13; R21, R22, R23; R31, R32, R33],其中R11、R12、R13等为旋转矩阵的元素。 ```matlab function [q1, q2, q3, q4, q5, q6] = six_dof_robot_ik(x, y, z, R) % 六自由度机械臂运动学逆解 % 输入:末端执行器的位置[x, y, z],末端执行器的姿态矩阵R % 输出:机械臂各关节角度q1、q2、q3、q4、q5、q6 % 机械臂几何参数 l1 = 1; % 第1个关节到第2个关节的长度 l2 = 1; % 第2个关节到第3个关节的长度 l3 = 1; % 第3个关节到第4个关节的长度 l4 = 1; % 第4个关节到第5个关节的长度 l5 = 1; % 第5个关节到第6个关节的长度 l6 = 1; % 第6个关节到末端执行器的长度 % 末端执行器的位置和姿态 T = [R [x; y; z]; 0 0 0 1]; % 计算第1个关节的角度 q1 = atan2(T(2,4), T(1,4)); % 计算第3个关节的角度 a = l2*cos(q1); b = l3*sin(q1); c = T(1,4)*cos(q1) + T(2,4)*sin(q1); d = (a - c)^2 + b^2 - l1^2; q3 = atan2(sqrt(1 - ((d^2)/(4*l1^2))), d/(2*l1)); % 计算第2个关节的角度 q2 = atan2((a - c), b) - atan2(sqrt(1 - ((d^2)/(4*l1^2))), d/(2*l1)); % 计算第4个关节到第6个关节的姿态矩阵 R4 = [cos(q1)*cos(q3) - sin(q1)*sin(q3)*cos(q2) - cos(q1)*sin(q3)*sin(q2), -cos(q1)*sin(q3) - sin(q1)*sin(q2)*cos(q3) - cos(q3)*sin(q1)*cos(q2), sin(q1)*cos(q2) + cos(q1)*sin(q2)*sin(q3) - cos(q1)*cos(q3)*sin(q2); cos(q3)*sin(q1) + cos(q1)*sin(q2)*sin(q3) - cos(q1)*cos(q2)*sin(q3), cos(q1)*cos(q2)*cos(q3) - sin(q1)*sin(q3)*sin(q2) - cos(q3)*sin(q1)*sin(q2), -cos(q1)*sin(q2) - cos(q2)*sin(q1)*sin(q3) + cos(q3)*cos(q1)*sin(q2); cos(q2)*sin(q3), -cos(q3)*sin(q2), cos(q2)*cos(q3)]; % 计算第6个关节的角度 q6 = atan2(sqrt(R4(3,2)^2 + R4(3,3)^2), R4(3,1)); % 计算第5个关节的角度 q5 = atan2(R4(2,1), R4(1,1)); % 计算第4个关节的角度 q4 = atan2(R4(3,2)/sin(q6), -R4(3,3)/sin(q6)); end ``` 需要注意的是,上述代码仅为示例,具体实现过程需要根据机械臂的几何参数和关节类型进行相应的编程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值