tesseract_urdf_geometry_unit.cpp
Go to the documentation of this file.
3 #include <gtest/gtest.h>
4 #include <Eigen/Geometry>
5 #include <octomap/OcTree.h>
7 
12 
13 TEST(TesseractURDFUnit, parse_geometry) // NOLINT
14 {
15  const bool global_make_convex = false;
16  const auto parse_geometry_fn = [&](const tinyxml2::XMLElement* xml_element,
17  const tesseract_common::ResourceLocator& locator,
18  const bool visual) {
19  return tesseract_urdf::parseGeometry(xml_element, locator, visual, global_make_convex);
20  };
21 
23  {
24  std::string str = R"(<geometry extra="0 0 0">
25  <box size="1 1 1" />
26  </geometry>)";
28  EXPECT_TRUE(runTest<tesseract_geometry::Geometry::Ptr>(
29  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
31  }
32 
33  {
34  std::string str = R"(<geometry extra="0 0 0">
35  <sphere radius="1" />
36  </geometry>)";
38  EXPECT_TRUE(runTest<tesseract_geometry::Geometry::Ptr>(
39  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
41  }
42 
43  {
44  std::string str = R"(<geometry extra="0 0 0">
45  <cylinder radius="1" length="1" />
46  </geometry>)";
48  EXPECT_TRUE(runTest<tesseract_geometry::Geometry::Ptr>(
49  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
51  }
52 
53  {
54  std::string str = R"(<geometry extra="0 0 0">
55  <tesseract:cone radius="1" length="1" />
56  </geometry>)";
58  EXPECT_TRUE(runTest<tesseract_geometry::Geometry::Ptr>(
59  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
61  }
62 
63  {
64  std::string str = R"(<geometry extra="0 0 0">
65  <tesseract:capsule radius="1" length="1" />
66  </geometry>)";
68  EXPECT_TRUE(runTest<tesseract_geometry::Geometry::Ptr>(
69  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
71  }
72 
73  {
74  std::string str = R"(<geometry extra="0 0 0">
75  <tesseract:octomap shape_type="box" extra="0 0 0">
76  <tesseract:octree filename="package://tesseract_support/meshes/box_2m.bt" extra="0 0 0"/>
77  </tesseract:octomap>
78  </geometry>)";
80  EXPECT_TRUE(runTest<tesseract_geometry::Geometry::Ptr>(
81  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
83  }
84 
85  {
86  std::string str = R"(<geometry extra="0 0 0">
87  <mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 2 1" extra="0 0 0"/>
88  </geometry>)";
90  EXPECT_TRUE(runTest<tesseract_geometry::Geometry::Ptr>(
91  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
93  }
94 
95  {
96  std::string str = R"(<geometry extra="0 0 0">
97  <tesseract:sdf_mesh filename="package://tesseract_support/meshes/box_2m.ply" scale="1 2 1" extra="0 0 0"/>
98  </geometry>)";
100  EXPECT_TRUE(runTest<tesseract_geometry::Geometry::Ptr>(
101  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
103  }
104 
105  {
106  std::string str = R"(<geometry>
107  <unknown_type extra="0 0 0"/>
108  </geometry>)";
110  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
111  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
112  EXPECT_TRUE(elem == nullptr);
113  }
114 
115  {
116  std::string str = R"(<geometry>
117  </geometry>)";
119  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
120  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
121  EXPECT_TRUE(elem == nullptr);
122  }
123 
124  {
125  std::string str = R"(<geometry>
126  <box size="1 1 a" />
127  </geometry>)";
129  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
130  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
131  EXPECT_TRUE(elem == nullptr);
132  }
133 
134  {
135  std::string str = R"(<geometry extra="0 0 0">
136  <sphere />
137  </geometry>)";
139  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
140  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
141  EXPECT_TRUE(elem == nullptr);
142  }
143 
144  {
145  std::string str = R"(<geometry extra="0 0 0">
146  <cylinder />
147  </geometry>)";
149  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
150  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
151  EXPECT_TRUE(elem == nullptr);
152  }
153 
154  {
155  std::string str = R"(<geometry extra="0 0 0">
156  <tesseract:cone />
157  </geometry>)";
159  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
160  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
161  EXPECT_TRUE(elem == nullptr);
162  }
163 
164  {
165  std::string str = R"(<geometry extra="0 0 0">
166  <tesseract:capsule />
167  </geometry>)";
169  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
170  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
171  EXPECT_TRUE(elem == nullptr);
172  }
173 
174  {
175  std::string str = R"(<geometry extra="0 0 0">
176  <tesseract:octomap shape_type="box" extra="0 0 0">
177  <tesseract:octree />
178  </tesseract:octomap>
179  </geometry>)";
181  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
182  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
183  EXPECT_TRUE(elem == nullptr);
184  }
185 
186  {
187  std::string str = R"(<geometry extra="0 0 0">
188  <mesh />
189  </geometry>)";
191  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
192  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
193  EXPECT_TRUE(elem == nullptr);
194  }
195 
196  {
197  std::string str = R"(<geometry extra="0 0 0">
198  <tesseract:sdf_mesh />
199  </geometry>)";
201  EXPECT_FALSE(runTest<tesseract_geometry::Geometry::Ptr>(
202  elem, parse_geometry_fn, str, tesseract_urdf::GEOMETRY_ELEMENT_NAME.data(), resource_locator, true));
203  EXPECT_TRUE(elem == nullptr);
204  }
205 }
206 
207 TEST(TesseractURDFUnit, write_geometry) // NOLINT
208 {
209  // The catch clause for many of the subtypes is not triggered by these tests. Triggering them would require sending
210  // a nullptr to the write function - for now. These could be expanded in the future to have more failure modes, and
211  // already having the catch blocks in place seems wise.
212 
213  { // trigger check for nullptr input
214  tesseract_geometry::Geometry::Ptr geometry = nullptr;
215  std::string text;
216  EXPECT_EQ(1,
217  writeTest<tesseract_geometry::Geometry::Ptr>(
218  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("")));
219  EXPECT_EQ(text, "");
220  }
221 
222  { // sphere
223  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::Sphere>(1.0);
224  std::string text;
225  EXPECT_EQ(0,
226  writeTest<tesseract_geometry::Geometry::Ptr>(
227  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("")));
228  EXPECT_NE(text, "");
229  }
230 
231  { // cylinder
232  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::Cylinder>(1.0, 1.414);
233  std::string text;
234  EXPECT_EQ(0,
235  writeTest<tesseract_geometry::Geometry::Ptr>(
236  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("")));
237  EXPECT_NE(text, "");
238  }
239 
240  { // capsule
241  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::Capsule>(1.0, 1.57);
242  std::string text;
243  EXPECT_EQ(0,
244  writeTest<tesseract_geometry::Geometry::Ptr>(
245  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("")));
246  EXPECT_NE(text, "");
247  }
248 
249  { // cone
250  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::Cone>(1.0, 2.3);
251  std::string text;
252  EXPECT_EQ(0,
253  writeTest<tesseract_geometry::Geometry::Ptr>(
254  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("")));
255  EXPECT_NE(text, "");
256  }
257 
258  { // box
259  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::Box>(1.0, 2.0, 3.0);
260  std::string text;
261  EXPECT_EQ(0,
262  writeTest<tesseract_geometry::Geometry::Ptr>(
263  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("")));
264  EXPECT_NE(text, "");
265  }
266 
267  { // plane
268  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::Plane>(1.0, 1.1, 1.2, 1.3);
269  std::string text;
270  EXPECT_EQ(1,
271  writeTest<tesseract_geometry::Geometry::Ptr>(
272  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("")));
273  EXPECT_EQ(text, "");
274  }
275 
276  { // mesh
277  tesseract_common::VectorVector3d vertices = { Eigen::Vector3d(0, 0, 0),
278  Eigen::Vector3d(1, 0, 0),
279  Eigen::Vector3d(0, 1, 0) };
280  Eigen::VectorXi indices(4);
281  indices << 3, 0, 1, 2;
282  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::Mesh>(
283  std::make_shared<tesseract_common::VectorVector3d>(vertices), std::make_shared<Eigen::VectorXi>(indices));
284 
285  std::string text;
286  EXPECT_EQ(
287  0,
288  writeTest<tesseract_geometry::Geometry::Ptr>(
289  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("geom0")));
290  EXPECT_NE(text, "");
291  }
292 
293  { // sdf_mesh
294  tesseract_common::VectorVector3d vertices = { Eigen::Vector3d(0, 0, 0),
295  Eigen::Vector3d(1, 0, 0),
296  Eigen::Vector3d(0, 1, 0) };
297  Eigen::VectorXi indices(4);
298  indices << 3, 0, 1, 2;
299  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::SDFMesh>(
300  std::make_shared<tesseract_common::VectorVector3d>(vertices), std::make_shared<Eigen::VectorXi>(indices));
301 
302  std::string text;
303  EXPECT_EQ(
304  0,
305  writeTest<tesseract_geometry::Geometry::Ptr>(
306  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("geom2")));
307  EXPECT_NE(text, "");
308  }
309 
310  { // octree
311  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::Octree>(
312  std::make_shared<octomap::OcTree>(1.0), tesseract_geometry::OctreeSubType::BOX);
313  std::string text;
314  EXPECT_EQ(
315  0,
316  writeTest<tesseract_geometry::Geometry::Ptr>(
317  geometry, &tesseract_urdf::writeGeometry, text, tesseract_common::getTempPath(), std::string("geom3")));
318  EXPECT_NE(text, "");
319  }
320 
321  { // octree failed-to-write
322  tesseract_geometry::Geometry::Ptr geometry = std::make_shared<tesseract_geometry::Octree>(
323  std::make_shared<octomap::OcTree>(1.0), tesseract_geometry::OctreeSubType::BOX);
324  std::string text;
325  EXPECT_EQ(1,
326  writeTest<tesseract_geometry::Geometry::Ptr>(
327  geometry, &tesseract_urdf::writeGeometry, text, std::string("/tmp/nonexistant/"), std::string("")));
328  EXPECT_EQ(text, "");
329  }
330 }
tesseract_urdf::parseGeometry
std::shared_ptr< tesseract_geometry::Geometry > parseGeometry(const tinyxml2::XMLElement *xml_element, const tesseract_common::ResourceLocator &locator, bool visual, bool make_convex_meshes)
Parse xml element geometry.
Definition: geometry.cpp:51
tesseract_common::getTempPath
std::string getTempPath()
tesseract_geometry::Geometry::Ptr
std::shared_ptr< Geometry > Ptr
tesseract_geometry::GeometryType::CONE
@ CONE
geometry.h
Parse geometry from xml string.
resource_locator.h
tesseract_urdf::GEOMETRY_ELEMENT_NAME
static constexpr std::string_view GEOMETRY_ELEMENT_NAME
Definition: geometry.h:46
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_geometry::GeometryType::MESH
@ MESH
OcTree.h
tesseract_geometry::GeometryType::CYLINDER
@ CYLINDER
EXPECT_TRUE
#define EXPECT_TRUE(args)
geometries.h
tesseract_urdf_common_unit.h
tesseract_geometry::GeometryType::SPHERE
@ SPHERE
tesseract_common::VectorVector3d
std::vector< Eigen::Vector3d > VectorVector3d
tesseract_common::ResourceLocator
tesseract_geometry::GeometryType::CAPSULE
@ CAPSULE
TESSERACT_COMMON_IGNORE_WARNINGS_POP
tesseract_geometry::GeometryType::SDF_MESH
@ SDF_MESH
tesseract_geometry::GeometryType::BOX
@ BOX
tesseract_urdf::writeGeometry
tinyxml2::XMLElement * writeGeometry(const std::shared_ptr< const tesseract_geometry::Geometry > &geometry, tinyxml2::XMLDocument &doc, const std::string &package_path, const std::string &filename)
writeGeometry Write geometry to URDF XML
Definition: geometry.cpp:196
tesseract_geometry::GeometryType::OCTREE
@ OCTREE
tesseract_common::GeneralResourceLocator
macros.h
EXPECT_EQ
#define EXPECT_EQ(a, b)
EXPECT_FALSE
#define EXPECT_FALSE(args)
tesseract_geometry::OctreeSubType::BOX
@ BOX
TEST
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH TESSERACT_COMMON_IGNORE_WARNINGS_POP TEST(TesseractURDFUnit, parse_geometry)
Definition: tesseract_urdf_geometry_unit.cpp:13


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