在學習《機器人學》的時候,常常遇到轉換矩陣 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