Feedback control - need to update an algebraic variable within ODE function.
显示 更早的评论
I am trying to code a quaternion feedback controller for the rotation of a satellite. I have a function which i use ode45 with and returns the quaternions x(1) to x(4) and angular velocities x(5) to x(7). Within this function I also find the control torque u1, u2 and u3 which depend on the values obtained from the quaternions and the angular velocities. I want u1,u2 and u3 to initially be 0, and then update depending on the values obtained from using ode45. This is then fed back into xdot(5)-xdot(7) and then the control is completed. I am having difficulty with initialising u1,u2 and u3 to be zero and then updating as the function runs. Any help appreciated, thanks.
function [xdot] = Feedback(t,x)
ue1 = 0.1; %External Torques (M)
ue2 = 0.1;
ue3 = 0.1;
J1 = 431; %Moments of Inertia
J2 = 421;
J3 = 485;
q1c = 0.5; %Desired Quaternions
q2c = -0.5;
q3c = 0.5;
q4c = 0.5;
k = 1; %Controller constants
c1 = 4;
c2 = 4;
c3 = 4;
xdot = zeros(7,1); % a column vector
% Quaternions
xdot(1)=((x(7)*x(2)-x(6)*x(3)+x(5)*x(4))*.5);
xdot(2)=((-x(7)*x(1)+x(5)*x(3)+x(6)*x(4))*.5);
xdot(3)=((x(6)*x(1)-x(5)*x(2)+x(7)*x(4))*.5);
xdot(4)=((-x(5)*x(1)-x(6)*x(2)-x(7)*x(3))*.5);
% Angular Velocities
xdot(5)=(u1+ue1+(J2-J3)*x(6)*x(7))/J1;
xdot(6)=(u2+ue2+(J3-J1)*x(7)*x(5))/J2;
xdot(7)=(u3+ue3+(J1-J2)*x(5)*x(6))/J3;
% Error Quaternions
qe1=(q4c*x(1)+q3c*x(2)-q2c*x(3)-q1c*x(4));
qe2=(-q3c*x(1)+q4c*x(2)+q1c*x(3)-q2c*x(4));
qe3=(q2c*x(1)-q1c*x(2)+q4c*x(3)-q3c*x(4));
% Control Torques
u1=-k*qe1-c1*x(5);
u2=-k*qe2-c2*x(6);
u3=-k*qe3-c3*x(7);
end
9 个评论
darova
2020-4-12
How to make u1,u2,u3 zeros if all values are predefined? Maybe x(5:7) can be changed?
u1=-k*qe1-c1*x(5);
u2=-k*qe2-c2*x(6);
u3=-k*qe3-c3*x(7);
Conor Ryan
2020-4-13
darova
2020-4-13
I mean following
a = 2;
b = 3;
c = 1;
u = a*b-c; % u = 5 but you want u to be 0
It's impossible if all values predefined. So i asked: which value is impossible to change (a,b,c)
Torsten
2020-4-13
Why don't you calculate xdot(5) - xdot(7) after updating error quaternions and control torques ?
Conor Ryan
2020-4-13
Steven Lord
2020-4-13
Can you post the mathematical equations you're trying to solve? I'd like to see the equations, not the code you've written to try to solve the equations.
Conor Ryan
2020-4-13
Conor Ryan
2020-4-13
Conor Ryan
2020-4-13
回答(1 个)
James Tursa
2020-5-7
1 个投票
I think you are using the wrong tool for this. ode45( ) is an adaptive integrator, which means that it has the freedom to change stepsizes and make derivative function calls at times that are not necessarily increasing. E.g. ode45( ) might try to make a step with dt, then detect that the estimated error terms are too large, so it will decrease dt and try again. This will result in ode45( ) making calls to your derivative function at times that are not strictly increasing ... there will be some calls at times that are before the time of an earlier call. I think this is going to mess up your feedback control that you have inside your derivative function. Calculating your feedback control at the end of your derivative function and making it persistent inside the derivative function so that it gets used in the next integration step isn't going to fix this problem.
I would offer two things you could try:
1) Use your own hand-coded RK4 code where you can dictate that the derivative function calls are always going forward in time, AND at the same time you can dictate when to calculate and apply your control feedback, which will be fed into the next integration step. The RK4 code isn't that difficult to write and this is probably the simplest thing to try.
2) Code things up in Simulink with an actual feedback loop (you will need to put in a feedback delay to avoid an algebraic loop error).
类别
在 帮助中心 和 File Exchange 中查找有关 Reference Applications 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

