GCC Code Coverage Report


Directory: ./
File: unittest/factory/contact_constraint.cpp
Date: 2025-06-03 08:14:12
Exec Total Coverage
Lines: 0 135 0.0%
Functions: 0 4 0.0%
Branches: 0 250 0.0%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2021-2023, University of Edinburgh, Heriot-Watt University
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
7 ///////////////////////////////////////////////////////////////////////////////
8
9 #include "contact_constraint.hpp"
10
11 #include "contact.hpp"
12 #include "cost.hpp"
13 #include "crocoddyl/core/constraints/residual.hpp"
14 #include "crocoddyl/multibody/actions/contact-fwddyn.hpp"
15 #include "crocoddyl/multibody/residuals/contact-control-gravity.hpp"
16 #include "crocoddyl/multibody/residuals/contact-cop-position.hpp"
17 #include "crocoddyl/multibody/residuals/contact-force.hpp"
18 #include "crocoddyl/multibody/residuals/contact-friction-cone.hpp"
19 #include "crocoddyl/multibody/residuals/contact-wrench-cone.hpp"
20
21 namespace crocoddyl {
22 namespace unittest {
23
24 const std::vector<ContactConstraintModelTypes::Type>
25 ContactConstraintModelTypes::all(ContactConstraintModelTypes::init_all());
26
27 ✗ std::ostream &operator<<(std::ostream &os,
28 ContactConstraintModelTypes::Type type) {
29 ✗ switch (type) {
30 ✗ case ContactConstraintModelTypes::
31 ConstraintModelResidualContactForceEquality:
32 ✗ os << "ConstraintModelResidualContactForceEquality";
33 ✗ break;
34 ✗ case ContactConstraintModelTypes::
35 ConstraintModelResidualContactCoPPositionInequality:
36 ✗ os << "ConstraintModelResidualContactCoPPositionInequality";
37 ✗ break;
38 ✗ case ContactConstraintModelTypes::
39 ConstraintModelResidualContactFrictionConeInequality:
40 ✗ os << "ConstraintModelResidualContactFrictionConeInequality";
41 ✗ break;
42 ✗ case ContactConstraintModelTypes::
43 ConstraintModelResidualContactWrenchConeInequality:
44 ✗ os << "ConstraintModelResidualContactWrenchConeInequality";
45 ✗ break;
46 ✗ case ContactConstraintModelTypes::
47 ConstraintModelResidualContactControlGravInequality:
48 ✗ os << "ConstraintModelResidualContactControlGravInequality";
49 ✗ break;
50 ✗ case ContactConstraintModelTypes::NbContactConstraintModelTypes:
51 ✗ os << "NbContactConstraintModelTypes";
52 ✗ break;
53 ✗ default:
54 ✗ break;
55 }
56 ✗ return os;
57 }
58
59 ✗ ContactConstraintModelFactory::ContactConstraintModelFactory() {}
60 ✗ ContactConstraintModelFactory::~ContactConstraintModelFactory() {}
61
62 std::shared_ptr<crocoddyl::DifferentialActionModelAbstract>
63 ✗ ContactConstraintModelFactory::create(
64 ContactConstraintModelTypes::Type constraint_type,
65 PinocchioModelTypes::Type model_type,
66 ActuationModelTypes::Type actuation_type) const {
67 // Identify the state type given the model type
68 StateModelTypes::Type state_type;
69 ✗ PinocchioModelFactory model_factory(model_type);
70 ✗ switch (model_type) {
71 ✗ case PinocchioModelTypes::Talos:
72 ✗ state_type = StateModelTypes::StateMultibody_Talos;
73 ✗ break;
74 ✗ case PinocchioModelTypes::RandomHumanoid:
75 ✗ state_type = StateModelTypes::StateMultibody_RandomHumanoid;
76 ✗ break;
77 ✗ case PinocchioModelTypes::HyQ:
78 ✗ state_type = StateModelTypes::StateMultibody_HyQ;
79 ✗ break;
80 ✗ default:
81 ✗ throw_pretty(__FILE__ ": Wrong PinocchioModelTypes::Type given");
82 break;
83 }
84
85 // Create contact contact diff-action model with standard cost functions
86 ✗ std::shared_ptr<crocoddyl::DifferentialActionModelContactFwdDynamics> action;
87 ✗ std::shared_ptr<crocoddyl::StateMultibody> state;
88 ✗ std::shared_ptr<crocoddyl::ActuationModelAbstract> actuation;
89 ✗ std::shared_ptr<crocoddyl::ContactModelMultiple> contact;
90 ✗ std::shared_ptr<crocoddyl::CostModelSum> cost;
91 ✗ std::shared_ptr<crocoddyl::ConstraintModelManager> constraint;
92 ✗ state = std::static_pointer_cast<crocoddyl::StateMultibody>(
93 ✗ StateModelFactory().create(state_type));
94 ✗ actuation = ActuationModelFactory().create(actuation_type, state_type);
95 ✗ contact = std::make_shared<crocoddyl::ContactModelMultiple>(
96 ✗ state, actuation->get_nu());
97 ✗ cost = std::make_shared<crocoddyl::CostModelSum>(state, actuation->get_nu());
98 ✗ constraint = std::make_shared<crocoddyl::ConstraintModelManager>(
99 ✗ state, actuation->get_nu());
100 ✗ std::vector<std::size_t> frame_ids = model_factory.get_frame_ids();
101 ✗ std::vector<std::string> frame_names = model_factory.get_frame_names();
102 // Define the contact model
103 ✗ switch (state_type) {
104 ✗ case StateModelTypes::StateMultibody_Talos:
105 case StateModelTypes::StateMultibody_RandomHumanoid:
106 ✗ for (std::size_t i = 0; i < frame_names.size(); ++i) {
107 ✗ contact->addContact(frame_names[i],
108 ✗ ContactModelFactory().create(
109 ContactModelTypes::ContactModel6D_LOCAL,
110 ✗ model_type, Eigen::Vector2d::Random(),
111 ✗ frame_names[i], actuation->get_nu()));
112 }
113 ✗ break;
114 ✗ case StateModelTypes::StateMultibody_HyQ:
115 ✗ for (std::size_t i = 0; i < frame_names.size(); ++i) {
116 ✗ contact->addContact(frame_names[i],
117 ✗ ContactModelFactory().create(
118 ContactModelTypes::ContactModel3D_LOCAL,
119 ✗ model_type, Eigen::Vector2d::Random(),
120 ✗ frame_names[i], actuation->get_nu()));
121 }
122 ✗ break;
123 ✗ default:
124 ✗ throw_pretty(__FILE__ ": Wrong StateModelTypes::Type given");
125 break;
126 }
127 // Define standard cost functions
128 ✗ cost->addCost(
129 "state",
130 ✗ CostModelFactory().create(
131 CostModelTypes::CostModelResidualState, state_type,
132 ActivationModelTypes::ActivationModelQuad, actuation->get_nu()),
133 0.1);
134 ✗ cost->addCost(
135 "control",
136 ✗ CostModelFactory().create(
137 CostModelTypes::CostModelResidualControl, state_type,
138 ActivationModelTypes::ActivationModelQuad, actuation->get_nu()),
139 0.1);
140
141 // Define the constraint function
142 ✗ Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
143 ✗ crocoddyl::FrictionCone friction_cone(R, 1.);
144 ✗ crocoddyl::WrenchCone wrench_cone(R, 1., Eigen::Vector2d(0.1, 0.1));
145 ✗ crocoddyl::CoPSupport cop_support(R, Eigen::Vector2d(0.1, 0.1));
146 ✗ Eigen::VectorXd lb, ub;
147 ✗ switch (constraint_type) {
148 ✗ case ContactConstraintModelTypes::
149 ConstraintModelResidualContactForceEquality:
150 ✗ for (std::size_t i = 0; i < frame_ids.size(); ++i) {
151 ✗ constraint->addConstraint(
152 ✗ "constraint_" + std::to_string(i),
153 ✗ std::make_shared<crocoddyl::ConstraintModelResidual>(
154 state,
155 ✗ std::make_shared<crocoddyl::ResidualModelContactForce>(
156 ✗ state, frame_ids[i], pinocchio::Force::Random(),
157 ✗ model_factory.get_contact_nc(), actuation->get_nu())));
158 }
159 ✗ break;
160 ✗ case ContactConstraintModelTypes::
161 ConstraintModelResidualContactCoPPositionInequality:
162 ✗ lb = cop_support.get_lb();
163 ✗ ub = cop_support.get_ub();
164 ✗ for (std::size_t i = 0; i < frame_ids.size(); ++i) {
165 ✗ constraint->addConstraint(
166 ✗ "constraint_" + std::to_string(i),
167 ✗ std::make_shared<crocoddyl::ConstraintModelResidual>(
168 state,
169 ✗ std::make_shared<crocoddyl::ResidualModelContactCoPPosition>(
170 ✗ state, frame_ids[i], cop_support, actuation->get_nu()),
171 lb, ub));
172 }
173 ✗ break;
174 ✗ case ContactConstraintModelTypes::
175 ConstraintModelResidualContactFrictionConeInequality:
176 ✗ lb = friction_cone.get_lb();
177 ✗ ub = friction_cone.get_ub();
178 ✗ for (std::size_t i = 0; i < frame_ids.size(); ++i) {
179 ✗ constraint->addConstraint(
180 ✗ "constraint_" + std::to_string(i),
181 ✗ std::make_shared<crocoddyl::ConstraintModelResidual>(
182 state,
183 ✗ std::make_shared<crocoddyl::ResidualModelContactFrictionCone>(
184 ✗ state, frame_ids[i], friction_cone, actuation->get_nu()),
185 lb, ub),
186 true);
187 }
188 ✗ break;
189 ✗ case ContactConstraintModelTypes::
190 ConstraintModelResidualContactWrenchConeInequality:
191 ✗ lb = wrench_cone.get_lb();
192 ✗ ub = wrench_cone.get_ub();
193 ✗ for (std::size_t i = 0; i < frame_ids.size(); ++i) {
194 ✗ constraint->addConstraint(
195 ✗ "constraint_" + std::to_string(i),
196 ✗ std::make_shared<crocoddyl::ConstraintModelResidual>(
197 state,
198 ✗ std::make_shared<crocoddyl::ResidualModelContactWrenchCone>(
199 ✗ state, frame_ids[i], wrench_cone, actuation->get_nu()),
200 lb, ub),
201 true);
202 }
203 ✗ break;
204 ✗ case ContactConstraintModelTypes::
205 ConstraintModelResidualContactControlGravInequality:
206 ✗ lb = Eigen::VectorXd::Zero(state->get_nv());
207 ✗ ub = Eigen::VectorXd::Random(state->get_nv()).cwiseAbs();
208 ✗ constraint->addConstraint(
209 "constraint_0",
210 ✗ std::make_shared<crocoddyl::ConstraintModelResidual>(
211 state,
212 ✗ std::make_shared<crocoddyl::ResidualModelContactControlGrav>(
213 ✗ state, actuation->get_nu()),
214 lb, ub));
215 ✗ break;
216 ✗ default:
217 ✗ throw_pretty(__FILE__ ": Wrong ContactConstraintModelTypes::Type given");
218 break;
219 }
220
221 action =
222 ✗ std::make_shared<crocoddyl::DifferentialActionModelContactFwdDynamics>(
223 ✗ state, actuation, contact, cost, constraint, 0., true);
224 ✗ return action;
225 ✗ }
226
227 } // namespace unittest
228 } // namespace crocoddyl
229