1 #ifndef TESSERACT_COLLISION_COLLISION_MESH_MESH_UNIT_HPP
2 #define TESSERACT_COLLISION_COLLISION_MESH_MESH_UNIT_HPP
20 auto vertices = std::make_shared<tesseract_common::VectorVector3d>();
21 auto faces = std::make_shared<Eigen::VectorXi>();
28 EXPECT_GT(num_faces, 0);
30 sphere = std::make_shared<tesseract_geometry::Mesh>(vertices, faces);
33 Eigen::Isometry3d sphere_pose;
34 sphere_pose.setIdentity();
38 obj1_shapes.push_back(sphere);
39 obj1_poses.push_back(sphere_pose);
41 checker.addCollisionObject(
"sphere_link", 0, obj1_shapes, obj1_poses,
false);
42 checker.enableCollisionObject(
"sphere_link");
47 CollisionShapePtr thin_box = std::make_shared<tesseract_geometry::Box>(0.1, 1, 1);
48 Eigen::Isometry3d thin_box_pose;
49 thin_box_pose.setIdentity();
53 obj2_shapes.push_back(thin_box);
54 obj2_poses.push_back(thin_box_pose);
56 checker.addCollisionObject(
"thin_box_link", 0, obj2_shapes, obj2_poses);
57 checker.disableCollisionObject(
"thin_box_link");
63 CollisionShapePtr sphere1 = std::make_shared<tesseract_geometry::Mesh>(vertices, faces);
64 Eigen::Isometry3d sphere1_pose;
65 sphere1_pose.setIdentity();
69 obj3_shapes.push_back(sphere1);
70 obj3_poses.push_back(sphere1_pose);
72 checker.addCollisionObject(
"sphere1_link", 0, obj3_shapes, obj3_poses);
77 CollisionShapePtr remove_box = std::make_shared<tesseract_geometry::Box>(0.1, 1, 1);
78 Eigen::Isometry3d remove_box_pose;
79 remove_box_pose.setIdentity();
83 obj4_shapes.push_back(remove_box);
84 obj4_poses.push_back(remove_box_pose);
86 checker.addCollisionObject(
"remove_box_link", 0, obj4_shapes, obj4_poses);
87 EXPECT_TRUE(checker.getCollisionObjects().size() == 4);
88 EXPECT_TRUE(checker.hasCollisionObject(
"remove_box_link"));
89 checker.removeCollisionObject(
"remove_box_link");
90 EXPECT_FALSE(checker.hasCollisionObject(
"remove_box_link"));
95 EXPECT_FALSE(checker.removeCollisionObject(
"link_does_not_exist"));
96 EXPECT_FALSE(checker.enableCollisionObject(
"link_does_not_exist"));
97 EXPECT_FALSE(checker.disableCollisionObject(
"link_does_not_exist"));
108 EXPECT_TRUE(checker.getCollisionObjects().size() == 3);
109 for (
const auto& co : checker.getCollisionObjects())
111 EXPECT_TRUE(checker.getCollisionObjectGeometries(co).size() == 1);
112 EXPECT_TRUE(checker.getCollisionObjectGeometriesTransforms(co).size() == 1);
113 for (
const auto& cgt : checker.getCollisionObjectGeometriesTransforms(co))
115 EXPECT_TRUE(cgt.isApprox(Eigen::Isometry3d::Identity(), 1e-5));
121 inline void runTest(DiscreteContactManager& checker)
132 std::vector<std::string> active_links{
"sphere_link",
"sphere1_link" };
133 checker.setActiveCollisionObjects(active_links);
134 std::vector<std::string> check_active_links = checker.getActiveCollisionObjects();
135 EXPECT_TRUE(tesseract_common::isIdentical<std::string>(active_links, check_active_links,
false));
137 EXPECT_TRUE(checker.getContactAllowedValidator() ==
nullptr);
139 checker.setDefaultCollisionMargin(0);
140 EXPECT_NEAR(checker.getCollisionMarginData().getMaxCollisionMargin(), 0.0, 1e-5);
144 location[
"sphere_link"] = Eigen::Isometry3d::Identity();
145 location[
"sphere1_link"] = Eigen::Isometry3d::Identity();
146 location[
"sphere1_link"].translation()(0) = 0.2;
147 checker.setCollisionObjectsTransform(location);
150 ContactResultMap result;
154 result.flattenMoveResults(result_vector);
161 location[
"sphere1_link"].translation() = Eigen::Vector3d(1, 0, 0);
163 result_vector.clear();
164 checker.setCollisionObjectsTransform(location);
167 result.flattenCopyResults(result_vector);
175 result_vector.clear();
178 EXPECT_NEAR(checker.getCollisionMarginData().getMaxCollisionMargin(), 0.55, 1e-5);
180 result.flattenMoveResults(result_vector);
183 EXPECT_NEAR(result_vector[0].distance, 0.52448, 0.001);
185 std::vector<int> idx = { 0, 1, 1 };
186 if (result_vector[0].link_names[0] !=
"sphere_link")
189 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.23776, 0.001);
190 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], 0.76224, 0.001);
191 EXPECT_NEAR(result_vector[0].nearest_points[0][1], result_vector[0].nearest_points[1][1], 0.001);
192 EXPECT_NEAR(result_vector[0].nearest_points[0][2], result_vector[0].nearest_points[1][2], 0.001);
193 EXPECT_GT((idx[2] * result_vector[0].normal).dot(Eigen::Vector3d(1, 0, 0)), 0.0);
194 EXPECT_LT(std::abs(std::acos((idx[2] * result_vector[0].normal).dot(Eigen::Vector3d(1, 0, 0)))), 0.00001);
199 location[
"sphere1_link"].translation() = Eigen::Vector3d(0, 1, 0);
201 result_vector.clear();
205 checker.setCollisionObjectsTransform(
"sphere1_link", location[
"sphere1_link"]);
207 EXPECT_NEAR(checker.getCollisionMarginData().getMaxCollisionMargin(), 0.55, 1e-5);
209 result.flattenCopyResults(result_vector);
212 EXPECT_NEAR(result_vector[0].distance, 0.5, 0.001);
215 if (result_vector[0].link_names[0] !=
"sphere_link")
218 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 0.25, 0.001);
219 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], 0.75, 0.001);
220 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
221 EXPECT_NEAR(result_vector[0].nearest_points[0][2], result_vector[0].nearest_points[1][2], 0.001);
222 EXPECT_GT((idx[2] * result_vector[0].normal).dot(Eigen::Vector3d(0, 1, 0)), 0.0);
223 EXPECT_LT(std::abs(std::acos((idx[2] * result_vector[0].normal).dot(Eigen::Vector3d(0, 1, 0)))), 0.00001);
226 #endif // TESSERACT_COLLISION_COLLISION_MESH_MESH_UNIT_HPP