15 #include <Eigen/Geometry>
22 template <
typename Scalar>
23 void checkSize(const ::std::vector<Scalar>& v,
const size_t i, const ::std::string& type)
26 throw ::std::runtime_error(
"Cannot construct " + type +
" from " + ::
std::to_string(v.size()) +
" elements " +
32 [](const ::std::vector<double>& v){ checkSize(v, 3,
"vector"); return ::Eigen::Vector3d(v.data()); })
35 [](const ::std::vector<float>& v){ checkSize(v, 3,
"vector"); return ::Eigen::Vector3f(v.data()); })
38 [](const ::std::vector<double>& v){ checkSize(v, 4,
"vector"); return ::Eigen::Vector4d(v.data()); })
41 [](const ::std::vector<float>& v){ checkSize(v, 4,
"vector"); return ::Eigen::Vector4f(v.data()); })
44 ([](const ::std::vector<double>& v){ checkSize(v, 9,
"3x3 matrix");
45 return ::Eigen::Matrix<double, 3, 3, ::Eigen::RowMajor>(v.data()); }))
48 ([](const ::std::vector<float>& v){ checkSize(v, 9,
"3x3 matrix");
49 return ::Eigen::Matrix<float, 3, 3, ::Eigen::RowMajor>(v.data()); }))
52 ([](const ::
std::vector<
double>& v){ checkSize(v, 16,
"4x4 matrix");
53 return ::Eigen::Matrix<double, 4, 4, ::Eigen::RowMajor>(v.data()); }))
56 ([](const ::
std::vector<
float>& v){ checkSize(v, 16,
"4x4 matrix");
57 return ::Eigen::Matrix<float, 4, 4, ::Eigen::RowMajor>(v.data()); }))
60 [](const ::
std::vector<
double>& v)
65 return ::Eigen::Quaterniond(
66 ::Eigen::AngleAxisd(v[0], ::Eigen::Vector3d::UnitX()) *
67 ::Eigen::AngleAxisd(v[1], ::Eigen::Vector3d::UnitY()) *
68 ::Eigen::AngleAxisd(v[2], ::Eigen::Vector3d::UnitZ()));
70 return ::Eigen::Quaterniond(v[3], v[0], v[1], v[2]);
72 throw ::std::runtime_error(
"Cannot construct quaternion from " + ::
std::to_string(v.size()) +
" elements.");
77 [](const ::std::vector<float>& v)
82 return ::Eigen::Quaternionf(
83 ::Eigen::AngleAxisf(v[0], ::Eigen::Vector3f::UnitX()) *
84 ::Eigen::AngleAxisf(v[1], ::Eigen::Vector3f::UnitY()) *
85 ::Eigen::AngleAxisf(v[2], ::Eigen::Vector3f::UnitZ()));
87 return ::Eigen::Quaternionf(v[3], v[0], v[1], v[2]);
89 throw ::std::runtime_error(
"Cannot construct quaternion from " + ::
std::to_string(v.size()) +
" elements.");
94 [](const ::std::vector<double>& v)
96 auto result = ::Eigen::Isometry3d::Identity();
100 result.translationExt() = ::Eigen::Vector3d(v[0], v[1], v[2]);
101 result.linearExt() = ::Eigen::Quaterniond(
102 ::Eigen::AngleAxisd(v[3], ::Eigen::Vector3d::UnitX()) *
103 ::Eigen::AngleAxisd(v[4], ::Eigen::Vector3d::UnitY()) *
104 ::Eigen::AngleAxisd(v[5], ::Eigen::Vector3d::UnitZ())).toRotationMatrix();
107 result.translationExt() = ::Eigen::Vector3d(v[0], v[1], v[2]);
108 result.linearExt() = ::Eigen::Quaterniond(v[6], v[3], v[4], v[5]).toRotationMatrix();
111 result = (::Eigen::Matrix<double, 4, 4, ::Eigen::RowMajor>(v.data()));
114 throw ::std::runtime_error(
"Cannot construct Eigen isometry from " + ::
std::to_string(v.size()) +
" elements.");
119 [](const ::std::vector<float>& v)
121 auto result = ::Eigen::Isometry3f::Identity();
125 result.translationExt() = ::Eigen::Vector3f(v[0], v[1], v[2]);
126 result.linearExt() = ::Eigen::Quaternionf(
127 ::Eigen::AngleAxisf(v[3], ::Eigen::Vector3f::UnitX()) *
128 ::Eigen::AngleAxisf(v[4], ::Eigen::Vector3f::UnitY()) *
129 ::Eigen::AngleAxisf(v[5], ::Eigen::Vector3f::UnitZ())).toRotationMatrix();
132 result.translationExt() = ::Eigen::Vector3f(v[0], v[1], v[2]);
133 result.linearExt() = ::Eigen::Quaternionf(v[6], v[3], v[4], v[5]).toRotationMatrix();
136 result = (::Eigen::Matrix<float, 4, 4, ::Eigen::RowMajor>(v.data()));
139 throw ::std::runtime_error(
"Cannot construct Eigen isometry from " + ::
std::to_string(v.size()) +
" elements.");