% 清除工作区和命令窗口
clear; clc;
% 使用改进的DH参数法定义初始连杆参数
L(1) = Link([-pi/2 476 0 -pi/2], 'standard');
L(2) = Link([-pi/2 0 600 pi], 'standard');
L(3) = Link([-pi/2 0 0 -pi/2], 'standard');
L(4) = Link([0 650 0 pi/2], 'standard');
L(5) = Link([0 0 0 pi/2], 'standard');
% 创建机械臂模型
robot = SerialLink(L, 'name', '5DOF Robot');
% 定义初始关节角度
initial_angles = [0 0 0 0 0];
% 可视化机械臂(初始姿态)
robot.plot(initial_angles);
% 计算初始关节角度下末端执行器的变换矩阵
T = robot.fkine(initial_angles);
disp('初始末端执行器的变换矩阵:');
disp(T);
此为标准DH参数下的机械臂代码,运行后得出的位姿变换矩阵和机械臂模型如图
这和预期的矩阵还有模型都不一致,在通过自己写的函数验真DH参数的正确性,首先定义函数
% 定义DH参数变换矩阵函数
function T = dh_transform(theta, d, a, alpha)
T = [cos(theta), -sin(theta)*cos(alpha), sin(theta)*sin(alpha), a*cos(theta);
sin(theta), cos(theta)*cos(alpha), -cos(theta)*sin(alpha), a*sin(theta);
0, sin(alpha), cos(alpha), d;
0, 0, 0, 1];
end
% 定义正向运动学函数
function T = forward_kinematics(dh_params, joint_angles)
% 计算末端执行器的变换矩阵
T = eye(4);
for i = 1:size(dh_params, 1)
theta = joint_angles(i) + dh_params(i, 1);
d = dh_params(i, 2);
a = dh_params(i, 3);
alpha = dh_params(i, 4);
T = T * dh_transform(theta, d, a, alpha);
end
end
因为采用的是标准DH参数,若是采用改进DH参数,这里的变换矩阵函数需要变换
标准DH参数:
改进DH参数:
定义DH参数
%定义DH参数
dh_params = [
-pi/2, 476, 0, -pi/2;
-pi/2, 0, 600, pi;
-pi/2, 0, 0, -pi/2;
0, 650, 0, pi/2;
0, 0, 0, pi/2;
];
joint_angles = [0 0 0 0 0];
T = forward_kinematics(dh_params, joint_angles);
disp('初始末端执行器的变换矩阵:');
disp(T);
运行后得出的变换矩阵为
与Robotic Toolbox计算出的矩阵不同,后者算出的才是预期的矩阵,通过排查可以发现,不管如何调整Robotic Toolbox中Link里面theta值,矩阵和机械臂模型都不会改变,原因是
% 定义初始关节角度
initial_angles = [0 0 0 0 0];
初始关节角度将Link中theta值都替换掉了,所以用于计算的theta值为initial_angles的值,所以在使用工具箱时,需要将所需的theta值施加到初始关节角度上。将initial_angles值调整一下
% 清除工作区和命令窗口
clear; clc;
% 使用改进的DH参数法定义初始连杆参数
L(1) = Link([-pi/2 476 0 -pi/2], 'standard');
L(2) = Link([-pi/2 0 600 pi], 'standard');
L(3) = Link([-pi/2 0 0 -pi/2], 'standard');
L(4) = Link([0 650 0 pi/2], 'standard');
L(5) = Link([0 0 0 pi/2], 'standard');
% 创建机械臂模型
robot = SerialLink(L, 'name', '5DOF Robot');
% 定义初始关节角度
initial_angles = [-pi/2 -pi/2 -pi/2 0 0];
% 可视化机械臂(初始姿态)
robot.plot(initial_angles);
% 计算初始关节角度下末端执行器的变换矩阵
T = robot.fkine(initial_angles);
disp('初始末端执行器的变换矩阵:');
disp(T);
运行结果就没有问题了。