void test_distance_capsule_box(fcl::GJKSolverType solver_type, S solver_tolerance, S test_tolerance) { using CollisionGeometryPtr_t = std::shared_ptr<fcl::CollisionGeometry<S>>; // Capsule<S> of radius 2 and of height 4 CollisionGeometryPtr_t capsuleGeometry (new fcl::Capsule<S> (2., 4.)); // Box<S> of size 1 by 2 by 4 CollisionGeometryPtr_t boxGeometry (new fcl::Box<S> (1., 2., 4.)); // Enable computation of nearest points fcl::DistanceRequest<S> distanceRequest (true); fcl::DistanceResult<S> distanceResult; distanceRequest.gjk_solver_type = solver_type; distanceRequest.distance_tolerance = solver_tolerance; // Rotate capsule around y axis by pi/2 and move it behind box fcl::Transform3<S> tf1 = fcl::Translation3<S>(fcl::Vector3<S>(-10., 0.8, 1.5)) *fcl::Quaternion<S>(sqrt(2)/2, 0, sqrt(2)/2, 0); fcl::Transform3<S> tf2 = fcl::Transform3<S>::Identity(); fcl::CollisionObject<S> capsule (capsuleGeometry, tf1); fcl::CollisionObject<S> box (boxGeometry, tf2); // test distance distanceResult.clear (); fcl::distance (&capsule, &box, distanceRequest, distanceResult); fcl::Vector3<S> o1 = distanceResult.nearest_points [0]; fcl::Vector3<S> o2 = distanceResult.nearest_points [1]; EXPECT_NEAR (distanceResult.min_distance, 5.5, test_tolerance); EXPECT_NEAR (o1 [0], -6.0, test_tolerance); EXPECT_NEAR (o1 [1], 0.8, test_tolerance); EXPECT_NEAR (o1 [2], 1.5, test_tolerance); EXPECT_NEAR (o2 [0], -0.5, test_tolerance); EXPECT_NEAR (o2 [1], 0.8, test_tolerance); EXPECT_NEAR (o2 [2], 1.5, test_tolerance); }
void test_distance_capsule_box() { using CollisionGeometryPtr_t = std::shared_ptr<fcl::CollisionGeometry<S>>; // Capsule of radius 2 and of height 4 CollisionGeometryPtr_t capsuleGeometry (new fcl::Capsule<S> (2., 4.)); // Box of size 1 by 2 by 4 CollisionGeometryPtr_t boxGeometry (new fcl::Box<S> (1., 2., 4.)); // Enable computation of nearest points fcl::DistanceRequest<S> distanceRequest (true); fcl::DistanceResult<S> distanceResult; fcl::Transform3<S> tf1(fcl::Translation3<S>(fcl::Vector3<S> (3., 0, 0))); fcl::Transform3<S> tf2 = fcl::Transform3<S>::Identity(); fcl::CollisionObject<S> capsule (capsuleGeometry, tf1); fcl::CollisionObject<S> box (boxGeometry, tf2); // test distance fcl::distance (&capsule, &box, distanceRequest, distanceResult); // Nearest point on capsule fcl::Vector3<S> o1 (distanceResult.nearest_points [0]); // Nearest point on box fcl::Vector3<S> o2 (distanceResult.nearest_points [1]); EXPECT_NEAR (distanceResult.min_distance, 0.5, 1e-4); EXPECT_NEAR (o1 [0], -2.0, 1e-4); EXPECT_NEAR (o1 [1], 0.0, 1e-4); EXPECT_NEAR (o2 [0], 0.5, 1e-4); EXPECT_NEAR (o1 [1], 0.0, 1e-4); // TODO(JS): maybe o2 rather than o1? // Move capsule above box tf1 = fcl::Translation3<S>(fcl::Vector3<S> (0., 0., 8.)); capsule.setTransform (tf1); // test distance distanceResult.clear (); fcl::distance (&capsule, &box, distanceRequest, distanceResult); o1 = distanceResult.nearest_points [0]; o2 = distanceResult.nearest_points [1]; EXPECT_NEAR (distanceResult.min_distance, 2.0, 1e-4); EXPECT_NEAR (o1 [0], 0.0, 1e-4); EXPECT_NEAR (o1 [1], 0.0, 1e-4); EXPECT_NEAR (o1 [2], -4.0, 1e-4); // Disabled broken test lines. Please see #25. // CHECK_CLOSE_TO_0 (o2 [0], 1e-4); EXPECT_NEAR (o2 [1], 0.0, 1e-4); EXPECT_NEAR (o2 [2], 2.0, 1e-4); // Rotate capsule around y axis by pi/2 and move it behind box tf1.translation() = fcl::Vector3<S>(-10., 0., 0.); tf1.linear() = fcl::Quaternion<S>(sqrt(2)/2, 0, sqrt(2)/2, 0).toRotationMatrix(); capsule.setTransform (tf1); // test distance distanceResult.clear (); fcl::distance (&capsule, &box, distanceRequest, distanceResult); o1 = distanceResult.nearest_points [0]; o2 = distanceResult.nearest_points [1]; EXPECT_NEAR (distanceResult.min_distance, 5.5, 1e-4); EXPECT_NEAR (o1 [0], 0.0, 1e-4); EXPECT_NEAR (o1 [1], 0.0, 1e-4); EXPECT_NEAR (o1 [2], 4.0, 1e-4); EXPECT_NEAR (o2 [0], -0.5, 1e-4); EXPECT_NEAR (o2 [1], 0.0, 1e-4); EXPECT_NEAR (o2 [2], 0.0, 1e-4); }