1 #ifndef TESSERACT_COLLISION_COLLISION_SPHERE_SPHERE_UNIT_HPP
2 #define TESSERACT_COLLISION_COLLISION_SPHERE_SPHERE_UNIT_HPP
14 inline void addCollisionObjects(DiscreteContactManager& checker,
bool use_convex_mesh =
false)
24 auto mesh_vertices = std::make_shared<tesseract_common::VectorVector3d>();
25 auto mesh_faces = std::make_shared<Eigen::VectorXi>();
33 auto mesh = std::make_shared<tesseract_geometry::Mesh>(mesh_vertices, mesh_faces);
38 sphere = std::make_shared<tesseract_geometry::Sphere>(0.25);
41 Eigen::Isometry3d sphere_pose;
42 sphere_pose.setIdentity();
46 obj1_shapes.push_back(sphere);
47 obj1_poses.push_back(sphere_pose);
49 checker.addCollisionObject(
"sphere_link", 0, obj1_shapes, obj1_poses);
54 CollisionShapePtr thin_box = std::make_shared<tesseract_geometry::Box>(0.1, 1, 1);
55 Eigen::Isometry3d thin_box_pose;
56 thin_box_pose.setIdentity();
60 obj2_shapes.push_back(thin_box);
61 obj2_poses.push_back(thin_box_pose);
63 checker.addCollisionObject(
"thin_box_link", 0, obj2_shapes, obj2_poses,
false);
73 auto mesh_vertices = std::make_shared<tesseract_common::VectorVector3d>();
74 auto mesh_faces = std::make_shared<Eigen::VectorXi>();
82 auto mesh = std::make_shared<tesseract_geometry::Mesh>(mesh_vertices, mesh_faces);
87 sphere1 = std::make_shared<tesseract_geometry::Sphere>(0.25);
90 Eigen::Isometry3d sphere1_pose;
91 sphere1_pose.setIdentity();
95 obj3_shapes.push_back(sphere1);
96 obj3_poses.push_back(sphere1_pose);
98 checker.addCollisionObject(
"sphere1_link", 0, obj3_shapes, obj3_poses);
103 CollisionShapePtr remove_box = std::make_shared<tesseract_geometry::Box>(0.1, 1, 1);
104 Eigen::Isometry3d remove_box_pose;
105 remove_box_pose.setIdentity();
109 obj4_shapes.push_back(remove_box);
110 obj4_poses.push_back(remove_box_pose);
112 checker.addCollisionObject(
"remove_box_link", 0, obj4_shapes, obj4_poses);
113 EXPECT_TRUE(checker.getCollisionObjects().size() == 4);
114 EXPECT_TRUE(checker.hasCollisionObject(
"remove_box_link"));
115 checker.removeCollisionObject(
"remove_box_link");
116 EXPECT_FALSE(checker.hasCollisionObject(
"remove_box_link"));
117 EXPECT_TRUE(checker.getCollisionObjects().size() == 3);
122 EXPECT_FALSE(checker.removeCollisionObject(
"link_does_not_exist"));
123 EXPECT_FALSE(checker.enableCollisionObject(
"link_does_not_exist"));
124 EXPECT_FALSE(checker.disableCollisionObject(
"link_does_not_exist"));
131 EXPECT_TRUE(checker.getCollisionObjects().size() == 3);
139 std::vector<std::string> active_links{
"sphere_link",
"sphere1_link" };
140 checker.setActiveCollisionObjects(active_links);
141 std::vector<std::string> check_active_links = checker.getActiveCollisionObjects();
142 EXPECT_TRUE(tesseract_common::isIdentical<std::string>(active_links, check_active_links,
false));
144 EXPECT_TRUE(checker.getContactAllowedValidator() ==
nullptr);
147 EXPECT_NEAR(checker.getCollisionMarginData().getMaxCollisionMargin(), 0.1, 1e-5);
151 location[
"sphere_link"] = Eigen::Isometry3d::Identity();
152 location[
"sphere1_link"] = Eigen::Isometry3d::Identity();
153 location[
"sphere1_link"].translation()(0) = 0.2;
154 checker.setCollisionObjectsTransform(location);
157 ContactResultMap result;
161 result.flattenMoveResults(result_vector);
164 EXPECT_NEAR(result_vector[0].distance, -0.30, 0.0001);
166 std::vector<int> idx = { 0, 1, 1 };
167 if (result_vector[0].link_names[0] !=
"sphere_link")
170 if (result_vector[0].single_contact_point)
172 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
173 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][0] - (0.25)) > 0.001 &&
174 std::abs(result_vector[0].nearest_points[0][0] - (-0.05)) > 0.001);
175 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001 &&
176 std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001);
177 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][2] - (0.0)) > 0.001 &&
178 std::abs(result_vector[0].nearest_points[0][2] - (0.0)) > 0.001);
182 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.25, 0.001);
183 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 0.0, 0.001);
184 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2], 0.0, 0.001);
185 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], -0.05, 0.001);
186 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], 0.0, 0.001);
187 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][2], 0.0, 0.001);
190 EXPECT_NEAR(result_vector[0].normal[0], idx[2] * 1.0, 0.001);
191 EXPECT_NEAR(result_vector[0].normal[1], idx[2] * 0.0, 0.001);
192 EXPECT_NEAR(result_vector[0].normal[2], idx[2] * 0.0, 0.0016);
198 location[
"sphere1_link"].translation() = Eigen::Vector3d(1, 0, 0);
200 result_vector.clear();
201 checker.setCollisionObjectsTransform(
"sphere1_link", location[
"sphere1_link"]);
204 result.flattenCopyResults(result_vector);
212 result_vector.clear();
215 EXPECT_NEAR(checker.getCollisionMarginData().getMaxCollisionMargin(), 0.52, 1e-5);
217 result.flattenMoveResults(result_vector);
220 EXPECT_NEAR(result_vector[0].distance, 0.5, 0.0001);
223 if (result_vector[0].link_names[0] !=
"sphere_link")
226 if (result_vector[0].single_contact_point)
228 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
229 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][0] - (0.25)) > 0.001 &&
230 std::abs(result_vector[0].nearest_points[0][0] - (0.75)) > 0.001);
231 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001 &&
232 std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001);
233 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][2] - (0.0)) > 0.001 &&
234 std::abs(result_vector[0].nearest_points[0][2] - (0.0)) > 0.001);
238 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.25, 0.001);
239 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 0.0, 0.001);
240 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2], 0.0, 0.001);
241 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], 0.75, 0.001);
242 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], 0.0, 0.001);
243 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][2], 0.0, 0.001);
246 EXPECT_NEAR(result_vector[0].normal[0], idx[2] * 1.0, 0.001);
247 EXPECT_NEAR(result_vector[0].normal[1], idx[2] * 0.0, 0.001);
248 EXPECT_NEAR(result_vector[0].normal[2], idx[2] * 0.0, 0.001);
256 std::vector<std::string> active_links{
"sphere_link",
"sphere1_link" };
259 EXPECT_TRUE(tesseract_common::isIdentical<std::string>(active_links, check_active_links,
false));
268 location[
"sphere_link"] = Eigen::Isometry3d::Identity();
269 location[
"sphere1_link"] = Eigen::Isometry3d::Identity();
270 location[
"sphere1_link"].translation()(0) = 0.2;
285 std::vector<int> idx = { 0, 1, 1 };
286 if (result_vector[0].link_names[0] !=
"sphere_link")
289 if (result_vector[0].single_contact_point)
291 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
292 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][0] - (0.25)) > 0.001 &&
293 std::abs(result_vector[0].nearest_points[0][0] - (-0.05)) > 0.001);
294 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001 &&
295 std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001);
296 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][2] - (0.0)) > 0.001 &&
297 std::abs(result_vector[0].nearest_points[0][2] - (0.0)) > 0.001);
301 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.25, 0.001);
302 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 0.0, 0.001);
303 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2], 0.0, 0.001);
304 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], -0.05, 0.001);
305 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], 0.0, 0.001);
306 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][2], 0.0, 0.001);
309 EXPECT_NEAR(result_vector[0].normal[0], idx[2] * 1.0, 0.001);
310 EXPECT_NEAR(result_vector[0].normal[1], idx[2] * 0.0, 0.001);
311 EXPECT_NEAR(result_vector[0].normal[2], idx[2] * 0.0, 0.0016);
317 location[
"sphere1_link"].translation() = Eigen::Vector3d(1, 0, 0);
319 result_vector.clear();
331 result_vector.clear();
342 if (result_vector[0].link_names[0] !=
"sphere_link")
345 if (result_vector[0].single_contact_point)
347 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
348 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][0] - (0.25)) > 0.001 &&
349 std::abs(result_vector[0].nearest_points[0][0] - (0.75)) > 0.001);
350 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001 &&
351 std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001);
352 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][2] - (0.0)) > 0.001 &&
353 std::abs(result_vector[0].nearest_points[0][2] - (0.0)) > 0.001);
357 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.25, 0.001);
358 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 0.0, 0.001);
359 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2], 0.0, 0.001);
360 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], 0.75, 0.001);
361 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], 0.0, 0.001);
362 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][2], 0.0, 0.001);
365 EXPECT_NEAR(result_vector[0].normal[0], idx[2] * 1.0, 0.001);
366 EXPECT_NEAR(result_vector[0].normal[1], idx[2] * 0.0, 0.001);
367 EXPECT_NEAR(result_vector[0].normal[2], idx[2] * 0.0, 0.001);
375 std::vector<std::string> active_links{
"sphere_link",
"sphere1_link" };
378 EXPECT_TRUE(tesseract_common::isIdentical<std::string>(active_links, check_active_links,
false));
387 location[
"sphere_link"] = Eigen::Isometry3d::Identity();
388 location[
"sphere1_link"] = Eigen::Isometry3d::Identity();
389 location[
"sphere1_link"].translation()(0) = 0.2;
404 std::vector<int> idx = { 0, 1, 1 };
405 if (result_vector[0].link_names[0] !=
"sphere_link")
408 if (result_vector[0].single_contact_point)
410 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
411 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][0] - (0.23776)) > 0.001 &&
412 std::abs(result_vector[0].nearest_points[0][0] - (-0.032874)) > 0.001);
413 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001 &&
414 std::abs(result_vector[0].nearest_points[0][1] - (0.0)) > 0.001);
415 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][2] - (-0.025368)) > 0.001 &&
416 std::abs(result_vector[0].nearest_points[0][2] - (0.025368)) > 0.001);
420 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.232874, 0.001);
421 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 0.0, 0.001);
422 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2], -0.025368, 0.001);
423 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], -0.032874, 0.001);
424 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], 0.0, 0.001);
425 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][2], 0.025368, 0.001);
428 EXPECT_GT((idx[2] * result_vector[0].normal).dot(Eigen::Vector3d(1, 0, 0)), 0.0);
429 EXPECT_LT(std::abs(std::acos((idx[2] * result_vector[0].normal).dot(Eigen::Vector3d(1, 0, 0)))), 0.5);
434 location[
"sphere1_link"].translation() = Eigen::Vector3d(1, 0, 0);
436 result_vector.clear();
453 std::vector<std::string> active_links{
"sphere_link",
"sphere1_link" };
456 EXPECT_TRUE(tesseract_common::isIdentical<std::string>(active_links, check_active_links,
false));
461 location[
"sphere_link"] = Eigen::Isometry3d::Identity();
462 location[
"sphere1_link"] = Eigen::Isometry3d::Identity();
463 location[
"sphere1_link"].translation() = Eigen::Vector3d(1, 0, 0);
475 EXPECT_NEAR(result_vector[0].nearest_points[0][1], result_vector[0].nearest_points[1][1], 0.001);
476 EXPECT_NEAR(result_vector[0].nearest_points[0][2], result_vector[0].nearest_points[1][2], 0.001);
478 std::vector<int> idx = { 0, 1, 1 };
479 if (result_vector[0].link_names[0] !=
"sphere_link")
482 if (result_vector[0].single_contact_point)
484 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
485 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][0] - (0.23776)) > 0.001 &&
486 std::abs(result_vector[0].nearest_points[0][0] - (0.76224)) > 0.001);
490 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.23776, 0.001);
491 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], 0.76224, 0.001);
494 EXPECT_GT((idx[2] * result_vector[0].normal).dot(Eigen::Vector3d(1, 0, 0)), 0.0);
495 EXPECT_LT(std::abs(std::acos((idx[2] * result_vector[0].normal).dot(Eigen::Vector3d(1, 0, 0)))), 0.00001);
503 std::vector<std::string> active_links{
"sphere_link",
"sphere1_link" };
506 EXPECT_TRUE(tesseract_common::isIdentical<std::string>(active_links, check_active_links,
false));
514 location[
"sphere1_link"] = Eigen::Isometry3d::Identity();
515 location[
"sphere1_link"].translation()(1) = 0.2;
529 std::vector<int> idx = { 0, 1, 1 };
530 if (result_vector[0].link_names[0] !=
"sphere_link")
533 if (result_vector[0].single_contact_point)
535 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
536 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][1] - (0.2308753)) > 0.001 &&
537 std::abs(result_vector[0].nearest_points[0][1] - (-0.0308753)) > 0.001);
538 EXPECT_NEAR(std::abs(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0]), 0.0425563, 0.001);
539 EXPECT_NEAR(std::abs(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2]), 0.0263040, 0.001);
543 EXPECT_NEAR(std::abs(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0]), 0.0425563, 0.001);
544 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 0.2308753, 0.001);
545 EXPECT_NEAR(std::abs(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2]), 0.0263040, 0.001);
546 EXPECT_NEAR(std::abs(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0]), 0.0425563, 0.001);
547 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], -0.0308753, 0.001);
548 EXPECT_NEAR(std::abs(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][2]), 0.0263040, 0.001);
551 EXPECT_NEAR(std::abs(idx[2] * result_vector[0].normal[0]), 0.3037316, 0.001);
552 EXPECT_NEAR(idx[2] * result_vector[0].normal[1], 0.9340783, 0.001);
553 EXPECT_NEAR(std::abs(idx[2] * result_vector[0].normal[2]), 0.1877358, 0.001);
554 EXPECT_LT(std::abs(std::acos((idx[2] * result_vector[0].normal).dot(Eigen::Vector3d(0, 1, 0)))), 0.4);
565 inline void runTest(DiscreteContactManager& checker,
bool use_convex_mesh)
583 #endif // TESSERACT_COLLISION_COLLISION_SPHERE_SPHERE_UNIT_HPP