static int do_test (void) { setup_eintr (SIGUSR1, NULL); int i; for (i = 0; i < 10; ++i) { pthread_t th; int e = pthread_create (&th, NULL, tf1, NULL); if (e != 0) { char buf[100]; printf ("main: pthread_create failed: %s\n", strerror_r (e, buf, sizeof (buf))); exit (1); } } delayed_exit (3); /* This call must never return. */ (void) tf1 (NULL); return 1; }
static int do_test (void) { setup_eintr (SIGUSR1, NULL); int i; for (i = 0; i < 10; ++i) { pthread_t th; int e = pthread_create (&th, NULL, tf1, NULL); if (e != 0) { char buf[100]; printf ("main: pthread_create failed: %s\n", strerror_r (e, buf, sizeof (buf))); exit (1); } } (void) tf1 (NULL); /* NOTREACHED */ return 0; }
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); }
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 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; distanceRequest.gjk_solver_type = solver_type; distanceRequest.distance_tolerance = solver_tolerance; 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, test_tolerance); EXPECT_NEAR (o1 [0], 1.0, test_tolerance); EXPECT_NEAR (o1 [1], 0.0, test_tolerance); EXPECT_NEAR (o2 [0], 0.5, test_tolerance); EXPECT_NEAR (o2 [1], 0.0, test_tolerance); // 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, test_tolerance); EXPECT_NEAR (o1 [0], 0.0, test_tolerance); EXPECT_NEAR (o1 [1], 0.0, test_tolerance); EXPECT_NEAR (o1 [2], 4.0, test_tolerance); EXPECT_NEAR (o2 [0], 0.0, test_tolerance); EXPECT_NEAR (o2 [1], 0.0, test_tolerance); EXPECT_NEAR (o2 [2], 2.0, test_tolerance); // 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, test_tolerance); EXPECT_NEAR (o1 [0], -6.0, test_tolerance); EXPECT_NEAR (o1 [1], 0.0, test_tolerance); EXPECT_NEAR (o1 [2], 0.0, test_tolerance); EXPECT_NEAR (o2 [0], -0.5, test_tolerance); EXPECT_NEAR (o2 [1], 0.0, test_tolerance); EXPECT_NEAR (o2 [2], 0.0, test_tolerance); }