Matlab中變量的動態定義

在學習《機器人學》的時候,常常遇到轉換矩陣 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章