Conversions.h
Go to the documentation of this file.
1 /*
2  * Copyright 2012-2020 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
7 #include "SpaceVecAlg"
8 
9 namespace sva
10 {
11 
27 namespace conversions
28 {
30 constexpr bool RightHanded = true;
32 constexpr bool LeftHanded = false;
33 
42 template<typename Derived>
43 PTransform<typename Derived::Scalar> fromHomogeneous(const Eigen::MatrixBase<Derived> & m,
44  bool rightHandedness = RightHanded)
45 {
46  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Derived, 4, 4);
47  if(rightHandedness)
48  {
49  return PTransform<typename Derived::Scalar>(m.template block<3, 3>(0, 0).transpose(), m.template block<3, 1>(0, 3));
50  }
51  else
52  {
53  return PTransform<typename Derived::Scalar>(m.template block<3, 3>(0, 0), m.template block<3, 1>(0, 3));
54  }
55 }
56 
65 template<typename T>
66 Eigen::Matrix<T, 4, 4> toHomogeneous(const PTransform<T> & pt, bool rightHandedness = RightHanded)
67 {
68  Eigen::Matrix<T, 4, 4> res = Eigen::Matrix<T, 4, 4>::Zero();
69  res(3, 3) = 1.0;
70 
71  res.template block<3, 1>(0, 3) = pt.translation();
72 
73  if(rightHandedness)
74  {
75  res.template block<3, 3>(0, 0) = pt.rotation().transpose();
76  }
77  else
78  {
79  res.template block<3, 3>(0, 0) = pt.rotation();
80  }
81  return res;
82 }
83 
85 template<typename T>
86 using affine3_t = Eigen::Transform<T, 3, Eigen::TransformTraits::Affine>;
87 
98 template<typename T>
99 PTransform<T> fromAffine(const affine3_t<T> & a, bool rightHandedness = RightHanded)
100 {
101  if(rightHandedness)
102  {
103  return PTransform<T>(a.rotation().transpose(), a.translation());
104  }
105  else
106  {
107  return PTransform<T>(a.rotation(), a.translation());
108  }
109 }
110 
120 template<typename T>
121 affine3_t<T> toAffine(const PTransform<T> & pt, bool rightHandedness = RightHanded)
122 {
123  affine3_t<T> ret;
124  ret.setIdentity();
125  ret.translation() = pt.translation();
126  if(rightHandedness)
127  {
128  ret.matrix().template block<3, 3>(0, 0) = pt.rotation().transpose();
129  }
130  else
131  {
132  ret.matrix().template block<3, 3>(0, 0) = pt.rotation();
133  }
134  return ret;
135 }
136 } // namespace conversions
137 
140 } // namespace sva
sva::conversions::toHomogeneous
Eigen::Matrix< T, 4, 4 > toHomogeneous(const PTransform< T > &pt, bool rightHandedness=RightHanded)
Convert a Plucker Transform into an homogeneous matrix.
Definition: Conversions.h:66
sva::conversions::fromHomogeneous
PTransform< typename Derived::Scalar > fromHomogeneous(const Eigen::MatrixBase< Derived > &m, bool rightHandedness=RightHanded)
Convert an homogeneous matrix into a Plucker Transform.
Definition: Conversions.h:43
sva::conversions::RightHanded
constexpr bool RightHanded
Alias for right handedness (default)
Definition: Conversions.h:30
SpaceVecAlg
sva
Definition: ABInertia.h:10
sva::PTransform::translation
const vector3_t & translation() const
Definition: PTransform.h:153
sva::PTransform::rotation
const matrix3_t & rotation() const
Definition: PTransform.h:141
sva::conversions::toAffine
affine3_t< T > toAffine(const PTransform< T > &pt, bool rightHandedness=RightHanded)
Convert a Plucker Transform into an Eigen::Affine3<T>
Definition: Conversions.h:121
sva::PTransform
Definition: fwd.h:23
sva::conversions::affine3_t
Eigen::Transform< T, 3, Eigen::TransformTraits::Affine > affine3_t
Define an Eigen::Affine3<T>
Definition: Conversions.h:86
sva::conversions::fromAffine
PTransform< T > fromAffine(const affine3_t< T > &a, bool rightHandedness=RightHanded)
Convert an Eigen::Affine3<T> into a Plucker Transform.
Definition: Conversions.h:99
sva::conversions::LeftHanded
constexpr bool LeftHanded
Alias for left handedness.
Definition: Conversions.h:32