MATLAB通过函数计算出的变换矩阵与Robotic Toolbox自带的函数计算出的变换矩阵不同的原因

% 清除工作区和命令窗口
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);

运行结果就没有问题了。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值