function demo_MPC01 % Batch LQR with viapoints and a double integrator system. % % If this code is useful for your research, please cite the related publication: % @incollection{Calinon19chapter, % author="Calinon, S. and Lee, D.", % title="Learning Control", % booktitle="Humanoid Robotics: a Reference", % publisher="Springer", % editor="Vadakkepat, P. and Goswami, A.", % year="2019", % pages="1261--1312", % doi="10.1007/978-94-007-6046-2_68" % } % % Copyright (c) 2019 Idiap Research Institute, http://idiap.ch/ % Written by Sylvain Calinon, http://calinon.ch/ % % This file is part of PbDlib, http://www.idiap.ch/software/pbdlib/ % % PbDlib is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License version 3 as % published by the Free Software Foundation. % % PbDlib is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with PbDlib. If not, see . addpath('./m_fcts/'); %% Parameters %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% nbData = 200; %Number of datapoints nbPoints = 3; %Number of keypoints nbVarPos = 2; %Dimension of position data (here: x1,x2) nbDeriv = 2; %Number of static and dynamic features (nbDeriv=2 for [x,dx] and u=ddx) nbVar = nbVarPos * nbDeriv; %Dimension of state vector dt = 1E-2; %Time step duration rfactor = 1E-8; %dt^nbDeriv; %Control cost in LQR R = speye((nbData-1)*nbVarPos) * rfactor; %Control cost matrix %% Dynamical System settings (discrete version) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% A1d = zeros(nbDeriv); for i=0:nbDeriv-1 A1d = A1d + diag(ones(nbDeriv-i,1),i) * dt^i * 1/factorial(i); %Discrete 1D end B1d = zeros(nbDeriv,1); for i=1:nbDeriv B1d(nbDeriv-i+1) = dt^i * 1/factorial(i); %Discrete 1D end A = kron(A1d, speye(nbVarPos)); %Discrete nD B = kron(B1d, speye(nbVarPos)); %Discrete nD %Build Sx and Su transfer matrices Su = sparse(nbVar*nbData, nbVarPos*(nbData-1)); Sx = kron(ones(nbData,1), speye(nbVar)); M = B; for n=2:nbData id1 = (n-1)*nbVar+1:nbData*nbVar; Sx(id1,:) = Sx(id1,:) * A; id1 = (n-1)*nbVar+1:n*nbVar; id2 = 1:(n-1)*nbVarPos; Su(id1,id2) = M; M = [A*M(:,1:nbVarPos), M]; end %% Task setting %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tl = linspace(1, nbData, nbPoints+1); tl = round(tl(2:end)); MuQ = zeros(nbVar*nbData,1); Q = zeros(nbVar*nbData); for t=1:length(tl) id(:,t) = [1:nbVarPos] + (tl(t)-1) * nbVar; Q(id(:,t), id(:,t)) = eye(nbVarPos); MuQ(id(:,t)) = rand(nbVarPos,1) - 0.5; end %% Batch LQR reproduction %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% x0 = zeros(nbVar,1); u = (Su' * Q * Su + R) \ Su' * Q * (MuQ - Sx * x0); rx = reshape(Sx*x0+Su*u, nbVar, nbData); %Reshape data for plotting uSigma = inv(Su' * Q * Su + R); % + eye((nbData-1)*nbVarU) * 1E-10; xSigma = Su * uSigma * Su'; %% Plot 2D %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% figure('position',[10 10 800 800]); hold on; axis off; for t=1:nbData plotGMM(rx(1:2,t), xSigma(nbVar*(t-1)+[1,2],nbVar*(t-1)+[1,2]).*1E-6, [.2 .2 .2], .1); end plot(rx(1,:), rx(2,:), '-','linewidth',2,'color',[0 0 0]); plot(rx(1,1), rx(2,1), '.','markersize',35,'color',[0 0 0]); plot(MuQ(id(1,:)), MuQ(id(2,:)), '.','markersize',35,'color',[.8 0 0]); axis equal; % print('-dpng','graphs/demo_MPC01.png'); pause; close all;