#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
что имеет только один столбец.