matlab代码实现了一个关节型六轴机械臂的仿真
·
%% 基于MATLAB的关节型六轴机械臂仿真
%% 参数定义
clear;
close all;
clc;
%角度转换
angle=pi/180; %转化为角度制
%D-H参数表
theta1 = 0; D1 = 0.4; A1 = 0.025; alpha1 = pi/2; offset1 = 0;
theta2 = pi/2;D2 = 0; A2 = 0.56; alpha2 = 0; offset2 = 0;
theta3 = 0; D3 = 0; A3 = 0.035; alpha3 = pi/2; offset3 = 0;
theta4 = 0; D4 = 0.515; A4 = 0; alpha4 = pi/2; offset4 = 0;
theta5 = pi; D5 = 0; A5 = 0; alpha5 = pi/2; offset5 = 0;
theta6 = 0; D6 = 0.08; A6 = 0; alpha6 = 0; offset6 = 0;
%% DH法建立模型,关节转角,关节距离,连杆长度,连杆转角,关节类型(0转动,1移动),'standard':建立标准型D-H参数
L(1) = Link([theta1, D1, A1, alpha1, offset1], 'standard')
L(2) = Link([theta2, D2, A2, alpha2, offset2], 'standard')
L(3) = Link([theta3, D3, A3, alpha3, offset3], 'standard')
L(4) = Link([theta4, D4, A4, alpha4, offset4], 'standard')
L(5) = Link([theta5, D5, A5, alpha5, offset5], 'standard')
L(6) = Link([theta6, D6, A6, alpha6, offset6], 'standard')
% 定义关节范围
L(1).qlim =[-180*angle, 180*angle];
L(2).qlim =[-180*angle, 180*angle];
L(3).qlim =[-180*angle, 180*angle];
L(4).qlim =[-180*angle, 180*angle];
L(5).qlim =[-180*angle, 180*angle];
L(6).qlim =[-180*angle, 180*angle];
zlim([-2,2]);
hold on;
robot2=SerialLink([L(1),L(2),L(3),L(4),L(5),L(6)],"base",transl(0,-1,0));
robot2.plot([0,0,0,0,0,0]);
%% 显示机械臂(把上述连杆“串起来”)
robot0 = SerialLink(L,'name','six');
theta = [0 pi/2 0 0 pi 0]; %初始关节角度
figure(1)
robot0.plot(theta);
title('双臂机械人');
robot0 = SerialLink(L,'name','six');
T1=transl(0.5,0,0); %根据给定起始点,得到起始点位姿
T2=transl(0,0.5,0); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T1); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T2); %根据终止点位姿,得到终止点关节角
step = 15;
%% 显示机械臂(把上述连杆“串起来”)
robot0 = SerialLink(L,'name','six');
theta = [0 pi/2 0 0 pi 0]; %初始关节角度
figure(1)
robot0.plot(theta);
title('双臂机械人');
robot0 = SerialLink(L,'name','six');
%%
T1=transl(0.5,-1,0.5); %根据给定起始点,得到起始点位姿
T2=transl(0.5,-0.9,0.6); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T1); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T2); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法1
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);
%%
T3=transl(0.5,-0.9,0.6); %根据给定起始点,得到起始点位姿
T4=transl(0.5,-0.7,0.6); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T3); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T4); %根据终止点位姿,得到终止点关节角
step = 15;
% 轨迹规划方法2
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);
%%
T5=transl(0.5,-0.7,0.6); %根据给定起始点,得到起始点位姿
T6=transl(0.5,-0.6,0.4); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T5); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T6); %根据终止点位姿,得到终止点关节角
step = 15;
% 轨迹规划方法3
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);
%%
T7=transl(0.5,-0.6,0.4); %根据给定起始点,得到起始点位姿
T8=transl(0.5,-1,0); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T7); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T8); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法4
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);
%%
T9=transl(0.5,-1,0); %根据给定起始点,得到起始点位姿
T10=transl(0.5,-1.4,0.4); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T9); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T10); %根据终止点位姿,得到终止点关节角
step = 15;
% 轨迹规划方法5
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);
%%
T10=transl(0.5,-1.4,0.4); %根据给定起始点,得到起始点位姿
T11=transl(0.5,-1.3,0.6); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T10); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T11); %根据终止点位姿,得到终止点关节角
step = 15;
% 轨迹规划方法6
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);
%%
T12=transl(0.5,-1.3,0.6); %根据给定起始点,得到起始点位姿
T13=transl(0.5,-1.1,0.6); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T12); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T13); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法7
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);
%%
T14=transl(0.5,-1.1,0.6); %根据给定起始点,得到起始点位姿
T15=transl(0.5,-1,0.5); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T14); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T15); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法8
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);
%%
T16=transl(0.5,-1,0.5); %根据给定起始点,得到起始点位姿
T17=transl(0.5,-1,1); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T16); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T17); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法8
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
%plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);
%%
T18=transl(0.5,0,0); %根据给定起始点,得到起始点位姿
T19=transl(0.5,0.2,0); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T18); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T19); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
%%
T20=transl(0.5,0.2,0); %根据给定起始点,得到起始点位姿
T21=transl(0.5,0.2,0.6); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T20); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T21); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
%%
T22=transl(0.5,0.2,0.6); %根据给定起始点,得到起始点位姿
T23=transl(0.5,0.1,0.6); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T22); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T23); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
%%
T24=transl(0.5,0.1,0.6); %根据给定起始点,得到起始点位姿
T25=transl(0.5,0.1,0.1); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T24); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T25); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
%%
T26=transl(0.5,0.1,0.1); %根据给定起始点,得到起始点位姿
T27=transl(0.5,-0.1,0.1); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T26); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T27); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
%%
T28=transl(0.5,-0.1,0.1); %根据给定起始点,得到起始点位姿
T29=transl(0.5,-0.1,0.6); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T28); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T29); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
%%
T30=transl(0.5,-0.1,0.6); %根据给定起始点,得到起始点位姿
T31=transl(0.5,-0.2,0.6); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T30); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T31); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
%%
T32=transl(0.5,-0.2,0.6); %根据给定起始点,得到起始点位姿
T33=transl(0.5,-0.2,0); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T32); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T33); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
%%
T34=transl(0.5,-0.2,0); %根据给定起始点,得到起始点位姿
T35=transl(0.5,0,0); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T34); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T35); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
%%
T36=transl(0.5,0,0); %根据给定起始点,得到起始点位姿
T37=transl(0.5,0,1); %根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T36); %根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T37); %根据终止点位姿,得到终止点关节角
step = 15;
%轨迹规划方法
figure(1)
%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
%plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot0.plot(q);
以下是对上述 MATLAB 代码功能的解释:
一、初始化和参数定义
- 清除和关闭操作:
clear;清除工作区中的变量。close all;关闭所有图形窗口。clc;清空命令窗口。
- 角度转换:
angle=pi/180;将弧度转换为度的转换因子。
- D-H 参数表定义:
- 定义了关节型六轴机械臂的 D-H 参数,包括
theta(关节转角)、D(关节距离)、A(连杆长度)、alpha(连杆转角)和offset等,这些参数描述了机械臂各连杆和关节的几何和运动学特性。
- 定义了关节型六轴机械臂的 D-H 参数,包括
二、机械臂模型建立
- 建立连杆:
- 通过
Link函数结合 D-H 参数和'standard'类型,创建了 6 个连杆L(1)到L(6)。 - 为每个连杆设置关节范围
L(i).qlim,将角度范围从弧度转换为度表示。 zlim([-2,2]);限制 z 轴的显示范围。hold on;用于在同一图形窗口中保持图形显示。robot2=SerialLink([L(1),L(2),L(3),L(4),L(5),L(6)],"base",transl(0,-1,0));将连杆组合成一个机械臂对象robot2,并设置了基坐标系的平移。robot2.plot([0,0,0,0,0,0]);绘制机械臂在关节角度为[0,0,0,0,0,0]时的初始姿态。- 还有
robot0 = SerialLink(L,'name','six');创建另一个机械臂对象robot0,并命名为'six'。
- 通过
三、机械臂姿态显示和轨迹规划
- 初始姿态显示:
- 多次使用
robot0.plot(theta);或robot2.plot(theta);显示机械臂在不同初始关节角度theta下的姿态,如theta = [0 pi/2 0 0 pi 0];。
- 多次使用
- 逆运动学计算和轨迹规划:
- 定义了多组起始点和终止点的位姿
T1到T37,通过transl函数将坐标转换为齐次变换矩阵表示。 - 对于每组起始点和终止点,使用
ikine函数进行逆运动学计算,得到起始点关节角init_ang和终止点关节角targ_ang。 - 对于每个轨迹规划部分:
[q,qd, qdd]=jtraj(init_ang,targ_ang,step);利用jtraj函数进行关节空间的五次多项式轨迹规划,生成从起始关节角到终止关节角的关节角度q、角速度qd和角加速度qdd轨迹,其中step表示采样点个数。T=robot2.fkine(q);或T=robot0.fkine(q);使用正运动学fkine函数根据关节角度轨迹计算末端执行器的位姿。nT=T.T;获取位姿矩阵的元素。plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));绘制末端执行器的轨迹,squeeze函数用于去除多余的维度。- 最后使用
robot2.plot(q);或robot0.plot(q);显示机械臂在关节角度轨迹q下的动画,展示机械臂沿着规划轨迹的运动。
- 定义了多组起始点和终止点的位姿
总体而言,该代码实现了一个关节型六轴机械臂的仿真,包括以下几个主要方面:
- 建立机械臂的运动学模型,使用 D-H 参数法。
- 对机械臂进行不同初始姿态的显示。
- 规划多组不同起始点和终止点之间的关节空间轨迹,使用五次多项式轨迹规划方法。
- 对每组轨迹进行逆运动学求解得到关节角度,再通过正运动学得到末端执行器的位姿,并绘制末端执行器的轨迹。
- 显示机械臂在不同轨迹下的运动动画,可视化机械臂的运动。
更多推荐



所有评论(0)