在使用工具箱建立机器臂模型验算结果时开始结果总是错误,后来发现原来在用link函数时每个坐标原点取的位置是杆的末端,所以参数发生了变化,
不可直接使用上面的DH参数,所以导致验算错误。最后按照这个参数规则修改后得到了正确的结果。
直接上代码
%%
%初始数据%连杆长度
l1=4; l2=3; l3=2;
%待求解给定角度
Theta1=[0.0;0.0;0.0];
% Theta2=[10;20;30];
% Theta3=[90;90;90];
Theta2=[10*pi/180;20*pi/180;30*pi/180];
Theta3=[pi/2;pi/2;pi/2];
syms theta1 theta2 theta3;
%精确度
eps=1e-10;
%%
%习题(a),求DH参数,在图上建立好各个关节的坐标后,根据课本53页参数判断的法则得到参数表如下
% 参数意义: theta d a alpha 旋转还是平移关节(这个顺序为了方便后面机器人建模)
param1=[theta1 0 0 0 0];
param2=[theta2 0 l1 0 0];
param3=[theta3 0 l2 0 0];
%%
%习题(b)求相邻的齐次变换矩阵,此处用自己写的函数求解
T01=matFun(param1);
T12=matFun(param2);
T23=matFun(param3);
%推导常量矩阵T3h
%由于{H}的姿态和{3}相同,故从{3}到{H}只有a=l3,其他参数都是0,所以
param4=[0 0 l3 0 0];
T3h=matFun(param4);
%%
%习题(c)
%用符号法求正向运动学解并输出
T03=T01*T12*T23; T03=simplify (T03)
T0h=T03*T3h; T0h=simplify (T0h)
%进行数值计算 不加分号是为了显示结果
theta1=Theta1(1,1); theta2=Theta1(2,1); theta3=Theta1(3,1);
Theta1
T03=eval(T03)
T0h=eval(T0h)
theta1=Theta2(1,1); theta2=Theta2(2,1); theta3=Theta2(3,1);
Theta2
T03=eval(T01*T12*T23)
T0h=eval(T01*T12*T23*T3h)
theta1=Theta3(1,1); theta2=Theta3(2,1); theta3=Theta3(3,1);
Theta3
T03=eval(T01*T12*T23)
T0h=eval(T01*T12*T23*T3h)
%%
%习题(d),用工具箱验算计算结果
%根据参数表建立机器臂模型 经过测试发现,每个坐标原点取的位置是杆的末端,所以参数发生了变化,不可直接使用上面的param
param11=[theta1 0 l1 0 0];
param21=[theta2 0 l2 0 0];
param31=[theta3 0 l3 0 0];
L1=Link(param11,'standard');
L2=Link(param21,'standard');
L3=Link(param31,'standard');
%mhand表示机械臂
mhand=SerialLink([L1 L2 L3], 'name', '3R robot');
%用工具箱进行正运动学计算
disp('用工具箱进行验算');
Theta1
mhand.fkine(Theta1)
Theta2
mhand.fkine(Theta2)
Theta3
mhand.fkine(Theta3)