转:https://blog.csdn.net/jldemanman/article/details/79229312
摘要
本文主要是给大家一个系统的概念,如何用Matlab实现六轴机器人的建模和实现轨迹规划。以后将会给大家讲解如何手写正逆解以及轨迹插补的程序。程序是基于Matlab2016a,工具箱版本为Robotic Toolbox 9.10,需要安装包的可以在下方留言。1.D-H建模
目前国内看到的机器人教材都是来自蔡自兴老师的对的书,因此常用的建模方法都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模型的在描述一个连杆末端连接两个关节时会产生歧义的问题,所以也出现了改进的D-H建模。
![标准和改进对比图](https://i-blog.csdnimg.cn/blog_migrate/59d955d76537ad1dc4c6a393e50c8f7e.jpeg)
对比来看参数并没有改变,标准的 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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
本段代码取名为代码段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,求解出关节角q
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
我们可以查看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);%动画演示
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
蓝色细线就是规划的轨迹,六轴机器人manman将会动态演示从起始点到终止点的过程。