tesseract_urdf_mesh_unit.cpp
Go to the documentation of this file.
3 #include <gtest/gtest.h>
4 #include <Eigen/Geometry>
6 
7 #include <tesseract_urdf/mesh.h>
12 
13 static std::string getTempPkgPath()
14 {
15  std::string tmp = tesseract_common::getTempPath();
16  std::string tmppkg = tmp + "tmppkg";
17  if (!std::filesystem::is_directory(tmppkg) || !std::filesystem::exists(tmppkg))
18  {
19  std::filesystem::create_directory(tmppkg);
20  }
21  return tmppkg;
22 }
23 
24 TEST(TesseractURDFUnit, parse_mesh) // NOLINT
25 {
27  const bool global_make_convex = false;
28  const auto parse_mesh_fn =
29  [&](const tinyxml2::XMLElement* xml_element, const tesseract_common::ResourceLocator& locator, bool visual) {
30  return tesseract_urdf::parseMesh(xml_element, locator, visual, global_make_convex);
31  };
32 
33  {
34  std::string str =
35  R"(<mesh filename="package://tesseract_support/meshes/sphere_p25m.stl" scale="1 2 1" extra="0 0 0"/>)";
36  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
37  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
38  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
39  EXPECT_TRUE(geom.size() == 1);
40  EXPECT_EQ(geom[0]->getFaceCount(), 80);
41  EXPECT_EQ(geom[0]->getVertexCount(), 240);
42  EXPECT_NEAR(geom[0]->getScale()[0], 1, 1e-5);
43  EXPECT_NEAR(geom[0]->getScale()[1], 2, 1e-5);
44  EXPECT_NEAR(geom[0]->getScale()[2], 1, 1e-5);
45  }
46 
47  {
48  std::string str = R"(<mesh filename="package://tesseract_support/meshes/sphere_p25m.stl"/>)";
49  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
50  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
51  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
52  EXPECT_TRUE(geom.size() == 1);
53  EXPECT_EQ(geom[0]->getFaceCount(), 80);
54  EXPECT_EQ(geom[0]->getVertexCount(), 240);
55  EXPECT_NEAR(geom[0]->getScale()[0], 1, 1e-5);
56  EXPECT_NEAR(geom[0]->getScale()[1], 1, 1e-5);
57  EXPECT_NEAR(geom[0]->getScale()[2], 1, 1e-5);
58  }
59 
60  // Make convex override false (correct)
61  {
62  std::string str =
63  R"(<mesh filename="package://tesseract_support/meshes/sphere_p25m.stl" tesseract:make_convex="false"/>)";
64  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
65  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
66  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
67  EXPECT_TRUE(geom.size() == 1);
68  EXPECT_EQ(geom[0]->getFaceCount(), 80);
69  EXPECT_EQ(geom[0]->getVertexCount(), 240);
70  EXPECT_NEAR(geom[0]->getScale()[0], 1, 1e-5);
71  EXPECT_NEAR(geom[0]->getScale()[1], 1, 1e-5);
72  EXPECT_NEAR(geom[0]->getScale()[2], 1, 1e-5);
73  }
74 
75  // Make convex override true (correct)
76  {
77  std::string str =
78  R"(<mesh filename="package://tesseract_support/meshes/sphere_p25m.stl" tesseract:make_convex="true"/>)";
79  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
80  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
81  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
82  EXPECT_TRUE(geom.size() == 1);
83  EXPECT_LE(geom[0]->getFaceCount(), 80);
84  EXPECT_LE(geom[0]->getVertexCount(), 240);
85  EXPECT_NEAR(geom[0]->getScale()[0], 1, 1e-5);
86  EXPECT_NEAR(geom[0]->getScale()[1], 1, 1e-5);
87  EXPECT_NEAR(geom[0]->getScale()[2], 1, 1e-5);
88  }
89 
90  // Make convex (incorrect)
91  {
92  std::string str =
93  R"(<mesh filename="package://tesseract_support/meshes/sphere_p25m.stl" tesseract:make_convex="foo"/>)";
94  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
95  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
96  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
97  EXPECT_TRUE(geom.empty());
98  }
99 
100  {
101  std::string str = R"(<mesh filename="abc" scale="1 2 1"/>)";
102  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
103  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
104  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
105  EXPECT_TRUE(geom.empty());
106  }
107 
108  {
109  std::string str = R"(<mesh filename="package://tesseract_support/meshes/sphere_p25m.stl" scale="1 a 1"/>)";
110  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
111  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
112  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
113  EXPECT_TRUE(geom.empty());
114  }
115 
116  {
117  std::string str = R"(<mesh filename="package://tesseract_support/meshes/sphere_p25m.stl" scale="a 1 1"/>)";
118  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
119  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
120  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
121  EXPECT_TRUE(geom.empty());
122  }
123 
124  {
125  std::string str = R"(<mesh filename="package://tesseract_support/meshes/sphere_p25m.stl" scale="1 1 a"/>)";
126  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
127  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
128  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
129  EXPECT_TRUE(geom.empty());
130  }
131 
132  {
133  std::string str = R"(<mesh filename="package://tesseract_support/meshes/sphere_p25m.stl" scale="1 2 1 3"/>)";
134  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
135  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
136  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
137  EXPECT_TRUE(geom.empty());
138  }
139 
140  {
141  std::string str = R"(<mesh scale="1 2 1"/>)";
142  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
143  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
144  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
145  EXPECT_TRUE(geom.empty());
146  }
147 
148  {
149  std::string str = "<mesh />";
150  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
151  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
152  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
153  EXPECT_TRUE(geom.empty());
154  }
155 }
156 
157 TEST(TesseractURDFUnit, write_mesh) // NOLINT
158 {
159  {
160  tesseract_common::VectorVector3d vertices = { Eigen::Vector3d(0, 0, 0),
161  Eigen::Vector3d(1, 0, 0),
162  Eigen::Vector3d(0, 1, 0) };
163  Eigen::VectorXi indices(4);
164  indices << 3, 0, 1, 2;
165  tesseract_geometry::Mesh::Ptr mesh = std::make_shared<tesseract_geometry::Mesh>(
166  std::make_shared<tesseract_common::VectorVector3d>(vertices), std::make_shared<Eigen::VectorXi>(indices));
167  std::string text;
168  EXPECT_EQ(0,
169  writeTest<tesseract_geometry::Mesh::Ptr>(
170  mesh, &tesseract_urdf::writeMesh, text, getTempPkgPath(), std::string("mesh0.ply")));
171  EXPECT_EQ(text, R"(<mesh filename="package://tmppkg/mesh0.ply"/>)");
172  }
173 
174  { // fail to write
175  tesseract_common::VectorVector3d vertices = { Eigen::Vector3d(0, 0, 0),
176  Eigen::Vector3d(1, 0, 0),
177  Eigen::Vector3d(0, 1, 0) };
178  Eigen::VectorXi indices(4);
179  indices << 3, 0, 1, 2;
180  tesseract_geometry::Mesh::Ptr mesh = std::make_shared<tesseract_geometry::Mesh>(
181  std::make_shared<tesseract_common::VectorVector3d>(vertices), std::make_shared<Eigen::VectorXi>(indices));
182  std::string text;
183  EXPECT_EQ(1,
184  writeTest<tesseract_geometry::Mesh::Ptr>(
185  mesh, &tesseract_urdf::writeMesh, text, tesseract_common::getTempPath(), std::string("")));
186  EXPECT_EQ(text, "");
187  }
188 
189  {
190  tesseract_geometry::Mesh::Ptr mesh = nullptr;
191  std::string text;
192  EXPECT_EQ(1,
193  writeTest<tesseract_geometry::Mesh::Ptr>(
194  mesh, &tesseract_urdf::writeMesh, text, tesseract_common::getTempPath(), std::string("mesh1.ply")));
195  EXPECT_EQ(text, "");
196  }
197 }
198 
199 TEST(TesseractURDFUnit, parse_convex_mesh) // NOLINT
200 {
202  const bool global_make_convex = true;
203  const auto parse_mesh_fn =
204  [&](const tinyxml2::XMLElement* xml_element, const tesseract_common::ResourceLocator& locator, bool visual) {
205  return tesseract_urdf::parseMesh(xml_element, locator, visual, global_make_convex);
206  };
207 
208  {
209  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 2 1" extra="0 0 0"/>)";
210  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
211  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
212  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
213  EXPECT_TRUE(geom.size() == 1);
214  EXPECT_EQ(geom[0]->getFaceCount(), 7);
215  EXPECT_EQ(geom[0]->getVertexCount(), 8);
216  EXPECT_NEAR(geom[0]->getScale()[0], 1, 1e-5);
217  EXPECT_NEAR(geom[0]->getScale()[1], 2, 1e-5);
218  EXPECT_NEAR(geom[0]->getScale()[2], 1, 1e-5);
219  }
220 
221  // Global and local override set to make convex mesh
222  {
223  std::string str =
224  R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 2 1" extra="0 0 0" tesseract:make_convex="true"/>)";
225  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
226  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
227  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
228  EXPECT_TRUE(geom.size() == 1);
229  EXPECT_EQ(geom[0]->getFaceCount(), 7);
230  EXPECT_EQ(geom[0]->getVertexCount(), 8);
231  EXPECT_NEAR(geom[0]->getScale()[0], 1, 1e-5);
232  EXPECT_NEAR(geom[0]->getScale()[1], 2, 1e-5);
233  EXPECT_NEAR(geom[0]->getScale()[2], 1, 1e-5);
234  }
235 
236  // Global and local override set to make convex mesh
237  {
238  std::string str =
239  R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 2 1" extra="0 0 0" tesseract:make_convex="false"/>)";
240  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
241  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
242  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
243  EXPECT_TRUE(geom.size() == 1);
244  EXPECT_EQ(geom[0]->getFaceCount(), 12);
245  EXPECT_EQ(geom[0]->getVertexCount(), 8);
246  EXPECT_NEAR(geom[0]->getScale()[0], 1, 1e-5);
247  EXPECT_NEAR(geom[0]->getScale()[1], 2, 1e-5);
248  EXPECT_NEAR(geom[0]->getScale()[2], 1, 1e-5);
249  }
250 
251  {
252  std::string str =
253  R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 2 1" tesseract:make_convex="true"/>)";
254  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
255  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
256  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
257  EXPECT_TRUE(geom.size() == 1);
258  EXPECT_TRUE(geom[0]->getFaceCount() >= 6); // Because we are converting due to numerical variance you could end up
259  // with additional faces.
260  EXPECT_TRUE(geom[0]->getVertexCount() == 8);
261  }
262 
263  {
264  std::string str =
265  R"(<mesh filename="package://tesseract_support/meshes/box_box.dae" scale="1 2 1" tesseract:make_convex="true"/>)";
266  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
267  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
268  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
269  EXPECT_TRUE(geom.size() == 2);
270  }
271 
272  {
273  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply"/>)";
274  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
275  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
276  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
277  EXPECT_TRUE(geom.size() == 1);
278  EXPECT_TRUE(geom[0]->getFaceCount() == 7);
279  EXPECT_TRUE(geom[0]->getVertexCount() == 8);
280  EXPECT_NEAR(geom[0]->getScale()[0], 1, 1e-5);
281  EXPECT_NEAR(geom[0]->getScale()[1], 1, 1e-5);
282  EXPECT_NEAR(geom[0]->getScale()[2], 1, 1e-5);
283  }
284 
285  {
286  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="a 2 1" />)";
287  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
288  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
289  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
290  EXPECT_TRUE(geom.empty());
291  }
292 
293  {
294  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 a 1" />)";
295  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
296  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
297  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
298  EXPECT_TRUE(geom.empty());
299  }
300 
301  {
302  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 2 a" />)";
303  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
304  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
305  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
306  EXPECT_TRUE(geom.empty());
307  }
308 
309  {
310  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="-1 2 1" />)";
311  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
312  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
313  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
314  EXPECT_TRUE(geom.empty());
315  }
316 
317  {
318  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 -1 1" />)";
319  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
320  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
321  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
322  EXPECT_TRUE(geom.empty());
323  }
324 
325  {
326  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 2 -1" />)";
327  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
328  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
329  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
330  EXPECT_TRUE(geom.empty());
331  }
332 
333  {
334  std::string str = R"(<mesh filename="abc" scale="1 2 1"/>)";
335  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
336  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
337  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
338  EXPECT_TRUE(geom.empty());
339  }
340 
341  {
342  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 a 1"/>)";
343  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
344  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
345  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
346  EXPECT_TRUE(geom.empty());
347  }
348 
349  {
350  std::string str = R"(<mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 2 1 3"/>)";
351  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
352  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
353  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
354  EXPECT_TRUE(geom.empty());
355  }
356 
357  {
358  std::string str = R"(<mesh scale="1 2 1"/>)";
359  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
360  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
361  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
362  EXPECT_TRUE(geom.empty());
363  }
364 
365  {
366  std::string str = "<mesh />";
367  std::vector<tesseract_geometry::PolygonMesh::Ptr> geom;
368  EXPECT_FALSE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
369  geom, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, false));
370  EXPECT_TRUE(geom.empty());
371  }
372 }
373 
374 TEST(TesseractURDFUnit, write_convex_mesh) // NOLINT
375 {
376  {
377  // Create an arbitrary mesh denoted specifically as a convex mesh type
378  tesseract_common::VectorVector3d vertices = { Eigen::Vector3d(0, 0, 0),
379  Eigen::Vector3d(1, 0, 0),
380  Eigen::Vector3d(0, 1, 0) };
381  Eigen::VectorXi indices(4);
382  indices << 3, 0, 1, 2;
383  auto convex_mesh = std::make_shared<tesseract_geometry::ConvexMesh>(
384  std::make_shared<tesseract_common::VectorVector3d>(vertices), std::make_shared<Eigen::VectorXi>(indices));
385 
386  // Write the convex mesh into a string
387  // Since the input type is specifically a ConvexMesh, the tesseract:make_convex` attribute should be present to
388  // indicate that mesh should be made convex and produce a `ConvexMesh`
389  std::string text;
390  EXPECT_EQ(0,
391  writeTest<tesseract_geometry::ConvexMesh::Ptr>(
392  convex_mesh, &tesseract_urdf::writeMesh, text, getTempPkgPath(), std::string("convex0.ply")));
393  EXPECT_EQ(text, R"(<mesh filename="package://tmppkg/convex0.ply" tesseract:make_convex="true"/>)");
394  }
395 
396  { // With scale
397  // Create an arbitrary mesh denoted specifically as a convex mesh type
398  tesseract_common::VectorVector3d vertices = { Eigen::Vector3d(0, 0, 0),
399  Eigen::Vector3d(1, 0, 0),
400  Eigen::Vector3d(0, 1, 0) };
401  Eigen::VectorXi indices(4);
402  indices << 3, 0, 1, 2;
403  Eigen::Vector3d scale(0.5, 0.5, 0.5);
404  auto convex_mesh =
405  std::make_shared<tesseract_geometry::ConvexMesh>(std::make_shared<tesseract_common::VectorVector3d>(vertices),
406  std::make_shared<Eigen::VectorXi>(indices),
407  nullptr,
408  scale);
409 
410  // Write the convex mesh into a string
411  // Since the input type is specifically a ConvexMesh, the tesseract:make_convex` attribute should be present to
412  // indicate that mesh should be made convex and produce a `ConvexMesh`
413  std::string text;
414  EXPECT_EQ(0,
415  writeTest<tesseract_geometry::ConvexMesh::Ptr>(
416  convex_mesh, &tesseract_urdf::writeMesh, text, getTempPkgPath(), std::string("convex1.ply")));
417  EXPECT_EQ(text,
418  R"(<mesh filename="package://tmppkg/convex1.ply" scale="0.5 0.5 0.5" tesseract:make_convex="true"/>)");
419  }
420 }
tesseract_common::getTempPath
std::string getTempPath()
tesseract_geometry::Mesh::Ptr
std::shared_ptr< Mesh > Ptr
mesh.h
resource_locator.h
tesseract_urdf::MESH_ELEMENT_NAME
static constexpr std::string_view MESH_ELEMENT_NAME
Definition: mesh.h:47
getTempPkgPath
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH static TESSERACT_COMMON_IGNORE_WARNINGS_POP std::string getTempPkgPath()
Definition: tesseract_urdf_mesh_unit.cpp:13
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_urdf::writeMesh
tinyxml2::XMLElement * writeMesh(const std::shared_ptr< const tesseract_geometry::PolygonMesh > &mesh, tinyxml2::XMLDocument &doc, const std::string &package_path, const std::string &filename)
writeMesh Write a mesh to URDF XML and PLY file
Definition: mesh.cpp:131
EXPECT_TRUE
#define EXPECT_TRUE(args)
tesseract_urdf_common_unit.h
runTest
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH TESSERACT_COMMON_IGNORE_WARNINGS_POP bool runTest(ElementType &type, std::function< ElementType(const tinyxml2::XMLElement *)> func, const std::string &xml_string, const std::string &element_name)
Definition: tesseract_urdf_common_unit.h:21
EXPECT_NEAR
#define EXPECT_NEAR(a, b, prec)
tesseract_common::VectorVector3d
std::vector< Eigen::Vector3d > VectorVector3d
tesseract_common::ResourceLocator
TEST
TEST(TesseractURDFUnit, parse_mesh)
Definition: tesseract_urdf_mesh_unit.cpp:24
mesh.h
Parse mesh from xml string.
TESSERACT_COMMON_IGNORE_WARNINGS_POP
convex_mesh.h
tesseract_common::GeneralResourceLocator
macros.h
EXPECT_EQ
#define EXPECT_EQ(a, b)
EXPECT_FALSE
#define EXPECT_FALSE(args)
tesseract_urdf::parseMesh
std::vector< std::shared_ptr< tesseract_geometry::PolygonMesh > > parseMesh(const tinyxml2::XMLElement *xml_element, const tesseract_common::ResourceLocator &locator, bool visual, bool make_convex)
Parse xml element mesh.
Definition: mesh.cpp:47


tesseract_urdf
Author(s): Levi Armstrong
autogenerated on Thu Apr 24 2025 03:10:44