function planTrajectory
modelName = 'planning';
TORQUE_IND = 1;
Q_IND = 2;
DQ_IND = 3;
open_system(modelName);
set_param(modelName,'FastRestart','on');
set_param(modelName,'SimMechanicsOpenEditorOnUpdate','off');
t0 = 0;
q0 = [0 0];
qf = [pi/4 pi/4];
DQ0 = [0 0];
DQf = [0 0];
totalTime = 10;
numPoints = 4;
numJoints = 2;
t = linspace(t0,totalTime,numPoints + 2);
Q0 = zeros(numJoints, numPoints + 2);
for i = 1:numJoints
Q0(i,:) = linspace(q0(i), qf(i),numPoints + 2);
end
Qt = Q0;
xOld = [];
yout = [];
fun = @(x) costFunTrajectoryPlanning(x);
nonlcon = [];
x0 = Q0(:,2:numPoints+1);
x0 = x0(:);
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
options = optimoptions('fmincon', 'Display', 'iter', 'Algorithm',...
'interior-point', 'MaxIterations', 10, 'PlotFcn', @optimplotfval);
[xOpt, fobj, exitFlag, outputFree] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
xOpt = reshape(xOpt, numJoints, numPoints);
QOpt = Q0;
QOpt(:,2:numPoints+1) = xOpt;
Qt = QOpt;
set_param(modelName,'FastRestart','off');
set_param(modelName,'SimMechanicsOpenEditorOnUpdate','on');
simOut = sim(modelName,'SrcWorkspace', 'current', 'StopTime', num2str(totalTime));
out = simOut.get('yout');
tout = simOut.get('tout');
q = out.getElement(Q_IND).Values.Data(:,:);
dq = out.getElement(DQ_IND).Values.Data(:,:);
tInd = ismembertol(tout,t);
tNew = tout(tInd);
if length(tNew) ~= length(t)
error('planTrajectory: Time vectors don''t have the same length');
end
Qout = q(tInd,:)';
dQout = dq(tInd,:)';
function [f] = costFunTrajectoryPlanning(x)
updateIfNeeded(x);
f = yout.getElement(TORQUE_IND).Values.Data(end,1);
end
function updateIfNeeded(x)
if ~isequal(x,xOld)
Xvp = reshape(x, 2, numPoints);
Qt(:,2:numPoints+1) = Xvp;
simOut = sim(modelName, 'SrcWorkspace', 'current',...
'StopTime', num2str(totalTime));
yout = simOut.get('yout');
xOld = x;
end
end
end