Robotics Toolbox机器人仿真入门教程
Robotics Toolbox机器人仿真入门教程
Robotics Toolbox是MATLAB中用于机器人学仿真的重要工具箱,它提供了丰富的函数和类来处理机器人运动学、动力学和控制等问题。本文将详细介绍Robotics Toolbox的基础用法,包括位姿描述、三角度表示法、机器人模型建立、正逆运动学和轨迹规划等内容。
RoboticsToolbox基础用法
(1)二维空间位姿描述
在二维空间中,位姿可以用一个3x3的齐次变换矩阵来表示。Robotics Toolbox提供了SE2
函数来创建这样的矩阵。
T1 = SE2(1,3,30,"deg");
trplot2(T1,"frame","1","color","b");
axis([0 5 0 5]);
T2=trans12(3, 4);
hold on;
trplot2(T2,"frame","2","color","r");
运行效果:
(2)三维空间位姿描述
在三维空间中,位姿可以用一个4x4的齐次变换矩阵来表示。Robotics Toolbox提供了多种创建旋转矩阵的方法,包括绕坐标轴旋转的函数。
R1=rotx(30,"deg")*roty(50,"deg"); %绕x轴旋转30°,再绕y轴旋转50°
trplot(R1,"frame","A", "color", "b"); %画出旋转矩阵R1
tranimate(R1,"frame","A", "color", "b"); %将R1的变换做成动画
R2=roty(50,"deg")*rotx(30,"deg"); %绕y轴旋转50°,再绕x轴旋转30°
hold on
trplot(R2,"frame","B", "color", "r"); %画出旋转矩阵R2
tranimate(R2,"frame","B", "color", "r"); %将R2的变换做成动画
运行效果:
R1和R2是两个完全不同的旋转矩阵,说明R1和R2具有不可交性。
2.三角度表示法
(1)欧拉角
欧拉角是在固定坐标系中,通过三个旋转角度来描述物体的姿态。Robotics Toolbox提供了欧拉角与旋转矩阵相互转换的函数。
R3=rotz(0.1)*roty(0.2)*rotz(0.3); % 构造旋转矩阵R3
R4=eul2r(0.1,0.2,0.3); % 欧拉角转化为旋转矩阵
eul=tr2eul(R3); % 旋转矩阵转化为欧拉角
(2)RPY角
RPY角是在固定坐标系A下,以固定的XYZ轴作为旋转的基准。三个角分别为Row(回转),Pitch(俯仰)和Yaw(偏转),可以用右手坐标系表示,食指为Row,中指为Pitch,大拇指为Yaw。
R5=rotz(0.3)*roty(0.2)*rotx(0.1); % 构造旋转矩阵R5
R6=rpy2r(0.3,0.2,0.1); % rpy角转化为旋转矩阵
eul=tr2rpy(R5); % 旋转矩阵转化为rpy角
(3)双向量角表示法
双向量角表示法通过两个向量来描述旋转。Robotics Toolbox提供了将双向量转化为旋转矩阵的函数。
a=[1 0 0]';
o=[0 1 0]';
R7=oa2r(o,a); % 将双向量o,a转化为旋转矩阵R7
(4)向量和旋转角表示法
向量和旋转角表示法通过一个旋转轴和一个旋转角度来描述旋转。Robotics Toolbox提供了相关的转换函数。
(5)单位四元数表示法
四元数是一种扩展的复数,可以用来表示旋转。Robotics Toolbox提供了完整的四元数操作函数。
s=0.98335;
v=[0.034271, 0.10602, 0.14357];
Q=UnitQuaternion(s,v); % 组成四元数
q=Q.inv(); % 求共轭
Q.display(); % 打印出四元数
Q.plot(); % 画出出四元数
Q.animate(); % 动画展示四元数
TT=Q.T; % 制作齐次变换矩阵
RR=Q.R; % 制作旋转矩阵
rpy=Q.torpy(); % 转换成rpy角
eul=Q.toeul(); % 转换成eul角
3.RoboticsToolbox建立机器人模型
(1)建立机器人模型函数
Robotics Toolbox提供了Link
类和SerialLink
类来建立机器人模型。Link
类用于描述单个连杆,SerialLink
类用于将多个连杆组合成一个机器人模型。
(2)DH参数
DH参数(Denavit-Hartenberg参数)是描述机器人连杆之间相对位置和姿态的参数。Robotics Toolbox支持标准DH参数和改进DH参数两种表示方法。
(3)改进DH参数,建立机器人模型步骤
以下是一个使用改进DH参数建立机器人模型的示例:
clc;
clear;
% 定义各个连杆以及关节类型,默认为转动关节
% theta d a alpha
% 连杆偏距参数d 连杆长度参数 关节偏角参数alpha
L1=Link([ 0 0 0 0], 'modified'); % [四个DH参数], options
L2=Link([ -pi/2 0.1925, 0.081 -pi/2], 'modified');
L3=Link([ 0 0.4 0 -pi/2], 'modified');
L4=Link([ 0 0.1685, 0 -pi/2], 'modified');
L5=Link([ 0 0.4, 0 pi/2], 'modified');
L6=Link([ 0 0.1363 0 pi/2], 'modified');
L7=Link([ 0 0.13375 0 -pi/2], 'modified');
%
b=isrevolute(L1);
robot=SerialLink([L1,L2,L3,L4,L5,L6,L7]); % 将七个连杆组成机械臂
robot.name='modified sawyer';
robot.display(); % 展示出
view(3); % 解决robot.teach()和plot的索引超出报错
robot.teach();
robot.plot([0 -pi/2 0 0 0 0 0]);
(4)标准DH参数建模
使用标准DH参数建立机器人模型的代码与改进DH参数类似,只需将'modified'
替换为'standard'
即可。
clc;
clear;
% 定义各个连杆以及关节类型,默认为转动关节
% theta d a alpha
% 连杆偏距参数d 连杆长度参数 关节偏角参数alpha
L1=Link([ 0 0 0 0], 'standard'); % [四个DH参数], options
L2=Link([ -pi/2 0.1925, 0.081 -pi/2], 'standard');
L3=Link([ 0 0.4 0 -pi/2], 'standard');
L4=Link([ 0 0.1685, 0 -pi/2], 'standard');
L5=Link([ 0 0.4, 0 pi/2], 'standard');
L6=Link([ 0 0.1363 0 pi/2], 'standard');
L7=Link([ 0 0.13375 0 -pi/2], 'standard');
%
b=isrevolute(L1);
robot=SerialLink([L1,L2,L3,L4,L5,L6,L7]); % 将七个连杆组成机械臂
robot.name='standard sawyer';
robot.display(); % 展示出
view(3); % 解决robot.teach()和plot的索引超出报错
robot.teach();
robot.plot([0 -pi/2 0 0 0 0 0]);
(5)标准DH和改进DH的区别
标准DH参数和改进DH参数的主要区别在于连杆的参考坐标系的选择。标准DH参数使用连杆的Z轴作为参考,而改进DH参数使用连杆的X轴作为参考。这种差异会影响DH参数的具体数值,但不会影响最终的机器人模型。
4.正逆运动学、轨迹规划
(1)正运动学
正运动学是计算机器人末端执行器位置和姿态的过程。以下是一个使用Puma560机械臂的正运动学示例:
mdl_puma560; % 加载puma560模型
qz % 零角度
qr % 就绪状态,机械臂甚至且垂直
qs % 伸展状态,机械臂伸直且水平
qn % 标准状态,机械臂处于灵巧工作状态
view(3);
p560.plot(qn);
T=p560.fkine(qn);
(2)逆运动学
逆运动学是计算机器人关节角度以达到指定末端执行器位置和姿态的过程。以下是一个使用Puma560机械臂的逆运动学示例:
(3)轨迹规划
轨迹规划是计算机器人从一个位置到另一个位置的运动路径。以下是一个使用Sawyer机器人进行轨迹规划的示例:
clc;
clear;
% 定义各个连杆以及关节类型,默认为转动关节
% theta d a alpha
% 连杆偏距参数d 连杆长度参数 关节偏角参数alpha
L1=Link([ 0 0 0 0], 'modified'); % [四个DH参数], options
L2=Link([ -pi/2 0.1925, 0.081 -pi/2], 'modified');
L3=Link([ 0 0.4 0 -pi/2], 'modified');
L4=Link([ 0 0.1685, 0 -pi/2], 'modified');
L5=Link([ 0 0.4, 0 pi/2], 'modified');
L6=Link([ 0 0.1363 0 pi/2], 'modified');
L7=Link([ 0 0.13375 0 -pi/2], 'modified');
%
b=isrevolute(L1);
robot=SerialLink([L1,L2,L3,L4,L5,L6,L7],'name','FANUC'); % 将七个连杆组成机械臂
robot.name='modified sawyer';
robot.display(); % 展示出
init_ang=[0 0 0 0 0 0 0];
targ_ang=[pi/4,-pi/3,pi/5,pi/2,-pi/4,pi/2,pi/3];
step=200;
[q,qd,qdd]=jtraj(init_ang,targ_ang,step); %关节空间规划轨迹,得到机器人末端运动的[位置,速度,加速度]
T0=robot.fkine(init_ang); % 正运动学解算
Tf=robot.fkine(targ_ang);
subplot(2,4,3); i=1:7; plot(q(:,i)); title("位置"); grid on;
subplot(2,4,4); i=1:7; plot(qd(:,i)); title("速度"); grid on;
subplot(2,4,7); i=1:7; plot(qdd(:,i)); title("加速度"); grid on;
Tc=ctraj(T0,Tf,step);
Tjtraj=transl(Tc);
subplot(2,4,8); plot2(Tjtraj, 'r');
title('p1到p2直线轨迹'); grid on;
subplot(2,4,[1,2,5,6]);
plot3(Tjtraj(:,1),Tjtraj(:,2),Tjtraj(:,3),"b"); grid on;
hold on;
view(3); % 解决robot.teach()和plot的索引超出报错
qq=robot.ikine(Tc);
robot.plot(qq);
5.速度和静力
(1)雅可比矩阵
雅可比矩阵描述了机器人关节速度与末端执行器速度之间的关系。Robotics Toolbox提供了计算雅可比矩阵的函数。
(2)分解速度运动控制
通过分解雅可比矩阵,可以实现对机器人末端执行器位置和姿态的独立控制。