GCC Code Coverage Report | |||||||||||||||||||||
|
|||||||||||||||||||||
Line | Branch | Exec | Source |
1 |
/////////////////////////////////////////////////////////////////////////////// |
||
2 |
// BSD 3-Clause License |
||
3 |
// |
||
4 |
// Copyright (C) 2021-2022, University of Edinburgh, LAAS-CNRS |
||
5 |
// Copyright note valid unless otherwise stated in individual files. |
||
6 |
// All rights reserved. |
||
7 |
/////////////////////////////////////////////////////////////////////////////// |
||
8 |
|||
9 |
#include "residual.hpp" |
||
10 |
|||
11 |
#include "crocoddyl/core/residuals/control.hpp" |
||
12 |
#include "crocoddyl/core/utils/exception.hpp" |
||
13 |
#include "crocoddyl/multibody/residuals/centroidal-momentum.hpp" |
||
14 |
#include "crocoddyl/multibody/residuals/com-position.hpp" |
||
15 |
#include "crocoddyl/multibody/residuals/control-gravity.hpp" |
||
16 |
#include "crocoddyl/multibody/residuals/frame-placement.hpp" |
||
17 |
#include "crocoddyl/multibody/residuals/frame-rotation.hpp" |
||
18 |
#include "crocoddyl/multibody/residuals/frame-translation.hpp" |
||
19 |
#include "crocoddyl/multibody/residuals/frame-velocity.hpp" |
||
20 |
#include "crocoddyl/multibody/residuals/pair-collision.hpp" |
||
21 |
#include "crocoddyl/multibody/residuals/state.hpp" |
||
22 |
|||
23 |
namespace crocoddyl { |
||
24 |
namespace unittest { |
||
25 |
|||
26 |
const std::vector<ResidualModelTypes::Type> ResidualModelTypes::all( |
||
27 |
ResidualModelTypes::init_all()); |
||
28 |
|||
29 |
180 |
std::ostream& operator<<(std::ostream& os, ResidualModelTypes::Type type) { |
|
30 |
✓✓✓✓ ✓✓✓✓ ✓✓✗✗ |
180 |
switch (type) { |
31 |
18 |
case ResidualModelTypes::ResidualModelState: |
|
32 |
18 |
os << "ResidualModelState"; |
|
33 |
18 |
break; |
|
34 |
18 |
case ResidualModelTypes::ResidualModelControl: |
|
35 |
18 |
os << "ResidualModelControl"; |
|
36 |
18 |
break; |
|
37 |
18 |
case ResidualModelTypes::ResidualModelCoMPosition: |
|
38 |
18 |
os << "ResidualModelCoMPosition"; |
|
39 |
18 |
break; |
|
40 |
18 |
case ResidualModelTypes::ResidualModelCentroidalMomentum: |
|
41 |
18 |
os << "ResidualModelCentroidalMomentum"; |
|
42 |
18 |
break; |
|
43 |
18 |
case ResidualModelTypes::ResidualModelFramePlacement: |
|
44 |
18 |
os << "ResidualModelFramePlacement"; |
|
45 |
18 |
break; |
|
46 |
18 |
case ResidualModelTypes::ResidualModelFrameRotation: |
|
47 |
18 |
os << "ResidualModelFrameRotation"; |
|
48 |
18 |
break; |
|
49 |
18 |
case ResidualModelTypes::ResidualModelFrameTranslation: |
|
50 |
18 |
os << "ResidualModelFrameTranslation"; |
|
51 |
18 |
break; |
|
52 |
18 |
case ResidualModelTypes::ResidualModelFrameVelocity: |
|
53 |
18 |
os << "ResidualModelFrameVelocity"; |
|
54 |
18 |
break; |
|
55 |
18 |
case ResidualModelTypes::ResidualModelControlGrav: |
|
56 |
18 |
os << "ResidualModelControlGrav"; |
|
57 |
18 |
break; |
|
58 |
#ifdef PINOCCHIO_WITH_HPP_FCL |
||
59 |
18 |
case ResidualModelTypes::ResidualModelPairCollision: |
|
60 |
18 |
os << "ResidualModelPairCollision"; |
|
61 |
18 |
break; |
|
62 |
#endif // PINOCCHIO_WITH_HPP_FCL |
||
63 |
case ResidualModelTypes::NbResidualModelTypes: |
||
64 |
os << "NbResidualModelTypes"; |
||
65 |
break; |
||
66 |
default: |
||
67 |
break; |
||
68 |
} |
||
69 |
180 |
return os; |
|
70 |
} |
||
71 |
|||
72 |
541 |
ResidualModelFactory::ResidualModelFactory() {} |
|
73 |
541 |
ResidualModelFactory::~ResidualModelFactory() {} |
|
74 |
|||
75 |
boost::shared_ptr<crocoddyl::ResidualModelAbstract> |
||
76 |
540 |
ResidualModelFactory::create(ResidualModelTypes::Type residual_type, |
|
77 |
StateModelTypes::Type state_type, |
||
78 |
std::size_t nu) const { |
||
79 |
✓✗ | 1080 |
StateModelFactory state_factory; |
80 |
540 |
boost::shared_ptr<crocoddyl::ResidualModelAbstract> residual; |
|
81 |
boost::shared_ptr<crocoddyl::StateMultibody> state = |
||
82 |
boost::static_pointer_cast<crocoddyl::StateMultibody>( |
||
83 |
✓✗ | 1080 |
state_factory.create(state_type)); |
84 |
540 |
pinocchio::FrameIndex frame_index = state->get_pinocchio()->frames.size() - 1; |
|
85 |
✓✗ | 540 |
pinocchio::SE3 frame_SE3 = pinocchio::SE3::Random(); |
86 |
|||
87 |
#ifdef PINOCCHIO_WITH_HPP_FCL |
||
88 |
✓✗ | 540 |
pinocchio::SE3 frame_SE3_obstacle = pinocchio::SE3::Random(); |
89 |
boost::shared_ptr<pinocchio::GeometryModel> geometry = |
||
90 |
✓✗✓✗ |
1080 |
boost::make_shared<pinocchio::GeometryModel>(pinocchio::GeometryModel()); |
91 |
pinocchio::GeomIndex ig_frame = |
||
92 |
✓✗✓✗ ✓✗✓✗ ✓✗✓✗ ✓✗✓✗ ✓✗ |
1620 |
geometry->addGeometryObject(pinocchio::GeometryObject( |
93 |
"frame", frame_index, |
||
94 |
540 |
state->get_pinocchio()->frames[frame_index].parent, |
|
95 |
✓✗✓✗ ✓✗ |
1080 |
CollisionGeometryPtr(new hpp::fcl::Sphere(0)), frame_SE3)); |
96 |
pinocchio::GeomIndex ig_obs = |
||
97 |
✓✗✓✗ ✓✗✓✗ ✓✗✓✗ ✓✗✓✗ ✓✗✓✗ ✓✗ |
1620 |
geometry->addGeometryObject(pinocchio::GeometryObject( |
98 |
540 |
"obs", state->get_pinocchio()->getFrameId("universe"), |
|
99 |
540 |
state->get_pinocchio() |
|
100 |
✓✗✓✗ |
1620 |
->frames[state->get_pinocchio()->getFrameId("universe")] |
101 |
.parent, |
||
102 |
✓✗✓✗ ✓✗ |
1080 |
CollisionGeometryPtr(new hpp::fcl::Sphere(0)), frame_SE3_obstacle)); |
103 |
✓✗✓✗ |
540 |
geometry->addCollisionPair(pinocchio::CollisionPair(ig_frame, ig_obs)); |
104 |
#endif // PINOCCHIO_WITH_HPP_FCL |
||
105 |
✗✓ | 540 |
if (nu == std::numeric_limits<std::size_t>::max()) { |
106 |
nu = state->get_nv(); |
||
107 |
} |
||
108 |
✓✓✓✓ ✓✓✓✓ ✓✓✗ |
540 |
switch (residual_type) { |
109 |
54 |
case ResidualModelTypes::ResidualModelState: |
|
110 |
✓✗ | 108 |
residual = boost::make_shared<crocoddyl::ResidualModelState>( |
111 |
✓✗ | 162 |
state, state->rand(), nu); |
112 |
54 |
break; |
|
113 |
54 |
case ResidualModelTypes::ResidualModelControl: |
|
114 |
✓✗ | 108 |
residual = boost::make_shared<crocoddyl::ResidualModelControl>( |
115 |
✓✗ | 108 |
state, Eigen::VectorXd::Random(nu)); |
116 |
54 |
break; |
|
117 |
54 |
case ResidualModelTypes::ResidualModelCoMPosition: |
|
118 |
✓✗ | 108 |
residual = boost::make_shared<crocoddyl::ResidualModelCoMPosition>( |
119 |
✓✗ | 108 |
state, Eigen::Vector3d::Random(), nu); |
120 |
54 |
break; |
|
121 |
54 |
case ResidualModelTypes::ResidualModelCentroidalMomentum: |
|
122 |
✓✗ | 108 |
residual = boost::make_shared<crocoddyl::ResidualModelCentroidalMomentum>( |
123 |
✓✗ | 108 |
state, Vector6d::Random(), nu); |
124 |
54 |
break; |
|
125 |
54 |
case ResidualModelTypes::ResidualModelFramePlacement: |
|
126 |
✓✗ | 108 |
residual = boost::make_shared<crocoddyl::ResidualModelFramePlacement>( |
127 |
54 |
state, frame_index, frame_SE3, nu); |
|
128 |
54 |
break; |
|
129 |
54 |
case ResidualModelTypes::ResidualModelFrameRotation: |
|
130 |
54 |
residual = boost::make_shared<crocoddyl::ResidualModelFrameRotation>( |
|
131 |
✓✗✓✗ |
54 |
state, frame_index, frame_SE3.rotation(), nu); |
132 |
54 |
break; |
|
133 |
54 |
case ResidualModelTypes::ResidualModelFrameTranslation: |
|
134 |
54 |
residual = boost::make_shared<crocoddyl::ResidualModelFrameTranslation>( |
|
135 |
✓✗✓✗ |
54 |
state, frame_index, frame_SE3.translation(), nu); |
136 |
54 |
break; |
|
137 |
54 |
case ResidualModelTypes::ResidualModelFrameVelocity: |
|
138 |
✓✗ | 108 |
residual = boost::make_shared<crocoddyl::ResidualModelFrameVelocity>( |
139 |
state, frame_index, pinocchio::Motion::Random(), |
||
140 |
✓✗ | 54 |
static_cast<pinocchio::ReferenceFrame>(rand() % 2), |
141 |
54 |
nu); // the code cannot test LOCAL_WORLD_ALIGNED |
|
142 |
54 |
break; |
|
143 |
54 |
case ResidualModelTypes::ResidualModelControlGrav: |
|
144 |
residual = |
||
145 |
✓✗ | 54 |
boost::make_shared<crocoddyl::ResidualModelControlGrav>(state, nu); |
146 |
54 |
break; |
|
147 |
#ifdef PINOCCHIO_WITH_HPP_FCL |
||
148 |
54 |
case ResidualModelTypes::ResidualModelPairCollision: |
|
149 |
54 |
residual = boost::make_shared<crocoddyl::ResidualModelPairCollision>( |
|
150 |
state, nu, geometry, 0, |
||
151 |
✓✗ | 54 |
state->get_pinocchio()->frames[frame_index].parent); |
152 |
54 |
break; |
|
153 |
#endif // PINOCCHIO_WITH_HPP_FCL |
||
154 |
default: |
||
155 |
throw_pretty(__FILE__ ": Wrong ResidualModelTypes::Type given"); |
||
156 |
break; |
||
157 |
} |
||
158 |
1080 |
return residual; |
|
159 |
} |
||
160 |
|||
161 |
boost::shared_ptr<crocoddyl::ResidualModelAbstract> create_random_residual( |
||
162 |
StateModelTypes::Type state_type) { |
||
163 |
static bool once = true; |
||
164 |
if (once) { |
||
165 |
srand((unsigned)time(NULL)); |
||
166 |
once = false; |
||
167 |
} |
||
168 |
|||
169 |
ResidualModelFactory factory; |
||
170 |
ResidualModelTypes::Type rand_type = static_cast<ResidualModelTypes::Type>( |
||
171 |
rand() % ResidualModelTypes::NbResidualModelTypes); |
||
172 |
return factory.create(rand_type, state_type); |
||
173 |
} |
||
174 |
|||
175 |
} // namespace unittest |
||
176 |
} // namespace crocoddyl |
Generated by: GCOVR (Version 4.2) |