29#ifndef HPP_CONSTRAINTS_CONVEX_SHAPE_HH 30#define HPP_CONSTRAINTS_CONVEX_SHAPE_HH 33#include <pinocchio/multibody/model.hpp> 36#include <coal/shape/geometric_shapes.h> 41#include <hpp/constraints/config.hh> 73 assert(std::abs(n.dot(u)) > 1e-8);
74 return A + u * (n.dot(P - A)) / n.dot(u);
110 std::reverse(
Pts_.begin(),
Pts_.end());
125 if (
Ns_[i].dot(Ap -
Pts_[i]) > 0)
return false;
136 const value_type inf = std::numeric_limits<value_type>::infinity();
137 value_type minPosDist = inf, maxNegDist = -inf;
138 bool outside =
false;
143 if (d < minPosDist) minPosDist = d;
145 if (d <= 0 && d > maxNegDist) maxNegDist = d;
147 if (outside)
return minPosDist;
167 if (
Pts_ != other.
Pts_)
return false;
169 if (
C_ != other.
C_)
return false;
170 if (
N_ != other.
N_)
return false;
171 if (
Ns_ != other.
Ns_)
return false;
172 if (
Us_ != other.
Us_)
return false;
173 if (
Ls_ != other.
Ls_)
return false;
206 if (c1 <= 0)
return (u.dot(w) > 0) ? (w.norm()) : (-w.norm());
210 return (u.dot(w) > 0) ? ((w - c2 * v).norm()) : (-(w - c2 * v).norm());
214 static std::vector<vector3_t> triangleToPoints(
const coal::TriangleP& t) {
217 std::vector<vector3_t> ret(3);
223 static std::vector<vector3_t> points(
const vector3_t& p0,
const vector3_t& p1,
224 const vector3_t& p2) {
225 std::vector<vector3_t> ret(3);
233 shapeDimension_ = Pts_.size();
235 switch (shapeDimension_) {
237 throw std::logic_error(
"Cannot represent an empty shape.");
243 N_ = vector3_t(1, 0, 0);
244 Ns_.push_back(vector3_t(0, 1, 0));
245 Us_.push_back(vector3_t(0, 0, 1));
249 C_ = (Pts_[0] + Pts_[1]) / 2;
252 Us_.push_back(Pts_[1] - Pts_[0]);
253 Ls_[0] = Us_[0].norm();
256 N_ = vector3_t(-Us_[0][1], Us_[0][0], 0);
258 N_ = vector3_t(0, -Us_[0][2], Us_[0][1]);
260 Ns_.push_back(Us_[0].cross(N_));
264 Ls_ = vector_t(shapeDimension_);
266 for (std::size_t i = 0; i < shapeDimension_; ++i) C_ += Pts_[i];
269 C_ /= (value_type)Pts_.size();
270 N_ = (Pts_[1] - Pts_[0]).cross(Pts_[2] - Pts_[1]);
271 assert(!N_.isZero());
274 Us_.resize(Pts_.size());
275 Ns_.resize(Pts_.size());
276 for (std::size_t i = 0; i < shapeDimension_; ++i) {
277 Us_[i] = Pts_[(i + 1) % shapeDimension_] - Pts_[i];
278 Ls_[i] = Us_[i].norm();
280 Ns_[i] = Us_[i].cross(N_);
283 for (std::size_t i = 0; i < shapeDimension_; ++i) {
284 assert(Us_[(i + 1) % shapeDimension_].dot(Ns_[i]) < 0 &&
285 "The sequence does not define a convex surface");
290 MinJoint_.translation() = C_;
291 MinJoint_.rotation().col(0) = N_;
292 MinJoint_.rotation().col(1) = Ns_[0];
293 MinJoint_.rotation().col(2) = Us_[0];
329 template <
bool WorldFrame>
366 yaxis =
oMj_.actInv(yaxis);
372 M.translation() = cs.
C_;
373 M.rotation().col(0) = cs.
N_;
374 M.rotation().col(1) = yaxis;
375 M.rotation().col(2) = cs.
N_.cross(yaxis);
Definition convex-shape.hh:77
ConvexShape(const std::vector< vector3_t > &pts, JointPtr_t joint=JointPtr_t())
Definition convex-shape.hh:87
Transform3s MinJoint_
Definition convex-shape.hh:195
ConvexShape(const vector3_t &p0, const vector3_t &p1, const vector3_t &p2, const JointPtr_t &joint=JointPtr_t())
Definition convex-shape.hh:100
const vector3_t & planeYaxis() const
Definition convex-shape.hh:158
bool operator!=(ConvexShape const &other) const
Definition convex-shape.hh:178
vector3_t C_
the center in the joint frame. It is constant.
Definition convex-shape.hh:186
std::vector< vector3_t > Us_
Definition convex-shape.hh:193
std::vector< vector3_t > Pts_
The points in the joint frame. It is constant.
Definition convex-shape.hh:183
bool operator==(ConvexShape const &other) const
Definition convex-shape.hh:166
ConvexShape(const ConvexShape &t)
Definition convex-shape.hh:107
bool isInsideLocal(const vector3_t &Ap) const
As isInside but consider A as expressed in joint frame.
Definition convex-shape.hh:122
void reverse()
Definition convex-shape.hh:109
vector3_t N_
the normal to the shape in the joint frame. It is constant.
Definition convex-shape.hh:188
value_type distanceLocal(const vector3_t &a) const
Definition convex-shape.hh:134
vector_t Ls_
Definition convex-shape.hh:194
std::vector< vector3_t > Ns_
Definition convex-shape.hh:193
ConvexShape(const coal::TriangleP &t, const JointPtr_t &joint=JointPtr_t())
Definition convex-shape.hh:93
vector3_t intersectionLocal(const vector3_t &A, const vector3_t &u) const
Definition convex-shape.hh:116
const Transform3s & positionInJoint() const
Transform of the shape in the joint frame.
Definition convex-shape.hh:164
const vector3_t & planeXaxis() const
Return the X axis of the plane in the joint frame.
Definition convex-shape.hh:152
JointPtr_t joint_
Definition convex-shape.hh:196
size_t shapeDimension_
Definition convex-shape.hh:184
assert(d.lhs()._blocks()==d.rhs()._blocks())
Definition active-set-differentiable-function.hh:37
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:51
pinocchio::Transform3s Transform3s
Definition fwd.hh:64
pinocchio::value_type value_type
Definition fwd.hh:48
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:71
pinocchio::JointPtr_t JointPtr_t
Definition fwd.hh:49
Definition convex-shape.hh:297
Transform3s alignedPositionInJoint(const ConvexShape &cs, vector3_t yaxis) const
Definition convex-shape.hh:362
vector3_t normal_
Definition convex-shape.hh:299
void updateToCurrentTransform(const ConvexShape &cs, const pinocchio::DeviceData &d)
Definition convex-shape.hh:318
Transform3s oMj_
Definition convex-shape.hh:303
void _recompute(const ConvexShape &cs)
Definition convex-shape.hh:330
bool isInside(const ConvexShape &cs, const vector3_t &A, const vector3_t &u) const
Definition convex-shape.hh:350
vector3_t intersection(const vector3_t &A, const vector3_t &u) const
Definition convex-shape.hh:342
void updateToCurrentTransform(const ConvexShape &cs)
Compute center and normal in world frame.
Definition convex-shape.hh:306
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:355
value_type distance(const ConvexShape &cs, vector3_t a) const
Definition convex-shape.hh:383
vector3_t center_
Definition convex-shape.hh:301