Вычислить матрицу с символической переменной - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть следующий скрипт MATLAB:

var_theta = sym('theta', [1,7]);
matrix_DH = computeDH(var_theta);
T_matrix = zeros(4,4,7);
for i = 1:7
    T_matrix(:,:,i) = computeT(matrix_DH(i,1), matrix_DH(i,2), matrix_DH(i,3), matrix_DH(i,4));
end

function matrixT = computeT(alpha, d, r, theta)
  matrixT = zeros(4,4);
  matrixT(1,:) = [cos(theta) -1*sin(theta) 0 r]; % first row 
  matrixT(2,:) = [sin(theta)*cos(alpha) cos(theta)*cos(alpha) -sin(alpha) -d*sin(alpha)]; % 2n row  
  matrixT(3,:) = [sin(theta)*sin(alpha) cos(theta)*sin(alpha) cos(alpha) d*cos(alpha)]; % 3rd row  
  matrixT(4,:) = [0 0 0 1]; % last row
end

function DH = computeDH(theta)
   DH = zeros(7,4);
   L = 0.4;
   M = 0.39;
   DH(1,:) = [0.5*pi 0 0 theta(1,1)];
   DH(2,:) = [-0.5*pi 0 0 theta(2)];
   DH(3,:) = [-0.5*pi L 0 theta(3)];
   DH(4,:) = [0.5*pi 0 0 theta(4)];
   DH(5,:) = [0.5*pi M 0 theta(5)];
   DH(6,:) = [-0.5*pi 0 0 theta(6)];
   DH(7,:) = [0 0 0 theta(7)];
end

Я бы хотел получить желаемый массив T_matrix без оценки тэты. Моя цель состоит в том, чтобы после получения матриц вывести каждую позицию по каждой тэте, чтобы вычислить якобиан. Итак, в конце я хотел бы получить полученные матрицы как функцию тэты. Проблема в том, что всякий раз, когда я вставляю символическую переменную в матрицу, она говорит:

The following error occurred converting from sym to double:
Unable to convert expression into double array.

Error in computeT_robotics>computeDH (line 21)
   DH(1,:) = [0.5*pi, 0, 0, theta(1)];

1 Ответ

0 голосов
/ 11 сентября 2018

Как заявил Энтони, матрицы, в которые включена моя тэта, также должны быть объявлены как sym, чтобы иметь возможность сохранять символические результаты.Конечный код:

var_theta = sym('theta', [1,7]);
matrix_DH = computeDH(var_theta);
T_matrix = sym('T_matrix',[4 4 7]);
for i = 1:7
    T_matrix(:,:,i) = computeT(matrix_DH(i,1), matrix_DH(i,2), matrix_DH(i,3), matrix_DH(i,4));
end

function matrixT = computeT(alpha, d, r, theta)
  matrixT = sym('matrixT', [4 4]);
  matrixT(1,:) = [cos(theta) -1*sin(theta) 0 r]; % first row 
  matrixT(2,:) = [sin(theta)*cos(alpha) cos(theta)*cos(alpha) -sin(alpha) -d*sin(alpha)]; % 2n row  
  matrixT(3,:) = [sin(theta)*sin(alpha) cos(theta)*sin(alpha) cos(alpha) d*cos(alpha)]; % 3rd row  
  matrixT(4,:) = [0 0 0 1]; % last row
end

function DH = computeDH(theta)
   DH = sym('DH',[7 4]);
   L = 0.4;
   M = 0.39;
   DH(1,:) = [0.5*pi 0 0 theta(1,1)];
   DH(2,:) = [-0.5*pi 0 0 theta(2)];
   DH(3,:) = [-0.5*pi L 0 theta(3)];
   DH(4,:) = [0.5*pi 0 0 theta(4)];
   DH(5,:) = [0.5*pi M 0 theta(5)];
   DH(6,:) = [-0.5*pi 0 0 theta(6)];
   DH(7,:) = [0 0 0 theta(7)];
end
...