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
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值