10 #ifndef CROCODDYL_CORE_INTEGRATOR_RK_HPP_
11 #define CROCODDYL_CORE_INTEGRATOR_RK_HPP_
13 #include "crocoddyl/core/fwd.hpp"
14 #include "crocoddyl/core/integ-action-base.hpp"
18 enum RKType { two = 2, three = 3, four = 4 };
38 template <
typename _Scalar>
42 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
45 typedef _Scalar Scalar;
58 typedef typename MathBase::VectorXs VectorXs;
59 typedef typename MathBase::MatrixXs MatrixXs;
71 std::shared_ptr<DifferentialActionModelAbstract> model,
72 std::shared_ptr<ControlParametrizationModelAbstract> control,
73 const RKType rktype,
const Scalar time_step = Scalar(1e-3),
74 const bool with_cost_residual =
true);
88 std::shared_ptr<DifferentialActionModelAbstract> model,
89 const RKType rktype,
const Scalar time_step = Scalar(1e-3),
90 const bool with_cost_residual =
true);
100 virtual void calc(
const std::shared_ptr<ActionDataAbstract>& data,
101 const Eigen::Ref<const VectorXs>& x,
102 const Eigen::Ref<const VectorXs>& u)
override;
114 virtual void calc(
const std::shared_ptr<ActionDataAbstract>& data,
115 const Eigen::Ref<const VectorXs>& x)
override;
124 virtual void calcDiff(
const std::shared_ptr<ActionDataAbstract>& data,
125 const Eigen::Ref<const VectorXs>& x,
126 const Eigen::Ref<const VectorXs>& u)
override;
138 virtual void calcDiff(
const std::shared_ptr<ActionDataAbstract>& data,
139 const Eigen::Ref<const VectorXs>& x)
override;
146 virtual std::shared_ptr<ActionDataAbstract>
createData()
override;
157 template <
typename NewScalar>
164 const std::shared_ptr<ActionDataAbstract>& data)
override;
179 virtual void quasiStatic(
const std::shared_ptr<ActionDataAbstract>& data,
180 Eigen::Ref<VectorXs> u,
181 const Eigen::Ref<const VectorXs>& x,
182 const std::size_t maxiter = 100,
183 const Scalar tol = Scalar(1e-9))
override;
195 virtual void print(std::ostream& os)
const override;
213 void set_rk_type(
const RKType rktype);
216 std::vector<Scalar> rk_c_;
220 template <
typename _Scalar>
223 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
225 typedef _Scalar Scalar;
232 typedef typename MathBase::VectorXs VectorXs;
233 typedef typename MathBase::MatrixXs MatrixXs;
235 template <
template <
typename Scalar>
class Model>
238 integral(model->get_ni(), Scalar(0.)),
239 dx(model->get_state()->get_ndx()),
240 ki(model->get_ni(), VectorXs::Zero(model->get_state()->get_ndx())),
241 y(model->get_ni(), VectorXs::Zero(model->get_state()->get_nx())),
242 ws(model->get_ni(), VectorXs::Zero(model->get_control()->get_nw())),
243 dx_rk(model->get_ni(), VectorXs::Zero(model->get_state()->get_ndx())),
244 dki_dx(model->get_ni(), MatrixXs::Zero(model->get_state()->get_ndx(),
245 model->get_state()->get_ndx())),
247 MatrixXs::Zero(model->get_state()->get_ndx(), model->get_nu())),
248 dyi_dx(model->get_ni(), MatrixXs::Zero(model->get_state()->get_ndx(),
249 model->get_state()->get_ndx())),
251 MatrixXs::Zero(model->get_state()->get_ndx(), model->get_nu())),
252 dli_dx(model->get_ni(), VectorXs::Zero(model->get_state()->get_ndx())),
253 dli_du(model->get_ni(), VectorXs::Zero(model->get_nu())),
255 MatrixXs::Zero(model->get_state()->get_ndx(),
256 model->get_state()->get_ndx())),
258 MatrixXs::Zero(model->get_control()->get_nw(),
259 model->get_control()->get_nw())),
261 MatrixXs::Zero(model->get_nu(), model->get_nu())),
263 MatrixXs::Zero(model->get_state()->get_ndx(),
264 model->get_control()->get_nw())),
265 ddli_dxdu(model->get_ni(), MatrixXs::Zero(model->get_state()->get_ndx(),
269 MatrixXs::Zero(model->get_control()->get_nw(), model->get_nu())),
270 Luu_partialx(model->get_ni(),
271 MatrixXs::Zero(model->get_nu(), model->get_nu())),
272 Lxu_i(model->get_ni(),
273 MatrixXs::Zero(model->get_state()->get_ndx(), model->get_nu())),
274 Lxx_partialx(model->get_ni(),
275 MatrixXs::Zero(model->get_state()->get_ndx(),
276 model->get_state()->get_ndx())),
279 MatrixXs::Zero(model->get_state()->get_ndx(), model->get_nu())) {
282 for (std::size_t i = 0; i < model->get_ni(); ++i) {
283 differential.push_back(std::shared_ptr<DifferentialActionDataAbstract>(
284 model->get_differential()->createData()));
285 control.push_back(std::shared_ptr<ControlParametrizationDataAbstract>(
286 model->get_control()->createData()));
289 const std::size_t nv = model->get_state()->get_nv();
290 dyi_dx[0].diagonal().setOnes();
291 dki_dx[0].topRightCorner(nv, nv).diagonal().setOnes();
295 std::vector<std::shared_ptr<DifferentialActionDataAbstract> >
297 std::vector<std::shared_ptr<ControlParametrizationDataAbstract> >
299 std::vector<Scalar> integral;
301 std::vector<VectorXs>
ki;
302 std::vector<VectorXs>
304 std::vector<VectorXs>
ws;
305 std::vector<VectorXs> dx_rk;
307 std::vector<MatrixXs>
310 std::vector<MatrixXs>
314 std::vector<MatrixXs>
317 std::vector<MatrixXs>
321 std::vector<VectorXs>
324 std::vector<VectorXs>
328 std::vector<MatrixXs>
331 std::vector<MatrixXs>
338 std::vector<MatrixXs>
342 std::vector<MatrixXs>
346 std::vector<MatrixXs>
351 std::vector<MatrixXs> Luu_partialx;
352 std::vector<MatrixXs> Lxu_i;
353 std::vector<MatrixXs> Lxx_partialx;
354 std::vector<MatrixXs> Lxx_partialu;
373 #include "crocoddyl/core/integrator/rk.hxx"
Abstract class for action model.
std::size_t nh_
Number of equality constraints.
std::size_t ng_
Number of inequality constraints.
Abstract class for the control trajectory parametrization.
Abstract class for differential action model.
Abstract class for an integrated action model.
bool with_cost_residual_
Flag indicating whether a cost residual is used.
Scalar time_step_
Time step used for integration.
std::shared_ptr< StateAbstract > state_
< Dimension of the control
std::shared_ptr< ControlParametrizationModelAbstract > control_
Model of the control parametrization.
std::size_t nu_
< Dimension of the cost residual
std::shared_ptr< DifferentialActionModelAbstract > differential_
Differential action model that is integrated.
Scalar time_step2_
Square of the time step used for integration.
virtual void calc(const std::shared_ptr< ActionDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u) override
Integrate the differential action model using RK scheme.
virtual std::shared_ptr< ActionDataAbstract > createData() override
Create the RK integrator data.
virtual void calcDiff(const std::shared_ptr< ActionDataAbstract > &data, const Eigen::Ref< const VectorXs > &x) override
Compute the partial derivatives of the cost.
virtual bool checkData(const std::shared_ptr< ActionDataAbstract > &data) override
Checks that a specific data belongs to this model.
IntegratedActionModelRKTpl(std::shared_ptr< DifferentialActionModelAbstract > model, const RKType rktype, const Scalar time_step=Scalar(1e-3), const bool with_cost_residual=true)
Initialize the RK integrator.
virtual void quasiStatic(const std::shared_ptr< ActionDataAbstract > &data, Eigen::Ref< VectorXs > u, const Eigen::Ref< const VectorXs > &x, const std::size_t maxiter=100, const Scalar tol=Scalar(1e-9)) override
Computes the quasic static commands.
IntegratedActionModelRKTpl(std::shared_ptr< DifferentialActionModelAbstract > model, std::shared_ptr< ControlParametrizationModelAbstract > control, const RKType rktype, const Scalar time_step=Scalar(1e-3), const bool with_cost_residual=true)
Initialize the RK integrator.
virtual void calc(const std::shared_ptr< ActionDataAbstract > &data, const Eigen::Ref< const VectorXs > &x) override
Integrate the total cost value for nodes that depends only on the state using RK scheme.
virtual void calcDiff(const std::shared_ptr< ActionDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u) override
Compute the partial derivatives of the RK integrator.
std::size_t get_ni() const
Return the number of nodes of the integrator.
virtual void print(std::ostream &os) const override
Print relevant information of the RK integrator model.
IntegratedActionModelRKTpl< NewScalar > cast() const
Cast the RK integrated-action model to a different scalar type.
VectorXs xnext
evolution state
MatrixXs Fx
Jacobian of the dynamics w.r.t. the state .
MatrixXs Fu
Jacobian of the dynamics w.r.t. the control .
MatrixXs Luu
Hessian of the cost w.r.t. the control .
VectorXs Lx
Jacobian of the cost w.r.t. the state .
MatrixXs Lxx
Hessian of the cost w.r.t. the state .
VectorXs Lu
Jacobian of the cost w.r.t. the control .
std::vector< MatrixXs > ddli_ddx
std::vector< VectorXs > ki
List of RK terms related to system dynamics.
std::vector< MatrixXs > dki_du
std::vector< std::shared_ptr< DifferentialActionDataAbstract > > differential
List of differential model data.
std::vector< MatrixXs > dki_dx
std::vector< MatrixXs > ddli_ddu
std::vector< MatrixXs > ddli_dxdw
std::vector< MatrixXs > ddli_ddw
std::vector< MatrixXs > ddli_dwdu
std::vector< MatrixXs > dyi_du
std::vector< VectorXs > y
List of states where f is evaluated in the RK integration.
std::vector< VectorXs > dli_du
std::vector< std::shared_ptr< ControlParametrizationDataAbstract > > control
List of control parametrization data.
std::vector< MatrixXs > ddli_dxdu
std::vector< VectorXs > dli_dx
std::vector< MatrixXs > dyi_dx
std::vector< VectorXs > ws
Control inputs evaluated in the RK integration.