Crocoddyl
Loading...
Searching...
No Matches
task-second-order.hpp
1
2// BSD 3-Clause License
3//
4// Copyright (C) 2026, Heriot-Watt University
5// Copyright note valid unless otherwise stated in individual files.
6// All rights reserved.
8
9#ifndef CROCODDYL_CORE_RESIDUALS_TASK_SECOND_ORDER_HPP_
10#define CROCODDYL_CORE_RESIDUALS_TASK_SECOND_ORDER_HPP_
11
12#include "crocoddyl/core/fwd.hpp"
13#include "crocoddyl/core/guidance-base.hpp"
14#include "crocoddyl/core/residual-base.hpp"
15#include "crocoddyl/core/task-base.hpp"
16
17namespace crocoddyl {
18
39template <typename _Scalar>
41 : public ResidualModelAbstractTpl<_Scalar> {
42 public:
43 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
45
46 typedef _Scalar Scalar;
47 typedef MathBaseTpl<Scalar> MathBase;
50 typedef ResidualDataAbstractTpl<Scalar> ResidualDataAbstract;
51 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
52 typedef GuidanceModelAbstractTpl<Scalar> GuidanceModelAbstract;
53 typedef TaskModelAbstractTpl<Scalar> TaskModelAbstract;
54 typedef typename MathBase::VectorXs VectorXs;
55 typedef typename MathBase::MatrixXs MatrixXs;
56
79 std::shared_ptr<TaskModelAbstract> task,
80 std::shared_ptr<GuidanceModelAbstract> guidance, const MatrixXs& gain);
91 std::shared_ptr<TaskModelAbstract> task,
92 std::shared_ptr<GuidanceModelAbstract> guidance,
93 const VectorXs& diagonal_gain);
104 std::shared_ptr<TaskModelAbstract> task,
105 std::shared_ptr<GuidanceModelAbstract> guidance, const Scalar& gain);
106 virtual ~ResidualModelTaskSecondOrderTpl() = default;
107
116 virtual void calc(const std::shared_ptr<ResidualDataAbstract>& data,
117 const Eigen::Ref<const VectorXs>& x,
118 const Eigen::Ref<const VectorXs>& u) override;
119
129 virtual void calcDiff(const std::shared_ptr<ResidualDataAbstract>& data,
130 const Eigen::Ref<const VectorXs>& x,
131 const Eigen::Ref<const VectorXs>& u) override;
132
136 virtual std::shared_ptr<ResidualDataAbstract> createData(
137 DataCollectorAbstract* const data) override;
138
142 template <typename NewScalar>
144
145 const std::shared_ptr<TaskModelAbstract>& get_task() const;
146 const std::shared_ptr<GuidanceModelAbstract>& get_guidance() const;
147 const MatrixXs& get_gain() const;
148
149 void set_guidance(std::shared_ptr<GuidanceModelAbstract> guidance);
150 void set_gain(const MatrixXs& gain);
151
152 virtual void print(std::ostream& os) const override;
153
154 protected:
155 using Base::nr_;
156 using Base::nu_;
158 using Base::state_;
161
162 void checkDimensions() const;
163
164 std::shared_ptr<TaskModelAbstract> task_;
165 std::shared_ptr<GuidanceModelAbstract> guidance_;
166 MatrixXs gain_;
167};
168
176template <typename _Scalar>
178 : public ResidualDataAbstractTpl<_Scalar> {
179 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
180
181 typedef _Scalar Scalar;
182 typedef MathBaseTpl<Scalar> MathBase;
183 typedef ResidualDataAbstractTpl<Scalar> Base;
184 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
185 typedef GuidanceDataAbstractTpl<Scalar> GuidanceDataAbstract;
186 typedef TaskDataAbstractTpl<Scalar> TaskDataAbstract;
187 typedef typename MathBase::VectorXs VectorXs;
188 typedef typename MathBase::MatrixXs MatrixXs;
189
196 template <template <typename Scalar> class Model>
197 ResidualDataTaskSecondOrderTpl(Model<Scalar>* const model,
198 DataCollectorAbstract* const data)
199 : Base(model, data),
200 task(model->get_task()->createData(data)),
201 guidance(model->get_guidance()->createData()),
202 v_error(model->get_nr()),
203 v_error_x(model->get_nr(), model->get_state()->get_ndx()),
204 v_error_u(model->get_nr(), model->get_nu()) {
205 task->compute_acceleration = true;
206 v_error.setZero();
207 v_error_x.setZero();
208 v_error_u.setZero();
209 }
210
211 virtual ~ResidualDataTaskSecondOrderTpl() = default;
212
213 std::shared_ptr<TaskDataAbstract> task;
214 std::shared_ptr<GuidanceDataAbstract> guidance;
215 VectorXs v_error;
216 MatrixXs v_error_x;
217 MatrixXs v_error_u;
218
219 using Base::Arr_Ru;
220 using Base::Arr_Rx;
221 using Base::r;
222 using Base::Ru;
223 using Base::Rx;
224 using Base::shared;
225};
226
227} // namespace crocoddyl
228
229/* --- Details -------------------------------------------------------------- */
230#include "crocoddyl/core/residuals/task-second-order.hxx"
231
232#endif // CROCODDYL_CORE_RESIDUALS_TASK_SECOND_ORDER_HPP_
Differentiable mapping from a task error to a desired task rate.
std::shared_ptr< StateAbstract > state_
ResidualModelAbstractTpl(std::shared_ptr< StateAbstract > state, const std::size_t nr, const std::size_t nu, const bool q_dependent=true, const bool v_dependent=true, const bool u_dependent=true)
Initialize the residual model.
ResidualModelTaskSecondOrderTpl(std::shared_ptr< TaskModelAbstract > task, std::shared_ptr< GuidanceModelAbstract > guidance, const MatrixXs &gain)
Initialize the second-order task residual with a full gain.
virtual void calcDiff(const std::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u) override
Compute the residual Jacobians.
virtual std::shared_ptr< ResidualDataAbstract > createData(DataCollectorAbstract *const data) override
Allocate data for the residual.
ResidualModelTaskSecondOrderTpl(std::shared_ptr< TaskModelAbstract > task, std::shared_ptr< GuidanceModelAbstract > guidance, const Scalar &gain)
Initialize the second-order task residual with a scalar gain.
ResidualModelTaskSecondOrderTpl< NewScalar > cast() const
Cast the residual model to a different scalar type.
virtual void calc(const std::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u) override
Compute the second-order task residual.
virtual void print(std::ostream &os) const override
Print relevant information of the residual model.
ResidualModelTaskSecondOrderTpl(std::shared_ptr< TaskModelAbstract > task, std::shared_ptr< GuidanceModelAbstract > guidance, const VectorXs &diagonal_gain)
Initialize the second-order task residual with a diagonal gain.
Abstract task model for convergence residuals.
Definition task-base.hpp:47
Preallocated values and derivatives produced by a guidance model.
Data for the second-order task residual.
ResidualDataTaskSecondOrderTpl(Model< Scalar > *const model, DataCollectorAbstract *const data)
Construct the residual data.
Preallocated values and derivatives produced by a task model.