10 #ifndef CROCODDYL_CORE_INTEGRATOR_RK4_HPP_
11 #define CROCODDYL_CORE_INTEGRATOR_RK4_HPP_
13 #include "crocoddyl/core/fwd.hpp"
14 #include "crocoddyl/core/integ-action-base.hpp"
15 #include "crocoddyl/core/utils/deprecate.hpp"
36 template <
typename _Scalar>
37 class IntegratedActionModelRK4Tpl
38 :
public IntegratedActionModelAbstractTpl<_Scalar> {
40 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
42 typedef _Scalar Scalar;
43 typedef MathBaseTpl<Scalar> MathBase;
44 typedef IntegratedActionModelAbstractTpl<Scalar> Base;
45 typedef IntegratedActionDataRK4Tpl<Scalar> Data;
46 typedef ActionDataAbstractTpl<Scalar> ActionDataAbstract;
47 typedef DifferentialActionModelAbstractTpl<Scalar>
48 DifferentialActionModelAbstract;
49 typedef ControlParametrizationModelAbstractTpl<Scalar>
50 ControlParametrizationModelAbstract;
51 typedef typename MathBase::VectorXs VectorXs;
52 typedef typename MathBase::MatrixXs MatrixXs;
63 IntegratedActionModelRK4Tpl(
64 boost::shared_ptr<DifferentialActionModelAbstract> model,
65 boost::shared_ptr<ControlParametrizationModelAbstract> control,
66 const Scalar time_step = Scalar(1e-3),
67 const bool with_cost_residual =
true);)
80 IntegratedActionModelRK4Tpl(
81 boost::shared_ptr<DifferentialActionModelAbstract> model,
82 const Scalar time_step = Scalar(1e-3),
83 const bool with_cost_residual =
true);)
84 virtual ~IntegratedActionModelRK4Tpl();
93 virtual void calc(
const boost::shared_ptr<ActionDataAbstract>& data,
94 const Eigen::Ref<const VectorXs>& x,
95 const Eigen::Ref<const VectorXs>& u);
107 virtual void calc(
const boost::shared_ptr<ActionDataAbstract>& data,
108 const Eigen::Ref<const VectorXs>& x);
117 virtual void calcDiff(
const boost::shared_ptr<ActionDataAbstract>& data,
118 const Eigen::Ref<const VectorXs>& x,
119 const Eigen::Ref<const VectorXs>& u);
131 virtual void calcDiff(
const boost::shared_ptr<ActionDataAbstract>& data,
132 const Eigen::Ref<const VectorXs>& x);
139 virtual boost::shared_ptr<ActionDataAbstract>
createData();
144 virtual bool checkData(
const boost::shared_ptr<ActionDataAbstract>& data);
159 virtual void quasiStatic(
const boost::shared_ptr<ActionDataAbstract>& data,
160 Eigen::Ref<VectorXs> u,
161 const Eigen::Ref<const VectorXs>& x,
162 const std::size_t maxiter = 100,
163 const Scalar tol = Scalar(1e-9));
170 virtual void print(std::ostream& os)
const;
185 std::array<Scalar, 4> rk4_c_;
188 template <
typename _Scalar>
189 struct IntegratedActionDataRK4Tpl
190 :
public IntegratedActionDataAbstractTpl<_Scalar> {
191 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
193 typedef _Scalar Scalar;
194 typedef MathBaseTpl<Scalar> MathBase;
195 typedef IntegratedActionDataAbstractTpl<Scalar> Base;
196 typedef DifferentialActionDataAbstractTpl<Scalar>
197 DifferentialActionDataAbstract;
198 typedef ControlParametrizationDataAbstractTpl<Scalar>
199 ControlParametrizationDataAbstract;
200 typedef typename MathBase::VectorXs VectorXs;
201 typedef typename MathBase::MatrixXs MatrixXs;
203 template <
template <
typename Scalar>
class Model>
204 explicit IntegratedActionDataRK4Tpl(Model<Scalar>*
const model)
206 integral(4, Scalar(0.)),
207 dx(model->get_state()->get_ndx()),
208 ki(4, VectorXs::Zero(model->get_state()->get_ndx())),
209 y(4, VectorXs::Zero(model->get_state()->get_nx())),
210 ws(4, VectorXs::Zero(model->get_control()->get_nw())),
211 dx_rk4(4, VectorXs::Zero(model->get_state()->get_ndx())),
212 dki_dx(4, MatrixXs::Zero(model->get_state()->get_ndx(),
213 model->get_state()->get_ndx())),
215 MatrixXs::Zero(model->get_state()->get_ndx(), model->get_nu())),
216 dyi_dx(4, MatrixXs::Zero(model->get_state()->get_ndx(),
217 model->get_state()->get_ndx())),
219 MatrixXs::Zero(model->get_state()->get_ndx(), model->get_nu())),
220 dli_dx(4, VectorXs::Zero(model->get_state()->get_ndx())),
221 dli_du(4, VectorXs::Zero(model->get_nu())),
222 ddli_ddx(4, MatrixXs::Zero(model->get_state()->get_ndx(),
223 model->get_state()->get_ndx())),
224 ddli_ddw(4, MatrixXs::Zero(model->get_control()->get_nw(),
225 model->get_control()->get_nw())),
226 ddli_ddu(4, MatrixXs::Zero(model->get_nu(), model->get_nu())),
227 ddli_dxdw(4, MatrixXs::Zero(model->get_state()->get_ndx(),
228 model->get_control()->get_nw())),
230 4, MatrixXs::Zero(model->get_state()->get_ndx(), model->get_nu())),
232 4, MatrixXs::Zero(model->get_control()->get_nw(), model->get_nu())),
233 Luu_partialx(4, MatrixXs::Zero(model->get_nu(), model->get_nu())),
235 MatrixXs::Zero(model->get_state()->get_ndx(), model->get_nu())),
236 Lxx_partialx(4, MatrixXs::Zero(model->get_state()->get_ndx(),
237 model->get_state()->get_ndx())),
239 4, MatrixXs::Zero(model->get_state()->get_ndx(), model->get_nu())) {
242 for (std::size_t i = 0; i < 4; ++i) {
243 differential.push_back(boost::shared_ptr<DifferentialActionDataAbstract>(
244 model->get_differential()->createData()));
245 control.push_back(boost::shared_ptr<ControlParametrizationDataAbstract>(
246 model->get_control()->createData()));
249 const std::size_t nv = model->get_state()->get_nv();
250 dyi_dx[0].diagonal().setOnes();
251 dki_dx[0].topRightCorner(nv, nv).diagonal().setOnes();
253 virtual ~IntegratedActionDataRK4Tpl() {}
255 std::vector<boost::shared_ptr<DifferentialActionDataAbstract> >
257 std::vector<boost::shared_ptr<ControlParametrizationDataAbstract> >
259 std::vector<Scalar> integral;
261 std::vector<VectorXs>
ki;
262 std::vector<VectorXs>
264 std::vector<VectorXs>
266 std::vector<VectorXs> dx_rk4;
268 std::vector<MatrixXs>
270 std::vector<MatrixXs>
275 std::vector<MatrixXs>
277 std::vector<MatrixXs>
282 std::vector<VectorXs>
284 std::vector<VectorXs>
289 std::vector<MatrixXs>
291 std::vector<MatrixXs>
297 std::vector<MatrixXs>
301 std::vector<MatrixXs>
305 std::vector<MatrixXs>
312 std::vector<MatrixXs> Luu_partialx;
313 std::vector<MatrixXs> Lxu_i;
314 std::vector<MatrixXs> Lxx_partialx;
315 std::vector<MatrixXs> Lxx_partialu;
334 #include "crocoddyl/core/integrator/rk4.hxx"
336 #endif // CROCODDYL_CORE_INTEGRATOR_RK4_HPP_