GCC Code Coverage Report


Directory: ./
File: unittest/factory/diff_action.cpp
Date: 2025-06-03 08:14:12
Exec Total Coverage
Lines: 0 520 0.0%
Functions: 0 8 0.0%
Branches: 0 1030 0.0%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2025, University of Edinburgh, CTU, INRIA,
5 // Heriot-Watt University, University of Pisa
6 // Copyright note valid unless otherwise stated in individual files.
7 // All rights reserved.
8 ///////////////////////////////////////////////////////////////////////////////
9
10 #include "diff_action.hpp"
11
12 #include "contact.hpp"
13 #include "cost.hpp"
14 #include "crocoddyl/core/actions/diff-lqr.hpp"
15 #include "crocoddyl/core/activations/quadratic-barrier.hpp"
16 #include "crocoddyl/core/activations/quadratic.hpp"
17 #include "crocoddyl/core/costs/residual.hpp"
18 #include "crocoddyl/core/residuals/joint-acceleration.hpp"
19 #include "crocoddyl/core/residuals/joint-effort.hpp"
20 #include "crocoddyl/multibody/actuations/floating-base.hpp"
21 #include "crocoddyl/multibody/actuations/full.hpp"
22 #include "crocoddyl/multibody/residuals/contact-force.hpp"
23 #include "crocoddyl/multibody/residuals/contact-friction-cone.hpp"
24 #include "crocoddyl/multibody/residuals/contact-wrench-cone.hpp"
25 #include "crocoddyl/multibody/residuals/frame-placement.hpp"
26 #include "crocoddyl/multibody/residuals/frame-translation.hpp"
27 #include "crocoddyl/multibody/states/multibody.hpp"
28
29 namespace crocoddyl {
30 namespace unittest {
31
32 const std::vector<DifferentialActionModelTypes::Type>
33 DifferentialActionModelTypes::all(DifferentialActionModelTypes::init_all());
34
35 ✗ std::ostream& operator<<(std::ostream& os,
36 DifferentialActionModelTypes::Type type) {
37 ✗ switch (type) {
38 ✗ case DifferentialActionModelTypes::DifferentialActionModelLQR:
39 ✗ os << "DifferentialActionModelLQR";
40 ✗ break;
41 ✗ case DifferentialActionModelTypes::DifferentialActionModelLQRDriftFree:
42 ✗ os << "DifferentialActionModelLQRDriftFree";
43 ✗ break;
44 ✗ case DifferentialActionModelTypes::DifferentialActionModelRandomLQR:
45 ✗ os << "DifferentialActionModelRandomLQR";
46 ✗ break;
47 ✗ case DifferentialActionModelTypes::
48 DifferentialActionModelFreeFwdDynamics_Hector:
49 ✗ os << "DifferentialActionModelFreeFwdDynamics_Hector";
50 ✗ break;
51 ✗ case DifferentialActionModelTypes::
52 DifferentialActionModelFreeFwdDynamics_TalosArm:
53 ✗ os << "DifferentialActionModelFreeFwdDynamics_TalosArm";
54 ✗ break;
55 ✗ case DifferentialActionModelTypes::
56 DifferentialActionModelFreeFwdDynamics_TalosArm_Squashed:
57 ✗ os << "DifferentialActionModelFreeFwdDynamics_TalosArm_Squashed";
58 ✗ break;
59 ✗ case DifferentialActionModelTypes::
60 DifferentialActionModelFreeInvDynamics_Hector:
61 ✗ os << "DifferentialActionModelFreeInvDynamics_Hector";
62 ✗ break;
63 ✗ case DifferentialActionModelTypes::
64 DifferentialActionModelFreeInvDynamics_TalosArm:
65 ✗ os << "DifferentialActionModelFreeInvDynamics_TalosArm";
66 ✗ break;
67 ✗ case DifferentialActionModelTypes::
68 DifferentialActionModelFreeInvDynamics_TalosArm_Squashed:
69 ✗ os << "DifferentialActionModelFreeInvDynamics_TalosArm_Squashed";
70 ✗ break;
71 ✗ case DifferentialActionModelTypes::
72 DifferentialActionModelContactFwdDynamics_TalosArm:
73 ✗ os << "DifferentialActionModelContactFwdDynamics_TalosArm";
74 ✗ break;
75 ✗ case DifferentialActionModelTypes::
76 DifferentialActionModelContact2DFwdDynamics_TalosArm:
77 ✗ os << "DifferentialActionModelContact2DFwdDynamics_TalosArm";
78 ✗ break;
79 ✗ case DifferentialActionModelTypes::
80 DifferentialActionModelContactFwdDynamics_HyQ:
81 ✗ os << "DifferentialActionModelContactFwdDynamics_HyQ";
82 ✗ break;
83 ✗ case DifferentialActionModelTypes::
84 DifferentialActionModelContactFwdDynamics_Talos:
85 ✗ os << "DifferentialActionModelContactFwdDynamics_Talos";
86 ✗ break;
87 ✗ case DifferentialActionModelTypes::
88 DifferentialActionModelContactFwdDynamicsWithFriction_TalosArm:
89 ✗ os << "DifferentialActionModelContactFwdDynamicsWithFriction_TalosArm";
90 ✗ break;
91 ✗ case DifferentialActionModelTypes::
92 DifferentialActionModelContact2DFwdDynamicsWithFriction_TalosArm:
93 ✗ os << "DifferentialActionModelContact2DFwdDynamicsWithFriction_TalosArm";
94 ✗ break;
95 ✗ case DifferentialActionModelTypes::
96 DifferentialActionModelContactFwdDynamicsWithFriction_HyQ:
97 ✗ os << "DifferentialActionModelContactFwdDynamicsWithFriction_HyQ";
98 ✗ break;
99 ✗ case DifferentialActionModelTypes::
100 DifferentialActionModelContactFwdDynamicsWithFriction_Talos:
101 ✗ os << "DifferentialActionModelContactFwdDynamicsWithFriction_Talos";
102 ✗ break;
103 ✗ case DifferentialActionModelTypes::
104 DifferentialActionModelContactInvDynamics_TalosArm:
105 ✗ os << "DifferentialActionModelContactInvDynamics_TalosArm";
106 ✗ break;
107 ✗ case DifferentialActionModelTypes::
108 DifferentialActionModelContactInvDynamics_HyQ:
109 ✗ os << "DifferentialActionModelContactInvDynamics_HyQ";
110 ✗ break;
111 ✗ case DifferentialActionModelTypes::
112 DifferentialActionModelContactInvDynamics_Talos:
113 ✗ os << "DifferentialActionModelContactInvDynamics_Talos";
114 ✗ break;
115 ✗ case DifferentialActionModelTypes::
116 DifferentialActionModelContactInvDynamicsWithFriction_TalosArm:
117 ✗ os << "DifferentialActionModelContactInvDynamicsWithFriction_TalosArm";
118 ✗ break;
119 ✗ case DifferentialActionModelTypes::
120 DifferentialActionModelContactInvDynamicsWithFriction_HyQ:
121 ✗ os << "DifferentialActionModelContactInvDynamicsWithFriction_HyQ";
122 ✗ break;
123 ✗ case DifferentialActionModelTypes::
124 DifferentialActionModelContactInvDynamicsWithFriction_Talos:
125 ✗ os << "DifferentialActionModelContactInvDynamicsWithFriction_Talos";
126 ✗ break;
127 ✗ case DifferentialActionModelTypes::NbDifferentialActionModelTypes:
128 ✗ os << "NbDifferentialActionModelTypes";
129 ✗ break;
130 ✗ default:
131 ✗ break;
132 }
133 ✗ return os;
134 }
135
136 ✗ DifferentialActionModelFactory::DifferentialActionModelFactory() {}
137 ✗ DifferentialActionModelFactory::~DifferentialActionModelFactory() {}
138
139 std::shared_ptr<crocoddyl::DifferentialActionModelAbstract>
140 ✗ DifferentialActionModelFactory::create(DifferentialActionModelTypes::Type type,
141 bool with_baumgarte) const {
142 ✗ std::shared_ptr<crocoddyl::DifferentialActionModelAbstract> action;
143 ✗ switch (type) {
144 ✗ case DifferentialActionModelTypes::DifferentialActionModelLQR:
145 ✗ action = std::make_shared<crocoddyl::DifferentialActionModelLQR>(40, 40,
146 ✗ false);
147 ✗ break;
148 ✗ case DifferentialActionModelTypes::DifferentialActionModelLQRDriftFree:
149 action =
150 ✗ std::make_shared<crocoddyl::DifferentialActionModelLQR>(40, 40, true);
151 ✗ break;
152 ✗ case DifferentialActionModelTypes::DifferentialActionModelRandomLQR:
153 ✗ action = std::make_shared<crocoddyl::DifferentialActionModelLQR>(
154 ✗ crocoddyl::DifferentialActionModelLQR::Random(40, 40));
155 ✗ break;
156 ✗ case DifferentialActionModelTypes::
157 DifferentialActionModelFreeFwdDynamics_Hector:
158 ✗ action = create_freeFwdDynamics(
159 StateModelTypes::StateMultibody_Hector,
160 ✗ ActuationModelTypes::ActuationModelFloatingBaseThrusters, false);
161 ✗ break;
162 ✗ case DifferentialActionModelTypes::
163 DifferentialActionModelFreeFwdDynamics_TalosArm:
164 ✗ action = create_freeFwdDynamics(StateModelTypes::StateMultibody_TalosArm,
165 ✗ ActuationModelTypes::ActuationModelFull);
166 ✗ break;
167 ✗ case DifferentialActionModelTypes::
168 DifferentialActionModelFreeFwdDynamics_TalosArm_Squashed:
169 ✗ action = create_freeFwdDynamics(
170 StateModelTypes::StateMultibody_TalosArm,
171 ✗ ActuationModelTypes::ActuationModelSquashingFull);
172 ✗ break;
173 ✗ case DifferentialActionModelTypes::
174 DifferentialActionModelFreeInvDynamics_Hector:
175 ✗ action = create_freeInvDynamics(
176 StateModelTypes::StateMultibody_Hector,
177 ✗ ActuationModelTypes::ActuationModelFloatingBaseThrusters);
178 ✗ break;
179 ✗ case DifferentialActionModelTypes::
180 DifferentialActionModelFreeInvDynamics_TalosArm:
181 ✗ action = create_freeInvDynamics(StateModelTypes::StateMultibody_TalosArm,
182 ✗ ActuationModelTypes::ActuationModelFull);
183 ✗ break;
184 ✗ case DifferentialActionModelTypes::
185 DifferentialActionModelFreeInvDynamics_TalosArm_Squashed:
186 ✗ action = create_freeInvDynamics(
187 StateModelTypes::StateMultibody_TalosArm,
188 ✗ ActuationModelTypes::ActuationModelSquashingFull);
189 ✗ break;
190 ✗ case DifferentialActionModelTypes::
191 DifferentialActionModelContactFwdDynamics_TalosArm:
192 ✗ action = create_contactFwdDynamics(
193 StateModelTypes::StateMultibody_TalosArm,
194 ✗ ActuationModelTypes::ActuationModelFull, false, with_baumgarte);
195 ✗ break;
196 ✗ case DifferentialActionModelTypes::
197 DifferentialActionModelContact2DFwdDynamics_TalosArm:
198 ✗ action = create_contactFwdDynamics(
199 StateModelTypes::StateMultibodyContact2D_TalosArm,
200 ✗ ActuationModelTypes::ActuationModelFull, false, with_baumgarte);
201 ✗ break;
202 ✗ case DifferentialActionModelTypes::
203 DifferentialActionModelContactFwdDynamics_HyQ:
204 ✗ action = create_contactFwdDynamics(
205 StateModelTypes::StateMultibody_HyQ,
206 ActuationModelTypes::ActuationModelFloatingBase, false,
207 ✗ with_baumgarte);
208 ✗ break;
209 ✗ case DifferentialActionModelTypes::
210 DifferentialActionModelContactFwdDynamics_Talos:
211 ✗ action = create_contactFwdDynamics(
212 StateModelTypes::StateMultibody_Talos,
213 ActuationModelTypes::ActuationModelFloatingBase, false,
214 ✗ with_baumgarte);
215 ✗ break;
216 ✗ case DifferentialActionModelTypes::
217 DifferentialActionModelContactFwdDynamicsWithFriction_TalosArm:
218 ✗ action = create_contactFwdDynamics(
219 StateModelTypes::StateMultibody_TalosArm,
220 ✗ ActuationModelTypes::ActuationModelFull, true, with_baumgarte);
221 ✗ break;
222 ✗ case DifferentialActionModelTypes::
223 DifferentialActionModelContact2DFwdDynamicsWithFriction_TalosArm:
224 ✗ action = create_contactFwdDynamics(
225 StateModelTypes::StateMultibodyContact2D_TalosArm,
226 ✗ ActuationModelTypes::ActuationModelFull, true, with_baumgarte);
227 ✗ break;
228 ✗ case DifferentialActionModelTypes::
229 DifferentialActionModelContactFwdDynamicsWithFriction_HyQ:
230 ✗ action = create_contactFwdDynamics(
231 StateModelTypes::StateMultibody_HyQ,
232 ActuationModelTypes::ActuationModelFloatingBase, true,
233 ✗ with_baumgarte);
234 ✗ break;
235 ✗ case DifferentialActionModelTypes::
236 DifferentialActionModelContactFwdDynamicsWithFriction_Talos:
237 ✗ action = create_contactFwdDynamics(
238 StateModelTypes::StateMultibody_Talos,
239 ActuationModelTypes::ActuationModelFloatingBase, true,
240 ✗ with_baumgarte);
241 ✗ break;
242 ✗ case DifferentialActionModelTypes::
243 DifferentialActionModelContactInvDynamics_TalosArm:
244 ✗ action = create_contactInvDynamics(
245 StateModelTypes::StateMultibody_TalosArm,
246 ActuationModelTypes::ActuationModelFloatingBase, false,
247 ✗ with_baumgarte);
248 ✗ break;
249 ✗ case DifferentialActionModelTypes::
250 DifferentialActionModelContactInvDynamics_HyQ:
251 ✗ action = create_contactInvDynamics(
252 StateModelTypes::StateMultibody_HyQ,
253 ActuationModelTypes::ActuationModelFloatingBase, false,
254 ✗ with_baumgarte);
255 ✗ break;
256 ✗ case DifferentialActionModelTypes::
257 DifferentialActionModelContactInvDynamics_Talos:
258 ✗ action = create_contactInvDynamics(
259 StateModelTypes::StateMultibody_Talos,
260 ActuationModelTypes::ActuationModelFloatingBase, false,
261 ✗ with_baumgarte);
262 ✗ break;
263 ✗ case DifferentialActionModelTypes::
264 DifferentialActionModelContactInvDynamicsWithFriction_TalosArm:
265 ✗ action = create_contactInvDynamics(
266 StateModelTypes::StateMultibody_TalosArm,
267 ✗ ActuationModelTypes::ActuationModelFull, true, with_baumgarte);
268 ✗ break;
269 ✗ case DifferentialActionModelTypes::
270 DifferentialActionModelContactInvDynamicsWithFriction_HyQ:
271 ✗ action = create_contactInvDynamics(
272 StateModelTypes::StateMultibody_HyQ,
273 ActuationModelTypes::ActuationModelFloatingBase, true,
274 ✗ with_baumgarte);
275 ✗ break;
276 ✗ case DifferentialActionModelTypes::
277 DifferentialActionModelContactInvDynamicsWithFriction_Talos:
278 ✗ action = create_contactInvDynamics(
279 StateModelTypes::StateMultibody_Talos,
280 ActuationModelTypes::ActuationModelFloatingBase, true,
281 ✗ with_baumgarte);
282 ✗ break;
283 ✗ default:
284 ✗ throw_pretty(__FILE__ ": Wrong DifferentialActionModelTypes::Type given");
285 break;
286 }
287 ✗ return action;
288 ✗ }
289
290 std::shared_ptr<crocoddyl::DifferentialActionModelFreeFwdDynamics>
291 ✗ DifferentialActionModelFactory::create_freeFwdDynamics(
292 StateModelTypes::Type state_type, ActuationModelTypes::Type actuation_type,
293 bool constraints) const {
294 ✗ std::shared_ptr<crocoddyl::DifferentialActionModelFreeFwdDynamics> action;
295 ✗ std::shared_ptr<crocoddyl::StateMultibody> state;
296 ✗ std::shared_ptr<crocoddyl::ActuationModelAbstract> actuation;
297 ✗ std::shared_ptr<crocoddyl::CostModelSum> cost;
298 ✗ std::shared_ptr<crocoddyl::ConstraintModelManager> constraint;
299 ✗ state = std::static_pointer_cast<crocoddyl::StateMultibody>(
300 ✗ StateModelFactory().create(state_type));
301 ✗ actuation = ActuationModelFactory().create(actuation_type, state_type);
302 ✗ const std::size_t nu = actuation->get_nu();
303 ✗ cost = std::make_shared<crocoddyl::CostModelSum>(state, nu);
304 ✗ cost->addCost("state",
305 ✗ CostModelFactory().create(
306 CostModelTypes::CostModelResidualState, state_type,
307 ActivationModelTypes::ActivationModelQuad, nu),
308 1.);
309 ✗ cost->addCost("control",
310 ✗ CostModelFactory().create(
311 CostModelTypes::CostModelResidualControl, state_type,
312 ActivationModelTypes::ActivationModelQuad, nu),
313 1.);
314 ✗ cost->addCost(
315 "joint_eff",
316 ✗ std::make_shared<crocoddyl::CostModelResidual>(
317 ✗ state, std::make_shared<crocoddyl::ResidualModelJointEffort>(
318 ✗ state, actuation, Eigen::VectorXd::Zero(nu), nu, true)),
319 1.);
320 ✗ cost->addCost(
321 "joint_acc",
322 ✗ std::make_shared<crocoddyl::CostModelResidual>(
323 ✗ state, std::make_shared<crocoddyl::ResidualModelJointAcceleration>(
324 state, nu)),
325 0.01);
326 ✗ cost->addCost("frame",
327 ✗ CostModelFactory().create(
328 CostModelTypes::CostModelResidualFramePlacement, state_type,
329 ActivationModelTypes::ActivationModelQuad, nu),
330 1.);
331 ✗ if (constraints) {
332 ✗ constraint = std::make_shared<crocoddyl::ConstraintModelManager>(state, nu);
333 ✗ constraint->addConstraint(
334 "frame",
335 ✗ ConstraintModelFactory().create(
336 ConstraintModelTypes::ConstraintModelResidualFramePlacementEquality,
337 state_type, nu));
338 ✗ constraint->addConstraint(
339 "frame-velocity",
340 ✗ ConstraintModelFactory().create(
341 ConstraintModelTypes::ConstraintModelResidualFrameVelocityEquality,
342 state_type, nu));
343 action =
344 ✗ std::make_shared<crocoddyl::DifferentialActionModelFreeFwdDynamics>(
345 ✗ state, actuation, cost, constraint);
346 } else {
347 action =
348 ✗ std::make_shared<crocoddyl::DifferentialActionModelFreeFwdDynamics>(
349 ✗ state, actuation, cost);
350 }
351 ✗ return action;
352 ✗ }
353
354 std::shared_ptr<crocoddyl::DifferentialActionModelFreeInvDynamics>
355 ✗ DifferentialActionModelFactory::create_freeInvDynamics(
356 StateModelTypes::Type state_type, ActuationModelTypes::Type actuation_type,
357 bool constraints) const {
358 ✗ std::shared_ptr<crocoddyl::DifferentialActionModelFreeInvDynamics> action;
359 ✗ std::shared_ptr<crocoddyl::StateMultibody> state;
360 ✗ std::shared_ptr<crocoddyl::ActuationModelAbstract> actuation;
361 ✗ std::shared_ptr<crocoddyl::CostModelSum> cost;
362 ✗ std::shared_ptr<crocoddyl::ConstraintModelManager> constraint;
363 ✗ state = std::static_pointer_cast<crocoddyl::StateMultibody>(
364 ✗ StateModelFactory().create(state_type));
365 ✗ actuation = ActuationModelFactory().create(actuation_type, state_type);
366 ✗ const std::size_t nu = state->get_nv();
367 ✗ cost = std::make_shared<crocoddyl::CostModelSum>(state, nu);
368 ✗ cost->addCost("state",
369 ✗ CostModelFactory().create(
370 CostModelTypes::CostModelResidualState, state_type,
371 ActivationModelTypes::ActivationModelQuad, nu),
372 1.);
373 ✗ cost->addCost("control",
374 ✗ CostModelFactory().create(
375 CostModelTypes::CostModelResidualControl, state_type,
376 ActivationModelTypes::ActivationModelQuad, nu),
377 1.);
378 ✗ cost->addCost("frame",
379 ✗ CostModelFactory().create(
380 CostModelTypes::CostModelResidualFramePlacement, state_type,
381 ActivationModelTypes::ActivationModelQuad, nu),
382 1.);
383 ✗ if (constraints) {
384 ✗ constraint = std::make_shared<crocoddyl::ConstraintModelManager>(state, nu);
385 ✗ constraint->addConstraint(
386 "frame",
387 ✗ ConstraintModelFactory().create(
388 ConstraintModelTypes::ConstraintModelResidualFramePlacementEquality,
389 state_type, nu));
390 ✗ constraint->addConstraint(
391 "frame-velocity",
392 ✗ ConstraintModelFactory().create(
393 ConstraintModelTypes::ConstraintModelResidualFrameVelocityEquality,
394 state_type, nu));
395 action =
396 ✗ std::make_shared<crocoddyl::DifferentialActionModelFreeInvDynamics>(
397 ✗ state, actuation, cost, constraint);
398 } else {
399 action =
400 ✗ std::make_shared<crocoddyl::DifferentialActionModelFreeInvDynamics>(
401 ✗ state, actuation, cost);
402 }
403 ✗ return action;
404 ✗ }
405
406 std::shared_ptr<crocoddyl::DifferentialActionModelContactFwdDynamics>
407 ✗ DifferentialActionModelFactory::create_contactFwdDynamics(
408 StateModelTypes::Type state_type, ActuationModelTypes::Type actuation_type,
409 bool with_friction, bool with_baumgarte) const {
410 ✗ std::shared_ptr<crocoddyl::DifferentialActionModelContactFwdDynamics> action;
411 ✗ std::shared_ptr<crocoddyl::StateMultibody> state;
412 ✗ std::shared_ptr<crocoddyl::ActuationModelAbstract> actuation;
413 ✗ std::shared_ptr<crocoddyl::ContactModelMultiple> contact;
414 ✗ std::shared_ptr<crocoddyl::CostModelSum> cost;
415 ✗ state = std::static_pointer_cast<crocoddyl::StateMultibody>(
416 ✗ StateModelFactory().create(state_type));
417 ✗ actuation = ActuationModelFactory().create(actuation_type, state_type);
418 ✗ const std::size_t nu = actuation->get_nu();
419 ✗ contact = std::make_shared<crocoddyl::ContactModelMultiple>(state, nu);
420 ✗ cost = std::make_shared<crocoddyl::CostModelSum>(state, nu);
421
422 ✗ Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
423 ✗ pinocchio::Force force = pinocchio::Force::Zero();
424 ✗ crocoddyl::FrictionCone friction_cone(R, 0.8, 4, false);
425 ✗ crocoddyl::WrenchCone wrench_cone(R, 0.8, Eigen::Vector2d(0.1, 0.1), 4,
426 ✗ false);
427 ✗ crocoddyl::ActivationBounds friction_bounds(friction_cone.get_lb(),
428 ✗ friction_cone.get_ub());
429 ✗ crocoddyl::ActivationBounds wrench_bounds(wrench_cone.get_lb(),
430 ✗ wrench_cone.get_ub());
431 std::shared_ptr<crocoddyl::ActivationModelAbstract> friction_activation =
432 ✗ std::make_shared<crocoddyl::ActivationModelQuadraticBarrier>(
433 ✗ friction_bounds);
434 std::shared_ptr<crocoddyl::ActivationModelAbstract> wrench_activation =
435 ✗ std::make_shared<crocoddyl::ActivationModelQuadraticBarrier>(
436 ✗ wrench_bounds);
437 ✗ Eigen::Vector2d gains = Eigen::Vector2d::Random();
438 ✗ if (!with_baumgarte) {
439 ✗ gains.setZero();
440 }
441
442 ✗ switch (state_type) {
443 ✗ case StateModelTypes::StateMultibody_TalosArm:
444 ✗ contact->addContact("lf", ContactModelFactory().create(
445 ContactModelTypes::ContactModel3D_LOCAL,
446 PinocchioModelTypes::TalosArm, gains,
447 "gripper_left_fingertip_1_link", nu));
448 ✗ if (with_friction) {
449 // friction cone
450 ✗ cost->addCost(
451 "lf_cone",
452 ✗ std::make_shared<crocoddyl::CostModelResidual>(
453 state, friction_activation,
454 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
455 state,
456 ✗ state->get_pinocchio()->getFrameId(
457 "gripper_left_fingertip_1_link"),
458 friction_cone, nu)),
459 0.1);
460 // force regularization
461 ✗ cost->addCost(
462 "lf_forceReg",
463 ✗ std::make_shared<crocoddyl::CostModelResidual>(
464 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
465 state,
466 ✗ state->get_pinocchio()->getFrameId(
467 "gripper_left_fingertip_1_link"),
468 ✗ force, 3, nu)),
469 0.1);
470 }
471 ✗ break;
472 ✗ case StateModelTypes::StateMultibodyContact2D_TalosArm:
473 ✗ contact->addContact("lf", ContactModelFactory().create(
474 ContactModelTypes::ContactModel2D,
475 PinocchioModelTypes::TalosArm, gains,
476 "gripper_left_fingertip_1_link", nu));
477 ✗ if (with_friction) {
478 // friction cone
479 ✗ cost->addCost(
480 "lf_cone",
481 ✗ std::make_shared<crocoddyl::CostModelResidual>(
482 state, friction_activation,
483 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
484 state,
485 ✗ state->get_pinocchio()->getFrameId(
486 "gripper_left_fingertip_1_link"),
487 friction_cone, nu)),
488 0.1);
489 // TODO: enable force regularization once it would support Contact2D
490 }
491 ✗ break;
492 ✗ case StateModelTypes::StateMultibody_HyQ:
493 ✗ contact->addContact(
494 ✗ "lf", ContactModelFactory().create(
495 ContactModelTypes::ContactModel3D_LOCAL,
496 ✗ PinocchioModelTypes::HyQ, 0.25 * gains, "lf_foot", nu));
497 ✗ contact->addContact(
498 ✗ "rf", ContactModelFactory().create(
499 ContactModelTypes::ContactModel3D_WORLD,
500 ✗ PinocchioModelTypes::HyQ, 0.25 * gains, "rf_foot", nu));
501 ✗ contact->addContact(
502 ✗ "lh", ContactModelFactory().create(
503 ContactModelTypes::ContactModel3D_LWA,
504 ✗ PinocchioModelTypes::HyQ, 0.25 * gains, "lh_foot", nu));
505 ✗ contact->addContact(
506 ✗ "rh", ContactModelFactory().create(
507 ContactModelTypes::ContactModel3D_LOCAL,
508 ✗ PinocchioModelTypes::HyQ, 0.25 * gains, "rh_foot", nu));
509 ✗ if (with_friction) {
510 // friction cone
511 ✗ cost->addCost(
512 "lf_cone",
513 ✗ std::make_shared<crocoddyl::CostModelResidual>(
514 state, friction_activation,
515 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
516 ✗ state, state->get_pinocchio()->getFrameId("lf_foot"),
517 friction_cone, nu)),
518 0.1);
519 ✗ cost->addCost(
520 "rf_cone",
521 ✗ std::make_shared<crocoddyl::CostModelResidual>(
522 state, friction_activation,
523 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
524 ✗ state, state->get_pinocchio()->getFrameId("rf_foot"),
525 friction_cone, nu)),
526 0.1);
527 ✗ cost->addCost(
528 "lh_cone",
529 ✗ std::make_shared<crocoddyl::CostModelResidual>(
530 state, friction_activation,
531 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
532 ✗ state, state->get_pinocchio()->getFrameId("lh_foot"),
533 friction_cone, nu)),
534 0.1);
535 ✗ cost->addCost(
536 "rh_cone",
537 ✗ std::make_shared<crocoddyl::CostModelResidual>(
538 state, friction_activation,
539 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
540 ✗ state, state->get_pinocchio()->getFrameId("rh_foot"),
541 friction_cone, nu)),
542 0.1);
543 // force regularization
544 ✗ cost->addCost(
545 "lf_forceReg",
546 ✗ std::make_shared<crocoddyl::CostModelResidual>(
547 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
548 ✗ state, state->get_pinocchio()->getFrameId("lf_foot"),
549 ✗ force, 3, nu)),
550 0.1);
551 ✗ cost->addCost(
552 "rf_forceReg",
553 ✗ std::make_shared<crocoddyl::CostModelResidual>(
554 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
555 ✗ state, state->get_pinocchio()->getFrameId("rf_foot"),
556 ✗ force, 3, nu)),
557 0.1);
558 ✗ cost->addCost(
559 "lh_forceReg",
560 ✗ std::make_shared<crocoddyl::CostModelResidual>(
561 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
562 ✗ state, state->get_pinocchio()->getFrameId("lh_foot"),
563 ✗ force, 3, nu)),
564 0.1);
565 ✗ cost->addCost(
566 "rh_forceReg",
567 ✗ std::make_shared<crocoddyl::CostModelResidual>(
568 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
569 ✗ state, state->get_pinocchio()->getFrameId("rh_foot"),
570 ✗ force, 3, nu)),
571 0.1);
572 }
573 ✗ break;
574 ✗ case StateModelTypes::StateMultibody_Talos:
575 ✗ contact->addContact(
576 ✗ "lf", ContactModelFactory().create(
577 ContactModelTypes::ContactModel6D_LOCAL,
578 PinocchioModelTypes::Talos, gains, "left_sole_link", nu));
579 ✗ contact->addContact(
580 ✗ "rf", ContactModelFactory().create(
581 ContactModelTypes::ContactModel6D_WORLD,
582 PinocchioModelTypes::Talos, gains, "right_sole_link", nu));
583 ✗ if (with_friction) {
584 // friction / wrench cone
585 ✗ cost->addCost(
586 "lf_cone",
587 ✗ std::make_shared<crocoddyl::CostModelResidual>(
588 state, friction_activation,
589 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
590 ✗ state, state->get_pinocchio()->getFrameId("left_sole_link"),
591 friction_cone, nu)),
592 0.01);
593 ✗ cost->addCost(
594 "rf_cone",
595 ✗ std::make_shared<crocoddyl::CostModelResidual>(
596 state, wrench_activation,
597 ✗ std::make_shared<crocoddyl::ResidualModelContactWrenchCone>(
598 state,
599 ✗ state->get_pinocchio()->getFrameId("right_sole_link"),
600 wrench_cone, nu)),
601 0.01);
602 // force regularization
603 ✗ cost->addCost(
604 "lf_forceReg",
605 ✗ std::make_shared<crocoddyl::CostModelResidual>(
606 state,
607 ✗ std::make_shared<crocoddyl::ResidualModelContactForce>(
608 ✗ state, state->get_pinocchio()->getFrameId("left_sole_link"),
609 ✗ force, 6, nu)),
610 0.01);
611 ✗ cost->addCost(
612 "rf_forceReg",
613 ✗ std::make_shared<crocoddyl::CostModelResidual>(
614 state,
615 ✗ std::make_shared<crocoddyl::ResidualModelContactForce>(
616 state,
617 ✗ state->get_pinocchio()->getFrameId("right_sole_link"),
618 ✗ force, 6, nu)),
619 0.01);
620 }
621 ✗ break;
622 ✗ default:
623 ✗ throw_pretty(__FILE__ ": Wrong StateModelTypes::Type given");
624 break;
625 }
626 ✗ cost->addCost("state",
627 ✗ CostModelFactory().create(
628 CostModelTypes::CostModelResidualState, state_type,
629 ActivationModelTypes::ActivationModelQuad, nu),
630 0.1);
631 ✗ cost->addCost("control",
632 ✗ CostModelFactory().create(
633 CostModelTypes::CostModelResidualControl, state_type,
634 ActivationModelTypes::ActivationModelQuad, nu),
635 0.1);
636 ✗ cost->addCost(
637 "joint_eff",
638 ✗ std::make_shared<crocoddyl::CostModelResidual>(
639 ✗ state, std::make_shared<crocoddyl::ResidualModelJointEffort>(
640 ✗ state, actuation, Eigen::VectorXd::Zero(nu), nu, true)),
641 0.1);
642 action =
643 ✗ std::make_shared<crocoddyl::DifferentialActionModelContactFwdDynamics>(
644 ✗ state, actuation, contact, cost, 0., true);
645 ✗ return action;
646 ✗ }
647
648 std::shared_ptr<crocoddyl::DifferentialActionModelContactInvDynamics>
649 ✗ DifferentialActionModelFactory::create_contactInvDynamics(
650 StateModelTypes::Type state_type, ActuationModelTypes::Type actuation_type,
651 bool with_friction, bool with_baumgarte) const {
652 ✗ std::shared_ptr<crocoddyl::DifferentialActionModelContactInvDynamics> action;
653 ✗ std::shared_ptr<crocoddyl::StateMultibody> state;
654 ✗ std::shared_ptr<crocoddyl::ActuationModelAbstract> actuation;
655 ✗ std::shared_ptr<crocoddyl::ContactModelMultiple> contact;
656 ✗ std::shared_ptr<crocoddyl::CostModelSum> cost;
657 ✗ state = std::static_pointer_cast<crocoddyl::StateMultibody>(
658 ✗ StateModelFactory().create(state_type));
659 ✗ actuation = ActuationModelFactory().create(actuation_type, state_type);
660 ✗ std::size_t nu = state->get_nv();
661
662 ✗ Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
663 ✗ pinocchio::Force force = pinocchio::Force::Zero();
664 ✗ crocoddyl::FrictionCone friction_cone(R, 0.8, 4, false);
665 ✗ crocoddyl::WrenchCone wrench_cone(R, 0.8, Eigen::Vector2d(0.1, 0.1), 4,
666 ✗ false);
667 ✗ crocoddyl::ActivationBounds friction_bounds(friction_cone.get_lb(),
668 ✗ friction_cone.get_ub());
669 ✗ crocoddyl::ActivationBounds wrench_bounds(wrench_cone.get_lb(),
670 ✗ wrench_cone.get_ub());
671 std::shared_ptr<crocoddyl::ActivationModelAbstract> friction_activation =
672 ✗ std::make_shared<crocoddyl::ActivationModelQuadraticBarrier>(
673 ✗ friction_bounds);
674 std::shared_ptr<crocoddyl::ActivationModelAbstract> wrench_activation =
675 ✗ std::make_shared<crocoddyl::ActivationModelQuadraticBarrier>(
676 ✗ wrench_bounds);
677 ✗ Eigen::Vector2d gains = Eigen::Vector2d::Random();
678 ✗ if (!with_baumgarte) {
679 ✗ gains.setZero();
680 }
681
682 ✗ switch (state_type) {
683 ✗ case StateModelTypes::StateMultibody_TalosArm:
684 ✗ nu += 3;
685 ✗ contact = std::make_shared<crocoddyl::ContactModelMultiple>(state, nu);
686 ✗ cost = std::make_shared<crocoddyl::CostModelSum>(state, nu);
687 ✗ contact->addContact("lf", ContactModelFactory().create(
688 ContactModelTypes::ContactModel3D_LOCAL,
689 PinocchioModelTypes::TalosArm, gains,
690 "gripper_left_fingertip_1_link", nu));
691 ✗ if (with_friction) {
692 // friction cone
693 ✗ cost->addCost(
694 "lf_cone",
695 ✗ std::make_shared<crocoddyl::CostModelResidual>(
696 state, friction_activation,
697 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
698 state,
699 ✗ state->get_pinocchio()->getFrameId(
700 "gripper_left_fingertip_1_link"),
701 ✗ friction_cone, nu, false)),
702 0.1);
703 // force regularization
704 ✗ cost->addCost(
705 "lf_forceReg",
706 ✗ std::make_shared<crocoddyl::CostModelResidual>(
707 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
708 state,
709 ✗ state->get_pinocchio()->getFrameId(
710 "gripper_left_fingertip_1_link"),
711 ✗ force, 3, nu, false)),
712 0.1);
713 }
714 ✗ break;
715 ✗ case StateModelTypes::StateMultibody_HyQ:
716 ✗ nu += 12; // it includes nc
717 ✗ contact = std::make_shared<crocoddyl::ContactModelMultiple>(state, nu);
718 ✗ cost = std::make_shared<crocoddyl::CostModelSum>(state, nu);
719 ✗ contact->addContact("lf",
720 ✗ ContactModelFactory().create(
721 ContactModelTypes::ContactModel3D_LOCAL,
722 PinocchioModelTypes::HyQ, gains, "lf_foot", nu));
723 ✗ contact->addContact("rf",
724 ✗ ContactModelFactory().create(
725 ContactModelTypes::ContactModel3D_WORLD,
726 PinocchioModelTypes::HyQ, gains, "rf_foot", nu));
727 ✗ contact->addContact("lh",
728 ✗ ContactModelFactory().create(
729 ContactModelTypes::ContactModel3D_LWA,
730 PinocchioModelTypes::HyQ, gains, "lh_foot", nu));
731 ✗ contact->addContact("rh",
732 ✗ ContactModelFactory().create(
733 ContactModelTypes::ContactModel3D_LOCAL,
734 PinocchioModelTypes::HyQ, gains, "rh_foot", nu));
735 ✗ if (with_friction) {
736 // friction cone
737 ✗ cost->addCost(
738 "lf_cone",
739 ✗ std::make_shared<crocoddyl::CostModelResidual>(
740 state, friction_activation,
741 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
742 ✗ state, state->get_pinocchio()->getFrameId("lf_foot"),
743 ✗ friction_cone, nu, false)),
744 0.1);
745 ✗ cost->addCost(
746 "rf_cone",
747 ✗ std::make_shared<crocoddyl::CostModelResidual>(
748 state, friction_activation,
749 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
750 ✗ state, state->get_pinocchio()->getFrameId("rf_foot"),
751 ✗ friction_cone, nu, false)),
752 0.1);
753 ✗ cost->addCost(
754 "lh_cone",
755 ✗ std::make_shared<crocoddyl::CostModelResidual>(
756 state, friction_activation,
757 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
758 ✗ state, state->get_pinocchio()->getFrameId("lh_foot"),
759 ✗ friction_cone, nu, false)),
760 0.1);
761 ✗ cost->addCost(
762 "rh_cone",
763 ✗ std::make_shared<crocoddyl::CostModelResidual>(
764 state, friction_activation,
765 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
766 ✗ state, state->get_pinocchio()->getFrameId("rh_foot"),
767 ✗ friction_cone, nu, false)),
768 0.1);
769 // force regularization
770 ✗ cost->addCost(
771 "lf_forceReg",
772 ✗ std::make_shared<crocoddyl::CostModelResidual>(
773 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
774 ✗ state, state->get_pinocchio()->getFrameId("lf_foot"),
775 ✗ force, 3, nu, false)),
776 0.1);
777 ✗ cost->addCost(
778 "rf_forceReg",
779 ✗ std::make_shared<crocoddyl::CostModelResidual>(
780 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
781 ✗ state, state->get_pinocchio()->getFrameId("rf_foot"),
782 ✗ force, 3, nu, false)),
783 0.1);
784 ✗ cost->addCost(
785 "lh_forceReg",
786 ✗ std::make_shared<crocoddyl::CostModelResidual>(
787 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
788 ✗ state, state->get_pinocchio()->getFrameId("lh_foot"),
789 ✗ force, 3, nu, false)),
790 0.1);
791 ✗ cost->addCost(
792 "rh_forceReg",
793 ✗ std::make_shared<crocoddyl::CostModelResidual>(
794 ✗ state, std::make_shared<crocoddyl::ResidualModelContactForce>(
795 ✗ state, state->get_pinocchio()->getFrameId("rh_foot"),
796 ✗ force, 3, nu, false)),
797 0.1);
798 }
799 ✗ break;
800 ✗ case StateModelTypes::StateMultibody_Talos:
801 ✗ nu += 12; // it includes nc
802 ✗ contact = std::make_shared<crocoddyl::ContactModelMultiple>(state, nu);
803 ✗ cost = std::make_shared<crocoddyl::CostModelSum>(state, nu);
804 ✗ contact->addContact(
805 ✗ "lf", ContactModelFactory().create(
806 ContactModelTypes::ContactModel6D_LOCAL,
807 PinocchioModelTypes::Talos, gains, "left_sole_link", nu));
808 ✗ contact->addContact(
809 ✗ "rf", ContactModelFactory().create(
810 ContactModelTypes::ContactModel6D_WORLD,
811 PinocchioModelTypes::Talos, gains, "right_sole_link", nu));
812 ✗ if (with_friction) {
813 // friction / wrench cone
814 ✗ cost->addCost(
815 "lf_cone",
816 ✗ std::make_shared<crocoddyl::CostModelResidual>(
817 state, friction_activation,
818 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
819 ✗ state, state->get_pinocchio()->getFrameId("left_sole_link"),
820 ✗ friction_cone, nu, false)),
821 0.01);
822 ✗ cost->addCost(
823 "rf_cone",
824 ✗ std::make_shared<crocoddyl::CostModelResidual>(
825 state, wrench_activation,
826 ✗ std::make_shared<crocoddyl::ResidualModelContactWrenchCone>(
827 state,
828 ✗ state->get_pinocchio()->getFrameId("right_sole_link"),
829 ✗ wrench_cone, nu, false)),
830 0.01);
831 // force regularization
832 ✗ cost->addCost(
833 "lf_forceReg",
834 ✗ std::make_shared<crocoddyl::CostModelResidual>(
835 state,
836 ✗ std::make_shared<crocoddyl::ResidualModelContactForce>(
837 ✗ state, state->get_pinocchio()->getFrameId("left_sole_link"),
838 ✗ force, 6, nu, false)),
839 0.01);
840 ✗ cost->addCost(
841 "rf_forceReg",
842 ✗ std::make_shared<crocoddyl::CostModelResidual>(
843 state,
844 ✗ std::make_shared<crocoddyl::ResidualModelContactForce>(
845 state,
846 ✗ state->get_pinocchio()->getFrameId("right_sole_link"),
847 ✗ force, 6, nu, false)),
848 0.01);
849 }
850 ✗ break;
851 ✗ default:
852 ✗ throw_pretty(__FILE__ ": Wrong StateModelTypes::Type given");
853 break;
854 }
855 ✗ cost->addCost("state",
856 ✗ CostModelFactory().create(
857 CostModelTypes::CostModelResidualState, state_type,
858 ActivationModelTypes::ActivationModelQuad, nu),
859 0.1);
860 ✗ cost->addCost("control",
861 ✗ CostModelFactory().create(
862 CostModelTypes::CostModelResidualControl, state_type,
863 ActivationModelTypes::ActivationModelQuad, nu),
864 0.1);
865 action =
866 ✗ std::make_shared<crocoddyl::DifferentialActionModelContactInvDynamics>(
867 ✗ state, actuation, contact, cost);
868 ✗ return action;
869 ✗ }
870
871 } // namespace unittest
872 } // namespace crocoddyl
873