几个小时后,我思考一个我认为很容易解决的问题。我只是得不到。 在Coursera(Aerial Robotics)的作业中,我要求使用matlab的ODE45函数对PD控制器进行编程。目标是(仅!)物体沿z轴的垂直稳定。
二阶的差分补偿是
u(t)= m *(zd'' + Kp *(zd-z)+ Kv(zd' -z')+ g)
这里d停留在所需的位置,z单独代表实际位置和'或者''代表第一个o。二阶导数。 而且你需要保持或得到它应该存在的对象。
现在我尝试将其缩减为第一顺序的系统,如下所示:
zd = z1
dz1 / dt = z2
dz2 / dt = u(t)/ m - (Kp *(zd-z)+ Kv(zd' -z')+ g)
Z = Z3
DZ3 / DT = Z4
U = Z5
DZ5 / DT = Z6
我认为我有zd(0)的5个起始变量,zd'(0)= z2(0),z(0)= z3(0),z'(0)= z4( 0)和你(0)。目标是获得你(t)。
现在我尝试了这段代码,不幸的是总是会出错:
z0 = [s_des(1), s_des(2), s(1), s(2), u];
tlim=[t, t+.01];
[t,z]=ode45(@flight, tlim, z0);
function dzdt=flight(t,z)
dzdt_1 = z(2);
dzdt_2 = z(5)/m+kv*z(4)-kv*z(2)-kp*z(1)+kp*z(3)-g;
dzdt_3 = z(4);
dzdt_5 = z(6);
dzdt=[dzdt_1; dzdt_2; dzdt_3; dzdt_5];
end
这里s_des,s变量包含起始值或实际值。
错误是:
指数超出矩阵维度。 控制器/飞行中的错误(第42行) dzdt_2 = z(5)/ m + kv z(4)-kv z(2)-kp z(1)+ kp z(3)-g; < / p>
任何人都可以帮助我。我尝试了较少的方程式,但大多数情况下我得到的错误或错误与此相同: CONTROLLER / FLIGHT返回长度为5的向量,但初始条件向量的长度为6.返回的向量 CONTROLLER / FLIGHT和初始条件向量必须具有相同数量的元素。
编辑: 如果我改变中央功能如下,我不会得到任何错误,但它不起作用,因为我的对象只是落到地上; - )
[t,z]=ode45(@flight, tlim, z0);
function dzdt=flight(t,z)
dzdt_1 = z(2);
dzdt_2 = z(5)/m+kv*z(4)-kv*z(2)-kp*z(1)+kp*z(3)-g;
dzdt_3 = z(4);
dzdt=[dzdt_1; dzdt_2; dzdt_3; 0; 0];
end
感谢。
答案 0 :(得分:0)
在思考并尝试了一段时间后,我想出了这个解决方案:
tlim=[tinit, tinit+.01];
iniCond=[s_des(1)-s(1),s_des(2)-s(2), s_des(1), s_des(2)];
[tSol, eSol]=ode45(@control, tlim, iniCond);
u=kv*m*eSol(end, 2) + m*kp*eSol(end,1) + m*g
function derror = control(time, error)
A=[0 1 0 0;-kp -kv 0 0;0 0 0 1;-kp -kv 0 0];
b=[0 0 0 u/m-g]';
derror=A*error+b;
end
这完成了模拟四轴飞行器垂直运动的工作。