1.
此类型的变量不支持使用点进行索引。
出错 SerialLink/animate (第 105 行)
if h.link(L) ~= 0
出错 SerialLink/plot (第 299 行)
robot.animate(qq);
【报错解决:上一次生成的plot图还没关】
2.
索引超出数组元素的数目(4)。
出错 SerialLink/plot>create_robot (line 468) d = norm( d(4:6)-d(1:3) ) / 72;
出错 SerialLink/plot (line 251) handle = create_robot(robot, opt);
【报错解决:
命令行输入
edit SerialLink.plot + 回车
在 function plot 那段改成这样
[myModifyForViewErrorA, myModifyForViewErrorB]=view(gca);
if isequal([myModifyForViewErrorA, myModifyForViewErrorB],[0,90])
view(3)
end
也就是加一个 view(3)
保存+关闭+重启 即可
3. 常用代码
clear;
close all;
clc;
%% 基于MATLAB的关节型六轴机械臂仿真
%% 参数定义
%机械臂为六自由度机械臂
clear L;
%角度转换
angle=pi/180; %度
%D-H参数表
theta1 = 0; D1 = 460; A1 = -155 ; alpha1 = -pi/2; offset1 = 0;
theta2 = 0; D2 = 0; A2 = -614 ; alpha2 = 0; offset2 = 0;
theta3 = 0; D3 = 0; A3 = -199.5; alpha3 = -pi/2; offset3 = 0;
theta4 = 0; D4 = 600; A4 = 0; alpha4 = pi/2; offset4 = 0;
theta5 = 0; D5 = 0; A5 = 0.46 ; alpha5 = -pi/2; offset5 = 0;
theta6 = 0; D6 = 100; 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 =[-160*angle, 180*angle]; %% +90
L(2).qlim =[-120*angle,120*angle];
L(3).qlim =[-180*angle, 180*angle];
L(4).qlim =[-190*angle, 190*angle];
L(5).qlim =[-360*angle, 360*angle];
L(6).qlim =[-200*angle, 200*angle];
%% 显示机械臂
robot0 = SerialLink(L,'name','six');
f = 1
%画在第1张图上
% 初始角 -90 90 0 0 0 0
jA = deg2rad(-100)
jB = deg2rad(80)
jC = deg2rad(0)
jD = deg2rad(0)
jE = deg2rad(-30)
jF = deg2rad(0)
theta = [jA jB jC jD jE jF]; %初始关节角度
figure(f)
p=robot0.fkine(theta); %fkine正解函数,根据关节角theta,求解出末端位姿p
robot0.plot(theta);
title('六轴机械臂模型');
robot0.teach
H = double(p)
%世界对法兰的矩阵
AngleH = H(1:3,1:3)
B = AngleH(1,2)
AngleHDeg = rad2deg(rotm2eul(AngleH,'ZYX'))
phi = rad2deg(atan2(AngleH(2,3), -AngleH(1,3))) % 第一次旋转角度(绕 Z 轴)
theta = rad2deg(atan2(sqrt(AngleH(1,3)^2 + AngleH(2,3)^2), AngleH(3,3))) % 第二次旋转角度(绕 X' 轴)
psi = rad2deg(atan2(AngleH(1,2), AngleH(1,1))) % 第三次旋转角度(绕 Z'' 轴)
%% 正向过 绕x轴 (yaw)旋转180度 保持z轴不变)
P1= [
1 0 0 0
0 -1 0 0
0 0 1 0
0 0 0 1] ;
%% 正向过程 绕z(yaw轴旋转-90度)
P2 = [0 -1 0 0
1 0 0 0
0 0 1 0
0 0 0 1];
%% 末端相对法兰的姿态矩阵
TranTool = [
0.87773 -0.0049 -0.4799 -0.698
0.0093 0.9999 0.0027 -70.447
0.4798 -0.010 0.8772 434.456
0 0 0 1];
% 法兰相对世界坐标的姿态 * 法兰相对末端的坐标旋转 = 末端坐标系下法兰对世界的姿态
H2 = H * P1 *P2
% 末端坐标系下法兰对世界的姿态 * 末端相对法兰的姿态矩阵
Result = H2*(TranTool)
% 提取平移向量 XYZ
XYZ = Result(1:3, 4);
invTran = inv(TranTool)
%%测试矩阵乘法
AngleR = invTran * inv(P2) * inv(P1) * H
% 提取矩阵 R_xyz
ResultInv = AngleR(1:3,1:3);