-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathPreviewSystem.cpp
More file actions
86 lines (72 loc) · 2.92 KB
/
Copy pathPreviewSystem.cpp
File metadata and controls
86 lines (72 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// This file is part of mpc.
// mpc is free software: you can redistribute it and/or
// modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// mpc 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with mpc. If not, see
// <http://www.gnu.org/licenses/>.
// header
#include "PreviewSystem.h"
//mpc
#include "debugUtils.h"
namespace mpc {
PreviewSystem::PreviewSystem(const Eigen::MatrixXd& state, const Eigen::MatrixXd& control,
const Eigen::VectorXd& bias, const Eigen::VectorXd& xInit, int numberOfSteps)
{
system(state, control, bias, xInit, numberOfSteps);
}
void PreviewSystem::system(const Eigen::MatrixXd& state, const Eigen::MatrixXd& control,
const Eigen::VectorXd& bias, const Eigen::VectorXd& xInit, int numberOfSteps)
{
if (xInit.rows() != state.rows())
DOMAIN_ERROR_EXCEPTION(throwMsgOnRows("xInit", "state", xInit, state));
if (state.rows() != state.cols())
DOMAIN_ERROR_EXCEPTION(throwMsgOnSquareMat("state", state));
if (xInit.rows() != control.rows())
DOMAIN_ERROR_EXCEPTION(throwMsgOnRows("xInit", "control", xInit, control));
if (xInit.rows() != bias.rows())
DOMAIN_ERROR_EXCEPTION(throwMsgOnRows("xInit", "state", xInit, bias));
if (numberOfSteps <= 0) // This should desappear later
DOMAIN_ERROR_EXCEPTION("The number of step sould be a positive number! ");
isUpdated = false;
nrUStep = numberOfSteps;
nrXStep = numberOfSteps + 1;
xDim = static_cast<int>(state.cols());
uDim = static_cast<int>(control.cols());
fullXDim = xDim * nrXStep;
fullUDim = uDim * nrUStep;
x0 = xInit;
A = state;
B = control;
d = bias;
Phi.resize(fullXDim, xDim);
Psi.resize(fullXDim, fullUDim);
xi.resize(fullXDim);
Phi.setZero();
Phi.block(0, 0, xDim, xDim) = Eigen::MatrixXd::Identity(xDim, xDim);
Psi.setZero();
xi.setZero();
}
void PreviewSystem::updateSystem() noexcept
{
Phi.block(xDim, 0, xDim, xDim) = A;
Psi.block(xDim, 0, xDim, uDim) = B;
xi.segment(xDim, xDim) = d;
for (auto i = 2; i < nrXStep; ++i) {
Phi.block(i * xDim, 0, xDim, xDim).noalias() = A * Phi.block((i - 1) * xDim, 0, xDim, xDim);
Psi.block(i * xDim, 0, xDim, uDim).noalias() = A * Psi.block((i - 1) * xDim, 0, xDim, uDim);
for (auto j = 1; j < i; ++j)
Psi.block(i * xDim, j * uDim, xDim, uDim) = Psi.block((i - 1) * xDim, (j - 1) * uDim, xDim, uDim);
xi.segment(i * xDim, xDim).noalias() = A * xi.segment((i - 1) * xDim, xDim) + d;
}
isUpdated = true;
}
} // namespace mpc