33 #ifndef DART_MATH_GEOMETRY_HPP_ 34 #define DART_MATH_GEOMETRY_HPP_ 36 #include <Eigen/Dense> 38 #include "dart/common/Deprecated.hpp" 39 #include "dart/math/Constants.hpp" 40 #include "dart/math/MathTypes.hpp" 46 Eigen::Matrix3d makeSkewSymmetric(
const Eigen::Vector3d& _v);
49 Eigen::Vector3d fromSkewSymmetric(
const Eigen::Matrix3d& _m);
53 Eigen::Quaterniond expToQuat(
const Eigen::Vector3d& _v);
56 Eigen::Vector3d quatToExp(
const Eigen::Quaterniond& _q);
59 Eigen::Vector3d rotatePoint(
60 const Eigen::Quaterniond& _q,
const Eigen::Vector3d& _pt);
63 Eigen::Vector3d rotatePoint(
64 const Eigen::Quaterniond& _q,
double _x,
double _y,
double _z);
67 Eigen::Matrix3d quatDeriv(
const Eigen::Quaterniond& _q,
int _el);
70 Eigen::Matrix3d quatSecondDeriv(
71 const Eigen::Quaterniond& _q,
int _el1,
int _el2);
76 Eigen::Matrix3d eulerXYXToMatrix(
const Eigen::Vector3d& _angle);
80 Eigen::Matrix3d eulerXYZToMatrix(
const Eigen::Vector3d& _angle);
84 Eigen::Matrix3d eulerXZXToMatrix(
const Eigen::Vector3d& _angle);
88 Eigen::Matrix3d eulerXZYToMatrix(
const Eigen::Vector3d& _angle);
92 Eigen::Matrix3d eulerYXYToMatrix(
const Eigen::Vector3d& _angle);
96 Eigen::Matrix3d eulerYXZToMatrix(
const Eigen::Vector3d& _angle);
100 Eigen::Matrix3d eulerYZXToMatrix(
const Eigen::Vector3d& _angle);
104 Eigen::Matrix3d eulerYZYToMatrix(
const Eigen::Vector3d& _angle);
108 Eigen::Matrix3d eulerZXYToMatrix(
const Eigen::Vector3d& _angle);
113 Eigen::Matrix3d eulerZYXToMatrix(
const Eigen::Vector3d& _angle);
117 Eigen::Matrix3d eulerZXZToMatrix(
const Eigen::Vector3d& _angle);
122 Eigen::Matrix3d eulerZYZToMatrix(
const Eigen::Vector3d& _angle);
126 Eigen::Vector3d matrixToEulerXYX(
const Eigen::Matrix3d& _R);
129 Eigen::Vector3d matrixToEulerXYZ(
const Eigen::Matrix3d& _R);
135 Eigen::Vector3d matrixToEulerXZY(
const Eigen::Matrix3d& _R);
141 Eigen::Vector3d matrixToEulerYXZ(
const Eigen::Matrix3d& _R);
144 Eigen::Vector3d matrixToEulerYZX(
const Eigen::Matrix3d& _R);
150 Eigen::Vector3d matrixToEulerZXY(
const Eigen::Matrix3d& _R);
153 Eigen::Vector3d matrixToEulerZYX(
const Eigen::Matrix3d& _R);
163 Eigen::Isometry3d expMap(
const Eigen::Vector6d& _S);
169 Eigen::Isometry3d expAngular(
const Eigen::Vector3d& _s);
172 Eigen::Matrix3d expMapRot(
const Eigen::Vector3d& _expmap);
175 Eigen::Matrix3d expMapJac(
const Eigen::Vector3d& _expmap);
178 Eigen::Matrix3d expMapJacDot(
179 const Eigen::Vector3d& _expmap,
const Eigen::Vector3d& _qdot);
183 Eigen::Matrix3d expMapJacDeriv(
const Eigen::Vector3d& _expmap,
int _qi);
188 Eigen::Vector3d logMap(
const Eigen::Matrix3d& _R);
191 Eigen::Vector6d logMap(
const Eigen::Isometry3d& _T);
209 Eigen::Vector6d AdT(
const Eigen::Isometry3d& _T,
const Eigen::Vector6d& _V);
212 Eigen::Matrix6d getAdTMatrix(
const Eigen::Isometry3d& T);
215 template <
typename Derived>
216 typename Derived::PlainObject AdTJac(
217 const Eigen::Isometry3d& _T,
const Eigen::MatrixBase<Derived>& _J)
221 Derived::RowsAtCompileTime == 6,
222 THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);
224 typename Derived::PlainObject ret(_J.rows(), _J.cols());
227 for (
int i = 0; i < _J.cols(); ++i)
228 ret.col(i) = AdT(_T, _J.col(i));
234 template <
typename Derived>
235 typename Derived::PlainObject AdTJacFixed(
236 const Eigen::Isometry3d& _T,
const Eigen::MatrixBase<Derived>& _J)
239 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived);
243 Derived::RowsAtCompileTime == 6,
244 THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);
246 typename Derived::PlainObject ret(_J.rows(), _J.cols());
249 ret.template topRows<3>().noalias() = _T.linear() * _J.template topRows<3>();
250 ret.template bottomRows<3>().noalias()
251 = -ret.template topRows<3>().colwise().cross(_T.translation())
252 + _T.linear() * _J.template bottomRows<3>();
258 Eigen::Vector6d AdR(
const Eigen::Isometry3d& _T,
const Eigen::Vector6d& _V);
261 Eigen::Vector6d AdTAngular(
262 const Eigen::Isometry3d& _T,
const Eigen::Vector3d& _w);
265 Eigen::Vector6d AdTLinear(
266 const Eigen::Isometry3d& _T,
const Eigen::Vector3d& _v);
272 template <
typename Derived>
273 typename Derived::PlainObject AdRJac(
274 const Eigen::Isometry3d& _T,
const Eigen::MatrixBase<Derived>& _J)
277 Derived::RowsAtCompileTime == 6,
278 THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);
280 typename Derived::PlainObject ret(_J.rows(), _J.cols());
282 ret.template topRows<3>().noalias() = _T.linear() * _J.template topRows<3>();
284 ret.template bottomRows<3>().noalias()
285 = _T.linear() * _J.template bottomRows<3>();
290 template <
typename Derived>
291 typename Derived::PlainObject AdRInvJac(
292 const Eigen::Isometry3d& _T,
const Eigen::MatrixBase<Derived>& _J)
295 Derived::RowsAtCompileTime == 6,
296 THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);
298 typename Derived::PlainObject ret(_J.rows(), _J.cols());
300 ret.template topRows<3>().noalias()
301 = _T.linear().transpose() * _J.template topRows<3>();
303 ret.template bottomRows<3>().noalias()
304 = _T.linear().transpose() * _J.template bottomRows<3>();
309 template <
typename Derived>
310 typename Derived::PlainObject adJac(
311 const Eigen::Vector6d& _V,
const Eigen::MatrixBase<Derived>& _J)
314 Derived::RowsAtCompileTime == 6,
315 THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);
317 typename Derived::PlainObject ret(_J.rows(), _J.cols());
319 ret.template topRows<3>().noalias()
320 = -_J.template topRows<3>().colwise().cross(_V.head<3>());
322 ret.template bottomRows<3>().noalias()
323 = -_J.template bottomRows<3>().colwise().cross(_V.head<3>())
324 - _J.template topRows<3>().colwise().cross(_V.tail<3>());
330 Eigen::Vector6d AdInvT(
const Eigen::Isometry3d& _T,
const Eigen::Vector6d& _V);
333 template <
typename Derived>
334 typename Derived::PlainObject AdInvTJac(
335 const Eigen::Isometry3d& _T,
const Eigen::MatrixBase<Derived>& _J)
339 Derived::RowsAtCompileTime == 6,
340 THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);
342 typename Derived::PlainObject ret(_J.rows(), _J.cols());
345 for (
int i = 0; i < _J.cols(); ++i)
346 ret.col(i) = AdInvT(_T, _J.col(i));
352 template <
typename Derived>
353 typename Derived::PlainObject AdInvTJacFixed(
354 const Eigen::Isometry3d& _T,
const Eigen::MatrixBase<Derived>& _J)
357 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived);
361 Derived::RowsAtCompileTime == 6,
362 THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE);
364 typename Derived::PlainObject ret(_J.rows(), _J.cols());
367 ret.template topRows<3>().noalias()
368 = _T.linear().transpose() * _J.template topRows<3>();
369 ret.template bottomRows<3>().noalias()
370 = _T.linear().transpose()
371 * (_J.template bottomRows<3>()
372 + _J.template topRows<3>().colwise().cross(_T.translation()));
388 Eigen::Vector6d AdInvRLinear(
389 const Eigen::Isometry3d& _T,
const Eigen::Vector3d& _v);
394 Eigen::Vector6d dAdT(
const Eigen::Isometry3d& _T,
const Eigen::Vector6d& _F);
400 Eigen::Vector6d dAdInvT(
const Eigen::Isometry3d& _T,
const Eigen::Vector6d& _F);
403 Eigen::Vector6d dAdInvR(
const Eigen::Isometry3d& _T,
const Eigen::Vector6d& _F);
411 Eigen::Vector6d ad(
const Eigen::Vector6d& _X,
const Eigen::Vector6d& _Y);
422 Eigen::Vector6d dad(
const Eigen::Vector6d& _s,
const Eigen::Vector6d& _t);
425 Inertia transformInertia(
const Eigen::Isometry3d& _T,
const Inertia& _AI);
429 Eigen::Matrix3d parallelAxisTheorem(
430 const Eigen::Matrix3d& _original,
431 const Eigen::Vector3d& _comShift,
444 Eigen::Matrix3d computeRotation(
445 const Eigen::Vector3d& axis, AxisType axisType = AxisType::AXIS_X);
450 Eigen::Isometry3d computeTransform(
451 const Eigen::Vector3d& axis,
452 const Eigen::Vector3d& translation,
453 AxisType axisType = AxisType::AXIS_X);
457 Eigen::Isometry3d getFrameOriginAxisZ(
458 const
Eigen::Vector3d& _origin, const
Eigen::Vector3d& _axisZ);
462 bool verifyRotation(const
Eigen::Matrix3d& _R);
466 bool verifyTransform(const
Eigen::Isometry3d& _T);
470 inline
double wrapToPi(
double angle)
472 constexpr
auto pi = constantsd::pi();
474 return std::fmod(angle + pi, 2 * pi) - pi;
477 template <
typename MatrixType,
typename ReturnType>
478 void extractNullSpace(
const Eigen::JacobiSVD<MatrixType>& _SVD, ReturnType& _NS)
482 if (_SVD.nonzeroSingularValues() > 0)
484 double thresh = std::max(
485 _SVD.singularValues().coeff(0) * 1e-10,
486 std::numeric_limits<double>::min());
487 int i = _SVD.nonzeroSingularValues() - 1;
488 while (i >= 0 && _SVD.singularValues().coeff(i) < thresh)
493 int cols = _SVD.matrixV().cols(), rows = _SVD.matrixV().rows();
494 _NS = _SVD.matrixV().block(0, rank, rows, cols - rank);
497 template <
typename MatrixType,
typename ReturnType>
498 void computeNullSpace(
const MatrixType& _M, ReturnType& _NS)
500 Eigen::JacobiSVD<MatrixType> svd(_M, Eigen::ComputeFullV);
501 extractNullSpace(svd, _NS);
504 typedef std::vector<Eigen::Vector3d> SupportGeometry;
506 typedef common::aligned_vector<Eigen::Vector2d> SupportPolygon;
512 SupportPolygon computeSupportPolgyon(
513 const SupportGeometry& _geometry,
514 const Eigen::Vector3d& _axis1 = Eigen::Vector3d::UnitX(),
515 const Eigen::Vector3d& _axis2 = Eigen::Vector3d::UnitY());
521 SupportPolygon computeSupportPolgyon(
522 std::vector<std::size_t>& _originalIndices,
523 const SupportGeometry& _geometry,
524 const Eigen::Vector3d& _axis1 = Eigen::Vector3d::UnitX(),
525 const Eigen::Vector3d& _axis2 = Eigen::Vector3d::UnitY());
528 SupportPolygon computeConvexHull(
const SupportPolygon& _points);
532 SupportPolygon computeConvexHull(
533 std::vector<std::size_t>& _originalIndices,
const SupportPolygon& _points);
536 Eigen::Vector2d computeCentroidOfHull(
const SupportPolygon& _convexHull);
540 enum IntersectionResult
552 IntersectionResult computeIntersection(
553 Eigen::Vector2d& _intersectionPoint,
554 const Eigen::Vector2d& a1,
555 const Eigen::Vector2d& a2,
556 const Eigen::Vector2d& b1,
557 const Eigen::Vector2d& b2);
560 double cross(
const Eigen::Vector2d& _v1,
const Eigen::Vector2d& _v2);
563 bool isInsideSupportPolygon(
564 const Eigen::Vector2d& _p,
565 const SupportPolygon& _support,
566 bool _includeEdge =
true);
570 Eigen::Vector2d computeClosestPointOnLineSegment(
571 const Eigen::Vector2d& _p,
572 const Eigen::Vector2d& _s1,
573 const Eigen::Vector2d& _s2);
577 Eigen::Vector2d computeClosestPointOnSupportPolygon(
578 const Eigen::Vector2d& _p,
const SupportPolygon& _support);
582 Eigen::Vector2d computeClosestPointOnSupportPolygon(
583 std::size_t& _index1,
584 std::size_t& _index2,
585 const Eigen::Vector2d& _p,
586 const SupportPolygon& _support);
592 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
595 BoundingBox(
const Eigen::Vector3d& min,
const Eigen::Vector3d& max);
597 inline const Eigen::Vector3d& getMin()
const 601 inline const Eigen::Vector3d& getMax()
const 606 inline void setMin(
const Eigen::Vector3d& min)
610 inline void setMax(
const Eigen::Vector3d& max)
616 inline Eigen::Vector3d computeCenter()
const 618 return (mMax + mMin) * 0.5;
621 inline Eigen::Vector3d computeHalfExtents()
const 623 return (mMax - mMin) * 0.5;
626 inline Eigen::Vector3d computeFullExtents()
const 628 return (mMax - mMin);
633 Eigen::Vector3d mMin;
635 Eigen::Vector3d mMax;
641 #endif // DART_MATH_GEOMETRY_HPP_ Definition: MathTypes.hpp:47
Definition: Aspect.cpp:40
Definition: Geometry.hpp:589