Matlab: ошибка в «horzcat» при использовании функции matlab для создания файла из символьных вложений

#matlab #symbolic-math #robotics

Вопрос:

Этот вопрос содержит много кода, но в основном это сообщения об ошибках и определения параметров.

Я пытаюсь сгенерировать функциональный скрипт matlab для расчета динамики 4-канального робота-манипулятора. Цель состоит в том, чтобы заставить функцию принимать набор параметров(векторов/матриц) в качестве входных данных и возвращать системные матрицы D, C и G. Все вычисления выполняются символически в соответствии со стандартными формулами, найденными в любом учебнике по робототехнике. Я просмотрел все свои расчеты и не нашел здесь ошибок.

Когда вычисления завершены, файл функции создается следующей строкой кода:

 matlabFunction(D,C,G,'File','getDynamicsFnc','Vars',{[q], [q_dot], [I1], [I2], [I3], [I4],   [th_a], [DH_params], [m], [com], [g]});  

Это приводит к следующему сообщению об ошибке:

 Error using horzcat Dimensions of arrays being concatenated are not consistent.  Error in sym/matlabFunctiongt;computeVarnames (line 902)  allNames = matlab.lang.makeUniqueStrings([repelem("ft",1,nuOfBlocks-1), "ft"   allVars],1:nuOfBlocks-1,namelengthmax);  Error in sym/matlabFunctiongt;postProcessing (line 826)  [newFunctionNames, newArgumentName] = computeVarnames(blocks);  Error in sym/matlabFunction (line 198)  blocks = postProcessing(blocks);  Error in generate_func_complete (line 119)  matlabFunction(D,C,G,'File','getDynamicsFnc','Vars',{[q], [q_dot], [I1], [I2], [I3], [I4],   [th_a], [DH_params], [m], [com], [g]});  

Я проверил размеры всех элементов в рабочей области и не обнаружил никаких несоответствий. Я попытался запустить сценарий с фиктивными значениями для D, C и G, и он работал правильно (даже когда они состояли из элементов матриц преобразования/Якоби, которые вычисляются в сценарии).

Следующий код показывает, как вычисляются D, C и G:

 D = sym(zeros(dim)); C = sym(zeros(dim)); G = sym(zeros(dim,1));  % D matrix for i = 1:dim % T{i} is a 4X4 matrix that was calculated previously  R = T{i}(1:3,1:3);  It = simplify(R*I{i}*R');  D = D   m(i)*J_v{i}'*J_v{i}   J_w{i}'*It*J_w{i}; % Calculate D  P = P   m(i)*gvec'*rc{i}; % Potential energy. Used to find G later end P = simplify(P);  % C matrix for i= 1:dim  for j=1:dim  for k=1:dim  christ = 0.5*(diff(D(i,j),q(k))   diff(D(i,k),q(j)) - diff(D(k,j),q(i))); % Calculating Christoffel symbols  C(i,j) = C(i,j)   christ*q_dot(k); % Summing Christoffel symbols to find elements of C  end   end end  % G matrix for i = 1:dim  G(i) = diff(P,q(i)); % Calculating G end  

Я не буду включать вычисления для T, J или rc из-за длины кода, но я уже убедился, что проблема не в них. Все остальные используемые параметры определяются следующим образом:

 dim = 4; q = sym('q',[dim 1],'real'); q_dot = sym('q_dot',[dim 1],'real');  I1 = sym('I1', [3 3],'real'); I2 = sym('I2', [3 3],'real'); I3 = sym('I3', [3 3],'real'); I4 = sym('I4', [3 3],'real'); I = cell(1,4); I{1} = I1; I{2} = I2; I{3} = I3; I{4} = I4;  th_a = sym('th_a','real'); DH_params = sym('DH_params', [5 4],'real'); com = sym('com', [5 3],'real'); m = sym('m', [1 dim],'real'); g = sym('g','real'); gvec = [0;0;g];  

ПРИМЕЧАНИЕ: Я не использую функцию упрощения при расчете выходных данных. Это связано с резким увеличением времени выполнения скрипта до такой степени, что он не будет работать в течение нескольких часов.

Я включил в этот вопрос много кода, но я считаю, что он довольно прост для понимания и, надеюсь, не слишком навязчив. Пожалуйста, дайте отзыв, если я перестарался.

Комментарии:

1. Это не связано с вашей ошибкой, но когда вы это делаете [q] , вы объединяетесь q с примечанием. Это то же самое , что просто писать q , только медленнее.

2. Что касается вашей ошибки, я бы посоветовал включить отладчик и попытаться выяснить, где внутри matlabFunction функции это происходит. Это должно дать вам некоторое представление о том, в чем проблема. Вполне вероятно , что он пытается объединить D , C причем G по первому измерению, что не сработает, потому G что имеет только один столбец.