Как правильно использовать функцию ode45 в MATLAB для робота с дифференциальным приводом? - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь определить позу (x, y, theta) робота с дифференциальным приводом, используя ode45.Код, который я ниже, решает для позиции x, но у меня проблема с начальным условием.Я установил его на 0, так как в момент времени 0 предполагается, что робот находится в начале координат, но я получаю ошибку.Как установить начальное условие для ode45 таким образом, чтобы я получил ожидаемый результат?

Я попытался сделать вектор начальных условий такой же длины, что и dxdt, установив начальные условия в качестве матрицы нулей 41x1, но я не сделалне понимаю вывод, и я не верю, что я сделал это правильно.

% Given conditions for a differential drive robot:
B = 20; % (cm) distance along axle between centers of two wheels
r = 10; % (cm) diameter of both wheels
w_l = 5*sin(3*t); % (rad/s) angular rate of left wheel
w_r = 5*sin(3*t); % (rad/s) angular rate of right wheel
v_l = r*w_l; % (cm/s) velocity of left wheel
v_r = r*w_r; % (cm/s) velocity of right wheel
v = (v_r+v_l)/B; % (cm/s) velocity of robot
theta = 90; % constant orientation of robot since trajectory is straight

% Solve differential equation for x:
dxdt = v*cos(theta); % diff equaition for x
tspan = [0 20]; % time period to integrate over
x0 = 0; % initial condition since robot begins at origin
[t,x] = ode45(@(t,y) dxdt, tspan, x0);

Я хочу решить дифференциальное уравнение dxdt для 0 до 20 секунд с начальным условием 0.Я ожидаю, что результат выдаст мне вектор времени от 0 до 20 и массив для x.Я считаю, что проблема заключается в начальном условии.MATLAB выдает мне ошибку в живом редакторе, говоря: "@(t,y)dxdt returns a vector of length 69, but the length of initial conditions vector is 1. The vector returned by @(t,y)dxdt and the initial conditions vector must have the same number of elements."

1 Ответ

0 голосов
/ 11 февраля 2019

Проблема не в начальных условиях.Вам нужно определить dxdt как функцию, т. Е.

% Define differential equation
function derivative = dxdt(t,y)

% Given conditions for a differential drive robot:
B = 20; % (cm) distance along axle between centers of two wheels
r = 10; % (cm) diameter of both wheels
w_l = 5*sin(3*t); % (rad/s) angular rate of left wheel
w_r = 5*sin(3*t); % (rad/s) angular rate of right wheel
v_l = r*w_l; % (cm/s) velocity of left wheel
v_r = r*w_r; % (cm/s) velocity of right wheel
v = (v_r+v_l)/B; % (cm/s) velocity of robot
theta = 90; % constant orientation of robot since trajectory is straight

derivative = v*cos(theta); % diff equation for x

end

Затем, когда вы используете ode45, вы должны указать, что переменные t и y передаются в dxdt как

[t,x] = ode45(@(t,y) dxdt(t,y), tspan, x0);

Это должно сработать.В этом случае, поскольку dxdt принимает только аргументы по умолчанию, вы также можете написать

[t,x] = ode45(@dxdt, tspan, x0);

Полученная ошибка означает, что в какой-то момент вы превратили dxdt в вектор длиной 69, тогда как MATLABожидал получить 1 значение для dxdt, когда он передал одну t и одну y вашей dxdt 'функции'.Всякий раз, когда вы получаете подобные ошибки, я рекомендую поместить

clear all

`clearvars` % better than clear all - see am304's comment below

в верхней части вашего сценария, чтобы избежать загрязнения рабочей области ранее определеннымипеременные.

...