diff --git a/include/hpp/fcl/BV/BV_node.h b/include/hpp/fcl/BV/BV_node.h index 13e681278872efd0fa6459c8ccfc7c7ef7d3e7c8..5f83add9ba1b95f5e443bbd05dbda83fe9f3511d 100644 --- a/include/hpp/fcl/BV/BV_node.h +++ b/include/hpp/fcl/BV/BV_node.h @@ -116,6 +116,10 @@ struct BVNode : public BVNodeBase static const Matrix3f id3 = Matrix3f::Identity(); return id3; } + + /// \cond + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + /// \endcond }; template<> diff --git a/include/hpp/fcl/BV/kDOP.h b/include/hpp/fcl/BV/kDOP.h index 3293be7117921de97cbc5497c478881673a75676..2cb8ea52c07308f5a6c2c1d348cc4ceab4da2527 100644 --- a/include/hpp/fcl/BV/kDOP.h +++ b/include/hpp/fcl/BV/kDOP.h @@ -85,12 +85,12 @@ struct CollisionRequest; /// (-1, -1, 1) and (1, 1, -1) --> indices 9 and 21 /// (-1, 1, -1) and (1, -1, 1) --> indices 10 and 22 /// (1, -1, -1) and (-1, 1, 1) --> indices 11 and 23 -template<size_t N> +template<short N> class KDOP { private: /// @brief Origin's distances to N KDOP planes - FCL_REAL dist_[N]; + Eigen::Array<FCL_REAL, N, 1> dist_; public: @@ -103,16 +103,15 @@ public: /// @brief Creating kDOP containing two points KDOP(const Vec3f& a, const Vec3f& b); - /// @brief Check whether two KDOPs are overlapped + /// @brief Check whether two KDOPs overlap. bool overlap(const KDOP<N>& other) const; - /// Not implemented - bool overlap(const KDOP<N>& other, const CollisionRequest&, - FCL_REAL& sqrDistLowerBound) const - { - sqrDistLowerBound = sqrt (-1); - return overlap (other); - } + /// @brief Check whether two KDOPs overlap. + /// @return true if collision happens. + /// @retval sqrDistLowerBound squared lower bound on distance between boxes if + /// they do not overlap. + bool overlap(const KDOP<N>& other, const CollisionRequest& request, + FCL_REAL& sqrDistLowerBound) const; /// @brief The distance between two KDOP<N>. Not implemented. FCL_REAL distance(const KDOP<N>& other, Vec3f* P = NULL, Vec3f* Q = NULL) const; @@ -135,7 +134,7 @@ public: /// @brief The (AABB) center inline Vec3f center() const { - return Vec3f(dist_[0] + dist_[N / 2], dist_[1] + dist_[N / 2 + 1], dist_[2] + dist_[N / 2 + 2]) * 0.5; + return (dist_.template head<3>() + dist_.template segment<3>(N/2)) / 2; } @@ -163,12 +162,12 @@ public: return width() * height() * depth(); } - inline FCL_REAL dist(std::size_t i) const + inline FCL_REAL dist(short i) const { return dist_[i]; } - inline FCL_REAL& dist(std::size_t i) + inline FCL_REAL& dist(short i) { return dist_[i]; } @@ -176,16 +175,20 @@ public: //// @brief Check whether one point is inside the KDOP bool inside(const Vec3f& p) const; + public: + /// \cond + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + /// \endcond }; -template<size_t N> +template<short N> bool overlap(const Matrix3f& /*R0*/, const Vec3f& /*T0*/, const KDOP<N>& /*b1*/, const KDOP<N>& /*b2*/) { throw std::logic_error ("not implemented"); } -template<size_t N> +template<short N> bool overlap(const Matrix3f& /*R0*/, const Vec3f& /*T0*/, const KDOP<N>& /*b1*/, const KDOP<N>& /*b2*/, const CollisionRequest& /*request*/, FCL_REAL& /*sqrDistLowerBound*/) @@ -194,7 +197,7 @@ bool overlap(const Matrix3f& /*R0*/, const Vec3f& /*T0*/, } /// @brief translate the KDOP BV -template<size_t N> +template<short N> KDOP<N> translate(const KDOP<N>& bv, const Vec3f& t); } diff --git a/include/hpp/fcl/narrowphase/gjk.h b/include/hpp/fcl/narrowphase/gjk.h index 6e7d25ffc487085b533802b52cf1fb94c67c93cb..508480099c974ae6b0b9ee3f8007f2890d260ffe 100644 --- a/include/hpp/fcl/narrowphase/gjk.h +++ b/include/hpp/fcl/narrowphase/gjk.h @@ -218,7 +218,6 @@ static const size_t EPA_MAX_ITERATIONS = 255; /// @brief class for EPA algorithm struct EPA { -private: typedef GJK::SimplexV SimplexV; struct SimplexF { diff --git a/src/BV/OBB.cpp b/src/BV/OBB.cpp index 98a45f4668fbd81d847f37745575fd166bcedb77..9fb2d1502615f633f2c763db84a7eff72f428c62 100644 --- a/src/BV/OBB.cpp +++ b/src/BV/OBB.cpp @@ -331,6 +331,9 @@ namespace internal const Matrix3f& Bf, const FCL_REAL& breakDistance2, FCL_REAL& squaredLowerBoundDistance) { + FCL_REAL sinus2 = 1 - Bf (ia,ib) * Bf (ia,ib); + if (sinus2 < 1e-6) return false; + const FCL_REAL s = T[ka] * B(ja, ib) - T[ja] * B(ka, ib); const FCL_REAL diff = fabs(s) - (a[ja] * Bf(ka, ib) + a[ka] * Bf(ja, ib) + @@ -338,21 +341,10 @@ namespace internal // We need to divide by the norm || Aia x Bib || // As ||Aia|| = ||Bib|| = 1, (Aia | Bib)^2 = cosine^2 if (diff > 0) { - FCL_REAL sinus2 = 1 - Bf (ia,ib) * Bf (ia,ib); - if (sinus2 > 1e-6) { - squaredLowerBoundDistance = diff * diff / sinus2; - if (squaredLowerBoundDistance > breakDistance2) { - return true; - } + squaredLowerBoundDistance = diff * diff / sinus2; + if (squaredLowerBoundDistance > breakDistance2) { + return true; } - /* // or - FCL_REAL sinus2 = 1 - Bf (ia,ib) * Bf (ia,ib); - squaredLowerBoundDistance = diff * diff; - if (squaredLowerBoundDistance > breakDistance2 * sinus2) { - squaredLowerBoundDistance /= sinus2; - return true; - } - // */ } return false; } diff --git a/src/BV/kDOP.cpp b/src/BV/kDOP.cpp index 7959bff0d141f61d060c04b64a4a01c229228eb7..ffd99604272d694a1e2ddc77272c7918394e55f4 100644 --- a/src/BV/kDOP.cpp +++ b/src/BV/kDOP.cpp @@ -39,6 +39,8 @@ #include <limits> #include <iostream> +#include <hpp/fcl/collision_data.h> + namespace hpp { namespace fcl @@ -67,7 +69,7 @@ inline void minmax(FCL_REAL p, FCL_REAL& minv, FCL_REAL& maxv) /// @brief Compute the distances to planes with normals from KDOP vectors except those of AABB face planes -template<std::size_t N> +template<short N> void getDistances(const Vec3f& p, FCL_REAL* d) {} /// @brief Specification of getDistances @@ -106,39 +108,34 @@ inline void getDistances<9>(const Vec3f& p, FCL_REAL* d) d[8] = p[1] + p[2] - p[0]; } - - -template<size_t N> +template<short N> KDOP<N>::KDOP() { FCL_REAL real_max = std::numeric_limits<FCL_REAL>::max(); - for(size_t i = 0; i < N / 2; ++i) - { - dist_[i] = real_max; - dist_[i + N / 2] = -real_max; - } + dist_.template head<N/2>().setConstant( real_max); + dist_.template tail<N/2>().setConstant(-real_max); } -template<size_t N> +template<short N> KDOP<N>::KDOP(const Vec3f& v) { - for(size_t i = 0; i < 3; ++i) + for(short i = 0; i < 3; ++i) { dist_[i] = dist_[N / 2 + i] = v[i]; } FCL_REAL d[(N - 6) / 2]; getDistances<(N - 6) / 2>(v, d); - for(size_t i = 0; i < (N - 6) / 2; ++i) + for(short i = 0; i < (N - 6) / 2; ++i) { dist_[3 + i] = dist_[3 + i + N / 2] = d[i]; } } -template<size_t N> +template<short N> KDOP<N>::KDOP(const Vec3f& a, const Vec3f& b) { - for(size_t i = 0; i < 3; ++i) + for(short i = 0; i < 3; ++i) { minmax(a[i], b[i], dist_[i], dist_[i + N / 2]); } @@ -146,55 +143,69 @@ KDOP<N>::KDOP(const Vec3f& a, const Vec3f& b) FCL_REAL ad[(N - 6) / 2], bd[(N - 6) / 2]; getDistances<(N - 6) / 2>(a, ad); getDistances<(N - 6) / 2>(b, bd); - for(size_t i = 0; i < (N - 6) / 2; ++i) + for(short i = 0; i < (N - 6) / 2; ++i) { minmax(ad[i], bd[i], dist_[3 + i], dist_[3 + i + N / 2]); } } -template<size_t N> +template<short N> bool KDOP<N>::overlap(const KDOP<N>& other) const { - for(size_t i = 0; i < N / 2; ++i) - { - if(dist_[i] > other.dist_[i + N / 2]) return false; - if(dist_[i + N / 2] < other.dist_[i]) return false; + if ((dist_.template head<N/2>() > other.dist_.template tail<N/2>()).any()) return false; + if ((dist_.template tail<N/2>() < other.dist_.template head<N/2>()).any()) return false; + return true; +} + +template<short N> +bool KDOP<N>::overlap(const KDOP<N>& other, const CollisionRequest& request, + FCL_REAL& sqrDistLowerBound) const +{ + const FCL_REAL breakDistance (request.break_distance + request.security_margin); + + FCL_REAL a = (dist_.template head<N/2>() - other.dist_.template tail<N/2>()).minCoeff(); + if (a > breakDistance) { + sqrDistLowerBound = a*a; + return false; + } + + FCL_REAL b = (other.dist_.template head<N/2>() - dist_.template tail<N/2>()).minCoeff(); + if (b > breakDistance) { + sqrDistLowerBound = b*b; + return false; } + sqrDistLowerBound = std::min(a, b); return true; } -template<size_t N> +template<short N> bool KDOP<N>::inside(const Vec3f& p) const { - for(size_t i = 0; i < 3; ++i) - { - if(p[i] < dist_[i] || p[i] > dist_[i + N / 2]) - return false; - } + if ((p.array() < dist_.template head<3>()).any()) return false; + if ((p.array() > dist_.template segment<3>(N/2)).any()) return false; - FCL_REAL d[(N - 6) / 2]; - getDistances<(N - 6) / 2>(p, d); - for(size_t i = 0; i < (N - 6) / 2; ++i) - { - if(d[i] < dist_[3 + i] || d[i] > dist_[i + 3 + N / 2]) - return false; - } + enum { P = ((N-6)/2) }; + Eigen::Array<FCL_REAL, P, 1> d; + getDistances<P>(p, d.data()); + + if ((d < dist_.template segment<P>(3 )).any()) return false; + if ((d > dist_.template segment<P>(3+N/2)).any()) return false; return true; } -template<size_t N> +template<short N> KDOP<N>& KDOP<N>::operator += (const Vec3f& p) { - for(size_t i = 0; i < 3; ++i) + for(short i = 0; i < 3; ++i) { minmax(p[i], dist_[i], dist_[N / 2 + i]); } FCL_REAL pd[(N - 6) / 2]; getDistances<(N - 6) / 2>(p, pd); - for(size_t i = 0; i < (N - 6) / 2; ++i) + for(short i = 0; i < (N - 6) / 2; ++i) { minmax(pd[i], dist_[3 + i], dist_[3 + N / 2 + i]); } @@ -202,10 +213,10 @@ KDOP<N>& KDOP<N>::operator += (const Vec3f& p) return *this; } -template<size_t N> +template<short N> KDOP<N>& KDOP<N>::operator += (const KDOP<N>& other) { - for(size_t i = 0; i < N / 2; ++i) + for(short i = 0; i < N / 2; ++i) { dist_[i] = std::min(other.dist_[i], dist_[i]); dist_[i + N / 2] = std::max(other.dist_[i + N / 2], dist_[i + N / 2]); @@ -213,7 +224,7 @@ KDOP<N>& KDOP<N>::operator += (const KDOP<N>& other) return *this; } -template<size_t N> +template<short N> KDOP<N> KDOP<N>::operator + (const KDOP<N>& other) const { KDOP<N> res(*this); @@ -221,7 +232,7 @@ KDOP<N> KDOP<N>::operator + (const KDOP<N>& other) const } -template<size_t N> +template<short N> FCL_REAL KDOP<N>::distance(const KDOP<N>& /*other*/, Vec3f* /*P*/, Vec3f* /*Q*/) const { std::cerr << "KDOP distance not implemented!" << std::endl; @@ -229,22 +240,22 @@ FCL_REAL KDOP<N>::distance(const KDOP<N>& /*other*/, Vec3f* /*P*/, Vec3f* /*Q*/) } -template<size_t N> +template<short N> KDOP<N> translate(const KDOP<N>& bv, const Vec3f& t) { KDOP<N> res(bv); - for(size_t i = 0; i < 3; ++i) + for(short i = 0; i < 3; ++i) { res.dist(i) += t[i]; - res.dist(N / 2 + i) += t[i]; + res.dist(short(N / 2 + i)) += t[i]; } FCL_REAL d[(N - 6) / 2]; getDistances<(N - 6) / 2>(t, d); - for(size_t i = 0; i < (N - 6) / 2; ++i) + for(short i = 0; i < (N - 6) / 2; ++i) { - res.dist(3 + i) += d[i]; - res.dist(3 + i + N / 2) += d[i]; + res.dist(short(3 + i)) += d[i]; + res.dist(short(3 + i + N / 2)) += d[i]; } return res; diff --git a/src/narrowphase/gjk.cpp b/src/narrowphase/gjk.cpp index 9f0b94db7e2a185edb8bda396a9c2bf7b60bfe5a..329d9537c7e79a337c1506be7334cdf930bb4371 100644 --- a/src/narrowphase/gjk.cpp +++ b/src/narrowphase/gjk.cpp @@ -1058,25 +1058,26 @@ void EPA::initialize() bool EPA::getEdgeDist(SimplexF* face, SimplexV* a, SimplexV* b, FCL_REAL& dist) { - Vec3f ba = b->w - a->w; - Vec3f n_ab = ba.cross(face->n); + Vec3f ab = b->w - a->w; + Vec3f n_ab = ab.cross(face->n); FCL_REAL a_dot_nab = a->w.dot(n_ab); if(a_dot_nab < 0) // the origin is on the outside part of ab { // following is similar to projectOrigin for two points // however, as we dont need to compute the parameterization, dont need to compute 0 or 1 - FCL_REAL a_dot_ba = a->w.dot(ba); - FCL_REAL b_dot_ba = b->w.dot(ba); + FCL_REAL a_dot_ab = a->w.dot(ab); + FCL_REAL b_dot_ab = b->w.dot(ab); - if(a_dot_ba > 0) + if(a_dot_ab > 0) dist = a->w.norm(); - else if(b_dot_ba < 0) + else if(b_dot_ab < 0) dist = b->w.norm(); else { - FCL_REAL a_dot_b = a->w.dot(b->w); - dist = std::sqrt(std::max(a->w.squaredNorm() * b->w.squaredNorm() - a_dot_b * a_dot_b, (FCL_REAL)0)); + dist = std::sqrt(std::max( + a->w.squaredNorm() - a_dot_ab * a_dot_ab / ab.squaredNorm(), + 0.)); } return true; @@ -1099,16 +1100,17 @@ EPA::SimplexF* EPA::newFace(SimplexV* a, SimplexV* b, SimplexV* c, bool forced) face->n = (b->w - a->w).cross(c->w - a->w); FCL_REAL l = face->n.norm(); - if(l > tolerance) + if(l > Eigen::NumTraits<FCL_REAL>::epsilon()) { + face->n /= l; + if(!(getEdgeDist(face, a, b, face->d) || getEdgeDist(face, b, c, face->d) || getEdgeDist(face, c, a, face->d))) { - face->d = a->w.dot(face->n) / l; + face->d = a->w.dot(face->n); } - face->n /= l; if(forced || face->d >= -tolerance) return face; else @@ -1194,46 +1196,35 @@ EPA::Status EPA::evaluate(GJK& gjk, const Vec3f& guess) status = Valid; for(; iterations < max_iterations; ++iterations) { - if(nextsv < max_vertex_num) - { - SimplexHorizon horizon; - SimplexV* w = &sv_store[nextsv++]; - bool valid = true; - best->pass = ++pass; - // At the moment, SimplexF.n is always normalized. This could be revised in the future... - gjk.getSupport(best->n, true, *w); - FCL_REAL wdist = best->n.dot(w->w) - best->d; - if(wdist > tolerance) - { - for(size_t j = 0; (j < 3) && valid; ++j) - { - valid &= expand(pass, w, best->f[j], best->e[j], horizon); - } - - - if(valid && horizon.nf >= 3) - { - // need to add the edge connectivity between first and last faces - bind(horizon.ff, 2, horizon.cf, 1); - hull.remove(best); - stock.append(best); - best = findBest(); - outer = *best; - } - else - { - status = InvalidHull; break; - } - } - else - { - status = AccuracyReached; break; - } + if (nextsv >= max_vertex_num) { + status = OutOfVertices; + break; } - else - { - status = OutOfVertices; break; + + SimplexHorizon horizon; + SimplexV* w = &sv_store[nextsv++]; + bool valid = true; + best->pass = ++pass; + // At the moment, SimplexF.n is always normalized. This could be revised in the future... + gjk.getSupport(best->n, true, *w); + FCL_REAL wdist = best->n.dot(w->w) - best->d; + if(wdist <= tolerance) { + status = AccuracyReached; + break; + } + for(size_t j = 0; (j < 3) && valid; ++j) + valid &= expand(pass, w, best->f[j], best->e[j], horizon); + + if(!valid || horizon.nf < 3) { + status = InvalidHull; + break; } + // need to add the edge connectivity between first and last faces + bind(horizon.ff, 2, horizon.cf, 1); + hull.remove(best); + stock.append(best); + best = findBest(); + outer = *best; } normal = outer.n; @@ -1264,45 +1255,44 @@ bool EPA::expand(size_t pass, SimplexV* w, SimplexF* f, size_t e, SimplexHorizon static const size_t nexti[] = {1, 2, 0}; static const size_t previ[] = {2, 0, 1}; - if(f->pass != pass) + if(f->pass == pass) + return false; + + const size_t e1 = nexti[e]; + + // case 1: the new face is not degenerated, i.e., the new face is not coplanar with the old face f. + if(f->n.dot(w->w - f->vertex[e]->w) < -tolerance) { - const size_t e1 = nexti[e]; - - // case 1: the new face is not degenerated, i.e., the new face is not coplanar with the old face f. - if(f->n.dot(w->w) - f->d < -tolerance) + SimplexF* nf = newFace(f->vertex[e1], f->vertex[e], w, false); + if(nf) { - SimplexF* nf = newFace(f->vertex[e1], f->vertex[e], w, false); - if(nf) - { - // add face-face connectivity - bind(nf, 0, f, e); - - // if there is last face in the horizon, then need to add another connectivity, i.e. the edge connecting the current new add edge and the last new add edge. - // This does not finish all the connectivities because the final face need to connect with the first face, this will be handled in the evaluate function. - // Notice the face is anti-clockwise, so the edges are 0 (bottom), 1 (right), 2 (left) - if(horizon.cf) - bind(nf, 2, horizon.cf, 1); - else - horizon.ff = nf; - - horizon.cf = nf; - ++horizon.nf; - return true; - } - } - else // case 2: the new face is coplanar with the old face f. We need to add two faces and delete the old face - { - const size_t e2 = previ[e]; - f->pass = pass; - if(expand(pass, w, f->f[e1], f->e[e1], horizon) && expand(pass, w, f->f[e2], f->e[e2], horizon)) - { - hull.remove(f); - stock.append(f); - return true; - } + // add face-face connectivity + bind(nf, 0, f, e); + + // if there is last face in the horizon, then need to add another connectivity, i.e. the edge connecting the current new add edge and the last new add edge. + // This does not finish all the connectivities because the final face need to connect with the first face, this will be handled in the evaluate function. + // Notice the face is anti-clockwise, so the edges are 0 (bottom), 1 (right), 2 (left) + if(horizon.cf) + bind(nf, 2, horizon.cf, 1); + else + horizon.ff = nf; + + horizon.cf = nf; + ++horizon.nf; + return true; } + return false; } + // case 2: the new face is coplanar with the old face f. We need to add two faces and delete the old face + const size_t e2 = previ[e]; + f->pass = pass; + if(expand(pass, w, f->f[e1], f->e[e1], horizon) && expand(pass, w, f->f[e2], f->e[e2], horizon)) + { + hull.remove(f); + stock.append(f); + return true; + } return false; } diff --git a/src/shape/geometric_shapes_utility.cpp b/src/shape/geometric_shapes_utility.cpp index c0aba4929503b4948ed397f71a74ff2ceb51c460..bea9e11ee801a8795708f6dd32a55a2dd2c864c4 100644 --- a/src/shape/geometric_shapes_utility.cpp +++ b/src/shape/geometric_shapes_utility.cpp @@ -508,10 +508,10 @@ void computeBV<KDOP<16>, Halfspace>(const Halfspace& s, const Transform3f& tf, K const Vec3f& n = new_s.n; const FCL_REAL& d = new_s.d; - const std::size_t D = 8; - for(std::size_t i = 0; i < D; ++i) + const short D = 8; + for(short i = 0; i < D; ++i) bv.dist(i) = -std::numeric_limits<FCL_REAL>::max(); - for(std::size_t i = D; i < 2 * D; ++i) + for(short i = D; i < 2 * D; ++i) bv.dist(i) = std::numeric_limits<FCL_REAL>::max(); if(n[1] == (FCL_REAL)0.0 && n[2] == (FCL_REAL)0.0) @@ -563,11 +563,11 @@ void computeBV<KDOP<18>, Halfspace>(const Halfspace& s, const Transform3f& tf, K const Vec3f& n = new_s.n; const FCL_REAL& d = new_s.d; - const std::size_t D = 9; + const short D = 9; - for(std::size_t i = 0; i < D; ++i) + for(short i = 0; i < D; ++i) bv.dist(i) = -std::numeric_limits<FCL_REAL>::max(); - for(std::size_t i = D; i < 2 * D; ++i) + for(short i = D; i < 2 * D; ++i) bv.dist(i) = std::numeric_limits<FCL_REAL>::max(); if(n[1] == (FCL_REAL)0.0 && n[2] == (FCL_REAL)0.0) @@ -624,11 +624,11 @@ void computeBV<KDOP<24>, Halfspace>(const Halfspace& s, const Transform3f& tf, K const Vec3f& n = new_s.n; const FCL_REAL& d = new_s.d; - const std::size_t D = 12; + const short D = 12; - for(std::size_t i = 0; i < D; ++i) + for(short i = 0; i < D; ++i) bv.dist(i) = -std::numeric_limits<FCL_REAL>::max(); - for(std::size_t i = D; i < 2 * D; ++i) + for(short i = D; i < 2 * D; ++i) bv.dist(i) = std::numeric_limits<FCL_REAL>::max(); if(n[1] == (FCL_REAL)0.0 && n[2] == (FCL_REAL)0.0) @@ -748,11 +748,11 @@ void computeBV<KDOP<16>, Plane>(const Plane& s, const Transform3f& tf, KDOP<16>& const Vec3f& n = new_s.n; const FCL_REAL& d = new_s.d; - const std::size_t D = 8; + const short D = 8; - for(std::size_t i = 0; i < D; ++i) + for(short i = 0; i < D; ++i) bv.dist(i) = -std::numeric_limits<FCL_REAL>::max(); - for(std::size_t i = D; i < 2 * D; ++i) + for(short i = D; i < 2 * D; ++i) bv.dist(i) = std::numeric_limits<FCL_REAL>::max(); if(n[1] == (FCL_REAL)0.0 && n[2] == (FCL_REAL)0.0) @@ -799,11 +799,11 @@ void computeBV<KDOP<18>, Plane>(const Plane& s, const Transform3f& tf, KDOP<18>& const Vec3f& n = new_s.n; const FCL_REAL& d = new_s.d; - const std::size_t D = 9; + const short D = 9; - for(std::size_t i = 0; i < D; ++i) + for(short i = 0; i < D; ++i) bv.dist(i) = -std::numeric_limits<FCL_REAL>::max(); - for(std::size_t i = D; i < 2 * D; ++i) + for(short i = D; i < 2 * D; ++i) bv.dist(i) = std::numeric_limits<FCL_REAL>::max(); if(n[1] == (FCL_REAL)0.0 && n[2] == (FCL_REAL)0.0) @@ -854,11 +854,11 @@ void computeBV<KDOP<24>, Plane>(const Plane& s, const Transform3f& tf, KDOP<24>& const Vec3f& n = new_s.n; const FCL_REAL& d = new_s.d; - const std::size_t D = 12; + const short D = 12; - for(std::size_t i = 0; i < D; ++i) + for(short i = 0; i < D; ++i) bv.dist(i) = -std::numeric_limits<FCL_REAL>::max(); - for(std::size_t i = D; i < 2 * D; ++i) + for(short i = D; i < 2 * D; ++i) bv.dist(i) = std::numeric_limits<FCL_REAL>::max(); if(n[1] == (FCL_REAL)0.0 && n[2] == (FCL_REAL)0.0) diff --git a/test/collision.cpp b/test/collision.cpp index da4655f681ee2541dfb674958e9c5d6381d2fd66..dd6cc97d0f01d8180eb5b9274e40b14dcd972d42 100644 --- a/test/collision.cpp +++ b/test/collision.cpp @@ -263,7 +263,7 @@ template<typename BV, bool Oriented, bool recursive> struct traits : base_traits {}; -template<size_t N, bool recursive> +template<short N, bool recursive> struct traits<KDOP<N>, Oriented, recursive> : base_traits { enum { IS_IMPLEMENTED = false diff --git a/travis_custom/custom_before_install_osx.sh b/travis_custom/custom_before_install_osx.sh index 0ee7c787bb68f695b252ccd4552813042351cdee..1b33ed2e550534c2a499507b2271a9f2d54dea02 100755 --- a/travis_custom/custom_before_install_osx.sh +++ b/travis_custom/custom_before_install_osx.sh @@ -9,5 +9,5 @@ brew install boost assimp eigen octomap brew uninstall numpy pip uninstall numpy -y -brew install eigenpy +brew install eigenpy@2 brew link --overwrite numpy@1.16