8 #include <Eigen/StdVector>
10 #include <qpOASES.hpp>
11 #include <qpOASES/QProblemB.hpp>
16 #define ENABLE_QPBOX 1
17 #define DISABLE_QPBOX 0
18 #define ENABLE_FULLDDP 1
19 #define DISABLE_FULLDDP 0
21 USING_NAMESPACE_QPOASES
23 EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::MatrixXd)
24 EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::VectorXd)
26 template <
typename precision,
int stateSize,
int commandSize>
29 typedef Eigen::Matrix<precision, stateSize, 1>
stateVec_t;
30 typedef Eigen::Matrix<precision, 1, stateSize>
32 typedef Eigen::Matrix<precision, stateSize, stateSize>
36 typedef Eigen::Matrix<precision, commandSize, 1>
38 typedef Eigen::Matrix<precision, 1, commandSize>
40 typedef Eigen::Matrix<precision, commandSize, commandSize>
44 typedef Eigen::Matrix<precision, stateSize, commandSize>
46 typedef Eigen::Matrix<precision, stateSize, commandSize>
49 typedef Eigen::Matrix<precision, stateSize, commandSize>
52 typedef Eigen::Matrix<precision, commandSize, stateSize>
54 typedef Eigen::Matrix<precision, commandSize, stateSize>
57 typedef Eigen::Matrix<precision, commandSize, stateSize>
60 typedef Eigen::Matrix<precision, stateSize, stateSize>
63 typedef Eigen::Matrix<precision, commandSize, commandSize>
90 unsigned int commandNb;
101 double cost, previous_cost;
110 struct traj lastTraj;
118 Eigen::LLT<commandMat_t> lltofQuu;
130 unsigned char completeBackwardFlag;
149 bool fullDDP = 0,
bool QPBox = 0) {
150 dynamicModel = &myDynamicModel;
151 costFunction = &myCostFunction;
155 enableFullDDP = fullDDP;
156 zeroCommand.setZero();
160 qp =
new QProblemB(commandNb);
162 myOptions.printLevel = PL_LOW;
163 myOptions.enableRegularisation = BT_TRUE;
164 myOptions.initialStatusBounds = ST_INACTIVE;
165 myOptions.numRefinementSteps = 1;
166 myOptions.enableCholeskyRefactorisation = 1;
167 qp->setOptions(myOptions);
169 xOpt =
new real_t[commandNb];
176 unsigned int& myT,
double& mydt,
unsigned int& myiterMax,
177 double& mystopCrit) {
183 stopCrit = mystopCrit;
185 xList.resize(myT + 1);
187 updatedxList.resize(myT + 1);
188 updateduList.resize(myT);
189 tmpxPtr.resize(myT + 1);
211 for (iter = 1; iter < iterMax; iter++) {
214 if (changeAmount < stopCrit) {
219 xList = updatedxList;
220 updatedxList = tmpxPtr;
221 uList = updateduList;
222 updateduList = tmpuPtr;
224 return updateduList[0];
229 for (
unsigned int i = 0; i < T; i++) {
230 uList[i] = zeroCommand;
238 nextVx = costFunction->
getlx();
239 nextVxx = costFunction->
getlxx();
242 completeBackwardFlag = 0;
244 while (!completeBackwardFlag) {
245 completeBackwardFlag = 1;
246 muEye = stateMat_t::Constant(mu);
247 for (
int i = T - 1; i >= 0; i--) {
255 Qx = costFunction->
getlx() + dynamicModel->
getfx().transpose() * nextVx;
256 Qu = costFunction->
getlu() + dynamicModel->
getfu().transpose() * nextVx;
257 Qxx = costFunction->
getlxx() + dynamicModel->
getfx().transpose() *
258 (nextVxx)*dynamicModel->
getfx();
259 Quu = costFunction->
getluu() + dynamicModel->
getfu().transpose() *
260 (nextVxx)*dynamicModel->
getfu();
261 Qux = costFunction->
getlux() + dynamicModel->
getfu().transpose() *
262 (nextVxx)*dynamicModel->
getfx();
263 Quu_reg = costFunction->
getluu() + dynamicModel->
getfu().transpose() *
265 dynamicModel->
getfu();
266 Qux_reg = costFunction->
getlux() + dynamicModel->
getfu().transpose() *
268 dynamicModel->
getfx();
279 std::cout <<
"regularization" << std::endl;
284 completeBackwardFlag = 0;
288 QuuInv = Quu.inverse();
294 lb = lowerCommandBounds - u;
295 ub = upperCommandBounds - u;
296 qp->init(H.data(), g.data(), lb.data(), ub.data(), nWSR);
297 qp->getPrimalSolution(xOpt);
298 k = Eigen::Map<commandVec_t>(xOpt);
300 for (
unsigned int i_cmd = 0; i_cmd < commandNb; i_cmd++) {
301 if ((k[i_cmd] == lowerCommandBounds[i_cmd]) |
302 (k[i_cmd] == upperCommandBounds[i_cmd])) {
303 K.row(i_cmd).setZero();
313 nextVx = Qx + K.transpose() * Quu * k + K.transpose() * Qu +
315 nextVxx = Qxx + K.transpose() * Quu * K + K.transpose() * Qux +
317 nextVxx = 0.5 * (nextVxx + nextVxx.transpose());
327 updatedxList[0] = xInit;
330 for (
unsigned int i = 0; i < T; i++) {
332 uList[i] + alpha * kList[i] + KList[i] * (updatedxList[i] - xList[i]);
333 updatedxList[i + 1] =
335 changeAmount = fabs(previous_cost - cost) / cost;
337 previous_cost = cost;
341 lastTraj.
xList = updatedxList;
342 lastTraj.
uList = updateduList;
343 lastTraj.
iter = iter;
350 lltofQuu.compute(Quu_reg);
351 if (lltofQuu.info() == Eigen::NumericalIssue) {
352 std::cout <<
"not sdp" << std::endl;
353 std::cout <<
"#############################" << std::endl;
354 std::cout <<
"Quu_reg : " << Quu_reg << std::endl;
355 std::cout <<
"lxx : " << costFunction->
getlxx() << std::endl;
356 std::cout <<
"lu : " << costFunction->
getlu() << std::endl;
357 std::cout <<
"lx : " << costFunction->
getlx() << std::endl;
358 std::cout <<
"luu" << costFunction->
getluu() << std::endl;
359 std::cout <<
"updateduList[0] : " << updateduList[0] << std::endl;
360 std::cout <<
"updatedxList[0] : " << updatedxList[0] << std::endl;
361 std::cout <<
"#############################" << std::endl;
Definition: costfunction.hh:7
commandR_stateC_t & getlux()
Definition: costfunction.hh:84
virtual void computeFinalCostAndDeriv(const stateVec_t &X, const stateVec_t &Xdes)=0
stateMat_t & getlxx()
Definition: costfunction.hh:81
stateVec_t & getlx()
Definition: costfunction.hh:80
commandMat_t & getluu()
Definition: costfunction.hh:83
double & getFinalCost()
Definition: costfunction.hh:79
virtual void computeCostAndDeriv(const stateVec_t &X, const stateVec_t &Xdes, const commandVec_t &U)=0
commandVec_t & getlu()
Definition: costfunction.hh:82
double & getRunningCost()
Definition: costfunction.hh:78
Definition: ddpsolver.hh:27
Eigen::Matrix< precision, commandSize, stateSize > commandR_stateC_t
Definition: ddpsolver.hh:53
Eigen::Matrix< precision, stateSize, stateSize > stateMat_t
Definition: ddpsolver.hh:33
std::vector< commandR_stateC_t > commandR_stateC_tab_t
Definition: ddpsolver.hh:69
Eigen::Matrix< precision, stateSize, 1 > stateVec_t
Definition: ddpsolver.hh:29
std::vector< commandVec_t > commandVecTab_t
Definition: ddpsolver.hh:68
Eigen::Matrix< precision, stateSize, commandSize > stateR_commandC_stateD_t[stateSize]
Definition: ddpsolver.hh:47
Eigen::Matrix< precision, 1, commandSize > commandVecTrans_t
Definition: ddpsolver.hh:39
std::vector< stateVec_t > stateVecTab_t
Definition: ddpsolver.hh:67
Eigen::Matrix< precision, commandSize, commandSize > commandMat_t
Definition: ddpsolver.hh:41
Eigen::Matrix< precision, stateSize, commandSize > stateR_commandC_t
Definition: ddpsolver.hh:45
void backwardLoop()
Definition: ddpsolver.hh:235
commandVec_t solveTrajectory()
Definition: ddpsolver.hh:209
DDPSolver::commandVec_t getLastCommand()
Definition: ddpsolver.hh:347
Eigen::Matrix< precision, commandSize, stateSize > commandR_stateC_stateD_t[stateSize]
Definition: ddpsolver.hh:55
Eigen::Matrix< precision, stateSize, commandSize > stateR_commandC_commandD_t[commandSize]
Definition: ddpsolver.hh:50
Eigen::Matrix< precision, 1, stateSize > stateVecTrans_t
Definition: ddpsolver.hh:31
Eigen::Matrix< precision, commandSize, 1 > commandVec_t
Definition: ddpsolver.hh:37
DDPSolver::traj getLastSolvedTrajectory()
Definition: ddpsolver.hh:340
void forwardLoop()
Definition: ddpsolver.hh:325
void initTrajectory()
Definition: ddpsolver.hh:227
void initSolver(stateVec_t &myxInit, stateVec_t &myxDes)
Definition: ddpsolver.hh:204
void FirstInitSolver(stateVec_t &myxInit, stateVec_t &myxDes, unsigned int &myT, double &mydt, unsigned int &myiterMax, double &mystopCrit)
Definition: ddpsolver.hh:175
Eigen::Matrix< precision, commandSize, stateSize > commandR_stateC_commandD_t[commandSize]
Definition: ddpsolver.hh:58
Eigen::Matrix< precision, stateSize, stateSize > stateR_stateC_commandD_t[commandSize]
Definition: ddpsolver.hh:61
bool isQuudefinitePositive(const commandMat_t &Quu_reg)
Definition: ddpsolver.hh:349
DynamicModel< precision, stateSize, commandSize > DynamicModel_t
Definition: ddpsolver.hh:71
CostFunction< precision, stateSize, commandSize > CostFunction_t
Definition: ddpsolver.hh:72
Eigen::Matrix< precision, commandSize, commandSize > commandR_commandC_stateD_t[stateSize]
Definition: ddpsolver.hh:64
DDPSolver(DynamicModel_t &myDynamicModel, CostFunction_t &myCostFunction, bool fullDDP=0, bool QPBox=0)
Definition: ddpsolver.hh:148
Definition: dynamicmodel.hh:7
unsigned int getStateNb()
Definition: dynamicmodel.hh:86
virtual commandR_stateC_t computeTensorContux(const stateVec_t &nextVx)=0
stateR_commandC_t & getfu()
Definition: dynamicmodel.hh:92
virtual stateVec_t computeNextState(double &dt, const stateVec_t &X, const commandVec_t &U)=0
commandVec_t & getLowerCommandBounds()
Definition: dynamicmodel.hh:88
virtual commandMat_t computeTensorContuu(const stateVec_t &nextVx)=0
virtual void computeModelDeriv(double &dt, const stateVec_t &X, const commandVec_t &U)=0
commandVec_t & getUpperCommandBounds()
Definition: dynamicmodel.hh:89
unsigned int getCommandNb()
Definition: dynamicmodel.hh:87
virtual stateMat_t computeTensorContxx(const stateVec_t &nextVx)=0
stateMat_t & getfx()
Definition: dynamicmodel.hh:90
Definition: ddpsolver.hh:75
commandVecTab_t uList
Definition: ddpsolver.hh:77
stateVecTab_t xList
Definition: ddpsolver.hh:76
unsigned int iter
Definition: ddpsolver.hh:78