GCC Code Coverage Report


Directory: ./
File: include/pinocchio/multibody/model.hxx
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 242 264 91.7%
Branches: 284 691 41.1%

Line Branch Exec Source
1 //
2 // Copyright (c) 2015-2021 CNRS INRIA
3 // Copyright (c) 2015 Wandercraft, 86 rue de Paris 91400 Orsay, France.
4 //
5
6 #ifndef __pinocchio_multibody_model_hxx__
7 #define __pinocchio_multibody_model_hxx__
8
9 #include "pinocchio/utils/string-generator.hpp"
10 #include "pinocchio/multibody/liegroup/liegroup-algo.hpp"
11
12 /// @cond DEV
13
14 namespace pinocchio
15 {
16 namespace details
17 {
18 struct FilterFrame
19 {
20 const std::string & name;
21 const FrameType & typeMask;
22
23 112685 FilterFrame(const std::string & name, const FrameType & typeMask)
24 112685 : name(name)
25 112685 , typeMask(typeMask)
26 {
27 112685 }
28
29 template<typename Scalar, int Options>
30 3523428 bool operator()(const FrameTpl<Scalar, Options> & frame) const
31 {
32
4/4
✓ Branch 0 taken 1728522 times.
✓ Branch 1 taken 1762578 times.
✓ Branch 3 taken 42648 times.
✓ Branch 4 taken 1685874 times.
3523428 return (typeMask & frame.type) && (name == frame.name);
33 }
34 };
35 } // namespace details
36
37 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
38 const typename ModelTpl<Scalar, Options, JointCollectionTpl>::Vector3
39 ModelTpl<Scalar, Options, JointCollectionTpl>::gravity981((Scalar)0, (Scalar)0, (Scalar)-9.81);
40
41 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
42 inline std::ostream &
43 6 operator<<(std::ostream & os, const ModelTpl<Scalar, Options, JointCollectionTpl> & model)
44 {
45 typedef typename ModelTpl<Scalar, Options, JointCollectionTpl>::Index Index;
46
47 6 os << "Nb joints = " << model.njoints << " (nq=" << model.nq << ",nv=" << model.nv << ")"
48 6 << std::endl;
49
2/2
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 6 times.
53 for (Index i = 0; i < (Index)(model.njoints); ++i)
50 {
51 47 os << " Joint " << i << " " << model.names[i] << ": parent=" << model.parents[i]
52 47 << std::endl;
53 }
54
55 6 return os;
56 }
57
58 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
59 typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex
60 14297 ModelTpl<Scalar, Options, JointCollectionTpl>::addJoint(
61 const JointIndex parent,
62 const JointModel & joint_model,
63 const SE3 & joint_placement,
64 const std::string & joint_name,
65 const VectorXs & max_effort,
66 const VectorXs & max_velocity,
67 const VectorXs & min_config,
68 const VectorXs & max_config,
69 const VectorXs & joint_friction,
70 const VectorXs & joint_damping)
71 {
72
4/8
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14297 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14297 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 14297 times.
✗ Branch 11 not taken.
14297 assert(
73 (njoints == (int)joints.size()) && (njoints == (int)inertias.size())
74 && (njoints == (int)parents.size()) && (njoints == (int)jointPlacements.size()));
75
4/8
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14297 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 14297 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 14297 times.
✗ Branch 9 not taken.
14297 assert((joint_model.nq() >= 0) && (joint_model.nv() >= 0));
76
3/6
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14297 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 14297 times.
14297 assert(joint_model.nq() >= joint_model.nv());
77
78
2/28
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14297 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
14297 PINOCCHIO_CHECK_ARGUMENT_SIZE(
79 max_effort.size(), joint_model.nv(), "The joint maximum effort vector is not of right size");
80
2/28
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14297 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
14297 PINOCCHIO_CHECK_ARGUMENT_SIZE(
81 max_velocity.size(), joint_model.nv(),
82 "The joint maximum velocity vector is not of right size");
83
2/28
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14297 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
14297 PINOCCHIO_CHECK_ARGUMENT_SIZE(
84 min_config.size(), joint_model.nq(),
85 "The joint lower configuration bound is not of right size");
86
2/28
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14297 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
14297 PINOCCHIO_CHECK_ARGUMENT_SIZE(
87 max_config.size(), joint_model.nq(),
88 "The joint upper configuration bound is not of right size");
89
2/28
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14297 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
14297 PINOCCHIO_CHECK_ARGUMENT_SIZE(
90 joint_friction.size(), joint_model.nv(), "The joint friction vector is not of right size");
91
2/28
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14297 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
14297 PINOCCHIO_CHECK_ARGUMENT_SIZE(
92 joint_damping.size(), joint_model.nv(), "The joint damping vector is not of right size");
93
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14297 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
14297 PINOCCHIO_CHECK_INPUT_ARGUMENT(
94 parent < (JointIndex)njoints, "The index of the parent joint is not valid.");
95
96 14297 JointIndex joint_id = (JointIndex)(njoints++);
97
98
2/4
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 14297 times.
✗ Branch 6 not taken.
14297 joints.push_back(JointModel(joint_model.derived()));
99 14297 JointModel & jmodel = joints.back();
100
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 jmodel.setIndexes(joint_id, nq, nv);
101
102
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 const int joint_nq = jmodel.nq();
103
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 const int joint_idx_q = jmodel.idx_q();
104
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 const int joint_nv = jmodel.nv();
105
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 const int joint_idx_v = jmodel.idx_v();
106
107
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14297 times.
14297 assert(joint_idx_q >= 0);
108
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14297 times.
14297 assert(joint_idx_v >= 0);
109
110
2/4
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14297 times.
✗ Branch 5 not taken.
14297 inertias.push_back(Inertia::Zero());
111
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 parents.push_back(parent);
112
1/2
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
14297 children.push_back(IndexVector());
113
1/2
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
14297 children[parent].push_back(joint_id);
114
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 jointPlacements.push_back(joint_placement);
115
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 names.push_back(joint_name);
116
117 14297 nq += joint_nq;
118
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 nqs.push_back(joint_nq);
119
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 idx_qs.push_back(joint_idx_q);
120 14297 nv += joint_nv;
121
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 nvs.push_back(joint_nv);
122
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 idx_vs.push_back(joint_idx_v);
123
124
3/4
✓ Branch 0 taken 14288 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 14288 times.
✗ Branch 3 not taken.
14297 if (joint_nq > 0 && joint_nv > 0)
125 {
126
1/2
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
14288 effortLimit.conservativeResize(nv);
127
2/4
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14288 times.
✗ Branch 5 not taken.
14288 jmodel.jointVelocitySelector(effortLimit) = max_effort;
128
1/2
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
14288 velocityLimit.conservativeResize(nv);
129
2/4
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14288 times.
✗ Branch 5 not taken.
14288 jmodel.jointVelocitySelector(velocityLimit) = max_velocity;
130
1/2
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
14288 lowerPositionLimit.conservativeResize(nq);
131
2/4
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14288 times.
✗ Branch 5 not taken.
14288 jmodel.jointConfigSelector(lowerPositionLimit) = min_config;
132
1/2
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
14288 upperPositionLimit.conservativeResize(nq);
133
2/4
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14288 times.
✗ Branch 5 not taken.
14288 jmodel.jointConfigSelector(upperPositionLimit) = max_config;
134
135
1/2
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
14288 armature.conservativeResize(nv);
136
2/4
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14288 times.
✗ Branch 5 not taken.
14288 jmodel.jointVelocitySelector(armature).setZero();
137
1/2
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
14288 rotorInertia.conservativeResize(nv);
138
2/4
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14288 times.
✗ Branch 5 not taken.
14288 jmodel.jointVelocitySelector(rotorInertia).setZero();
139
1/2
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
14288 rotorGearRatio.conservativeResize(nv);
140
2/4
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14288 times.
✗ Branch 5 not taken.
14288 jmodel.jointVelocitySelector(rotorGearRatio).setOnes();
141
1/2
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
14288 friction.conservativeResize(nv);
142
2/4
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14288 times.
✗ Branch 5 not taken.
14288 jmodel.jointVelocitySelector(friction) = joint_friction;
143
1/2
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
14288 damping.conservativeResize(nv);
144
2/4
✓ Branch 1 taken 14288 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14288 times.
✗ Branch 5 not taken.
14288 jmodel.jointVelocitySelector(damping) = joint_damping;
145 }
146
147 // Init and add joint index to its parent subtrees.
148
2/4
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 14297 times.
✗ Branch 6 not taken.
14297 subtrees.push_back(IndexVector(1));
149 14297 subtrees[joint_id][0] = joint_id;
150
1/2
✓ Branch 1 taken 14297 times.
✗ Branch 2 not taken.
14297 addJointIndexToParentSubtrees(joint_id);
151
152 // Init and add joint index to the supports
153
1/2
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
14297 supports.push_back(supports[parent]);
154
1/2
✓ Branch 2 taken 14297 times.
✗ Branch 3 not taken.
14297 supports[joint_id].push_back(joint_id);
155
156 14297 return joint_id;
157 }
158
159 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
160 typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex
161 11485 ModelTpl<Scalar, Options, JointCollectionTpl>::addJoint(
162 const JointIndex parent,
163 const JointModel & joint_model,
164 const SE3 & joint_placement,
165 const std::string & joint_name,
166 const VectorXs & max_effort,
167 const VectorXs & max_velocity,
168 const VectorXs & min_config,
169 const VectorXs & max_config)
170 {
171
3/8
✓ Branch 1 taken 11485 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 11485 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 11485 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
11485 const VectorXs friction = VectorXs::Constant(joint_model.nv(), static_cast<Scalar>(0));
172
3/8
✓ Branch 1 taken 11485 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 11485 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 11485 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
11485 const VectorXs damping = VectorXs::Constant(joint_model.nv(), static_cast<Scalar>(0));
173
174
1/2
✓ Branch 1 taken 11485 times.
✗ Branch 2 not taken.
11485 return addJoint(
175 parent, joint_model, joint_placement, joint_name, max_effort, max_velocity, min_config,
176 22970 max_config, friction, damping);
177 11485 }
178
179 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
180 typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex
181 276 ModelTpl<Scalar, Options, JointCollectionTpl>::addJoint(
182 const JointIndex parent,
183 const JointModel & joint_model,
184 const SE3 & joint_placement,
185 const std::string & joint_name)
186 {
187
1/3
✓ Branch 1 taken 276 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
276 const VectorXs max_effort =
188
2/6
✗ Branch 1 not taken.
✓ Branch 2 taken 276 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 276 times.
✗ Branch 6 not taken.
276 VectorXs::Constant(joint_model.nv(), std::numeric_limits<Scalar>::max());
189
1/3
✓ Branch 1 taken 276 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
276 const VectorXs max_velocity =
190
2/6
✗ Branch 1 not taken.
✓ Branch 2 taken 276 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 276 times.
✗ Branch 6 not taken.
276 VectorXs::Constant(joint_model.nv(), std::numeric_limits<Scalar>::max());
191
1/5
✓ Branch 1 taken 276 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
276 const VectorXs min_config =
192
2/6
✗ Branch 1 not taken.
✓ Branch 2 taken 276 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 276 times.
✗ Branch 6 not taken.
276 VectorXs::Constant(joint_model.nq(), -std::numeric_limits<Scalar>::max());
193
1/3
✓ Branch 1 taken 276 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
276 const VectorXs max_config =
194
2/6
✗ Branch 1 not taken.
✓ Branch 2 taken 276 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 276 times.
✗ Branch 6 not taken.
276 VectorXs::Constant(joint_model.nq(), std::numeric_limits<Scalar>::max());
195
196
1/2
✓ Branch 1 taken 276 times.
✗ Branch 2 not taken.
276 return addJoint(
197 parent, joint_model, joint_placement, joint_name, max_effort, max_velocity, min_config,
198 552 max_config);
199 276 }
200
201 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
202 13445 FrameIndex ModelTpl<Scalar, Options, JointCollectionTpl>::addJointFrame(
203 const JointIndex & joint_index, int previous_frame_index)
204 {
205
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 13445 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
13445 PINOCCHIO_CHECK_INPUT_ARGUMENT(
206 joint_index < joints.size(),
207 "The joint index is larger than the number of joints in the model.");
208
2/2
✓ Branch 0 taken 11113 times.
✓ Branch 1 taken 2332 times.
13445 if (previous_frame_index < 0)
209 {
210 // FIXED_JOINT is required because the parent can be the universe and its
211 // type is FIXED_JOINT
212 11113 previous_frame_index =
213
1/2
✓ Branch 3 taken 11113 times.
✗ Branch 4 not taken.
11113 (int)getFrameId(names[parents[joint_index]], (FrameType)(JOINT | FIXED_JOINT));
214 }
215
1/2
✓ Branch 1 taken 13445 times.
✗ Branch 2 not taken.
13445 assert((size_t)previous_frame_index < frames.size() && "Frame index out of bound");
216
217 // Add a the joint frame attached to itself to the frame vector - redundant information but
218 // useful.
219
3/6
✓ Branch 2 taken 13445 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 13445 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 13445 times.
✗ Branch 10 not taken.
26890 return addFrame(Frame(
220 26890 names[joint_index], joint_index, (FrameIndex)previous_frame_index, SE3::Identity(), JOINT));
221 }
222
223 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
224 template<typename NewScalar>
225 typename CastType<NewScalar, ModelTpl<Scalar, Options, JointCollectionTpl>>::type
226 39 ModelTpl<Scalar, Options, JointCollectionTpl>::cast() const
227 {
228 typedef ModelTpl<NewScalar, Options, JointCollectionTpl> ReturnType;
229
230
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 ReturnType res;
231 39 res.nq = nq;
232 39 res.nv = nv;
233 39 res.njoints = njoints;
234 39 res.nbodies = nbodies;
235 39 res.nframes = nframes;
236
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.parents = parents;
237
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.children = children;
238
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.names = names;
239
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.subtrees = subtrees;
240
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.supports = supports;
241
2/4
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
39 res.gravity = gravity.template cast<NewScalar>();
242
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.name = name;
243
244
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.idx_qs = idx_qs;
245
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.nqs = nqs;
246
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.idx_vs = idx_vs;
247
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
39 res.nvs = nvs;
248
249 // Eigen Vectors
250
3/5
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
39 res.armature = armature.template cast<NewScalar>();
251
3/5
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
39 res.friction = friction.template cast<NewScalar>();
252
3/5
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
39 res.damping = damping.template cast<NewScalar>();
253
3/5
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
39 res.rotorInertia = rotorInertia.template cast<NewScalar>();
254
3/5
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
39 res.rotorGearRatio = rotorGearRatio.template cast<NewScalar>();
255
3/5
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
39 res.effortLimit = effortLimit.template cast<NewScalar>();
256
3/5
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
39 res.velocityLimit = velocityLimit.template cast<NewScalar>();
257
3/5
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
39 res.lowerPositionLimit = lowerPositionLimit.template cast<NewScalar>();
258
3/5
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
39 res.upperPositionLimit = upperPositionLimit.template cast<NewScalar>();
259
260 39 typename ConfigVectorMap::const_iterator it;
261
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 26 times.
39 for (it = referenceConfigurations.begin(); it != referenceConfigurations.end(); it++)
262 {
263 res.referenceConfigurations.insert(
264 std::make_pair(it->first, it->second.template cast<NewScalar>()));
265 }
266
267 // reserve vectors
268
1/2
✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
39 res.inertias.resize(inertias.size());
269
1/2
✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
39 res.jointPlacements.resize(jointPlacements.size());
270
1/2
✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
39 res.joints.resize(joints.size());
271
272 // copy into vectors
273
2/2
✓ Branch 1 taken 626 times.
✓ Branch 2 taken 26 times.
978 for (size_t k = 0; k < joints.size(); ++k)
274 {
275
2/4
✓ Branch 2 taken 626 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 626 times.
✗ Branch 7 not taken.
939 res.inertias[k] = inertias[k].template cast<NewScalar>();
276
2/4
✓ Branch 2 taken 626 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 626 times.
✗ Branch 7 not taken.
939 res.jointPlacements[k] = jointPlacements[k].template cast<NewScalar>();
277
2/4
✓ Branch 2 taken 626 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 626 times.
✗ Branch 7 not taken.
939 res.joints[k] = joints[k].template cast<NewScalar>();
278 }
279
280
1/2
✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
39 res.frames.resize(frames.size());
281
2/2
✓ Branch 1 taken 1216 times.
✓ Branch 2 taken 26 times.
1864 for (size_t k = 0; k < frames.size(); ++k)
282 {
283
2/4
✓ Branch 2 taken 1216 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1216 times.
✗ Branch 7 not taken.
1825 res.frames[k] = frames[k].template cast<NewScalar>();
284 }
285
286 78 return res;
287 }
288
289 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
290 92 bool ModelTpl<Scalar, Options, JointCollectionTpl>::operator==(const ModelTpl & other) const
291 {
292
2/4
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 54 times.
✗ Branch 3 not taken.
88 bool res = other.nq == nq && other.nv == nv && other.njoints == njoints
293
4/8
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 54 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 54 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 54 times.
✗ Branch 8 not taken.
88 && other.nbodies == nbodies && other.nframes == nframes && other.parents == parents
294
6/12
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 54 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 54 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 54 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 54 times.
✗ Branch 14 not taken.
88 && other.children == children && other.names == names && other.subtrees == subtrees
295
5/8
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 54 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 54 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 54 times.
✗ Branch 9 not taken.
180 && other.gravity == gravity && other.name == name;
296
297
9/16
✓ Branch 1 taken 57 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 54 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 54 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 54 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 54 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 54 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 54 times.
✗ Branch 19 not taken.
92 res &= other.idx_qs == idx_qs && other.nqs == nqs && other.idx_vs == idx_vs && other.nvs == nvs;
298
299
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 57 times.
92 if (other.referenceConfigurations.size() != referenceConfigurations.size())
300 return false;
301
302 92 typename ConfigVectorMap::const_iterator it = referenceConfigurations.begin();
303 92 typename ConfigVectorMap::const_iterator it_other = other.referenceConfigurations.begin();
304
2/2
✓ Branch 1 taken 22 times.
✓ Branch 2 taken 56 times.
134 for (long k = 0; k < (long)referenceConfigurations.size(); ++k)
305 {
306
2/2
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 21 times.
44 if (it->second.size() != it_other->second.size())
307 2 return false;
308
2/4
✓ Branch 3 taken 21 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 21 times.
42 if (it->second != it_other->second)
309 return false;
310
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
42 std::advance(it, 1);
311
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
42 std::advance(it_other, 1);
312 }
313
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 56 times.
90 if (other.armature.size() != armature.size())
314 return false;
315
1/2
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
90 res &= other.armature == armature;
316
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 54 times.
90 if (!res)
317 2 return res;
318
319
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
88 if (other.friction.size() != friction.size())
320 return false;
321
1/2
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
88 res &= other.friction == friction;
322
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
88 if (!res)
323 return res;
324
325
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
88 if (other.damping.size() != damping.size())
326 return false;
327
1/2
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
88 res &= other.damping == damping;
328
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
88 if (!res)
329 return res;
330
331
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
88 if (other.rotorInertia.size() != rotorInertia.size())
332 return false;
333
1/2
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
88 res &= other.rotorInertia == rotorInertia;
334
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
88 if (!res)
335 return res;
336
337
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
88 if (other.rotorGearRatio.size() != rotorGearRatio.size())
338 return false;
339
1/2
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
88 res &= other.rotorGearRatio == rotorGearRatio;
340
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
88 if (!res)
341 return res;
342
343
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
88 if (other.effortLimit.size() != effortLimit.size())
344 return false;
345
1/2
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
88 res &= other.effortLimit == effortLimit;
346
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 53 times.
88 if (!res)
347 1 return res;
348
349
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 53 times.
87 if (other.velocityLimit.size() != velocityLimit.size())
350 return false;
351
1/2
✓ Branch 1 taken 53 times.
✗ Branch 2 not taken.
87 res &= other.velocityLimit == velocityLimit;
352
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 53 times.
87 if (!res)
353 return res;
354
355
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 53 times.
87 if (other.lowerPositionLimit.size() != lowerPositionLimit.size())
356 return false;
357
1/2
✓ Branch 1 taken 53 times.
✗ Branch 2 not taken.
87 res &= other.lowerPositionLimit == lowerPositionLimit;
358
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 53 times.
87 if (!res)
359 return res;
360
361
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 53 times.
87 if (other.upperPositionLimit.size() != upperPositionLimit.size())
362 return false;
363
1/2
✓ Branch 1 taken 53 times.
✗ Branch 2 not taken.
87 res &= other.upperPositionLimit == upperPositionLimit;
364
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 53 times.
87 if (!res)
365 return res;
366
367
2/2
✓ Branch 1 taken 1651 times.
✓ Branch 2 taken 53 times.
2750 for (size_t k = 1; k < inertias.size(); ++k)
368 {
369
1/2
✓ Branch 3 taken 1651 times.
✗ Branch 4 not taken.
2663 res &= other.inertias[k] == inertias[k];
370
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1651 times.
2663 if (!res)
371 return res;
372 }
373
374
2/2
✓ Branch 1 taken 1651 times.
✓ Branch 2 taken 53 times.
2750 for (size_t k = 1; k < other.jointPlacements.size(); ++k)
375 {
376
1/2
✓ Branch 3 taken 1651 times.
✗ Branch 4 not taken.
2663 res &= other.jointPlacements[k] == jointPlacements[k];
377
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1651 times.
2663 if (!res)
378 return res;
379 }
380
381
4/8
✓ Branch 1 taken 53 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 53 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 53 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 53 times.
✗ Branch 9 not taken.
87 res &= other.joints == joints && other.frames == frames;
382
383 87 return res;
384 }
385
386 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
387 13796 void ModelTpl<Scalar, Options, JointCollectionTpl>::appendBodyToJoint(
388 const typename ModelTpl::JointIndex joint_index, const Inertia & Y, const SE3 & body_placement)
389 {
390
1/2
✓ Branch 1 taken 13796 times.
✗ Branch 2 not taken.
13796 const Inertia & iYf = Y.se3Action(body_placement);
391
1/2
✓ Branch 2 taken 13796 times.
✗ Branch 3 not taken.
13796 inertias[joint_index] += iYf;
392 13796 nbodies++;
393 13796 }
394
395 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
396 typename ModelTpl<Scalar, Options, JointCollectionTpl>::FrameIndex
397 15248 ModelTpl<Scalar, Options, JointCollectionTpl>::addBodyFrame(
398 const std::string & body_name,
399 const JointIndex & parentJoint,
400 const SE3 & body_placement,
401 int parentFrame)
402 {
403
2/2
✓ Branch 0 taken 11816 times.
✓ Branch 1 taken 3432 times.
15248 if (parentFrame < 0)
404 {
405 // FIXED_JOINT is required because the parent can be the universe and its
406 // type is FIXED_JOINT
407
1/2
✓ Branch 2 taken 11816 times.
✗ Branch 3 not taken.
11816 parentFrame = (int)getFrameId(names[parentJoint], (FrameType)(JOINT | FIXED_JOINT));
408 }
409
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 15248 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
15248 PINOCCHIO_CHECK_INPUT_ARGUMENT((size_t)parentFrame < frames.size(), "Frame index out of bound");
410
2/4
✓ Branch 2 taken 15248 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 15248 times.
✗ Branch 6 not taken.
15248 return addFrame(Frame(body_name, parentJoint, (FrameIndex)parentFrame, body_placement, BODY));
411 }
412
413 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
414 inline typename ModelTpl<Scalar, Options, JointCollectionTpl>::FrameIndex
415 3172 ModelTpl<Scalar, Options, JointCollectionTpl>::getBodyId(const std::string & name) const
416 {
417
1/2
✓ Branch 1 taken 3172 times.
✗ Branch 2 not taken.
3172 return getFrameId(name, BODY);
418 }
419
420 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
421 inline bool
422 6294 ModelTpl<Scalar, Options, JointCollectionTpl>::existBodyName(const std::string & name) const
423 {
424
1/2
✓ Branch 1 taken 6294 times.
✗ Branch 2 not taken.
6294 return existFrame(name, BODY);
425 }
426
427 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
428 inline typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex
429 14415 ModelTpl<Scalar, Options, JointCollectionTpl>::getJointId(const std::string & name) const
430 {
431 typedef std::vector<std::string>::iterator::difference_type it_diff_t;
432
1/2
✓ Branch 4 taken 14415 times.
✗ Branch 5 not taken.
14415 it_diff_t res = std::find(names.begin(), names.end(), name) - names.begin();
433
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14415 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
14415 PINOCCHIO_CHECK_INPUT_ARGUMENT(
434 (res < INT_MAX), "Id superior to int range. Should never happen.");
435 14415 return ModelTpl::JointIndex(res);
436 }
437
438 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
439 inline bool
440 1286 ModelTpl<Scalar, Options, JointCollectionTpl>::existJointName(const std::string & name) const
441 {
442 1286 return (names.end() != std::find(names.begin(), names.end(), name));
443 }
444
445 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
446 inline typename ModelTpl<Scalar, Options, JointCollectionTpl>::FrameIndex
447 34555 ModelTpl<Scalar, Options, JointCollectionTpl>::getFrameId(
448 const std::string & name, const FrameType & type) const
449 {
450 typename PINOCCHIO_ALIGNED_STD_VECTOR(Frame)::const_iterator it =
451
1/2
✓ Branch 4 taken 34191 times.
✗ Branch 5 not taken.
34555 std::find_if(frames.begin(), frames.end(), details::FilterFrame(name, type));
452
8/10
✓ Branch 2 taken 34190 times.
✓ Branch 3 taken 1 times.
✓ Branch 9 taken 34190 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 34189 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 34190 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
34555 PINOCCHIO_CHECK_INPUT_ARGUMENT(
453 ((it == frames.end()
454 || (std::find_if(boost::next(it), frames.end(), details::FilterFrame(name, type)) == frames.end()))),
455 "Several frames match the filter - please specify the FrameType");
456 34554 return FrameIndex(it - frames.begin());
457 }
458
459 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
460 44473 inline bool ModelTpl<Scalar, Options, JointCollectionTpl>::existFrame(
461 const std::string & name, const FrameType & type) const
462 {
463
1/2
✓ Branch 4 taken 44304 times.
✗ Branch 5 not taken.
44473 return std::find_if(frames.begin(), frames.end(), details::FilterFrame(name, type))
464 88946 != frames.end();
465 }
466
467 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
468 typename ModelTpl<Scalar, Options, JointCollectionTpl>::FrameIndex
469 32079 ModelTpl<Scalar, Options, JointCollectionTpl>::addFrame(
470 const Frame & frame, const bool append_inertia)
471 {
472
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 32079 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
32079 PINOCCHIO_CHECK_INPUT_ARGUMENT(
473 frame.parentJoint < (JointIndex)njoints, "The index of the parent joint is not valid.");
474
475 // TODO: fix it
476 // PINOCCHIO_CHECK_INPUT_ARGUMENT(frame.inertia.isValid(),
477 // "The input inertia is not valid.")
478
479 // Check if the frame.name exists with the same type
480
2/2
✓ Branch 1 taken 190 times.
✓ Branch 2 taken 31889 times.
32079 if (existFrame(frame.name, frame.type))
481 {
482 190 return getFrameId(frame.name, frame.type);
483 }
484 // else: we must add a new frames to the current stack
485 31889 frames.push_back(frame);
486
2/2
✓ Branch 0 taken 31169 times.
✓ Branch 1 taken 720 times.
31889 if (append_inertia)
487
1/2
✓ Branch 3 taken 31169 times.
✗ Branch 4 not taken.
31169 inertias[frame.parentJoint] += frame.placement.act(frame.inertia);
488 31889 nframes++;
489 31889 return FrameIndex(nframes - 1);
490 }
491
492 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
493 14297 void ModelTpl<Scalar, Options, JointCollectionTpl>::addJointIndexToParentSubtrees(
494 const JointIndex joint_id)
495 {
496
2/2
✓ Branch 2 taken 60068 times.
✓ Branch 3 taken 14297 times.
74365 for (JointIndex parent = parents[joint_id]; parent > 0; parent = parents[parent])
497 60068 subtrees[parent].push_back(joint_id);
498
499 // Also add joint_id to the universe
500 14297 subtrees[0].push_back(joint_id);
501 14297 }
502
503 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
504 1 std::vector<bool> ModelTpl<Scalar, Options, JointCollectionTpl>::hasConfigurationLimit()
505 {
506 1 std::vector<bool> vec;
507
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 for (Index i = 1; i < (Index)(njoints); ++i)
508 {
509
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 const std::vector<bool> & cf_limits = joints[i].hasConfigurationLimit();
510
1/2
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 vec.insert(vec.end(), cf_limits.begin(), cf_limits.end());
511 }
512 1 return vec;
513 }
514
515 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
516 1 std::vector<bool> ModelTpl<Scalar, Options, JointCollectionTpl>::hasConfigurationLimitInTangent()
517 {
518 1 std::vector<bool> vec;
519
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 for (Index i = 1; i < (Index)(njoints); ++i)
520 {
521
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 const std::vector<bool> & cf_limits = joints[i].hasConfigurationLimitInTangent();
522
1/2
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 vec.insert(vec.end(), cf_limits.begin(), cf_limits.end());
523 }
524 1 return vec;
525 }
526
527 } // namespace pinocchio
528
529 /// @endcond
530
531 #endif // ifndef __pinocchio_multibody_model_hxx__
532