29 #ifndef HPP_CONSTRAINTS_CONVEX_SHAPE_HH
30 #define HPP_CONSTRAINTS_CONVEX_SHAPE_HH
32 #include <coal/shape/geometric_shapes.h>
39 #include <hpp/pinocchio/joint.hh>
40 #include <pinocchio/multibody/model.hpp>
43 namespace constraints {
69 assert(std::abs(n.dot(u)) > 1e-8);
70 return A + u * (n.dot(P - A)) / n.dot(u);
85 : Pts_(pts), joint_(joint) {
90 : Pts_(triangleToPoints(t)), joint_(joint) {
98 : Pts_(points(p0, p1, p2)), joint_(joint) {
106 std::reverse(Pts_.begin(), Pts_.end());
119 assert(shapeDimension_ > 2);
120 for (std::size_t i = 0; i < shapeDimension_; ++i) {
121 if (Ns_[i].dot(Ap - Pts_[i]) > 0)
return false;
131 assert(shapeDimension_ > 1);
132 const value_type inf = std::numeric_limits<value_type>::infinity();
133 value_type minPosDist = inf, maxNegDist = -inf;
134 bool outside =
false;
135 for (std::size_t i = 0; i < shapeDimension_; ++i) {
136 value_type d = dist(a - Pts_[i], Ls_[i], Us_[i], Ns_[i]);
139 if (
d < minPosDist) minPosDist =
d;
141 if (d <= 0 && d > maxNegDist) maxNegDist =
d;
143 if (outside)
return minPosDist;
149 assert(shapeDimension_ > 2);
155 assert(shapeDimension_ > 2);
163 if (Pts_ != other.
Pts_)
return false;
165 if (C_ != other.
C_)
return false;
166 if (N_ != other.
N_)
return false;
167 if (Ns_ != other.
Ns_)
return false;
168 if (Us_ != other.
Us_)
return false;
169 if (Ls_ != other.
Ls_)
return false;
170 if (MinJoint_ != other.
MinJoint_)
return false;
171 if (joint_ != other.
joint_)
return false;
189 std::vector<vector3_t>
Ns_, Us_;
202 if (c1 <= 0)
return (u.dot(w) > 0) ? (w.norm()) : (-w.norm());
206 return (u.dot(w) > 0) ? ((w - c2 * v).norm()) : (-(w - c2 * v).norm());
210 static std::vector<vector3_t> triangleToPoints(
const coal::TriangleP& t) {
213 std::vector<vector3_t> ret(3);
221 std::vector<vector3_t> ret(3);
229 shapeDimension_ = Pts_.size();
231 switch (shapeDimension_) {
233 throw std::logic_error(
"Cannot represent an empty shape.");
245 C_ = (Pts_[0] + Pts_[1]) / 2;
248 Us_.push_back(Pts_[1] - Pts_[0]);
249 Ls_[0] = Us_[0].norm();
252 N_ =
vector3_t(-Us_[0][1], Us_[0][0], 0);
254 N_ =
vector3_t(0, -Us_[0][2], Us_[0][1]);
256 Ns_.push_back(Us_[0].cross(N_));
262 for (std::size_t i = 0; i < shapeDimension_; ++i) C_ += Pts_[i];
266 N_ = (Pts_[1] - Pts_[0]).cross(Pts_[2] - Pts_[1]);
270 Us_.resize(Pts_.size());
271 Ns_.resize(Pts_.size());
272 for (std::size_t i = 0; i < shapeDimension_; ++i) {
273 Us_[i] = Pts_[(i + 1) % shapeDimension_] - Pts_[i];
274 Ls_[i] = Us_[i].norm();
276 Ns_[i] = Us_[i].cross(N_);
279 for (std::size_t i = 0; i < shapeDimension_; ++i) {
280 assert(Us_[(i + 1) % shapeDimension_].dot(Ns_[i]) < 0 &&
281 "The sequence does not define a convex surface");
286 MinJoint_.translation() = C_;
287 MinJoint_.rotation().col(0) = N_;
288 MinJoint_.rotation().col(1) = Ns_[0];
289 MinJoint_.rotation().col(2) = Us_[0];
305 _recompute<true>(cs);
307 oMj_ = cs.
joint_->currentTransformation();
308 _recompute<false>(cs);
315 const pinocchio::DeviceData&
d) {
318 _recompute<true>(cs);
320 oMj_ = cs.
joint_->currentTransformation(
d);
321 _recompute<false>(cs);
325 template <
bool WorldFrame>
331 center_ = oMj_.act(cs.
C_);
332 normal_ = oMj_.rotation() * cs.
N_;
348 return isInside(cs, intersection(A, u));
362 yaxis = oMj_.actInv(yaxis);
368 M.translation() = cs.
C_;
369 M.rotation().col(0) = cs.
N_;
370 M.rotation().col(1) = yaxis;
371 M.rotation().col(2) = cs.
N_.cross(yaxis);
380 if (cs.
joint_ != NULL) a = oMj_.actInv(a);
Definition: convex-shape.hh:73
ConvexShape(const std::vector< vector3_t > &pts, JointPtr_t joint=JointPtr_t())
Definition: convex-shape.hh:83
Transform3s MinJoint_
Definition: convex-shape.hh:191
ConvexShape(const vector3_t &p0, const vector3_t &p1, const vector3_t &p2, const JointPtr_t &joint=JointPtr_t())
Definition: convex-shape.hh:96
const vector3_t & planeYaxis() const
Definition: convex-shape.hh:154
bool operator!=(ConvexShape const &other) const
Definition: convex-shape.hh:174
vector3_t C_
the center in the joint frame. It is constant.
Definition: convex-shape.hh:182
std::vector< vector3_t > Us_
Definition: convex-shape.hh:189
std::vector< vector3_t > Pts_
The points in the joint frame. It is constant.
Definition: convex-shape.hh:179
bool operator==(ConvexShape const &other) const
Definition: convex-shape.hh:162
ConvexShape(const ConvexShape &t)
Definition: convex-shape.hh:103
bool isInsideLocal(const vector3_t &Ap) const
As isInside but consider A as expressed in joint frame.
Definition: convex-shape.hh:118
const Transform3s & positionInJoint() const
Transform of the shape in the joint frame.
Definition: convex-shape.hh:160
void reverse()
Definition: convex-shape.hh:105
vector3_t N_
the normal to the shape in the joint frame. It is constant.
Definition: convex-shape.hh:184
const vector3_t & planeXaxis() const
Return the X axis of the plane in the joint frame.
Definition: convex-shape.hh:148
value_type distanceLocal(const vector3_t &a) const
Definition: convex-shape.hh:130
vector_t Ls_
Definition: convex-shape.hh:190
std::vector< vector3_t > Ns_
Definition: convex-shape.hh:189
ConvexShape(const coal::TriangleP &t, const JointPtr_t &joint=JointPtr_t())
Definition: convex-shape.hh:89
vector3_t intersectionLocal(const vector3_t &A, const vector3_t &u) const
Definition: convex-shape.hh:112
JointPtr_t joint_
Definition: convex-shape.hh:192
size_t shapeDimension_
Definition: convex-shape.hh:180
#define HPP_CONSTRAINTS_DLLAPI
Definition: config.hh:88
assert(d.lhs()._blocks()==d.rhs()._blocks())
const Derived & d
Definition: matrix-view-operation.hh:138
pinocchio::vector3_t vector3_t
Definition: fwd.hh:52
void closestPointToSegment(const vector3_t &P, const vector3_t &A, const vector3_t &v, vector3_t &B)
Definition: convex-shape.hh:48
pinocchio::Transform3s Transform3s
Definition: fwd.hh:64
pinocchio::value_type value_type
Definition: fwd.hh:48
bool operator==(const ComparisonTypes_t &v, const internal::ReplicateCompType &r)
Definition: comparison-types.hh:117
pinocchio::vector_t vector_t
Definition: fwd.hh:59
vector3_t linePlaneIntersection(const vector3_t &A, const vector3_t &u, const vector3_t &P, const vector3_t &n)
Definition: convex-shape.hh:67
pinocchio::JointPtr_t JointPtr_t
Definition: fwd.hh:49
Definition: active-set-differentiable-function.hh:36
Definition: convex-shape.hh:293
Transform3s alignedPositionInJoint(const ConvexShape &cs, vector3_t yaxis) const
Definition: convex-shape.hh:358
vector3_t normal_
Definition: convex-shape.hh:295
void updateToCurrentTransform(const ConvexShape &cs, const pinocchio::DeviceData &d)
Definition: convex-shape.hh:314
Transform3s oMj_
Definition: convex-shape.hh:299
void _recompute(const ConvexShape &cs)
Definition: convex-shape.hh:326
bool isInside(const ConvexShape &cs, const vector3_t &A, const vector3_t &u) const
Definition: convex-shape.hh:346
vector3_t intersection(const vector3_t &A, const vector3_t &u) const
Definition: convex-shape.hh:338
void updateToCurrentTransform(const ConvexShape &cs)
Compute center and normal in world frame.
Definition: convex-shape.hh:302
bool isInside(const ConvexShape &cs, const vector3_t &Ap) const
Check whether the point As in world frame is inside the triangle.
Definition: convex-shape.hh:351
value_type distance(const ConvexShape &cs, vector3_t a) const
Definition: convex-shape.hh:379
vector3_t center_
Definition: convex-shape.hh:297