Directory: | ./ |
---|---|
File: | src/parsers/mjcf/mjcf-graph.cpp |
Date: | 2025-02-12 21:03:38 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 643 | 708 | 90.8% |
Branches: | 1005 | 2587 | 38.8% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | // | ||
2 | // Copyright (c) 2016-2024 CNRS INRIA | ||
3 | // | ||
4 | |||
5 | #include "pinocchio/parsers/mjcf/mjcf-graph.hpp" | ||
6 | #include "pinocchio/multibody/model.hpp" | ||
7 | #include "pinocchio/algorithm/contact-info.hpp" | ||
8 | |||
9 | namespace pinocchio | ||
10 | { | ||
11 | namespace mjcf | ||
12 | { | ||
13 | namespace details | ||
14 | { | ||
15 | typedef boost::property_tree::ptree ptree; | ||
16 | typedef pinocchio::urdf::details:: | ||
17 | UrdfVisitor<double, 0, ::pinocchio::JointCollectionDefaultTpl> | ||
18 | UrdfVisitor; | ||
19 | |||
20 | // supported elements from mjcf | ||
21 | static const std::array<std::string, 3> ELEMENTS = {"joint", "geom", "site"}; | ||
22 | |||
23 | /// @brief Copy the value of ptree src into dst | ||
24 | /// @param src ptree to copy | ||
25 | /// @param dst ptree where copy is made | ||
26 | 30 | static void copyPtree(const ptree & src, ptree & dst) | |
27 | { | ||
28 |
6/10✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 44 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 74 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 44 times.
✓ Branch 13 taken 30 times.
|
74 | for (const ptree::value_type & v : src) |
29 |
3/6✓ Branch 2 taken 44 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 44 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 44 times.
✗ Branch 10 not taken.
|
44 | dst.put(ptree::path_type(v.first), v.second.data()); |
30 | 30 | } | |
31 | |||
32 | /// @brief Update class Element in order to have all info of parent classes | ||
33 | /// @param current current class | ||
34 | /// @param dst parent class | ||
35 | 39 | static void updateClassElement(ptree & current, const ptree & parent) | |
36 | { | ||
37 |
2/2✓ Branch 0 taken 117 times.
✓ Branch 1 taken 39 times.
|
156 | for (const std::string & el : ELEMENTS) |
38 | { | ||
39 |
1/2✓ Branch 1 taken 117 times.
✗ Branch 2 not taken.
|
117 | std::string path = el + ".<xmlattr>"; |
40 |
4/6✓ Branch 1 taken 117 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 117 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 30 times.
✓ Branch 8 taken 87 times.
|
234 | if (parent.get_child_optional(path)) |
41 | { | ||
42 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | const ptree default_value = ptree(); |
43 |
3/6✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 30 times.
✗ Branch 8 not taken.
|
30 | ptree attr_parent = parent.get_child(path, default_value); |
44 |
2/4✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
|
30 | const ptree & attr_current = current.get_child(path, default_value); |
45 | // To only copy non existing attribute in current, we copy all current | ||
46 | // attribute (replacing) into a parent copy then we replace current with the new | ||
47 | // ptree | ||
48 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | copyPtree(attr_current, attr_parent); |
49 |
2/4✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
|
30 | current.put_child(path, attr_parent); |
50 | 30 | } | |
51 | 117 | } | |
52 | 39 | } | |
53 | |||
54 | 7 | static std::string getName(const ptree & el, const boost::filesystem::path & filePath) | |
55 | { | ||
56 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
14 | auto n = el.get_optional<std::string>("<xmlattr>.name"); |
57 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2 times.
|
7 | if (n) |
58 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | return *n; |
59 | else | ||
60 | { | ||
61 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
|
2 | if (filePath.extension().empty()) |
62 | ✗ | PINOCCHIO_THROW_PRETTY( | |
63 | std::invalid_argument, "Cannot find extension for one of the mesh/texture"); | ||
64 | |||
65 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | auto st = filePath.stem(); |
66 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | if (!st.empty()) |
67 |
1/2✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2 | return st.string(); |
68 | else | ||
69 | ✗ | PINOCCHIO_THROW_PRETTY( | |
70 | std::invalid_argument, "Cannot find a name for one of the mesh.texture"); | ||
71 | 2 | } | |
72 | 7 | } | |
73 | |||
74 | 7 | static boost::filesystem::path updatePath( | |
75 | bool strippath, | ||
76 | const std::string & dir, | ||
77 | const std::string & modelPath, | ||
78 | const boost::filesystem::path & filePath) | ||
79 | { | ||
80 | namespace fs = boost::filesystem; | ||
81 | |||
82 | // Check if filename still has Absolute path, like said in mujoco doc | ||
83 |
6/6✓ Branch 1 taken 2 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 6 times.
|
7 | if (filePath.is_absolute() && !strippath) |
84 | 1 | return filePath; | |
85 | else | ||
86 | { | ||
87 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | auto filename = filePath; |
88 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
|
6 | if (strippath) |
89 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | filename = filePath.filename(); |
90 | |||
91 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | fs::path meshPath(dir); |
92 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
|
6 | if (meshPath.is_absolute()) |
93 | ✗ | return (meshPath / filename); | |
94 | else | ||
95 | { | ||
96 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | fs::path mainPath(modelPath); |
97 |
3/6✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
|
12 | return (mainPath.parent_path() / meshPath / filename); |
98 | 6 | } | |
99 | 6 | } | |
100 | } | ||
101 | |||
102 | 456 | double MjcfCompiler::convertAngle(const double & angle_) const | |
103 | { | ||
104 | 456 | return angle_ * angle_converter; | |
105 | } | ||
106 | |||
107 | 2 | Eigen::Matrix3d MjcfCompiler::convertEuler(const Eigen::Vector3d & angles) const | |
108 | { | ||
109 | Eigen::Matrix3d aa1 = | ||
110 |
5/10✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
|
2 | Eigen::AngleAxisd(convertAngle(angles(0)), mapEulerAngles.col(0)).toRotationMatrix(); |
111 | Eigen::Matrix3d aa2 = | ||
112 |
5/10✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
|
2 | Eigen::AngleAxisd(convertAngle(angles(1)), mapEulerAngles.col(1)).toRotationMatrix(); |
113 | Eigen::Matrix3d aa3 = | ||
114 |
5/10✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
|
2 | Eigen::AngleAxisd(convertAngle(angles(2)), mapEulerAngles.col(2)).toRotationMatrix(); |
115 | |||
116 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
4 | return aa1 * aa2 * aa3; |
117 | } | ||
118 | |||
119 | template<int Nq, int Nv> | ||
120 | 28 | RangeJoint RangeJoint::setDimension() const | |
121 | { | ||
122 | typedef UrdfVisitor::Vector Vector; | ||
123 | 28 | const double infty = std::numeric_limits<double>::infinity(); | |
124 | |||
125 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
28 | RangeJoint ret; |
126 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | ret.maxEffort = Vector::Constant(Nv, infty); |
127 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | ret.maxVel = Vector::Constant(Nv, infty); |
128 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | ret.maxConfig = Vector::Constant(Nq, 1.01); |
129 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | ret.minConfig = Vector::Constant(Nq, -1.01); |
130 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | ret.friction = Vector::Constant(Nv, 0.); |
131 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | ret.damping = Vector::Constant(Nv, 0.); |
132 |
3/6✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
|
28 | ret.armature = Vector::Constant(Nv, armature[0]); |
133 | 28 | ret.frictionLoss = frictionLoss; | |
134 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
28 | ret.springStiffness = springStiffness; |
135 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
28 | ret.springReference = springReference; |
136 | 56 | return ret; | |
137 | } | ||
138 | |||
139 | template<int Nq, int Nv> | ||
140 | 32 | RangeJoint RangeJoint::concatenate(const RangeJoint & range) const | |
141 | { | ||
142 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
|
32 | assert(range.maxEffort.size() == Nv); |
143 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
|
32 | assert(range.minConfig.size() == Nq); |
144 | |||
145 | 32 | RangeJoint ret(*this); | |
146 |
1/2✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
|
32 | ret.maxEffort.conservativeResize(maxEffort.size() + Nv); |
147 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | ret.maxEffort.tail(Nv) = range.maxEffort; |
148 |
1/2✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
|
32 | ret.maxVel.conservativeResize(maxVel.size() + Nv); |
149 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | ret.maxVel.tail(Nv) = range.maxVel; |
150 | |||
151 |
1/2✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
|
32 | ret.minConfig.conservativeResize(minConfig.size() + Nq); |
152 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | ret.minConfig.tail(Nq) = range.minConfig; |
153 |
1/2✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
|
32 | ret.maxConfig.conservativeResize(maxConfig.size() + Nq); |
154 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | ret.maxConfig.tail(Nq) = range.maxConfig; |
155 | |||
156 |
1/2✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
|
32 | ret.damping.conservativeResize(damping.size() + Nv); |
157 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | ret.damping.tail(Nv) = range.damping; |
158 |
1/2✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
|
32 | ret.friction.conservativeResize(friction.size() + Nv); |
159 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | ret.friction.tail(Nv) = range.friction; |
160 | |||
161 |
1/2✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
|
32 | ret.springReference.conservativeResize(springReference.size() + 1); |
162 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | ret.springReference.tail(1) = range.springReference; |
163 |
1/2✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
|
32 | ret.springStiffness.conservativeResize(springStiffness.size() + 1); |
164 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | ret.springStiffness.tail(1) = range.springStiffness; |
165 | |||
166 |
1/2✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
|
32 | ret.armature.conservativeResize(armature.size() + Nv); |
167 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | ret.armature.tail(Nv) = range.armature; |
168 | |||
169 | 32 | return ret; | |
170 | } | ||
171 | |||
172 | 278 | void MjcfJoint::goThroughElement( | |
173 | const ptree & el, bool use_limits, const MjcfCompiler & currentCompiler) | ||
174 | { | ||
175 | |||
176 |
4/18✗ Branch 0 not taken.
✓ Branch 1 taken 278 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 278 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 278 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 278 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
278 | if (!use_limits && el.get_optional<std::string>("<xmlattr>.range")) |
177 | ✗ | PINOCCHIO_THROW_PRETTY( | |
178 | std::invalid_argument, "Range limit is specified but it was not specify to use it."); | ||
179 | |||
180 | // Type | ||
181 |
2/4✓ Branch 1 taken 278 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 278 times.
✗ Branch 5 not taken.
|
556 | auto type_s = el.get_optional<std::string>("<xmlattr>.type"); |
182 |
2/2✓ Branch 0 taken 66 times.
✓ Branch 1 taken 212 times.
|
278 | if (type_s) |
183 |
2/4✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 66 times.
✗ Branch 5 not taken.
|
66 | jointType = *type_s; |
184 | |||
185 | // Axis | ||
186 |
2/4✓ Branch 1 taken 278 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 278 times.
✗ Branch 5 not taken.
|
556 | auto ax = el.get_optional<std::string>("<xmlattr>.axis"); |
187 |
2/2✓ Branch 0 taken 209 times.
✓ Branch 1 taken 69 times.
|
278 | if (ax) |
188 |
2/4✓ Branch 1 taken 209 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 209 times.
✗ Branch 5 not taken.
|
209 | axis = internal::getVectorFromStream<3>(*ax); |
189 | |||
190 | // Range | ||
191 |
2/4✓ Branch 1 taken 278 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 278 times.
✗ Branch 5 not taken.
|
556 | auto range_ = el.get_optional<std::string>("<xmlattr>.range"); |
192 |
2/2✓ Branch 0 taken 222 times.
✓ Branch 1 taken 56 times.
|
278 | if (range_) |
193 | { | ||
194 |
2/4✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 222 times.
✗ Branch 5 not taken.
|
222 | Eigen::Vector2d rangeT = internal::getVectorFromStream<2>(*range_); |
195 |
3/6✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 222 times.
✗ Branch 8 not taken.
|
222 | range.minConfig[0] = currentCompiler.convertAngle(rangeT(0)); |
196 |
3/6✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 222 times.
✗ Branch 8 not taken.
|
222 | range.maxConfig[0] = currentCompiler.convertAngle(rangeT(1)); |
197 | } | ||
198 | // Effort limit | ||
199 |
2/4✓ Branch 1 taken 278 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 278 times.
✗ Branch 5 not taken.
|
278 | range_ = el.get_optional<std::string>("<xmlattr>.actuatorfrcrange"); |
200 |
2/2✓ Branch 0 taken 116 times.
✓ Branch 1 taken 162 times.
|
278 | if (range_) |
201 | { | ||
202 |
2/4✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 116 times.
✗ Branch 5 not taken.
|
116 | Eigen::Vector2d rangeT = internal::getVectorFromStream<2>(*range_); |
203 |
2/4✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 116 times.
✗ Branch 5 not taken.
|
116 | range.maxEffort[0] = rangeT(1); |
204 | } | ||
205 | |||
206 | // Spring | ||
207 |
2/4✓ Branch 1 taken 278 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 278 times.
✗ Branch 5 not taken.
|
278 | auto value = el.get_optional<double>("<xmlattr>.springref"); |
208 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 278 times.
|
278 | if (value) |
209 | ✗ | range.springReference[0] = *value; | |
210 | |||
211 | // damping | ||
212 |
2/4✓ Branch 1 taken 278 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 278 times.
✗ Branch 5 not taken.
|
278 | value = el.get_optional<double>("<xmlattr>.damping"); |
213 |
2/2✓ Branch 0 taken 106 times.
✓ Branch 1 taken 172 times.
|
278 | if (value) |
214 |
2/4✓ Branch 1 taken 106 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 106 times.
✗ Branch 5 not taken.
|
106 | range.damping[0] = *value; |
215 | |||
216 |
2/4✓ Branch 1 taken 278 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 278 times.
✗ Branch 5 not taken.
|
278 | value = el.get_optional<double>("<xmlattr>.armature"); |
217 |
2/2✓ Branch 0 taken 97 times.
✓ Branch 1 taken 181 times.
|
278 | if (value) |
218 |
2/4✓ Branch 1 taken 97 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 97 times.
✗ Branch 5 not taken.
|
97 | range.armature[0] = *value; |
219 | |||
220 | // friction loss | ||
221 |
2/4✓ Branch 1 taken 278 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 278 times.
✗ Branch 5 not taken.
|
278 | value = el.get_optional<double>("<xmlattr>.frictionloss"); |
222 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 278 times.
|
278 | if (value) |
223 | ✗ | range.frictionLoss = *value; | |
224 | |||
225 |
2/4✓ Branch 1 taken 278 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 278 times.
✗ Branch 5 not taken.
|
278 | value = el.get_optional<double>("<xmlattr>.ref"); |
226 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 272 times.
|
278 | if (value) |
227 | { | ||
228 |
2/2✓ Branch 1 taken 1 times.
✓ Branch 2 taken 5 times.
|
6 | if (jointType == "slide") |
229 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | posRef = *value; |
230 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | else if (jointType == "hinge") |
231 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | posRef = currentCompiler.convertAngle(*value); |
232 | else | ||
233 | ✗ | PINOCCHIO_THROW_PRETTY( | |
234 | std::invalid_argument, | ||
235 | "Reference position can only be used with hinge or slide joints."); | ||
236 | } | ||
237 | 278 | } | |
238 | |||
239 | 194 | void MjcfJoint::fill( | |
240 | const ptree & el, const MjcfBody & currentBody, const MjcfGraph & currentGraph) | ||
241 | { | ||
242 | 194 | bool use_limit = true; | |
243 | // Name | ||
244 |
2/4✓ Branch 1 taken 194 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 194 times.
✗ Branch 5 not taken.
|
388 | auto name_s = el.get_optional<std::string>("<xmlattr>.name"); |
245 |
2/2✓ Branch 0 taken 185 times.
✓ Branch 1 taken 9 times.
|
194 | if (name_s) |
246 |
2/4✓ Branch 1 taken 185 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 185 times.
✗ Branch 5 not taken.
|
185 | jointName = *name_s; |
247 | else | ||
248 | jointName = | ||
249 |
3/6✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
|
9 | currentBody.bodyName + "Joint_" + std::to_string(currentBody.jointChildren.size()); |
250 | |||
251 | // Check if we need to check for limited argument | ||
252 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 194 times.
|
194 | if (!currentGraph.compilerInfo.autolimits) |
253 | { | ||
254 | ✗ | use_limit = false; | |
255 | ✗ | auto use_ls = el.get_optional<std::string>("<xmlattr>.limited"); | |
256 | ✗ | use_limit = *use_ls == "true"; | |
257 | } | ||
258 | |||
259 | // Placement | ||
260 |
2/4✓ Branch 1 taken 194 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 194 times.
✗ Branch 5 not taken.
|
194 | jointPlacement = currentGraph.convertPosition(el); |
261 | |||
262 | // default < ChildClass < Class < Real Joint | ||
263 |
4/6✓ Branch 3 taken 194 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 194 times.
✗ Branch 7 not taken.
✓ Branch 11 taken 57 times.
✓ Branch 12 taken 137 times.
|
194 | if (currentGraph.mapOfClasses.find("mujoco_default") != currentGraph.mapOfClasses.end()) |
264 | { | ||
265 |
2/4✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 57 times.
✗ Branch 6 not taken.
|
57 | const MjcfClass & classD = currentGraph.mapOfClasses.at("mujoco_default"); |
266 |
4/6✓ Branch 1 taken 57 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 57 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 34 times.
✓ Branch 9 taken 23 times.
|
114 | if (auto joint_p = classD.classElement.get_child_optional("joint")) |
267 |
1/2✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
|
34 | goThroughElement(*joint_p, use_limit, currentGraph.compilerInfo); |
268 | } | ||
269 | // childClass | ||
270 |
2/2✓ Branch 1 taken 52 times.
✓ Branch 2 taken 142 times.
|
194 | if (currentBody.childClass != "") |
271 | { | ||
272 |
1/2✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
|
52 | const MjcfClass & classE = currentGraph.mapOfClasses.at(currentBody.childClass); |
273 |
4/6✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 52 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 30 times.
✓ Branch 9 taken 22 times.
|
104 | if (auto joint_p = classE.classElement.get_child_optional("joint")) |
274 |
1/2✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
|
30 | goThroughElement(*joint_p, use_limit, currentGraph.compilerInfo); |
275 | } | ||
276 | // Class | ||
277 |
2/4✓ Branch 1 taken 194 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 194 times.
✗ Branch 5 not taken.
|
388 | auto cl_s = el.get_optional<std::string>("<xmlattr>.class"); |
278 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 174 times.
|
194 | if (cl_s) |
279 | { | ||
280 |
2/4✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
|
20 | std::string className = *cl_s; |
281 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
20 | const MjcfClass & classE = currentGraph.mapOfClasses.at(className); |
282 |
3/6✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 20 times.
✗ Branch 9 not taken.
|
40 | if (auto joint_p = classE.classElement.get_child_optional("joint")) |
283 |
1/2✓ Branch 2 taken 20 times.
✗ Branch 3 not taken.
|
20 | goThroughElement(*joint_p, use_limit, currentGraph.compilerInfo); |
284 | 20 | } | |
285 | // Joint | ||
286 |
1/2✓ Branch 1 taken 194 times.
✗ Branch 2 not taken.
|
194 | goThroughElement(el, use_limit, currentGraph.compilerInfo); |
287 | 194 | } | |
288 | |||
289 | 724 | SE3 MjcfGraph::convertPosition(const ptree & el) const | |
290 | { | ||
291 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | SE3 placement; |
292 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | placement.setIdentity(); |
293 | |||
294 | // position | ||
295 |
2/4✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 724 times.
✗ Branch 5 not taken.
|
1448 | auto pos = el.get_optional<std::string>("<xmlattr>.pos"); |
296 |
2/2✓ Branch 0 taken 461 times.
✓ Branch 1 taken 263 times.
|
724 | if (pos) |
297 |
3/6✓ Branch 1 taken 461 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 461 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 461 times.
✗ Branch 8 not taken.
|
461 | placement.translation() = internal::getVectorFromStream<3>(*pos); |
298 | |||
299 | /////////// Rotation | ||
300 | // Quaternion (w, x, y, z) | ||
301 |
2/4✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 724 times.
✗ Branch 5 not taken.
|
1448 | auto rot_s = el.get_optional<std::string>("<xmlattr>.quat"); |
302 |
2/2✓ Branch 0 taken 26 times.
✓ Branch 1 taken 698 times.
|
724 | if (rot_s) |
303 | { | ||
304 |
2/4✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
|
26 | Eigen::Vector4d quat = internal::getVectorFromStream<4>(*rot_s); |
305 | |||
306 |
5/10✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 14 not taken.
|
26 | Eigen::Quaterniond quaternion(quat(0), quat(1), quat(2), quat(3)); |
307 |
1/2✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
|
26 | quaternion.normalize(); |
308 |
2/4✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
|
26 | placement.rotation() = quaternion.toRotationMatrix(); |
309 | } | ||
310 | // Axis Angle | ||
311 |
4/6✓ Branch 1 taken 698 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 698 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 697 times.
|
1396 | else if ((rot_s = el.get_optional<std::string>("<xmlattr>.axisangle"))) |
312 | { | ||
313 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | Eigen::Vector4d axis_angle = internal::getVectorFromStream<4>(*rot_s); |
314 | |||
315 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | double angle = axis_angle(3); |
316 | |||
317 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
1 | Eigen::AngleAxisd angleAxis(compilerInfo.convertAngle(angle), axis_angle.head(3)); |
318 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | placement.rotation() = angleAxis.toRotationMatrix(); |
319 | } | ||
320 | // Euler Angles | ||
321 |
4/6✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 697 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 695 times.
|
1394 | else if ((rot_s = el.get_optional<std::string>("<xmlattr>.euler"))) |
322 | { | ||
323 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | Eigen::Vector3d angles = internal::getVectorFromStream<3>(*rot_s); |
324 | |||
325 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | placement.rotation() = compilerInfo.convertEuler(angles); |
326 | } | ||
327 |
4/6✓ Branch 1 taken 695 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 695 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 15 times.
✓ Branch 10 taken 680 times.
|
1390 | else if ((rot_s = el.get_optional<std::string>("<xmlattr>.xyaxes"))) |
328 | { | ||
329 |
2/4✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
|
15 | Eigen::Matrix<double, 6, 1> xyaxes = internal::getVectorFromStream<6>(*rot_s); |
330 | |||
331 |
2/4✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
|
15 | Eigen::Vector3d xAxis = xyaxes.head(3); |
332 |
1/2✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
|
15 | xAxis.normalize(); |
333 |
2/4✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
|
15 | Eigen::Vector3d yAxis = xyaxes.tail(3); |
334 | |||
335 | // make y axis orthogonal to x axis, normalize | ||
336 |
1/2✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
|
15 | double d = xAxis.dot(yAxis); |
337 |
2/4✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
|
15 | yAxis -= xAxis * d; |
338 |
1/2✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
|
15 | yAxis.normalize(); |
339 | |||
340 |
1/2✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
|
15 | Eigen::Vector3d zAxis = xAxis.cross(yAxis); |
341 |
1/2✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
|
15 | zAxis.normalize(); |
342 | |||
343 |
1/2✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
|
15 | Eigen::Matrix3d rotation; |
344 |
2/4✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
|
15 | rotation.col(0) = xAxis; |
345 |
2/4✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
|
15 | rotation.col(1) = yAxis; |
346 |
2/4✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
|
15 | rotation.col(2) = zAxis; |
347 | |||
348 |
2/4✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
|
15 | placement.rotation() = rotation; |
349 | } | ||
350 |
4/6✓ Branch 1 taken 680 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 680 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 679 times.
|
1360 | else if ((rot_s = el.get_optional<std::string>("<xmlattr>.zaxis"))) |
351 | { | ||
352 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | Eigen::Vector3d zaxis = internal::getVectorFromStream<3>(*rot_s); |
353 | // Compute the rotation matrix that maps z_axis to unit z | ||
354 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | placement.rotation() = |
355 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
2 | Eigen::Quaterniond::FromTwoVectors(Eigen::Vector3d::UnitZ(), zaxis).toRotationMatrix(); |
356 | } | ||
357 | 1448 | return placement; | |
358 | 724 | } | |
359 | |||
360 | 179 | Inertia MjcfGraph::convertInertiaFromMjcf(const ptree & el) const | |
361 | { | ||
362 |
2/4✓ Branch 1 taken 179 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 179 times.
✗ Branch 5 not taken.
|
179 | double mass = std::max(el.get<double>("<xmlattr>.mass"), compilerInfo.boundMass); |
363 | ; | ||
364 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 179 times.
|
179 | if (mass < 0) |
365 | ✗ | PINOCCHIO_THROW_PRETTY( | |
366 | std::invalid_argument, "Mass of body is not supposed to be negative"); | ||
367 | |||
368 |
1/2✓ Branch 1 taken 179 times.
✗ Branch 2 not taken.
|
179 | Inertia::Vector3 com; |
369 |
2/4✓ Branch 1 taken 179 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 179 times.
✗ Branch 5 not taken.
|
358 | auto com_s = el.get_optional<std::string>("<xmlattr>.pos"); |
370 |
1/2✓ Branch 0 taken 179 times.
✗ Branch 1 not taken.
|
179 | if (com_s) |
371 |
2/4✓ Branch 1 taken 179 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 179 times.
✗ Branch 5 not taken.
|
179 | com = internal::getVectorFromStream<3>(*com_s); |
372 | else | ||
373 | ✗ | com = Inertia::Vector3::Zero(); | |
374 | |||
375 |
3/6✓ Branch 1 taken 179 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 179 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 179 times.
✗ Branch 8 not taken.
|
179 | const Inertia::Matrix3 R = convertPosition(el).rotation(); |
376 | |||
377 |
2/4✓ Branch 1 taken 179 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 179 times.
✗ Branch 5 not taken.
|
179 | Inertia::Matrix3 I = Eigen::Matrix3d::Identity(); |
378 | |||
379 |
2/4✓ Branch 1 taken 179 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 179 times.
✗ Branch 5 not taken.
|
358 | auto inertia_s = el.get_optional<std::string>("<xmlattr>.diaginertia"); |
380 |
2/2✓ Branch 0 taken 123 times.
✓ Branch 1 taken 56 times.
|
179 | if (inertia_s) |
381 | { | ||
382 |
2/4✓ Branch 1 taken 123 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 123 times.
✗ Branch 5 not taken.
|
123 | Eigen::Vector3d inertiaDiag = internal::getVectorFromStream<3>(*inertia_s); |
383 |
2/4✓ Branch 1 taken 123 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 123 times.
✗ Branch 5 not taken.
|
123 | I = inertiaDiag.asDiagonal(); |
384 | } | ||
385 | |||
386 |
3/6✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 56 times.
✗ Branch 10 not taken.
|
112 | else if ((inertia_s = el.get_optional<std::string>("<xmlattr>.fullinertia"))) |
387 | { | ||
388 | // M(1,1), M(2,2), M(3,3), M(1,2), M(1,3), M(2,3) | ||
389 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | std::istringstream inertiaStream = internal::getConfiguredStringStream(*inertia_s); |
390 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | inertiaStream >> I(0, 0); |
391 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | inertiaStream >> I(1, 1); |
392 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | inertiaStream >> I(2, 2); |
393 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | inertiaStream >> I(0, 1); |
394 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | inertiaStream >> I(0, 2); |
395 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | inertiaStream >> I(1, 2); |
396 | |||
397 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | I(1, 0) = I(0, 1); |
398 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | I(2, 0) = I(0, 2); |
399 |
2/4✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
|
56 | I(2, 1) = I(1, 2); |
400 | 56 | } | |
401 | |||
402 | // Extract the diagonal elements as a vector | ||
403 |
2/2✓ Branch 0 taken 537 times.
✓ Branch 1 taken 179 times.
|
716 | for (int i = 0; i < 3; i++) |
404 |
2/4✓ Branch 1 taken 537 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 537 times.
✗ Branch 6 not taken.
|
537 | I(i, i) = std::max(I(i, i), compilerInfo.boundInertia); |
405 | |||
406 |
5/10✓ Branch 1 taken 179 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 179 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 179 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 179 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 179 times.
✗ Branch 14 not taken.
|
358 | return Inertia(mass, com, R * I * R.transpose()); |
407 | 179 | } | |
408 | |||
409 | 237 | void MjcfGraph::parseJointAndBody( | |
410 | const ptree & el, | ||
411 | const boost::optional<std::string> & childClass, | ||
412 | const std::string & parentName) | ||
413 | { | ||
414 |
1/2✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
|
237 | MjcfBody currentBody; |
415 |
1/2✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
|
237 | auto chcl_s = childClass; |
416 | // if inertiafromgeom is false and inertia does not exist - throw | ||
417 |
3/6✓ Branch 2 taken 237 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 237 times.
✗ Branch 6 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 237 times.
|
237 | if (!compilerInfo.inertiafromgeom && !el.get_child_optional("inertial")) |
418 | ✗ | PINOCCHIO_THROW_PRETTY( | |
419 | std::invalid_argument, "Cannot get inertia from geom and no inertia was found"); | ||
420 | |||
421 | 237 | bool usegeominertia = false; | |
422 |
2/2✓ Branch 1 taken 16 times.
✓ Branch 2 taken 221 times.
|
237 | if (compilerInfo.inertiafromgeom) |
423 | 16 | usegeominertia = true; | |
424 | 221 | else if ( | |
425 |
8/14✓ Branch 1 taken 221 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 221 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 221 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 44 times.
✓ Branch 11 taken 177 times.
✓ Branch 12 taken 221 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 44 times.
✓ Branch 16 taken 177 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
221 | boost::indeterminate(compilerInfo.inertiafromgeom) && !el.get_child_optional("inertial")) |
426 | 44 | usegeominertia = true; | |
427 | |||
428 |
7/12✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 237 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 868 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 868 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1105 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 868 times.
✓ Branch 16 taken 237 times.
|
1105 | for (const ptree::value_type & v : el) |
429 | { | ||
430 | // Current body node | ||
431 |
2/2✓ Branch 1 taken 237 times.
✓ Branch 2 taken 631 times.
|
868 | if (v.first == "<xmlattr>") |
432 | { | ||
433 | // Name | ||
434 |
2/4✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 237 times.
✗ Branch 5 not taken.
|
474 | auto name_s = v.second.get_optional<std::string>("name"); |
435 |
1/2✓ Branch 0 taken 237 times.
✗ Branch 1 not taken.
|
237 | if (name_s) |
436 |
2/4✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 237 times.
✗ Branch 5 not taken.
|
237 | currentBody.bodyName = *name_s; |
437 | else | ||
438 | ✗ | currentBody.bodyName = parentName + "Bis"; | |
439 | |||
440 |
1/2✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
|
237 | currentBody.bodyParent = parentName; |
441 |
2/4✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 237 times.
✗ Branch 5 not taken.
|
237 | currentBody.bodyPlacement = convertPosition(el); |
442 | |||
443 |
1/2✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
|
237 | bodiesList.push_back(currentBody.bodyName); |
444 | |||
445 |
4/6✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 237 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 11 times.
✓ Branch 8 taken 226 times.
|
711 | if (auto chcl_st = v.second.get_optional<std::string>("childclass")) |
446 | { | ||
447 |
1/2✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
|
11 | chcl_s = chcl_st; |
448 |
2/4✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 11 times.
✗ Branch 5 not taken.
|
11 | currentBody.childClass = *chcl_s; |
449 | } | ||
450 |
2/2✓ Branch 0 taken 54 times.
✓ Branch 1 taken 172 times.
|
226 | else if (childClass) |
451 |
2/4✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 54 times.
✗ Branch 5 not taken.
|
237 | currentBody.childClass = *chcl_s; |
452 | |||
453 | // Class | ||
454 |
2/4✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 237 times.
✗ Branch 5 not taken.
|
474 | auto cl_s = v.second.get_optional<std::string>("class"); |
455 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 237 times.
|
237 | if (cl_s) |
456 | ✗ | currentBody.bodyClassName = *cl_s; | |
457 | |||
458 | // Still need to deal with gravcomp and figure out if we need mocap, and user param... | ||
459 | 237 | } | |
460 | // Inertia | ||
461 |
5/6✓ Branch 1 taken 177 times.
✓ Branch 2 taken 691 times.
✓ Branch 3 taken 177 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 177 times.
✓ Branch 6 taken 691 times.
|
868 | if (v.first == "inertial" && !usegeominertia) |
462 |
2/4✓ Branch 1 taken 177 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 177 times.
✗ Branch 5 not taken.
|
177 | currentBody.bodyInertia = convertInertiaFromMjcf(v.second); |
463 | |||
464 | // Geom | ||
465 |
2/2✓ Branch 1 taken 50 times.
✓ Branch 2 taken 818 times.
|
868 | if (v.first == "geom") |
466 | { | ||
467 |
1/2✓ Branch 1 taken 50 times.
✗ Branch 2 not taken.
|
50 | MjcfGeom currentGeom; |
468 |
1/2✓ Branch 1 taken 50 times.
✗ Branch 2 not taken.
|
50 | currentGeom.fill(v.second, currentBody, *this); |
469 |
1/2✓ Branch 1 taken 50 times.
✗ Branch 2 not taken.
|
50 | currentBody.geomChildren.push_back(currentGeom); |
470 | 50 | } | |
471 | |||
472 | // Joint | ||
473 |
2/2✓ Branch 1 taken 194 times.
✓ Branch 2 taken 674 times.
|
868 | if (v.first == "joint") |
474 | { | ||
475 |
1/2✓ Branch 1 taken 194 times.
✗ Branch 2 not taken.
|
194 | MjcfJoint currentJoint; |
476 |
1/2✓ Branch 1 taken 194 times.
✗ Branch 2 not taken.
|
194 | currentJoint.fill(v.second, currentBody, *this); |
477 |
1/2✓ Branch 1 taken 194 times.
✗ Branch 2 not taken.
|
194 | currentBody.jointChildren.push_back(currentJoint); |
478 | 194 | } | |
479 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 864 times.
|
868 | if (v.first == "freejoint") |
480 | { | ||
481 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | MjcfJoint currentJoint; |
482 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | currentJoint.jointType = "free"; |
483 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
8 | auto jointName = v.second.get_optional<std::string>("<xmlattr>.name"); |
484 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
|
4 | if (jointName) |
485 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | currentJoint.jointName = *jointName; |
486 | else | ||
487 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | currentJoint.jointName = currentBody.bodyName + "_free"; |
488 | |||
489 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | currentBody.jointChildren.push_back(currentJoint); |
490 | 4 | } | |
491 |
2/2✓ Branch 1 taken 2 times.
✓ Branch 2 taken 866 times.
|
868 | if (v.first == "site") |
492 | { | ||
493 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | MjcfSite currentSite; |
494 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | currentSite.fill(v.second, currentBody, *this); |
495 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | currentBody.siteChildren.push_back(currentSite); |
496 | 2 | } | |
497 |
2/2✓ Branch 1 taken 202 times.
✓ Branch 2 taken 666 times.
|
868 | if (v.first == "body") |
498 | { | ||
499 |
1/2✓ Branch 1 taken 202 times.
✗ Branch 2 not taken.
|
202 | parseJointAndBody(v.second, chcl_s, currentBody.bodyName); |
500 | } | ||
501 | } | ||
502 | // Add all geom inertias if needed | ||
503 |
2/2✓ Branch 0 taken 60 times.
✓ Branch 1 taken 177 times.
|
237 | if (usegeominertia) |
504 | { | ||
505 |
1/2✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
|
60 | Inertia inert_temp(Inertia::Zero()); |
506 |
2/2✓ Branch 5 taken 23 times.
✓ Branch 6 taken 60 times.
|
83 | for (const auto & geom : currentBody.geomChildren) |
507 | { | ||
508 |
1/2✓ Branch 0 taken 23 times.
✗ Branch 1 not taken.
|
23 | if (geom.geomKind != MjcfGeom::VISUAL) |
509 |
2/4✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
|
23 | inert_temp += geom.geomPlacement.act(geom.geomInertia); |
510 | } | ||
511 |
1/2✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
|
60 | currentBody.bodyInertia = inert_temp; |
512 | } | ||
513 |
2/4✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 237 times.
✗ Branch 5 not taken.
|
237 | mapOfBodies.insert(std::make_pair(currentBody.bodyName, currentBody)); |
514 | 237 | } | |
515 | |||
516 | 1 | void MjcfGraph::parseTexture(const ptree & el) | |
517 | { | ||
518 | namespace fs = boost::filesystem; | ||
519 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | MjcfTexture text; |
520 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | auto file = el.get_optional<std::string>("<xmlattr>.file"); |
521 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | auto name_ = el.get_optional<std::string>("<xmlattr>.name"); |
522 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | auto type = el.get_optional<std::string>("<xmlattr>.type"); |
523 | |||
524 | 1 | std::string name; | |
525 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (name_) |
526 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | name = *name_; |
527 | ✗ | else if (type && *type == "skybox") | |
528 | ✗ | name = *type; | |
529 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
|
1 | if (!file) |
530 | { | ||
531 | ✗ | std::cout << "Warning - Only texture with files are supported" << std::endl; | |
532 | ✗ | if (name.empty()) | |
533 | ✗ | PINOCCHIO_THROW_PRETTY(std::invalid_argument, "Textures need a name."); | |
534 | } | ||
535 | else | ||
536 | { | ||
537 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | fs::path filePath(*file); |
538 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | name = getName(el, filePath); |
539 | |||
540 | text.filePath = | ||
541 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | updatePath(compilerInfo.strippath, compilerInfo.texturedir, modelPath, filePath) |
542 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | .string(); |
543 | 1 | } | |
544 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | auto str_v = el.get_optional<std::string>("<xmlattr>.type"); |
545 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (str_v) |
546 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | text.textType = *str_v; |
547 | |||
548 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
|
2 | if ((str_v = el.get_optional<std::string>("<xmlattr>.gridsize"))) |
549 | ✗ | text.gridsize = internal::getVectorFromStream<2>(*str_v); | |
550 | |||
551 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | mapOfTextures.insert(std::make_pair(name, text)); |
552 | 1 | } | |
553 | |||
554 | 1 | void MjcfGraph::parseMaterial(const ptree & el) | |
555 | { | ||
556 | 1 | std::string name; | |
557 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | MjcfMaterial mat; |
558 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | auto n = el.get_optional<std::string>("<xmlattr>.name"); |
559 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (n) |
560 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | name = *n; |
561 | else | ||
562 | ✗ | PINOCCHIO_THROW_PRETTY(std::invalid_argument, "Material was given without a name"); | |
563 | |||
564 | // default < Class < Attributes | ||
565 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
|
1 | if (mapOfClasses.find("mujoco_default") != mapOfClasses.end()) |
566 | { | ||
567 | ✗ | const MjcfClass & classD = mapOfClasses.at("mujoco_default"); | |
568 | ✗ | if (auto mat_p = classD.classElement.get_child_optional("material")) | |
569 | ✗ | mat.goThroughElement(*mat_p); | |
570 | } | ||
571 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | auto cl_s = el.get_optional<std::string>("<xmlattr>.class"); |
572 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if (cl_s) |
573 | { | ||
574 | ✗ | std::string className = *cl_s; | |
575 | ✗ | const MjcfClass & classE = mapOfClasses.at(className); | |
576 | ✗ | if (auto mat_p = classE.classElement.get_child_optional("material")) | |
577 | ✗ | mat.goThroughElement(*mat_p); | |
578 | } | ||
579 | |||
580 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mat.goThroughElement(el); |
581 | |||
582 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | mapOfMaterials.insert(std::make_pair(name, mat)); |
583 | 1 | } | |
584 | |||
585 | 7 | void MjcfGraph::parseMesh(const ptree & el) | |
586 | { | ||
587 | namespace fs = boost::filesystem; | ||
588 | |||
589 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | MjcfMesh mesh; |
590 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
7 | auto file = el.get_optional<std::string>("<xmlattr>.file"); |
591 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
14 | auto scale = el.get_optional<std::string>("<xmlattr>.scale"); |
592 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
|
7 | if (scale) |
593 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | mesh.scale = internal::getVectorFromStream<3>(*scale); |
594 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
|
7 | if (file) |
595 | { | ||
596 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | fs::path filePath(*file); |
597 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | std::string name = getName(el, filePath); |
598 | |||
599 | mesh.filePath = | ||
600 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
|
6 | updatePath(compilerInfo.strippath, compilerInfo.meshdir, modelPath, filePath).string(); |
601 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | mapOfMeshes.insert(std::make_pair(name, mesh)); |
602 | 6 | return; | |
603 | 6 | } | |
604 | |||
605 | // Handle vertex-based mesh | ||
606 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | auto vertex = el.get_optional<std::string>("<xmlattr>.vertex"); |
607 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
|
1 | if (!vertex) |
608 | { | ||
609 | ✗ | PINOCCHIO_THROW_PRETTY( | |
610 | std::invalid_argument, "Only meshes with files/vertices are supported.") | ||
611 | } | ||
612 | |||
613 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | auto name = el.get_optional<std::string>("<xmlattr>.name"); |
614 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
|
1 | if (!name) |
615 | { | ||
616 | ✗ | PINOCCHIO_THROW_PRETTY( | |
617 | std::invalid_argument, "Mesh with vertices without a name is not supported"); | ||
618 | } | ||
619 | |||
620 | // Parse and validate vertices | ||
621 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | Eigen::VectorXd meshVertices = internal::getUnknownSizeVectorFromStream(*vertex); |
622 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
|
1 | if (meshVertices.size() % 3 != 0) |
623 | { | ||
624 | ✗ | PINOCCHIO_THROW_PRETTY( | |
625 | std::invalid_argument, "Number of vertices is not a multiple of 3"); | ||
626 | } | ||
627 | |||
628 | // Convert to 3D vertex matrix | ||
629 | 1 | const auto numVertices = meshVertices.size() / 3; | |
630 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Eigen::MatrixX3d vertices(numVertices, 3); |
631 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 times.
|
10 | for (auto i = 0; i < numVertices; ++i) |
632 | { | ||
633 |
4/8✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
|
9 | vertices.row(i) = meshVertices.segment<3>(3 * i).transpose(); |
634 | } | ||
635 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mesh.vertices = vertices; |
636 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
1 | mapOfMeshes.insert(std::make_pair(*name, mesh)); |
637 |
6/6✓ Branch 5 taken 1 times.
✓ Branch 6 taken 6 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 6 times.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 6 times.
|
19 | } |
638 | |||
639 | 7 | void MjcfGraph::parseAsset(const ptree & el) | |
640 | { | ||
641 |
7/12✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 9 times.
✓ Branch 16 taken 7 times.
|
16 | for (const ptree::value_type & v : el) |
642 | { | ||
643 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
|
9 | if (v.first == "mesh") |
644 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | parseMesh(v.second); |
645 | |||
646 |
2/2✓ Branch 1 taken 1 times.
✓ Branch 2 taken 8 times.
|
9 | if (v.first == "material") |
647 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | parseMaterial(v.second); |
648 | |||
649 |
2/2✓ Branch 1 taken 1 times.
✓ Branch 2 taken 8 times.
|
9 | if (v.first == "texture") |
650 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | parseTexture(v.second); |
651 | |||
652 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
|
9 | if (v.first == "hfield") |
653 | ✗ | PINOCCHIO_THROW_PRETTY(std::invalid_argument, "hfields are not supported yet"); | |
654 | } | ||
655 | 7 | } | |
656 | |||
657 | 43 | void MjcfGraph::parseDefault(ptree & el, const ptree & parent, const std::string & parentTag) | |
658 | { | ||
659 | 43 | boost::optional<std::string> nameClass; | |
660 | // Classes | ||
661 |
7/12✓ Branch 1 taken 43 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 43 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 116 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 116 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 159 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 116 times.
✓ Branch 16 taken 43 times.
|
159 | for (ptree::value_type & v : el) |
662 | { | ||
663 |
2/2✓ Branch 1 taken 39 times.
✓ Branch 2 taken 77 times.
|
116 | if (v.first == "<xmlattr>") |
664 | { | ||
665 |
2/4✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
|
39 | nameClass = v.second.get_optional<std::string>("class"); |
666 |
1/2✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
|
39 | if (nameClass) |
667 | { | ||
668 |
1/2✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
|
39 | MjcfClass classDefault; |
669 |
2/4✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
|
39 | classDefault.className = *nameClass; |
670 |
1/2✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
|
39 | updateClassElement(el, parent); |
671 |
1/2✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
|
39 | classDefault.classElement = el; |
672 |
3/6✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39 times.
✗ Branch 8 not taken.
|
39 | mapOfClasses.insert(std::make_pair(*nameClass, classDefault)); |
673 | 39 | } | |
674 | else | ||
675 | ✗ | PINOCCHIO_THROW_PRETTY( | |
676 | std::invalid_argument, "Class does not have a name. Cannot parse model."); | ||
677 | } | ||
678 |
2/2✓ Branch 1 taken 29 times.
✓ Branch 2 taken 48 times.
|
77 | else if (v.first == "default") |
679 |
1/2✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
|
29 | parseDefault(v.second, el, v.first); |
680 |
5/6✓ Branch 1 taken 14 times.
✓ Branch 2 taken 34 times.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 14 times.
✓ Branch 7 taken 34 times.
|
48 | else if (parentTag == "mujoco" && v.first != "<xmlattr>") |
681 | { | ||
682 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
14 | MjcfClass classDefault; |
683 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
14 | classDefault.className = "mujoco_default"; |
684 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
14 | classDefault.classElement = el; |
685 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
14 | mapOfClasses.insert(std::make_pair("mujoco_default", classDefault)); |
686 | 14 | } | |
687 | } | ||
688 | 43 | } | |
689 | |||
690 | 16 | void MjcfGraph::parseCompiler(const ptree & el) | |
691 | { | ||
692 | // get autolimits | ||
693 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | auto auto_s = el.get_optional<std::string>("<xmlattr>.autolimits"); |
694 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 11 times.
|
16 | if (auto_s) |
695 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | if (*auto_s == "true") |
696 | 5 | compilerInfo.autolimits = true; | |
697 | |||
698 | // strip path | ||
699 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | auto strip_s = el.get_optional<std::string>("<xmlattr>.strippath"); |
700 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 15 times.
|
16 | if (strip_s) |
701 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | if (*strip_s == "true") |
702 | 1 | compilerInfo.strippath = true; | |
703 | |||
704 | // get dir to mesh and texture | ||
705 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | auto dir = el.get_optional<std::string>("<xmlattr>.assetdir"); |
706 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
|
16 | if (dir) |
707 | { | ||
708 | ✗ | compilerInfo.meshdir = *dir; | |
709 | ✗ | compilerInfo.texturedir = *dir; | |
710 | } | ||
711 | |||
712 |
4/6✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 7 times.
✓ Branch 10 taken 9 times.
|
32 | if ((dir = el.get_optional<std::string>("<xmlattr>.meshdir"))) |
713 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
7 | compilerInfo.meshdir = *dir; |
714 | |||
715 |
4/6✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 3 times.
✓ Branch 10 taken 13 times.
|
32 | if ((dir = el.get_optional<std::string>("<xmlattr>.texturedir"))) |
716 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
3 | compilerInfo.texturedir = *dir; |
717 | |||
718 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
16 | auto value_v = el.get_optional<double>("<xmlattr>.boundmass"); |
719 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
|
16 | if (value_v) |
720 | ✗ | compilerInfo.boundMass = *value_v; | |
721 | |||
722 |
3/6✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 16 times.
|
32 | if ((value_v = el.get_optional<double>("<xmlattr>.boundinertia"))) |
723 | ✗ | compilerInfo.boundInertia = *value_v; | |
724 | |||
725 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | auto in_g = el.get_optional<std::string>("<xmlattr>.inertiafromgeom"); |
726 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 12 times.
|
16 | if (in_g) |
727 | { | ||
728 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | if (*in_g == "true") |
729 | 4 | compilerInfo.inertiafromgeom = true; | |
730 | ✗ | else if (*in_g == "false") | |
731 | ✗ | compilerInfo.inertiafromgeom = false; | |
732 | } | ||
733 | |||
734 | // angle radian or degree | ||
735 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | auto angle_s = el.get_optional<std::string>("<xmlattr>.angle"); |
736 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 7 times.
|
16 | if (angle_s) |
737 |
2/4✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
|
9 | if (*angle_s == "radian") |
738 | 9 | compilerInfo.angle_converter = 1; | |
739 | |||
740 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
32 | auto eulerS = el.get_optional<std::string>("<xmlattr>.eulerseq"); |
741 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 14 times.
|
16 | if (eulerS) |
742 | { | ||
743 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | std::string eulerseq = *eulerS; |
744 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2 | if (eulerseq.find_first_not_of("xyzXYZ") != std::string::npos || eulerseq.size() != 3) |
745 | { | ||
746 | ✗ | PINOCCHIO_THROW_PRETTY( | |
747 | std::invalid_argument, "Model tried to use euler angles but euler sequence is wrong"); | ||
748 | } | ||
749 | else | ||
750 | { | ||
751 | // get index combination | ||
752 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
|
8 | for (std::size_t i = 0; i < eulerseq.size(); i++) |
753 | { | ||
754 | 6 | auto ci = static_cast<Eigen::Index>(i); | |
755 |
4/9✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
6 | switch (eulerseq[i]) |
756 | { | ||
757 | 2 | case 'x': | |
758 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
2 | compilerInfo.mapEulerAngles.col(ci) = Eigen::Vector3d::UnitX(); |
759 | 2 | break; | |
760 | ✗ | case 'X': | |
761 | ✗ | compilerInfo.mapEulerAngles.col(ci) = Eigen::Vector3d::UnitX(); | |
762 | ✗ | break; | |
763 | 2 | case 'y': | |
764 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
2 | compilerInfo.mapEulerAngles.col(ci) = Eigen::Vector3d::UnitY(); |
765 | 2 | break; | |
766 | ✗ | case 'Y': | |
767 | ✗ | compilerInfo.mapEulerAngles.col(ci) = Eigen::Vector3d::UnitY(); | |
768 | ✗ | break; | |
769 | 2 | case 'z': | |
770 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
2 | compilerInfo.mapEulerAngles.col(ci) = Eigen::Vector3d::UnitZ(); |
771 | 2 | break; | |
772 | ✗ | case 'Z': | |
773 | ✗ | compilerInfo.mapEulerAngles.col(ci) = Eigen::Vector3d::UnitZ(); | |
774 | ✗ | break; | |
775 | ✗ | default: | |
776 | ✗ | PINOCCHIO_THROW_PRETTY(std::invalid_argument, "Euler Axis does not exist"); | |
777 | break; | ||
778 | } | ||
779 | } | ||
780 | } | ||
781 | 2 | } | |
782 | 16 | } | |
783 | |||
784 | 3 | void MjcfGraph::parseKeyFrame(const ptree & el) | |
785 | { | ||
786 |
7/12✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✓ Branch 16 taken 3 times.
|
6 | for (const ptree::value_type & v : el) |
787 | { | ||
788 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | if (v.first == "key") |
789 | { | ||
790 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
6 | auto nameKey = v.second.get_optional<std::string>("<xmlattr>.name"); |
791 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | if (nameKey) |
792 | { | ||
793 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
6 | auto configVectorS = v.second.get_optional<std::string>("<xmlattr>.qpos"); |
794 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | if (configVectorS) |
795 | { | ||
796 | Eigen::VectorXd configVector = | ||
797 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
3 | internal::getUnknownSizeVectorFromStream(*configVectorS); |
798 |
3/6✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
3 | mapOfConfigs.insert(std::make_pair(*nameKey, configVector)); |
799 | 3 | } | |
800 | 3 | } | |
801 | 3 | } | |
802 | } | ||
803 | 3 | } | |
804 | |||
805 | 11 | void MjcfGraph::parseEquality(const ptree & el) | |
806 | { | ||
807 |
7/12✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 11 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 24 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 35 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 24 times.
✓ Branch 16 taken 11 times.
|
35 | for (const ptree::value_type & v : el) |
808 | { | ||
809 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | std::string type = v.first; |
810 | // List of supported constraints from mjcf description | ||
811 | // equality -> connect | ||
812 | |||
813 | // The constraints below are not supported and will be ignored with the following | ||
814 | // warning: joint, flex, distance, weld | ||
815 |
2/2✓ Branch 1 taken 10 times.
✓ Branch 2 taken 14 times.
|
24 | if (type != "connect") |
816 | { | ||
817 | // TODO(jcarpent): support extra constraint types such as joint, flex, distance, weld. | ||
818 | 10 | continue; | |
819 | } | ||
820 | |||
821 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
14 | MjcfEquality eq; |
822 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
14 | eq.type = type; |
823 | |||
824 | // get the name of first body | ||
825 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | auto body1 = v.second.get_optional<std::string>("<xmlattr>.body1"); |
826 |
1/2✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
|
14 | if (body1) |
827 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
14 | eq.body1 = *body1; |
828 | else | ||
829 | ✗ | PINOCCHIO_THROW_PRETTY(std::invalid_argument, "Equality constraint needs a first body"); | |
830 | |||
831 | // get the name of second body | ||
832 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | auto body2 = v.second.get_optional<std::string>("<xmlattr>.body2"); |
833 |
1/2✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
|
14 | if (body2) |
834 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
14 | eq.body2 = *body2; |
835 | |||
836 | // get the name of the constraint (if it exists) | ||
837 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | auto name = v.second.get_optional<std::string>("<xmlattr>.name"); |
838 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
|
14 | if (name) |
839 | ✗ | eq.name = *name; | |
840 | else | ||
841 |
3/6✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
|
14 | eq.name = eq.body1 + "_" + eq.body2 + "_constraint"; |
842 | |||
843 | // get the anchor position | ||
844 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
28 | auto anchor = v.second.get_optional<std::string>("<xmlattr>.anchor"); |
845 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 10 times.
|
14 | if (anchor) |
846 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | eq.anchor = internal::getVectorFromStream<3>(*anchor); |
847 | |||
848 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
14 | mapOfEqualities.insert(std::make_pair(eq.name, eq)); |
849 |
2/2✓ Branch 6 taken 14 times.
✓ Branch 7 taken 10 times.
|
24 | } |
850 | 11 | } | |
851 | |||
852 | 38 | void MjcfGraph::parseGraph() | |
853 | { | ||
854 |
1/2✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
|
38 | boost::property_tree::ptree el; |
855 |
3/6✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 38 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 38 times.
✗ Branch 8 not taken.
|
76 | if (pt.get_child_optional("mujoco")) |
856 |
3/6✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 38 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 38 times.
✗ Branch 8 not taken.
|
38 | el = pt.get_child("mujoco"); |
857 | else | ||
858 | ✗ | PINOCCHIO_THROW_PRETTY( | |
859 | std::invalid_argument, "This is not a standard mujoco model. Cannot parse it."); | ||
860 | |||
861 |
7/12✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 38 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 125 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 125 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 163 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 125 times.
✓ Branch 16 taken 38 times.
|
163 | for (const ptree::value_type & v : el) |
862 | { | ||
863 | // get model name | ||
864 |
2/2✓ Branch 1 taken 38 times.
✓ Branch 2 taken 87 times.
|
125 | if (v.first == "<xmlattr>") |
865 | { | ||
866 |
2/4✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 38 times.
✗ Branch 5 not taken.
|
76 | auto n_s = v.second.get_optional<std::string>("model"); |
867 |
1/2✓ Branch 0 taken 38 times.
✗ Branch 1 not taken.
|
38 | if (n_s) |
868 |
2/4✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 38 times.
✗ Branch 5 not taken.
|
38 | modelName = *n_s; |
869 | else | ||
870 | ✗ | PINOCCHIO_THROW_PRETTY( | |
871 | std::invalid_argument, "Model is missing a name. Cannot parse it"); | ||
872 | 38 | } | |
873 | |||
874 |
2/2✓ Branch 1 taken 15 times.
✓ Branch 2 taken 110 times.
|
125 | if (v.first == "compiler") |
875 |
3/6✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 8 not taken.
|
15 | parseCompiler(el.get_child("compiler")); |
876 | |||
877 |
2/2✓ Branch 1 taken 13 times.
✓ Branch 2 taken 112 times.
|
125 | if (v.first == "default") |
878 |
4/8✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 13 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
|
13 | parseDefault(el.get_child("default"), el, "mujoco"); |
879 | |||
880 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 118 times.
|
125 | if (v.first == "asset") |
881 |
3/6✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
|
7 | parseAsset(el.get_child("asset")); |
882 | |||
883 |
2/2✓ Branch 1 taken 3 times.
✓ Branch 2 taken 122 times.
|
125 | if (v.first == "keyframe") |
884 |
3/6✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
3 | parseKeyFrame(el.get_child("keyframe")); |
885 | |||
886 |
2/2✓ Branch 1 taken 35 times.
✓ Branch 2 taken 90 times.
|
125 | if (v.first == "worldbody") |
887 | { | ||
888 | 35 | boost::optional<std::string> childClass; | |
889 |
6/12✓ Branch 2 taken 35 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 35 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 35 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 35 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 35 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 35 times.
✗ Branch 18 not taken.
|
35 | parseJointAndBody(el.get_child("worldbody").get_child("body"), childClass); |
890 | 35 | } | |
891 | |||
892 |
2/2✓ Branch 1 taken 11 times.
✓ Branch 2 taken 114 times.
|
125 | if (v.first == "equality") |
893 | { | ||
894 |
3/6✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 11 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 11 times.
✗ Branch 8 not taken.
|
11 | parseEquality(el.get_child("equality")); |
895 | } | ||
896 | } | ||
897 | 38 | } | |
898 | |||
899 | 38 | void MjcfGraph::parseGraphFromXML(const std::string & xmlStr) | |
900 | { | ||
901 |
1/2✓ Branch 2 taken 38 times.
✗ Branch 3 not taken.
|
38 | boost::property_tree::read_xml(xmlStr, pt); |
902 | 38 | parseGraph(); | |
903 | 38 | } | |
904 | |||
905 | template<typename TypeX, typename TypeY, typename TypeZ, typename TypeUnaligned> | ||
906 | 30 | JointModel MjcfGraph::createJoint(const Eigen::Vector3d & axis) | |
907 | { | ||
908 |
4/6✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 9 times.
|
30 | if (axis.isApprox(Eigen::Vector3d::UnitX())) |
909 |
1/2✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
|
24 | return TypeX(); |
910 |
4/6✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 5 times.
|
18 | else if (axis.isApprox(Eigen::Vector3d::UnitY())) |
911 |
1/2✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
|
16 | return TypeY(); |
912 |
3/6✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
|
10 | else if (axis.isApprox(Eigen::Vector3d::UnitZ())) |
913 |
1/2✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
|
20 | return TypeZ(); |
914 | else | ||
915 | ✗ | return TypeUnaligned(axis.normalized()); | |
916 | } | ||
917 | |||
918 | 164 | void MjcfGraph::addSoloJoint( | |
919 | const MjcfJoint & joint, const MjcfBody & currentBody, SE3 & bodyInJoint) | ||
920 | { | ||
921 | |||
922 | 164 | FrameIndex parentFrameId = 0; | |
923 |
2/2✓ Branch 1 taken 161 times.
✓ Branch 2 taken 3 times.
|
164 | if (!currentBody.bodyParent.empty()) |
924 |
1/2✓ Branch 1 taken 161 times.
✗ Branch 2 not taken.
|
161 | parentFrameId = urdfVisitor.getBodyId(currentBody.bodyParent); |
925 | |||
926 | // get body pose in body parent | ||
927 |
1/2✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
|
164 | const SE3 bodyPose = currentBody.bodyPlacement; |
928 |
1/2✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
|
164 | Inertia inert = currentBody.bodyInertia; |
929 |
1/2✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
|
164 | SE3 jointInParent = bodyPose * joint.jointPlacement; |
930 |
2/4✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 164 times.
✗ Branch 5 not taken.
|
164 | bodyInJoint = joint.jointPlacement.inverse(); |
931 | UrdfVisitor::JointType jType; | ||
932 | |||
933 |
1/2✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
|
164 | RangeJoint range; |
934 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 160 times.
|
164 | if (joint.jointType == "free") |
935 | { | ||
936 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | urdfVisitor << "Free Joint " << '\n'; |
937 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | range = joint.range.setDimension<7, 6>(); |
938 | 4 | jType = UrdfVisitor::FLOATING; | |
939 | } | ||
940 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 154 times.
|
160 | else if (joint.jointType == "slide") |
941 | { | ||
942 |
3/6✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
|
6 | urdfVisitor << "joint prismatic with axis " << joint.axis << '\n'; |
943 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | range = joint.range; |
944 | 6 | jType = UrdfVisitor::PRISMATIC; | |
945 | } | ||
946 |
2/2✓ Branch 1 taken 9 times.
✓ Branch 2 taken 145 times.
|
154 | else if (joint.jointType == "ball") |
947 | { | ||
948 |
2/4✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
|
9 | urdfVisitor << "Sphere Joint " << '\n'; |
949 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
9 | range = joint.range.setDimension<4, 3>(); |
950 | 9 | jType = UrdfVisitor::SPHERICAL; | |
951 | } | ||
952 |
1/2✓ Branch 1 taken 145 times.
✗ Branch 2 not taken.
|
145 | else if (joint.jointType == "hinge") |
953 | { | ||
954 |
3/6✓ Branch 1 taken 145 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 145 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 145 times.
✗ Branch 8 not taken.
|
145 | urdfVisitor << "joint revolute with axis " << joint.axis << '\n'; |
955 |
1/2✓ Branch 1 taken 145 times.
✗ Branch 2 not taken.
|
145 | range = joint.range; |
956 | 145 | jType = UrdfVisitor::REVOLUTE; | |
957 | } | ||
958 | else | ||
959 | ✗ | PINOCCHIO_THROW_PRETTY(std::invalid_argument, "Unknown joint type"); | |
960 | |||
961 |
6/12✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 164 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 164 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 164 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 164 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 164 times.
✗ Branch 17 not taken.
|
328 | urdfVisitor.addJointAndBody( |
962 | 164 | jType, joint.axis, parentFrameId, jointInParent, joint.jointName, inert, bodyInJoint, | |
963 |
1/2✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
|
164 | currentBody.bodyName, range.maxEffort, range.maxVel, range.minConfig, range.maxConfig, |
964 | range.friction, range.damping); | ||
965 | |||
966 | // Add armature info | ||
967 |
1/2✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
|
164 | JointIndex j_id = urdfVisitor.getJointId(joint.jointName); |
968 |
1/2✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
|
164 | urdfVisitor.model.armature.segment( |
969 |
2/4✓ Branch 3 taken 164 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 164 times.
✗ Branch 7 not taken.
|
328 | urdfVisitor.model.joints[j_id].idx_v(), urdfVisitor.model.joints[j_id].nv()) = |
970 |
1/2✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
|
164 | range.armature; |
971 | 164 | } | |
972 | |||
973 | 203 | void MjcfGraph::fillModel(const std::string & nameOfBody) | |
974 | { | ||
975 | typedef UrdfVisitor::SE3 SE3; | ||
976 | |||
977 |
2/4✓ Branch 1 taken 203 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 203 times.
✗ Branch 5 not taken.
|
203 | MjcfBody currentBody = mapOfBodies.at(nameOfBody); |
978 | |||
979 | // get parent body frame | ||
980 | 203 | FrameIndex parentFrameId = 0; | |
981 |
2/2✓ Branch 1 taken 176 times.
✓ Branch 2 taken 27 times.
|
203 | if (!currentBody.bodyParent.empty()) |
982 |
1/2✓ Branch 1 taken 176 times.
✗ Branch 2 not taken.
|
176 | parentFrameId = urdfVisitor.getBodyId(currentBody.bodyParent); |
983 | |||
984 |
1/2✓ Branch 2 taken 203 times.
✗ Branch 3 not taken.
|
203 | Frame frame = urdfVisitor.model.frames[parentFrameId]; |
985 | // get body pose in body parent | ||
986 |
1/2✓ Branch 1 taken 203 times.
✗ Branch 2 not taken.
|
203 | const SE3 bodyPose = currentBody.bodyPlacement; |
987 |
1/2✓ Branch 1 taken 203 times.
✗ Branch 2 not taken.
|
203 | Inertia inert = currentBody.bodyInertia; |
988 | |||
989 | // Fixed Joint | ||
990 |
2/2✓ Branch 1 taken 32 times.
✓ Branch 2 taken 171 times.
|
203 | if (currentBody.jointChildren.size() == 0) |
991 | { | ||
992 |
2/2✓ Branch 1 taken 24 times.
✓ Branch 2 taken 8 times.
|
32 | if (currentBody.bodyParent.empty()) |
993 | 24 | return; | |
994 | |||
995 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | std::string jointName = nameOfBody + "_fixed"; |
996 |
3/6✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
|
8 | urdfVisitor << jointName << " being parsed." << '\n'; |
997 | |||
998 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | urdfVisitor.addFixedJointAndBody(parentFrameId, bodyPose, jointName, inert, nameOfBody); |
999 | 8 | return; | |
1000 | 8 | } | |
1001 | |||
1002 | 171 | bool composite = false; | |
1003 |
3/6✓ Branch 1 taken 171 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 171 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 171 times.
✗ Branch 8 not taken.
|
171 | SE3 jointPlacement, firstJointPlacement, prevJointPlacement = SE3::Identity(); |
1004 | |||
1005 |
1/2✓ Branch 1 taken 171 times.
✗ Branch 2 not taken.
|
171 | RangeJoint rangeCompo; |
1006 |
1/2✓ Branch 1 taken 171 times.
✗ Branch 2 not taken.
|
171 | JointModelComposite jointM; |
1007 | 171 | std::string jointName; | |
1008 | |||
1009 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 164 times.
|
171 | if (currentBody.jointChildren.size() > 1) |
1010 | { | ||
1011 | 7 | composite = true; | |
1012 | |||
1013 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
7 | MjcfJoint firstOne = currentBody.jointChildren.at(0); |
1014 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | jointName = "Composite_" + firstOne.jointName; |
1015 | 7 | } | |
1016 | |||
1017 |
1/2✓ Branch 1 taken 171 times.
✗ Branch 2 not taken.
|
171 | fillReferenceConfig(currentBody); |
1018 | |||
1019 | 171 | bool isFirst = true; | |
1020 |
1/2✓ Branch 1 taken 171 times.
✗ Branch 2 not taken.
|
171 | SE3 bodyInJoint; |
1021 | |||
1022 |
2/2✓ Branch 0 taken 164 times.
✓ Branch 1 taken 7 times.
|
171 | if (!composite) |
1023 | { | ||
1024 |
2/4✓ Branch 1 taken 164 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 164 times.
✗ Branch 5 not taken.
|
164 | addSoloJoint(currentBody.jointChildren.at(0), currentBody, bodyInJoint); |
1025 | } | ||
1026 | else | ||
1027 | { | ||
1028 |
2/2✓ Branch 5 taken 16 times.
✓ Branch 6 taken 7 times.
|
23 | for (const auto & joint : currentBody.jointChildren) |
1029 | { | ||
1030 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
|
16 | if (joint.jointType == "free") |
1031 | ✗ | PINOCCHIO_THROW_PRETTY( | |
1032 | std::invalid_argument, "Joint Composite trying to be created with a freeFlyer"); | ||
1033 | |||
1034 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | SE3 jointInParent = bodyPose * joint.jointPlacement; |
1035 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
16 | bodyInJoint = joint.jointPlacement.inverse(); |
1036 |
2/2✓ Branch 0 taken 7 times.
✓ Branch 1 taken 9 times.
|
16 | if (isFirst) |
1037 | { | ||
1038 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | firstJointPlacement = jointInParent; |
1039 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
7 | jointPlacement = SE3::Identity(); |
1040 | 7 | isFirst = false; | |
1041 | } | ||
1042 | else | ||
1043 |
3/6✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
|
9 | jointPlacement = prevJointPlacement.inverse() * jointInParent; |
1044 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 10 times.
|
16 | if (joint.jointType == "slide") |
1045 | { | ||
1046 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | jointM.addJoint( |
1047 | 6 | createJoint<JointModelPX, JointModelPY, JointModelPZ, JointModelPrismaticUnaligned>( | |
1048 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | joint.axis), |
1049 | jointPlacement); | ||
1050 | |||
1051 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | rangeCompo = rangeCompo.concatenate<1, 1>(joint.range); |
1052 | } | ||
1053 |
2/2✓ Branch 1 taken 1 times.
✓ Branch 2 taken 9 times.
|
10 | else if (joint.jointType == "ball") |
1054 | { | ||
1055 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | jointM.addJoint(JointModelSpherical(), jointPlacement); |
1056 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | rangeCompo = rangeCompo.concatenate<4, 3>(joint.range.setDimension<4, 3>()); |
1057 | } | ||
1058 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
9 | else if (joint.jointType == "hinge") |
1059 | { | ||
1060 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
9 | jointM.addJoint( |
1061 | 9 | createJoint<JointModelRX, JointModelRY, JointModelRZ, JointModelRevoluteUnaligned>( | |
1062 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
9 | joint.axis), |
1063 | jointPlacement); | ||
1064 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
9 | rangeCompo = rangeCompo.concatenate<1, 1>(joint.range); |
1065 | } | ||
1066 | else | ||
1067 | ✗ | PINOCCHIO_THROW_PRETTY( | |
1068 | std::invalid_argument, "Unknown joint type trying to be parsed."); | ||
1069 | |||
1070 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | prevJointPlacement = jointInParent; |
1071 | } | ||
1072 | JointIndex joint_id; | ||
1073 | |||
1074 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
7 | joint_id = urdfVisitor.model.addJoint( |
1075 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | frame.parentJoint, jointM, frame.placement * firstJointPlacement, jointName, |
1076 | rangeCompo.maxEffort, rangeCompo.maxVel, rangeCompo.minConfig, rangeCompo.maxConfig, | ||
1077 | rangeCompo.friction, rangeCompo.damping); | ||
1078 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | FrameIndex jointFrameId = urdfVisitor.model.addJointFrame(joint_id, (int)parentFrameId); |
1079 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | urdfVisitor.appendBodyToJoint(jointFrameId, inert, bodyInJoint, nameOfBody); |
1080 | |||
1081 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
14 | urdfVisitor.model.armature.segment( |
1082 |
2/4✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
|
14 | urdfVisitor.model.joints[joint_id].idx_v(), urdfVisitor.model.joints[joint_id].nv()) = |
1083 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | rangeCompo.armature; |
1084 | } | ||
1085 | |||
1086 |
1/2✓ Branch 1 taken 171 times.
✗ Branch 2 not taken.
|
171 | FrameIndex bodyId = urdfVisitor.model.getFrameId(nameOfBody, BODY); |
1087 |
1/2✓ Branch 2 taken 171 times.
✗ Branch 3 not taken.
|
171 | frame = urdfVisitor.model.frames[bodyId]; |
1088 |
2/2✓ Branch 4 taken 2 times.
✓ Branch 5 taken 171 times.
|
173 | for (const auto & site : currentBody.siteChildren) |
1089 | { | ||
1090 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | SE3 placement = bodyInJoint * site.sitePlacement; |
1091 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | urdfVisitor.model.addFrame( |
1092 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | Frame(site.siteName, frame.parentJoint, bodyId, placement, OP_FRAME)); |
1093 | } | ||
1094 |
4/4✓ Branch 4 taken 171 times.
✓ Branch 5 taken 32 times.
✓ Branch 7 taken 171 times.
✓ Branch 8 taken 32 times.
|
235 | } |
1095 | |||
1096 | 198 | void MjcfGraph::fillReferenceConfig(const MjcfBody & currentBody) | |
1097 | { | ||
1098 |
2/2✓ Branch 5 taken 183 times.
✓ Branch 6 taken 198 times.
|
381 | for (const auto & joint : currentBody.jointChildren) |
1099 | { | ||
1100 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 176 times.
|
183 | if (joint.jointType == "free") |
1101 | { | ||
1102 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | referenceConfig.conservativeResize(referenceConfig.size() + 7); |
1103 |
3/6✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
|
7 | referenceConfig.tail(7) << Eigen::Matrix<double, 7, 1>::Zero(); |
1104 | } | ||
1105 |
2/2✓ Branch 1 taken 10 times.
✓ Branch 2 taken 166 times.
|
176 | else if (joint.jointType == "ball") |
1106 | { | ||
1107 |
1/2✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
10 | referenceConfig.conservativeResize(referenceConfig.size() + 4); |
1108 |
3/6✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
|
10 | referenceConfig.tail(4) << Eigen::Vector4d::Zero(); |
1109 | } | ||
1110 |
4/6✓ Branch 1 taken 154 times.
✓ Branch 2 taken 12 times.
✓ Branch 4 taken 154 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 166 times.
✗ Branch 7 not taken.
|
166 | else if (joint.jointType == "slide" || joint.jointType == "hinge") |
1111 | { | ||
1112 |
1/2✓ Branch 2 taken 166 times.
✗ Branch 3 not taken.
|
166 | referenceConfig.conservativeResize(referenceConfig.size() + 1); |
1113 |
2/4✓ Branch 1 taken 166 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 166 times.
✗ Branch 5 not taken.
|
166 | referenceConfig.tail(1) << joint.posRef; |
1114 | } | ||
1115 | } | ||
1116 | 198 | } | |
1117 | |||
1118 | 3 | void MjcfGraph::addKeyFrame(const Eigen::VectorXd & keyframe, const std::string & keyName) | |
1119 | { | ||
1120 | // Check config vectors and add them if size is right | ||
1121 | 3 | const int model_nq = urdfVisitor.model.nq; | |
1122 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | if (keyframe.size() == model_nq) |
1123 | { | ||
1124 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | Eigen::VectorXd qpos(model_nq); |
1125 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 3 times.
|
9 | for (std::size_t i = 1; i < urdfVisitor.model.joints.size(); i++) |
1126 | { | ||
1127 | 6 | const auto & joint = urdfVisitor.model.joints[i]; | |
1128 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | int idx_q = joint.idx_q(); |
1129 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | int nq = joint.nq(); |
1130 | |||
1131 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | Eigen::VectorXd qpos_j = keyframe.segment(idx_q, nq); |
1132 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | Eigen::VectorXd q_ref = referenceConfig.segment(idx_q, nq); |
1133 |
3/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 5 times.
|
6 | if (joint.shortname() == "JointModelFreeFlyer") |
1134 | { | ||
1135 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
1 | Eigen::Vector4d new_quat(qpos_j(4), qpos_j(5), qpos_j(6), qpos_j(3)); |
1136 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | qpos_j.tail(4) = new_quat; |
1137 | } | ||
1138 |
3/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 4 times.
|
5 | else if (joint.shortname() == "JointModelSpherical") |
1139 | { | ||
1140 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
1 | Eigen::Vector4d new_quat(qpos_j(1), qpos_j(2), qpos_j(3), qpos_j(0)); |
1141 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | qpos_j = new_quat; |
1142 | } | ||
1143 |
3/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 3 times.
|
4 | else if (joint.shortname() == "JointModelComposite") |
1144 | { | ||
1145 |
3/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 1 times.
|
3 | for (const auto & joint_ : boost::get<JointModelComposite>(joint.toVariant()).joints) |
1146 | { | ||
1147 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | int idx_q_ = joint_.idx_q() - idx_q; |
1148 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | int nq_ = joint_.nq(); |
1149 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
|
2 | if (joint_.shortname() == "JointModelSpherical") |
1150 | { | ||
1151 | Eigen::Vector4d new_quat( | ||
1152 | ✗ | qpos_j(idx_q_ + 1), qpos_j(idx_q_ + 2), qpos_j(idx_q_ + 3), qpos_j(idx_q_)); | |
1153 | ✗ | qpos_j.segment(idx_q_, nq_) = new_quat; | |
1154 | } | ||
1155 | else | ||
1156 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
2 | qpos_j.segment(idx_q_, nq_) -= q_ref.segment(idx_q_, nq_); |
1157 | } | ||
1158 | } | ||
1159 | else | ||
1160 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | qpos_j -= q_ref; |
1161 | |||
1162 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | qpos.segment(idx_q, nq) = qpos_j; |
1163 | 6 | } | |
1164 | |||
1165 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
3 | urdfVisitor.model.referenceConfigurations.insert(std::make_pair(keyName, qpos)); |
1166 | 3 | } | |
1167 | else | ||
1168 | ✗ | PINOCCHIO_THROW_PRETTY(std::invalid_argument, "Keyframe size does not match model size"); | |
1169 | 3 | } | |
1170 | |||
1171 | 16 | void MjcfGraph::parseContactInformation( | |
1172 | const Model & model, | ||
1173 | PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATOR(RigidConstraintModel) & contact_models) | ||
1174 | { | ||
1175 |
2/2✓ Branch 5 taken 8 times.
✓ Branch 6 taken 16 times.
|
24 | for (const auto & entry : mapOfEqualities) |
1176 | { | ||
1177 | 8 | const MjcfEquality & eq = entry.second; | |
1178 | |||
1179 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | SE3 jointPlacement; |
1180 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | jointPlacement.setIdentity(); |
1181 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
8 | jointPlacement.translation() = eq.anchor; |
1182 | |||
1183 | // Get Joint Indices from the model | ||
1184 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | const JointIndex body1 = urdfVisitor.getParentId(eq.body1); |
1185 | |||
1186 | // when body2 is not specified, we link to the world | ||
1187 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
|
8 | if (eq.body2 == "") |
1188 | { | ||
1189 | ✗ | RigidConstraintModel rcm(CONTACT_3D, model, body1, jointPlacement, LOCAL); | |
1190 | ✗ | contact_models.push_back(rcm); | |
1191 | } | ||
1192 | else | ||
1193 | { | ||
1194 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | const JointIndex body2 = urdfVisitor.getParentId(eq.body2); |
1195 | RigidConstraintModel rcm( | ||
1196 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
8 | CONTACT_3D, model, body1, jointPlacement, body2, jointPlacement.inverse(), LOCAL); |
1197 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | contact_models.push_back(rcm); |
1198 | 8 | } | |
1199 | } | ||
1200 | 16 | } | |
1201 | |||
1202 | 27 | void MjcfGraph::parseRootTree() | |
1203 | { | ||
1204 |
1/2✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
|
27 | urdfVisitor.setName(modelName); |
1205 | // get name and inertia of first root link | ||
1206 |
2/4✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
|
27 | std::string rootLinkName = bodiesList.at(0); |
1207 |
2/4✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
|
27 | MjcfBody rootBody = mapOfBodies.find(rootLinkName)->second; |
1208 |
2/2✓ Branch 1 taken 24 times.
✓ Branch 2 taken 3 times.
|
27 | if (rootBody.jointChildren.size() == 0) |
1209 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | urdfVisitor.addRootJoint(rootBody.bodyInertia, rootLinkName); |
1210 | |||
1211 |
1/2✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
|
27 | fillReferenceConfig(rootBody); |
1212 |
2/2✓ Branch 5 taken 203 times.
✓ Branch 6 taken 27 times.
|
230 | for (const auto & entry : bodiesList) |
1213 | { | ||
1214 |
1/2✓ Branch 1 taken 203 times.
✗ Branch 2 not taken.
|
203 | fillModel(entry); |
1215 | } | ||
1216 | |||
1217 |
2/2✓ Branch 5 taken 3 times.
✓ Branch 6 taken 27 times.
|
30 | for (const auto & entry : mapOfConfigs) |
1218 | { | ||
1219 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | addKeyFrame(entry.second, entry.first); |
1220 | } | ||
1221 | 27 | } | |
1222 | } // namespace details | ||
1223 | } // namespace mjcf | ||
1224 | } // namespace pinocchio | ||
1225 |