在学习《机器人学》的时候,常常遇到转换矩阵
baT
这样的表示,意思是坐标系
{a}
转换到坐标系
{b}
的转换矩阵,在编程的时候我通常都会写作 Tab
,如果给定了多个关节的DH参数表,有时候需要同时计算多个转换矩阵,为了利用 for
循环来简化代码,可以利用元胞数组(cell
)进行输出
DH = [...]; %DH参数表设定
link = size(DH,1); %取DH表的列数,即所需求解的转换矩阵个数
for k=1:link
T{k} = Transmata(DH(k,:)'); %Transmata是一个自定义的转换矩阵求解函数
end
T10 = T{1};
T21 = T{2};
T32 = T{3};
T43 = T{4};
T54 = T{5};
T65 = T{6};
但是更多的情况下,我们更希望下面的赋值也能够自动进行,即我们希望变量名也能动态变化,那么就需要用到 eval
命令,该命令的作用是“执行文本字符串中的 MATLAB 表达式”,即事先将命令存储到字符串类型的变量中,再利用该函数执行,常用于不同类型数据的变量循环赋值,这与元胞数组的设计初衷类似,但是定制的空间更大(元胞数组的话只能定义数值型的行列坐标,而用 eval
命令可以定制任意的下标)
for k=1:link
T_temp = Transmata(DH(k,:)');
str = (['T',num2str(k-1),num2str(k),'= T_temp',';']);
eval(str)
end
附上 Transmat
函数和 Transmata
函数
function T = Transmata(x)
%% 请注意连环相乘矩阵的顺序(序数大的在后面) ${}^0_nT = {}^0_1T{}^1_2T\cdots{}^{n-2}_{n-1}T{}^{n-1}_nT$
%这个函数是根据DH表求解转换矩阵
%变量x=[alpha_i-1;a_i-1;d_i;theta_i]
z = zeros(3,1);
a1 = [x(1);0;0];
T1 = Transmat(a1,z);
P2 = [x(2);0;0];
T2 = Transmat(z,P2);
a3 = [0;0;x(4)];
T3 = Transmat(a3,z);
P4 = [0;0;x(3)];
T4 = Transmat(z,P4);
T = T1 * T2 * T3 * T4;
end
function T= Transmat(x,P,flag)
% T = Transmat(x,P,flag) 角度位移求解转换矩阵
% x=[alpha;beta;gamma] XYZ顺序旋转角度,当flag=0(缺省)时以欧拉角求解,当flag=1时以固定轴角求解
% P=[x;y;z] 两坐标轴之间的平移量
% flag 如前所述
% Transmat(x,P) 以欧拉角求解转移矩阵(Transmat(x,P,0)也行)
% Transmat(x,P,1) 以固定轴角度求解转移矩阵
% hu 2017-8-17
if (nargin < 3)
flag = 0;
end
Rotx = [1 0 0
0 cos(x(1)) -sin(x(1))
0 sin(x(1)) cos(x(1))];
Roty = [cos(x(2)) 0 sin(x(2))
0 1 0
-sin(x(2)) 0 cos(x(2))];
Rotz = [cos(x(3)) -sin(x(3)) 0
sin(x(3)) cos(x(3)) 0
0 0 1];
switch flag
case 1 %fixed angle
R = Rotz * Roty * Rotx;
case 0 %Euler angle(default)
R = Rotx * Roty * Rotz;
end
T = [R P;
0 0 0 1];
end