提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Robotics toolbox
一些自用的参考的robotics toolbox 代码学习的记录
1)找出各关节轴,并标出这些轴线的延长线。
2)找出关节轴 i i i和 i + 1 i+1 i+1之间的公垂线或关节轴 i i i和 i + 1 i+1 i+1的交点,以关节轴 i i i和 i + 1 i+1 i+1的交点或公垂线与关节轴 i i i的交点作为连杆坐标系{ i i i}的原点。
3)确定Z轴:如果关节是旋转的,Z轴按右手定则大拇指指向为正方向,关节转角θ为关节变量。如果关节是移动的,Z轴定在沿直线运动方向的正方向,连杆偏移d为关节变量。
4)确定X轴:规定 X i X_i Xi沿着公垂线的方向,如果关节轴 i i i和 i + 1 i+1 i+1相交,则规定 X i X_i Xi轴垂直于两关节所在的平面。
5)确定Y轴:通过右手定则确定Y轴的方向。大拇指指向Z轴的方向,以x轴为准,逆时针旋转90°的方向为y轴的方向。
6)当第一个关节变量为0时,规定坐标系{0}和{1}重合。对于坐标系{N},其原点和 X N X_N XN的方向可以任意选取。但是在选取时,通常尽量使连杆参数为0。
T = SE2(x, y, theta); % x、y为偏移量,theta为旋转角度(弧度制)
%SE——special Euclidean group 特殊欧几里得群
T = transl2(x, y); % (3x3矩阵)纯平移变换
trplot2(T); %二维平面绘出相应的旋转矩阵
代码如下(示例):
T1= SE3(T); %将 SE(2)变换提升为 SE(3)(4x4)
rotx(alpha), roty(beta), rotz(theta); % 绕xyz轴旋转的旋转矩阵(3x3)
trplot(T); % 画出相应的旋转矩阵
tranimate(T); % 旋转动画
transl( [x, y, z] ); % 平移变换(4x4)
trotx(theta), troty(theta), trotz(theta); % 只有旋转的绕xyz轴旋转的齐次变换矩阵(4x4)
L(i) = Link( [theta, d, a, alpha, sigma] )
% 定义关节,DH参数:关节角、连杆偏距、连杆长度、连杆转角,sigma=1为移动副
L(i).qlim = [min, max] % 关节角度限制
Robot = SerialLink( L, 'name', 'Robot' ) % 将Link连接成一个机械臂
theta = [0 pi/2 0 0 pi 0]; % 初始关节角度
Robot.plot(theta) % 画出机械臂,theta为关节初始角度
Robot.display % 输出机械臂信息
Robot.teach % 机械臂操控交互界面
link类其他的参数
名称 | 用法 |
---|---|
jointtype | 0-标准DH,1-改进DH |
offset | 关节变量的偏移量(转动副为角度,移动副为位移) |
mdh | 0-标准DH,1-改进DH |
机器人正运动学:已知或给定一组关节角,计算出工具坐标系相对于基坐标系的位置和姿态,也就是说,用正运动学来确定机器人末端执行器的位姿。(得出连杆n相对于连杆0的位置和姿态)
机器人逆运动学:给定机械臂末端执行器的位置和姿态,计算所有可到达给定位置和姿态的关节角。
Robot.fkine(theta) % 正运动学
Robot.ikine6s(T) % 逆运动学封闭解
Robot.ikine(T) % 逆运动学数值解
% q是位姿
Robot.jacob0(q) % 对于基坐标系的雅克比矩阵
Robot.jacobn(q) % 对于末端坐标系的雅克比矩阵
[q, qd, qdd] = jtraj(init_ang,targ_ang,step)
% init_ang——初始位姿,targ_ang——结束位姿,step——步数
%q——角度,qd——角速度,qdd——角加速度
Tc = ctraj(T0, T1, n) % T0——初始齐次变换矩阵,T1——结束时齐次变换矩阵, n——步数
%% MATLAB素质三连
clear all
clc
%% 实验一 基于MATLAB的关节型六轴机械臂仿真
%% 参数定义
%% 机械臂为六自由度机械臂
%角度转换
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移动)
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];
%% 显示机械臂
robot0 = SerialLink(L,'name','six');
f = 1 %画在第1张图上
theta = [0 pi/2 0 0 pi 0]; %初始关节角度
figure(f)
view(3);
robot0.plot(theta);
title('六轴机械臂模型');
%% 加入teach指令,则可调整各个关节角度
robot1 = SerialLink(L,'name','sixsix');
f = 2
figure(f)
view(3);
robot1.plot(theta);
robot1.teach
title('六轴机械臂模型可调节');
%% 实验二 基于MATLAB的六轴机械臂轨迹规划仿真
%% 2.2求解运动学正解
robot2 = SerialLink(L,'name','sixsixsix');
theta2 = [0.1,0,0,0,0,0]; %实验二指定的关节角
p=robot2.fkine(theta2) %fkine正解函数,根据关节角theta,求解出末端位姿p
q=ikine(robot2,p) %ikine逆解函数,根据末端位姿p,求解出关节角q
%% 2.3 jtraj 已知初始和终止的关节角度,利用五次多项式来规划轨迹
% T1=transl(0.5,0,0); %根据给定起始点,得到起始点位姿
% T2=transl(0,0.5,0); %根据给定终止点,得到终止点位姿
T1=transl(0.5,0,0); %根据给定起始点,得到起始点位姿
T2=transl(0,0.5,0); %根据给定终止点,得到终止点位姿
init_ang=robot2.ikine(T1); %根据起始点位姿,得到起始点关节角
targ_ang=robot2.ikine(T2); %根据终止点位姿,得到终止点关节角
step = 20;
f = 3
%轨迹规划方法
figure(f)
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step);
%五次多项式轨迹,得到关节角度,角速度,角加速度,50为采样点个数
grid on
T=robot2.fkine(q); %根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
title('输出末端轨迹');
robot2.plot(q); %动画演示
%% 求解位置、速度、加速度变化曲线
f = 4
figure(f)
subplot(3,2,[1,3]); %subplot 对画面分区 三行两列 占用1到3的位置
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q); %动画演示
figure(f)
subplot(3, 2, 2);
i = 1:6;
plot(q(:,1));
title('位置');
grid on;
figure(f)
subplot(3, 2, 4);
i = 1:6;
plot(qd(:,1));
title('速度');
grid on;
figure(f)
subplot(3, 2, 6);
i = 1:6;
plot(qdd(:,1));
title('加速度');
grid on;
t = robot2.fkine(q); %运动学正解
rpy=tr2rpy(t); %t中提取位置(xyz)
figure(f)
subplot(3,2,5);
plot2(rpy);
%% ctraj规划轨迹 考虑末端执行器在两个笛卡尔位姿之间移动
f = 5
T0 = robot2.fkine(init_ang); %运动学正解
T1 = robot2.fkine(targ_ang); %运动学正解
Tc = ctraj(T0,T1,step); %得到每一步的T阵
tt = transl(Tc);
figure(f)
plot2(tt,'r');
title('直线轨迹');
操作函数 | 用途 |
---|---|
A | 连杆变换矩阵 |
RP | 关节类型: |
friction | 摩擦力 |
nofriction | 摩擦力忽略 |
dyn | 显示动力学参数 |
islimit | 测试关节是否超出软限制 |
isrevolute | 测试是否为旋转关节 |
isprismatic | 测试是否为移动关节 |
display | 连杆参数以表格形式显示 |
char | 转为字符串 |
theta | 关节角度 |
d | 连杆偏移量 |
a | 连杆长度 |
alpha | 连杆扭角 |
sigma | 旋转关节为0,移动关节为1 |
mdh | 标准的D&H为0,否则为1 |
offset | 关节变量偏移量 |
qlim | 关节变量范围[min,max] |
m | 连杆质量 |
r | 连杆相对于坐标系的质心位置3x1 |
I | 连杆的惯性矩阵(关于连杆重心)3x3 |
B | 粘性摩擦力(对于电机)1x1或2x1 |
Tc | 库仑摩擦力1x1或2x1 |
G | 齿轮传动比 |
Jm | 电机惯性矩(对于电机) |
操作函数 | 用途 |
---|---|
plot | 以图形形式显示机器人 |
teach | 驱动机器人 |
isspherical | 测试机器人是否有球腕关节 |
islimit | 测试机器人是否抵达关节极限 |
fkine | 前向运动学求解 |
ikine6s | 6旋转轴球腕关节机器人的逆向运动学求解 |
ikine3 | 3旋转轴机器人的逆向运动学求解 |
ikine | 采用迭代方法的逆向运动学求解 |
jacob0 | 在世界坐标系描述的雅克比矩阵 |
jacobn | 在工具坐标系描述的雅克比矩阵 |
maniplty | 可操纵性度 |
jtraj | 关节空间轨迹 |
accel | 关节加速度 |
coriolis | 关节柯氏力 |
dyn | 显示连杆的动力学属性 |
fdyn | 关节运动 |
friction | 摩擦力 |
gravload | 关节重力 |
inertia | 关节惯性矩阵 |
nofriction | 设置摩擦力为0 |
rne | 关节的力/力矩 |
payload | 在末端坐标系增加负载 |
perturb | 随机扰动连杆的动力学参数 |
links | 连杆向量(1xN) |
gravity | 重力的方向[gx gy gz] |
base | 机器人基座的位姿(4x4) |
tool | 机器人的工具变换矩阵[ T6 to tool tip] (4x4) |
qlim | 关节范围[qmin qmax] (Nx2) |
offset | 偏置(Nx1) |
name | 机器人名字(在图形中显示) |
manuf | 注释, 制造商名 |
comment | 注释, 总评 |
plotopt | options for plot() method (cell array) |
n | 关节数 |
config | 机器人结构字符串, 例如 ‘RRRRRR’ |
mdh | 运动学中约定的布尔数 (0=DH, 1=MDH) |