1 #ifndef TESSERACT_COLLISION_COLLISION_COMPOUND_MESH_SPHERE_UNIT_HPP
2 #define TESSERACT_COLLISION_COLLISION_COMPOUND_MESH_SPHERE_UNIT_HPP
20 auto resource_locator = std::make_shared<tesseract_common::GeneralResourceLocator>();
21 auto compound_mesh_resource = resource_locator->locateResource(
"package://tesseract_support/meshes/box_box.dae");
23 tesseract_geometry::createMeshFromPath<tesseract_geometry::ConvexMesh>(compound_mesh_resource->getFilePath());
24 CollisionShapePtr box = std::make_shared<tesseract_geometry::CompoundMesh>(meshes);
25 Eigen::Isometry3d box_pose;
26 box_pose.setIdentity();
30 obj1_shapes.push_back(box);
31 obj1_poses.push_back(box_pose);
33 checker.addCollisionObject(
"box_link", 0, obj1_shapes, obj1_poses,
false);
34 checker.enableCollisionObject(
"box_link");
39 CollisionShapePtr thin_box = std::make_shared<tesseract_geometry::Box>(0.1, 1, 1);
40 Eigen::Isometry3d thin_box_pose;
41 thin_box_pose.setIdentity();
45 obj2_shapes.push_back(thin_box);
46 obj2_poses.push_back(thin_box_pose);
48 checker.addCollisionObject(
"thin_box_link", 0, obj2_shapes, obj2_poses);
49 checker.disableCollisionObject(
"thin_box_link");
57 Eigen::Isometry3d sphere_pose;
58 sphere_pose.setIdentity();
62 obj3_shapes.push_back(sphere);
63 obj3_poses.push_back(sphere_pose);
65 checker.addCollisionObject(
"sphere_link", 0, obj3_shapes, obj3_poses);
70 CollisionShapePtr remove_box = std::make_shared<tesseract_geometry::Box>(0.1, 1, 1);
71 Eigen::Isometry3d remove_box_pose;
72 remove_box_pose.setIdentity();
76 obj4_shapes.push_back(remove_box);
77 obj4_poses.push_back(remove_box_pose);
79 checker.addCollisionObject(
"remove_box_link", 0, obj4_shapes, obj4_poses);
80 EXPECT_TRUE(checker.getCollisionObjects().size() == 4);
81 EXPECT_TRUE(checker.hasCollisionObject(
"remove_box_link"));
82 checker.removeCollisionObject(
"remove_box_link");
83 EXPECT_FALSE(checker.hasCollisionObject(
"remove_box_link"));
88 EXPECT_FALSE(checker.removeCollisionObject(
"link_does_not_exist"));
89 EXPECT_FALSE(checker.enableCollisionObject(
"link_does_not_exist"));
90 EXPECT_FALSE(checker.disableCollisionObject(
"link_does_not_exist"));
101 EXPECT_TRUE(checker.getCollisionObjects().size() == 3);
102 for (
const auto& co : checker.getCollisionObjects())
104 EXPECT_TRUE(checker.getCollisionObjectGeometries(co).size() == 1);
105 EXPECT_TRUE(checker.getCollisionObjectGeometriesTransforms(co).size() == 1);
106 for (
const auto& cgt : checker.getCollisionObjectGeometriesTransforms(co))
108 EXPECT_TRUE(cgt.isApprox(Eigen::Isometry3d::Identity(), 1e-5));
115 inline void runTest(DiscreteContactManager& checker)
126 std::vector<std::string> active_links{
"box_link",
"sphere_link" };
127 checker.setActiveCollisionObjects(active_links);
128 std::vector<std::string> check_active_links = checker.getActiveCollisionObjects();
129 EXPECT_TRUE(tesseract_common::isIdentical<std::string>(active_links, check_active_links,
false));
131 EXPECT_TRUE(checker.getContactAllowedValidator() ==
nullptr);
133 checker.setDefaultCollisionMargin(0.1);
134 EXPECT_NEAR(checker.getCollisionMarginData().getMaxCollisionMargin(), 0.1, 1e-5);
138 location[
"box_link"] = Eigen::Isometry3d::Identity();
139 location[
"sphere_link"] = Eigen::Isometry3d::Identity();
140 location[
"sphere_link"].translation()(0) = 0.2;
141 checker.setCollisionObjectsTransform(location);
144 ContactResultMap result;
148 result.flattenMoveResults(result_vector);
151 EXPECT_NEAR(result_vector[0].distance, -0.19053635, 0.001);
153 std::vector<int> idx = { 0, 1, 1 };
154 if (result_vector[0].link_names[0] !=
"box_link")
157 if (result_vector[0].single_contact_point)
159 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
160 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][0] - (0.5)) > 0.001 &&
161 std::abs(result_vector[0].nearest_points[0][0] - (-0.05)) > 0.001);
162 EXPECT_NEAR(result_vector[0].nearest_points[0][1], 0.0, 0.001);
163 EXPECT_NEAR(result_vector[0].nearest_points[0][2], 0.0, 0.001);
167 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.2, 0.001);
168 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 0.0, 0.001);
169 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2], 0.0594636, 0.001);
170 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], 0.2, 0.001);
171 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], 0.0, 0.001);
172 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][2], 0.25, 0.001);
175 EXPECT_NEAR(result_vector[0].normal[0], idx[2] * 0.0, 0.001);
176 EXPECT_NEAR(result_vector[0].normal[1], idx[2] * 0.0, 0.001);
177 EXPECT_NEAR(result_vector[0].normal[2], idx[2] * -1.0, 0.001);
180 EXPECT_EQ(result_vector[0].shape_id[
static_cast<size_t>(idx[0])], 0);
185 location[
"sphere_link"].translation() = Eigen::Vector3d(0, 0, -0.3);
187 result_vector.clear();
190 checker.setCollisionObjectsTransform(
"sphere_link", location[
"sphere_link"]);
192 result.flattenCopyResults(result_vector);
200 result_vector.clear();
203 EXPECT_NEAR(checker.getCollisionMarginData().getMaxCollisionMargin(), 0.251, 1e-5);
205 result.flattenMoveResults(result_vector);
208 EXPECT_NEAR(result_vector[0].distance, 0.1094636, 0.001);
211 if (result_vector[0].link_names[0] !=
"box_link")
214 if (result_vector[0].single_contact_point)
216 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
217 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][0] - (0.5)) > 0.001 &&
218 std::abs(result_vector[0].nearest_points[0][0] - (0.75)) > 0.001);
219 EXPECT_NEAR(result_vector[0].nearest_points[0][1], 0.0, 0.001);
220 EXPECT_NEAR(result_vector[0].nearest_points[0][2], 0.0, 0.001);
225 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.0, 0.002);
226 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 0.0, 0.002);
227 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2], 0.0594636, 0.001);
228 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], 0.0, 0.002);
229 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], 0.0, 0.002);
230 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][2], -0.05, 0.001);
233 EXPECT_NEAR(result_vector[0].normal[0], idx[2] * 0.0, 0.001);
234 EXPECT_NEAR(result_vector[0].normal[1], idx[2] * 0.0, 0.001);
235 EXPECT_NEAR(result_vector[0].normal[2], idx[2] * -1.0, 0.001);
238 EXPECT_EQ(result_vector[0].shape_id[
static_cast<size_t>(idx[0])], 0);
244 result_vector.clear();
245 location[
"sphere_link"].translation() = Eigen::Vector3d(0, 2.75, 0);
247 checker.setCollisionObjectsTransform(
"sphere_link", location[
"sphere_link"]);
249 EXPECT_NEAR(checker.getCollisionMarginData().getMaxCollisionMargin(), 0.1, 1e-5);
251 result.flattenMoveResults(result_vector);
254 EXPECT_NEAR(result_vector[0].distance, 0.03130736, 0.001);
257 if (result_vector[0].link_names[0] !=
"box_link")
260 if (result_vector[0].single_contact_point)
262 EXPECT_NEAR(result_vector[0].nearest_points[0][0], result_vector[0].nearest_points[1][0], 0.001);
263 EXPECT_FALSE(std::abs(result_vector[0].nearest_points[0][0] - (0.5)) > 0.001 &&
264 std::abs(result_vector[0].nearest_points[0][0] - (0.75)) > 0.001);
265 EXPECT_NEAR(result_vector[0].nearest_points[0][1], 0.0, 0.001);
266 EXPECT_NEAR(result_vector[0].nearest_points[0][2], 0.0, 0.001);
270 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][0], 0.0, 0.001);
271 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][1], 2.4702682, 0.001);
272 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[0])][2], 0.0297318, 0.001);
273 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][0], 0.0, 0.001);
274 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][1], 2.5014002, 0.001);
275 EXPECT_NEAR(result_vector[0].nearest_points[
static_cast<size_t>(idx[1])][2], 0.0264228, 0.001);
278 EXPECT_NEAR(result_vector[0].normal[0], idx[2] * 0.0, 0.001);
279 EXPECT_NEAR(result_vector[0].normal[1], idx[2] * 0.9943989, 0.001);
280 EXPECT_NEAR(result_vector[0].normal[2], idx[2] * -0.1056915, 0.001);
283 EXPECT_EQ(result_vector[0].shape_id[
static_cast<size_t>(idx[0])], 0);
288 #endif // TESSERACT_COLLISION_COLLISION_COMPOUND_MESH_SPHERE_UNIT_HPP