Я пытаюсь имитировать динамику вращения системы. Я проверяю свой код, чтобы убедиться, что он работает с использованием моделирования, но я никогда не восстанавливал параметры, которые я передал модели. Другими словами, я не могу переоценить параметры, которые я выбрал для модели.Не удается восстановить параметры модели с помощью ode45
Я использую MATLAB для этого и, в частности, ode45
. Вот мой код:
% Load the input-output data
[torque outputs] = DataLogs2();
u = torque;
% using the simulation data
Ixx = 1.00;
Iyy = 2.00;
Izz = 3.00;
x0 = [0; 0; 0];
Ts = .02;
t = 0:Ts:Ts * (length(u) - 1);
[ T, x ] = ode45(@(t,x) rotationDyn(t, x, u(1+floor(t/Ts),:), Ixx, Iyy, Izz), t, x0);
w = x';
N = length(w);
q = 1; % a counter for the A and B matrices
% The Algorithm
for k=1:1:N
w_telda = [ 0 -w(3, k) w(2,k); ...
w(3,k) 0 -w(1,k); ...
-w(2,k) w(1,k) 0 ];
if k == N % to handle the problem of the last iteration
w_dash(:,k) = (-w(:,k))/Ts;
else
w_dash(:,k) = (w(:,k+1)-w(:,k))/Ts;
end
a = kron(w_dash(:,k)', eye(3)) + kron(w(:,k)', w_telda);
A(q:q+2,:) = a; % a 3N*9 matrix
B(q:q+2,:) = u(k,:)'; % a 3N*1 matrix % u(:,k)
q = q + 3;
end
% Forcing J to be diagonal. This is the case when we consider our quadcopter as two thin uniform
% rods crossed at the origin with a point mass (motor) at the end of each.
A_new = [A(:, 1) A(:, 5) A(:, 9)];
vec_J_diag = A_new\B;
J_diag = diag([vec_J_diag(1), vec_J_diag(2), vec_J_diag(3)])
eigenvalues_J_diag = eig(J_diag)
error = norm(A_new*vec_J_diag - B)
где моя динамическая модель определяется как:
function [dw, y] = rotationDyn(t, w, tau, Ixx, Iyy, Izz, varargin)
% The output equation
y = [w(1); w(2); w(3)];
% State equation
% dw = (I^-1)*(tau - cross(w, I*w));
dw = [Ixx^-1 * tau(1) - ((Izz-Iyy)/Ixx)*w(2)*w(3);
Iyy^-1 * tau(2) - ((Ixx-Izz)/Iyy)*w(1)*w(3);
Izz^-1 * tau(3) - ((Iyy-Ixx)/Izz)*w(1)*w(2)];
end
Практически то, что этот код должен делать, чтобы вычислить собственные значения матрицы инерции, J
, т.е. восстановить Ixx
, Iyy
и Izz
, которые я передал модели в самом начале (1, 2 и 3), но все, что я получаю, является неправильным результатом.
Проблема с использованием ode45
?
Извините, что не зная, где проблема в точности, но я много дней искал ее без везения. –
Пожалуйста, предоставьте некоторый тип вывода, чтобы мы могли лучше понять, что вы подразумеваете под «неправильными результатами». Возможно, сюжет результатов и сюжет (или описание) того, что вы думаете о нем. –
@brian. Предварительно заданные значения трех инерций «Ixx, Iyy, Izz» равны 1.0, 2.0 и 3.0, но оценочные результаты, которые я получаю: [-2.855851586472459e-01, 2.086082382514133e-03, 6.027561523432094e-02], которые являются собственными значениями матрицы 'J_diag' выше в коде –