В течение нескольких часов я размышляю над проблемой, которую, как мне кажется, легко решить. Я просто не понимаю. В задании для Coursera (Aerial Robotics) я попросил запрограммировать контроллер PD с помощью функции ODE45 из Matlab. Целью является (только!) Вертикальная стабилизация объекта по оси z.
Дифференциальное уравнение второго порядка для этого имеет вид
u(t) = m*(zd'' + Kp*(zd-z)+Kv(zd'-z')+g)
здесь d обозначает желаемое положение, только z обозначает фактическое положение, а «или» обозначает первое o. 2-я производная. И u - результирующая сила, необходимая для удержания или получения объекта на месте.
Теперь я попытался свести это к системе уравнений первого порядка следующим образом:
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
И я думаю, что у меня есть 5 начальных переменных для zd (0), zd '(0) = z2 (0), z (0) = z3 (0), z' (0) = z4 (0) и u (0) . И цель - получить u (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 em > z (3) -g;
Может кто-нибудь помочь мне. Я пробовал меньше уравнений, но чаще всего получаю ту же ошибку или ошибку, что и эта: КОНТРОЛЛЕР / ПОЛЕТ возвращает вектор длины 5, но длина вектора начальных условий равна 6. Вектор, возвращаемый КОНТРОЛЛЕР / ПОЛЕТ, и вектор начальных условий должно иметь одинаковое количество элементов.
edit: если я изменяю центральную функцию следующим образом, я не получаю никаких ошибок, но это не работает, так как мой объект просто падает на землю ;-)
[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
Спасибо.
zd
иz
? Может быть, было бы яснее, если бы вы не использовалиzd
в качестве имени переменной, когдаdz
иz
также плавают вокруг - person Wolfie   schedule 27.10.2017z(6)
? Исходя из ваших начальных условий, похоже, что у вас всего пять состояний. Входные и выходные данные вашей функции интеграции должны иметь такую же размерность, что и начальные условия. - person horchler   schedule 27.10.2017