tesseract_environment_collision.cpp
Go to the documentation of this file.
3 #include <gtest/gtest.h>
4 #include <algorithm>
5 #include <vector>
11 
14 
17 
19 
23 
24 using namespace tesseract_scene_graph;
25 using namespace tesseract_srdf;
26 using namespace tesseract_collision;
27 using namespace tesseract_environment;
28 
30 {
31  std::string path = "package://tesseract_support/urdf/lbr_iiwa_14_r820.urdf";
32  return tesseract_urdf::parseURDFFile(locator.locateResource(path)->getFilePath(), locator);
33 }
34 
36 {
37  std::string path = "package://tesseract_support/urdf/lbr_iiwa_14_r820.srdf";
38 
39  auto srdf = std::make_shared<SRDFModel>();
40  srdf->initFile(scene_graph, locator.locateResource(path)->getFilePath(), locator);
41 
42  return srdf;
43 }
44 
46 {
48 
49  auto scene_graph = getSceneGraph(locator);
50  EXPECT_TRUE(scene_graph != nullptr);
51 
52  auto srdf = getSRDFModel(*scene_graph, locator);
53  EXPECT_TRUE(srdf != nullptr);
54 
55  auto env = std::make_unique<Environment>();
56  bool success = env->init(*scene_graph, srdf);
57  EXPECT_TRUE(success);
58 
59  Link link_1("link_n1");
60  {
61  Visual::Ptr v = std::make_shared<Visual>();
62  v->origin.translation() = Eigen::Vector3d(0, 0, 0);
63  v->material = std::make_shared<Material>("test_material");
64  v->material->color = Eigen::Vector4d(1, 0, 0, 1);
65  v->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
66  v->name = "link1_visual";
67  link_1.visual.push_back(v);
68 
69  Collision::Ptr c = std::make_shared<Collision>();
70  c->origin.translation() = v->origin.translation();
71  c->geometry = v->geometry;
72  c->name = "link1_collision";
73  link_1.collision.push_back(c);
74  }
75 
76  Link link_2("link_n2");
77  {
78  Visual::Ptr v = std::make_shared<Visual>();
79  v->origin.translation() = Eigen::Vector3d(1.5, 0, 0);
80  v->material = std::make_shared<Material>("test_material");
81  v->material->color = Eigen::Vector4d(1, 1, 1, 1);
82  v->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
83  v->name = "link2_visual";
84  link_2.visual.push_back(v);
85 
86  Collision::Ptr c = std::make_shared<Collision>();
87  c->origin.translation() = v->origin.translation();
88  c->geometry = v->geometry;
89  c->name = "link2_collision";
90  link_2.collision.push_back(c);
91  }
92 
93  auto cmd1 = std::make_shared<AddLinkCommand>(link_1, true);
94  env->applyCommand(cmd1);
95 
96  auto cmd2 = std::make_shared<AddLinkCommand>(link_2, true);
97  env->applyCommand(cmd2);
98 
99  return env;
100 }
101 
102 TEST(TesseractEnvironmentCollisionUnit, runEnvironmentDiscreteCollisionTest) // NOLINT
103 {
104  // Get the environment
105  auto env = getEnvironment();
106 
107  // Setup collision margin data
108  CollisionCheckConfig collision_check_config;
109  collision_check_config.longest_valid_segment_length = 0.1;
112 
113  ContactManagerConfig contact_manager_config(0.0);
114 
115  { // Setup collision checker
116  DiscreteContactManager::Ptr manager = env->getDiscreteContactManager();
117  { // Check for collisions
119  std::vector<std::string> active_links = { "link_n1" };
120  manager->setActiveCollisionObjects(active_links);
121  manager->contactTest(collision, collision_check_config.contact_request);
122  EXPECT_FALSE(collision.empty());
123  }
124 
125  auto pose = Eigen::Isometry3d::Identity();
126  pose.translation() = Eigen::Vector3d(0, 0, 1.5);
127  manager->setCollisionObjectsTransform("link_n1", pose);
128  manager->applyContactManagerConfig(contact_manager_config);
129 
130  // Check for collisions
132  manager->contactTest(collision, collision_check_config.contact_request);
133 
134  EXPECT_FALSE(collision.empty());
135  }
136 
137  env->setActiveDiscreteContactManager("BulletDiscreteBVHManager");
138 
139  { // Setup collision checker
140  DiscreteContactManager::Ptr manager = env->getDiscreteContactManager();
141  { // Check for collisions
143  std::vector<std::string> active_links = { "link_n1" };
144  manager->setActiveCollisionObjects(active_links);
145  manager->contactTest(collision, collision_check_config.contact_request);
146  EXPECT_FALSE(collision.empty());
147  }
148 
149  auto pose = Eigen::Isometry3d::Identity();
150  pose.translation() = Eigen::Vector3d(0, 0, 1.5);
151  manager->setCollisionObjectsTransform("link_n1", pose);
152  manager->applyContactManagerConfig(contact_manager_config);
153 
154  // Check for collisions
156  manager->contactTest(collision, collision_check_config.contact_request);
157 
158  EXPECT_FALSE(collision.empty());
159  }
160 }
161 
162 TEST(TesseractEnvironmentCollisionUnit, runEnvironmentContinuousCollisionTest) // NOLINT
163 {
164  // Get the environment
165  auto env = getEnvironment();
166 
167  // Setup collision margin data
168  CollisionCheckConfig collision_check_config;
169  collision_check_config.longest_valid_segment_length = 0.1;
172 
173  ContactManagerConfig contact_manager_config(0.0);
174 
175  // Setup collision checker
176  ContinuousContactManager::Ptr manager = env->getContinuousContactManager();
177  { // Check for collisions
179  std::vector<std::string> active_links = { "link_n1" };
180  manager->setActiveCollisionObjects(active_links);
181  manager->contactTest(collision, collision_check_config.contact_request);
182  EXPECT_FALSE(collision.empty());
183  }
184 
185  auto pose1 = Eigen::Isometry3d::Identity();
186  pose1.translation() = Eigen::Vector3d(0, -2, 1.5);
187  auto pose2 = Eigen::Isometry3d::Identity();
188  pose2.translation() = Eigen::Vector3d(0, 2, 1.5);
189  manager->setCollisionObjectsTransform("link_n1", pose1, pose2);
190  manager->applyContactManagerConfig(contact_manager_config);
191 
192  // Check for collisions
194  manager->contactTest(collision, collision_check_config.contact_request);
195 
196  EXPECT_FALSE(collision.empty());
197 }
198 
199 TEST(TesseractEnvironmentCollisionUnit, runEnvironmentClearDiscreteCollisionTest) // NOLINT
200 {
201  // Get the environment
202  auto env = getEnvironment();
203  env->clearCachedDiscreteContactManager();
204 
205  // Setup collision margin data
206  CollisionCheckConfig collision_check_config;
207  collision_check_config.longest_valid_segment_length = 0.1;
210 
211  ContactManagerConfig contact_manager_config(0.0);
212 
213  // Setup collision checker
214  DiscreteContactManager::Ptr manager = env->getDiscreteContactManager();
215  { // Check for collisions
217  std::vector<std::string> active_links = { "link_n1" };
218  manager->setActiveCollisionObjects(active_links);
219  manager->contactTest(collision, collision_check_config.contact_request);
220  EXPECT_FALSE(collision.empty());
221  }
222 
223  auto pose = Eigen::Isometry3d::Identity();
224  pose.translation() = Eigen::Vector3d(0, 0, 1.5);
225  manager->setCollisionObjectsTransform("link_n1", pose);
226  manager->applyContactManagerConfig(contact_manager_config);
227 
228  // Check for collisions
230  manager->contactTest(collision, collision_check_config.contact_request);
231 
232  EXPECT_FALSE(collision.empty());
233 }
234 
235 TEST(TesseractEnvironmentCollisionUnit, runEnvironmentClearContinuousCollisionTest) // NOLINT
236 {
237  // Get the environment
238  auto env = getEnvironment();
239  env->clearCachedContinuousContactManager();
240 
241  // Setup collision margin data
242  CollisionCheckConfig collision_check_config;
243  collision_check_config.longest_valid_segment_length = 0.1;
246 
247  ContactManagerConfig contact_manager_config(0.0);
248 
249  // Setup collision checker
250  ContinuousContactManager::Ptr manager = env->getContinuousContactManager();
251  { // Check for collisions
253  std::vector<std::string> active_links = { "link_n1" };
254  manager->setActiveCollisionObjects(active_links);
255  manager->contactTest(collision, collision_check_config.contact_request);
256  EXPECT_FALSE(collision.empty());
257  }
258 
259  auto pose1 = Eigen::Isometry3d::Identity();
260  pose1.translation() = Eigen::Vector3d(0, -2, 1.5);
261  auto pose2 = Eigen::Isometry3d::Identity();
262  pose2.translation() = Eigen::Vector3d(0, 2, 1.5);
263  manager->setCollisionObjectsTransform("link_n1", pose1, pose2);
264  manager->applyContactManagerConfig(contact_manager_config);
265 
266  // Check for collisions
268  manager->contactTest(collision, collision_check_config.contact_request);
269 
270  EXPECT_FALSE(collision.empty());
271 }
272 
273 int main(int argc, char** argv)
274 {
275  testing::InitGoogleTest(&argc, argv);
276 
277  return RUN_ALL_TESTS();
278 }
tesseract_collision::ContactResultMap::empty
bool empty() const
graph.h
tesseract_srdf::SRDFModel::Ptr
std::shared_ptr< SRDFModel > Ptr
tesseract_srdf
tesseract_environment
Definition: command.h:45
tesseract_collision::ContactManagerConfig
tesseract_collision::ContinuousContactManager::Ptr
std::shared_ptr< ContinuousContactManager > Ptr
utils.h
resource_locator.h
tesseract_collision::CollisionEvaluatorType::CONTINUOUS
@ CONTINUOUS
tesseract_collision::ContactRequest::type
ContactTestType type
tesseract_common::ResourceLocator::locateResource
virtual std::shared_ptr< Resource > locateResource(const std::string &url) const=0
main
int main(int argc, char **argv)
Definition: tesseract_environment_collision.cpp:273
getSceneGraph
SceneGraph::Ptr getSceneGraph(const tesseract_common::ResourceLocator &locator)
Definition: tesseract_environment_collision.cpp:29
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_scene_graph::SceneGraph
tesseract_collision::CollisionCheckConfig::type
CollisionEvaluatorType type
EXPECT_TRUE
#define EXPECT_TRUE(args)
getSRDFModel
SRDFModel::Ptr getSRDFModel(const SceneGraph &scene_graph, const tesseract_common::ResourceLocator &locator)
Definition: tesseract_environment_collision.cpp:35
urdf_parser.h
discrete_contact_manager.h
tesseract_urdf::parseURDFFile
std::unique_ptr< tesseract_scene_graph::SceneGraph > parseURDFFile(const std::string &path, const tesseract_common::ResourceLocator &locator)
tesseract_collision::ContactResultMap
tesseract_collision::CollisionCheckConfig::contact_request
ContactRequest contact_request
tesseract_collision::CollisionCheckConfig
tesseract_environment::Environment::UPtr
std::unique_ptr< Environment > UPtr
Definition: environment.h:80
getEnvironment
tesseract_environment::Environment::UPtr getEnvironment()
Definition: tesseract_environment_collision.cpp:45
tesseract_scene_graph::Collision::Ptr
std::shared_ptr< Collision > Ptr
tesseract_common::ResourceLocator
TESSERACT_COMMON_IGNORE_WARNINGS_POP
continuous_contact_manager.h
srdf_model.h
TEST
TEST(TesseractEnvironmentCollisionUnit, runEnvironmentDiscreteCollisionTest)
Definition: tesseract_environment_collision.cpp:102
tesseract_collision::ContactTestType::FIRST
@ FIRST
tesseract_scene_graph::Visual::Ptr
std::shared_ptr< Visual > Ptr
environment.h
tesseract_collision::CollisionEvaluatorType::DISCRETE
@ DISCRETE
tesseract_common::GeneralResourceLocator
tesseract_collision
types.h
macros.h
tesseract_scene_graph::SceneGraph::Ptr
std::shared_ptr< SceneGraph > Ptr
box.h
tesseract_scene_graph
tesseract_collision::DiscreteContactManager::Ptr
std::shared_ptr< DiscreteContactManager > Ptr
EXPECT_FALSE
#define EXPECT_FALSE(args)
tesseract_collision::CollisionCheckConfig::longest_valid_segment_length
double longest_valid_segment_length


tesseract_environment
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:02:21