GCC Code Coverage Report | |||||||||||||||||||||
|
|||||||||||||||||||||
Line | Branch | Exec | Source |
1 |
/////////////////////////////////////////////////////////////////////////////// |
||
2 |
// BSD 3-Clause License |
||
3 |
// |
||
4 |
// Copyright (C) 2019-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.hpp" |
||
10 |
|||
11 |
#include "crocoddyl/core/utils/exception.hpp" |
||
12 |
#include "crocoddyl/multibody/contacts/contact-1d.hpp" |
||
13 |
#include "crocoddyl/multibody/contacts/contact-2d.hpp" |
||
14 |
#include "crocoddyl/multibody/contacts/contact-3d.hpp" |
||
15 |
#include "crocoddyl/multibody/contacts/contact-6d.hpp" |
||
16 |
|||
17 |
namespace crocoddyl { |
||
18 |
namespace unittest { |
||
19 |
|||
20 |
const std::vector<ContactModelTypes::Type> ContactModelTypes::all( |
||
21 |
ContactModelTypes::init_all()); |
||
22 |
|||
23 |
50 |
std::ostream& operator<<(std::ostream& os, |
|
24 |
const ContactModelTypes::Type& type) { |
||
25 |
✓✓✓✓ ✓✓✓✓ ✓✓✗✗ |
50 |
switch (type) { |
26 |
5 |
case ContactModelTypes::ContactModel1D_LOCAL: |
|
27 |
5 |
os << "ContactModel1D_LOCAL"; |
|
28 |
5 |
break; |
|
29 |
5 |
case ContactModelTypes::ContactModel1D_WORLD: |
|
30 |
5 |
os << "ContactModel1D_WORLD"; |
|
31 |
5 |
break; |
|
32 |
5 |
case ContactModelTypes::ContactModel1D_LWA: |
|
33 |
5 |
os << "ContactModel1D_LWA"; |
|
34 |
5 |
break; |
|
35 |
5 |
case ContactModelTypes::ContactModel2D: |
|
36 |
5 |
os << "ContactModel2D"; |
|
37 |
5 |
break; |
|
38 |
5 |
case ContactModelTypes::ContactModel3D_LOCAL: |
|
39 |
5 |
os << "ContactModel3D_LOCAL"; |
|
40 |
5 |
break; |
|
41 |
5 |
case ContactModelTypes::ContactModel3D_WORLD: |
|
42 |
5 |
os << "ContactModel3D_WORLD"; |
|
43 |
5 |
break; |
|
44 |
5 |
case ContactModelTypes::ContactModel3D_LWA: |
|
45 |
5 |
os << "ContactModel3D_LWA"; |
|
46 |
5 |
break; |
|
47 |
5 |
case ContactModelTypes::ContactModel6D_LOCAL: |
|
48 |
5 |
os << "ContactModel6D_LOCAL"; |
|
49 |
5 |
break; |
|
50 |
5 |
case ContactModelTypes::ContactModel6D_WORLD: |
|
51 |
5 |
os << "ContactModel6D_WORLD"; |
|
52 |
5 |
break; |
|
53 |
5 |
case ContactModelTypes::ContactModel6D_LWA: |
|
54 |
5 |
os << "ContactModel6D_LWA"; |
|
55 |
5 |
break; |
|
56 |
case ContactModelTypes::NbContactModelTypes: |
||
57 |
os << "NbContactModelTypes"; |
||
58 |
break; |
||
59 |
default: |
||
60 |
os << "Unknown type"; |
||
61 |
break; |
||
62 |
} |
||
63 |
50 |
return os; |
|
64 |
} |
||
65 |
|||
66 |
2003 |
ContactModelFactory::ContactModelFactory() {} |
|
67 |
2003 |
ContactModelFactory::~ContactModelFactory() {} |
|
68 |
|||
69 |
2003 |
boost::shared_ptr<crocoddyl::ContactModelAbstract> ContactModelFactory::create( |
|
70 |
ContactModelTypes::Type contact_type, PinocchioModelTypes::Type model_type, |
||
71 |
Eigen::Vector2d gains, const std::string frame_name, std::size_t nu) const { |
||
72 |
✓✗ | 4006 |
PinocchioModelFactory model_factory(model_type); |
73 |
boost::shared_ptr<crocoddyl::StateMultibody> state = |
||
74 |
✓✗✓✗ |
4006 |
boost::make_shared<crocoddyl::StateMultibody>(model_factory.create()); |
75 |
2003 |
boost::shared_ptr<crocoddyl::ContactModelAbstract> contact; |
|
76 |
2003 |
std::size_t frame_id = 0; |
|
77 |
✓✓ | 2003 |
if (frame_name == "") { |
78 |
✓✗ | 339 |
frame_id = model_factory.get_frame_ids()[0]; |
79 |
} else { |
||
80 |
✓✗ | 1664 |
frame_id = state->get_pinocchio()->getFrameId(frame_name); |
81 |
} |
||
82 |
✓✓ | 2003 |
if (nu == std::numeric_limits<std::size_t>::max()) { |
83 |
339 |
nu = state->get_nv(); |
|
84 |
} |
||
85 |
✓✓✓✓ ✓✓✓✓ ✓✓✗ |
2003 |
switch (contact_type) { |
86 |
41 |
case ContactModelTypes::ContactModel1D_LOCAL: { |
|
87 |
✓✗ | 41 |
pinocchio::SE3 M = pinocchio::SE3::Random(); |
88 |
✓✗ | 41 |
gains[0] = |
89 |
0; // TODO(cmastalli): remove hard-coded zero when fixed the contact |
||
90 |
41 |
contact = boost::make_shared<crocoddyl::ContactModel1D>( |
|
91 |
✓✗✓✗ |
41 |
state, frame_id, 0., pinocchio::ReferenceFrame::LOCAL, M.rotation(), |
92 |
41 |
nu, gains); |
|
93 |
41 |
break; |
|
94 |
} |
||
95 |
30 |
case ContactModelTypes::ContactModel1D_WORLD: { |
|
96 |
✓✗ | 30 |
pinocchio::SE3 M = pinocchio::SE3::Random(); |
97 |
✓✗ | 30 |
gains[0] = |
98 |
0; // TODO(cmastalli): remove hard-coded zero when fixed the contact |
||
99 |
30 |
contact = boost::make_shared<crocoddyl::ContactModel1D>( |
|
100 |
✓✗✓✗ |
30 |
state, frame_id, 0., pinocchio::ReferenceFrame::WORLD, M.rotation(), |
101 |
30 |
nu, gains); |
|
102 |
30 |
break; |
|
103 |
} |
||
104 |
30 |
case ContactModelTypes::ContactModel1D_LWA: { |
|
105 |
✓✗ | 30 |
pinocchio::SE3 M = pinocchio::SE3::Random(); |
106 |
✓✗ | 30 |
gains[0] = |
107 |
0; // TODO(cmastalli): remove hard-coded zero when fixed the contact |
||
108 |
30 |
contact = boost::make_shared<crocoddyl::ContactModel1D>( |
|
109 |
state, frame_id, 0., pinocchio::ReferenceFrame::LOCAL_WORLD_ALIGNED, |
||
110 |
✓✗✓✗ |
30 |
M.rotation(), nu, gains); |
111 |
30 |
break; |
|
112 |
} |
||
113 |
136 |
case ContactModelTypes::ContactModel2D: |
|
114 |
✓✗ | 136 |
gains[0] = |
115 |
0; // TODO(cmastalli): remove hard-coded zero when fixed the contact |
||
116 |
✓✗ | 272 |
contact = boost::make_shared<crocoddyl::ContactModel2D>( |
117 |
✓✗ | 272 |
state, frame_id, Eigen::Vector2d::Zero(), nu, gains); |
118 |
136 |
break; |
|
119 |
684 |
case ContactModelTypes::ContactModel3D_LOCAL: |
|
120 |
✓✗ | 1368 |
contact = boost::make_shared<crocoddyl::ContactModel3D>( |
121 |
state, frame_id, Eigen::Vector3d::Zero(), |
||
122 |
✓✗ | 1368 |
pinocchio::ReferenceFrame::LOCAL, nu, gains); |
123 |
684 |
break; |
|
124 |
248 |
case ContactModelTypes::ContactModel3D_WORLD: |
|
125 |
✓✗ | 496 |
contact = boost::make_shared<crocoddyl::ContactModel3D>( |
126 |
state, frame_id, Eigen::Vector3d::Zero(), |
||
127 |
✓✗ | 496 |
pinocchio::ReferenceFrame::WORLD, nu, gains); |
128 |
248 |
break; |
|
129 |
248 |
case ContactModelTypes::ContactModel3D_LWA: |
|
130 |
✓✗ | 496 |
contact = boost::make_shared<crocoddyl::ContactModel3D>( |
131 |
state, frame_id, Eigen::Vector3d::Zero(), |
||
132 |
✓✗ | 496 |
pinocchio::ReferenceFrame::LOCAL_WORLD_ALIGNED, nu, gains); |
133 |
248 |
break; |
|
134 |
296 |
case ContactModelTypes::ContactModel6D_LOCAL: |
|
135 |
✓✗ | 592 |
contact = boost::make_shared<crocoddyl::ContactModel6D>( |
136 |
state, frame_id, pinocchio::SE3::Identity(), |
||
137 |
✓✗ | 592 |
pinocchio::ReferenceFrame::LOCAL, nu, gains); |
138 |
296 |
break; |
|
139 |
260 |
case ContactModelTypes::ContactModel6D_WORLD: |
|
140 |
✓✗ | 520 |
contact = boost::make_shared<crocoddyl::ContactModel6D>( |
141 |
state, frame_id, pinocchio::SE3::Identity(), |
||
142 |
✓✗ | 520 |
pinocchio::ReferenceFrame::WORLD, nu, gains); |
143 |
260 |
break; |
|
144 |
30 |
case ContactModelTypes::ContactModel6D_LWA: |
|
145 |
✓✗ | 60 |
contact = boost::make_shared<crocoddyl::ContactModel6D>( |
146 |
state, frame_id, pinocchio::SE3::Identity(), |
||
147 |
✓✗ | 60 |
pinocchio::ReferenceFrame::LOCAL_WORLD_ALIGNED, nu, gains); |
148 |
30 |
break; |
|
149 |
default: |
||
150 |
throw_pretty(__FILE__ ": Wrong ContactModelTypes::Type given"); |
||
151 |
break; |
||
152 |
} |
||
153 |
4006 |
return contact; |
|
154 |
} |
||
155 |
|||
156 |
39 |
boost::shared_ptr<crocoddyl::ContactModelAbstract> create_random_contact() { |
|
157 |
static bool once = true; |
||
158 |
✓✓ | 39 |
if (once) { |
159 |
1 |
srand((unsigned)time(NULL)); |
|
160 |
1 |
once = false; |
|
161 |
} |
||
162 |
39 |
boost::shared_ptr<crocoddyl::ContactModelAbstract> contact; |
|
163 |
✓✗ | 78 |
ContactModelFactory factory; |
164 |
✓✓ | 39 |
if (rand() % 4 == 0) { |
165 |
✓✗✓✗ ✓✗ |
44 |
contact = factory.create(ContactModelTypes::ContactModel1D_LOCAL, |
166 |
PinocchioModelTypes::RandomHumanoid, |
||
167 |
✓✗ | 33 |
Eigen::Vector2d::Random()); |
168 |
✓✓ | 28 |
} else if (rand() % 4 == 1) { |
169 |
✓✗✓✗ ✓✗ |
24 |
contact = factory.create(ContactModelTypes::ContactModel2D, |
170 |
PinocchioModelTypes::RandomHumanoid, |
||
171 |
✓✗ | 18 |
Eigen::Vector2d::Random()); |
172 |
✓✓ | 22 |
} else if (rand() % 4 == 2) { |
173 |
✓✗✓✗ ✓✗ |
24 |
contact = factory.create(ContactModelTypes::ContactModel3D_LOCAL, |
174 |
PinocchioModelTypes::RandomHumanoid, |
||
175 |
✓✗ | 18 |
Eigen::Vector2d::Random()); |
176 |
} else { |
||
177 |
✓✗✓✗ ✓✗ |
64 |
contact = factory.create(ContactModelTypes::ContactModel6D_LOCAL, |
178 |
PinocchioModelTypes::RandomHumanoid, |
||
179 |
✓✗ | 48 |
Eigen::Vector2d::Random()); |
180 |
} |
||
181 |
78 |
return contact; |
|
182 |
} |
||
183 |
|||
184 |
} // namespace unittest |
||
185 |
} // namespace crocoddyl |
Generated by: GCOVR (Version 4.2) |