EigenConverter.h
Go to the documentation of this file.
1 /*
2 * This file is part of ArmarX.
3 *
4 * ArmarX is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * ArmarX is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * @author Fabian Peller (fabian dot peller at kit dot edu)
17 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
18 * GNU General Public License
19 */
20 
21 #pragma once
22 
23 // STD/STL
24 #include <memory>
25 #include <numeric>
26 #include <string>
27 
28 // Eigen
29 #include <Eigen/Core>
30 #include <Eigen/Geometry>
31 
32 
33 // ArmarX
35 
36 #include <RobotAPI/interface/aron.h>
38 
40 {
42  {
43  AronEigenConverter() = delete;
44 
45  public:
46  // TODO: Add inplace methods
47 
48  static Eigen::Quaternion<float> ConvertToQuaternionf(const data::NDArrayPtr&);
49  static Eigen::Quaternion<float> ConvertToQuaternionf(const data::NDArray&);
50  static Eigen::Quaternion<double> ConvertToQuaterniond(const data::NDArrayPtr&);
51  static Eigen::Quaternion<double> ConvertToQuaterniond(const data::NDArray&);
52  static Eigen::Vector3f ConvertToVector3f(const data::NDArrayPtr&);
53  static Eigen::Vector3f ConvertToVector3f(const data::NDArray&);
54  static Eigen::Vector3d ConvertToVector3d(const data::NDArrayPtr&);
55  static Eigen::Vector3d ConvertToVector3d(const data::NDArray&);
58  static Eigen::Matrix4d ConvertToMatrix4d(const data::NDArrayPtr&);
59  static Eigen::Matrix4d ConvertToMatrix4d(const data::NDArray&);
60 
61  template <typename T>
62  static Eigen::Quaternion<T>
64  {
66  return ConvertToQuaternion<T>(*nav);
67  }
68 
69  template <typename T>
70  static Eigen::Quaternion<T>
72  {
73  checkDimensions(nav, {1, 4, sizeof(T)}, "ConvertToQuaternion");
74  auto dims = nav.getShape();
75 
76  Eigen::Map<Eigen::Quaternion<T>> ret(reinterpret_cast<T*>(nav.getData()));
77  return ret;
78  }
79 
80  template <typename T, int Size>
83  {
85  return ConvertToVector<T, Size>(*nav);
86  }
87 
88  template <typename T, int Size>
91  {
92  checkDimensions(nav, {Size, 1, sizeof(T)}, "ConvertToVector");
93  auto dims = nav.getShape();
94 
95  Eigen::Map<Eigen::Matrix<T, Size, 1>> ret(reinterpret_cast<T*>(nav.getData()));
96  return ret;
97  }
98 
99  template <typename T, int Rows, int Cols>
102  {
104  return ConvertToMatrix<T, Rows, Cols>(*nav);
105  }
106 
107  template <typename T>
110  {
112 
113  const auto dims = nav.getShape();
114  ARMARX_CHECK(dims.size() == 2 or dims.size() == 3); // for now ...
115 
116  Eigen::Map<MatrixT> map(reinterpret_cast<T*>(nav.getData()), dims.at(0), dims.at(1));
117  return map;
118  }
119 
120  template <typename T, int Rows = Eigen::Dynamic, int Cols = Eigen::Dynamic>
123  {
124  if constexpr (Rows == Eigen::Dynamic and Cols == Eigen::Dynamic)
125  {
126  return ConvertToDynamicMatrix<T>(nav);
127  }
128  else
129  {
130  checkDimensions(nav, {Rows, Cols, sizeof(T)}, "ConvertToMatrix");
131 
132  Eigen::Map<Eigen::Matrix<T, Rows, Cols>> map(reinterpret_cast<T*>(nav.getData()));
133  return map;
134  }
135  }
136 
137  template <typename T>
138  static data::NDArrayPtr
139  ConvertFromQuaternion(const Eigen::Quaternion<T>& quat)
140  {
141  data::NDArrayPtr ndArr(new data::NDArray);
142  ndArr->setShape({1, 4});
143  ndArr->setData(sizeof(T) * 4,
144  reinterpret_cast<const unsigned char*>(quat.coeffs().data()));
145 
146  return ndArr;
147  }
148 
149  template <typename T>
150  static data::NDArrayPtr
152  {
153  data::NDArrayPtr ndArr(new data::NDArray);
154 
155  ndArr->setShape({static_cast<int>(mat.rows()), static_cast<int>(mat.cols())});
156  ndArr->setData(sizeof(T) * mat.size(),
157  reinterpret_cast<const unsigned char*>(mat.data()));
158 
159  return ndArr;
160  }
161 
162  template <typename T, int Rows = Eigen::Dynamic, int Cols = Eigen::Dynamic>
163  static data::NDArrayPtr
165  {
166  data::NDArrayPtr ndArr(new data::NDArray);
167 
168  ndArr->setShape({Rows, Cols});
169  ndArr->setData(sizeof(T) * mat.size(),
170  reinterpret_cast<const unsigned char*>(mat.data()));
171 
172  return ndArr;
173  }
174 
175  // Eigen::Array
176 
177  template <typename T>
178  static Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>
180  {
181  const auto dims = nav.getShape();
182  ARMARX_CHECK_EQUAL(dims.size(), 2);
183 
184  using ArrayT = Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>;
185 
186  ArrayT ret =
187  Eigen::Map<ArrayT>(reinterpret_cast<T*>(nav.getData()), dims.at(0), dims.at(1));
188  return ret;
189  }
190 
191  template <typename T, int Rows = Eigen::Dynamic, int Cols = Eigen::Dynamic>
192  static Eigen::Array<T, Rows, Cols>
194  {
195  if constexpr (Rows == Eigen::Dynamic and Cols == Eigen::Dynamic)
196  {
197  return ConvertToDynamicArray<T>(nav);
198  }
199 
200  checkDimensions(nav, {Rows, Cols, sizeof(T)}, "ConvertToArray");
201  auto dims = nav.getShape();
202 
203  Eigen::Map<Eigen::Array<T, Rows, Cols>> ret(
204  reinterpret_cast<T*>(nav.getData()), dims.at(0), dims.at(1));
205  return ret;
206  }
207 
208  template <typename T>
209  static data::NDArrayPtr
210  ConvertFromArray(const Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>& mat)
211  {
212  data::NDArrayPtr ndArr(new data::NDArray);
213 
214  ndArr->setShape({static_cast<int>(mat.rows()), static_cast<int>(mat.cols())});
215  ndArr->setData(sizeof(T) * mat.size(),
216  reinterpret_cast<const unsigned char*>(mat.data()));
217 
218  return ndArr;
219  }
220 
221 
222  private:
223  /**
224  * @throw `error::AronException` If `nav`'s dimensions do not match `expected`.
225  */
226  static void checkDimensions(const data::NDArray& nav,
227  const std::vector<int>& expected,
228  const std::string& method,
229  const std::string& caller = "AronEigenConverter");
230  };
231 
232 } // namespace armarx::aron::data::converter
233 
234 // legacy
236 {
238 }
armarx::aron::data::converter::AronEigenConverter::ConvertToQuaternion
static Eigen::Quaternion< T > ConvertToQuaternion(const data::NDArrayPtr &nav)
Definition: EigenConverter.h:63
armarx::aron::ret
ReaderT::InputType T & ret
Definition: rw.h:21
armarx::aron::data::converter::AronEigenConverter::ConvertFromMatrix
static data::NDArrayPtr ConvertFromMatrix(const Eigen::Matrix< T, Rows, Cols > &mat)
Definition: EigenConverter.h:164
armarx::aron::data::converter::AronEigenConverter::ConvertToMatrix4f
static Eigen::Matrix4f ConvertToMatrix4f(const data::NDArrayPtr &)
Definition: EigenConverter.cpp:57
armarx::aron::data::converter::AronEigenConverter::ConvertToVector
static Eigen::Matrix< T, Size, 1 > ConvertToVector(const data::NDArray &nav)
Definition: EigenConverter.h:90
armarx::aron::data::NDArray
Definition: NDArray.h:48
armarx::aron::data::converter::AronEigenConverter::ConvertToQuaterniond
static Eigen::Quaternion< double > ConvertToQuaterniond(const data::NDArrayPtr &)
Definition: EigenConverter.cpp:39
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
armarx::aron::data::converter::AronEigenConverter::ConvertFromMatrix
static data::NDArrayPtr ConvertFromMatrix(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat)
Definition: EigenConverter.h:151
armarx::aron::data::converter::AronEigenConverter::ConvertFromQuaternion
static data::NDArrayPtr ConvertFromQuaternion(const Eigen::Quaternion< T > &quat)
Definition: EigenConverter.h:139
armarx::aron::data::NDArrayPtr
std::shared_ptr< NDArray > NDArrayPtr
Definition: NDArray.h:46
armarx::aron::data::NDArray::getShape
std::vector< int > getShape() const
Definition: NDArray.cpp:145
armarx::aron::data::converter::AronEigenConverter::ConvertToVector3d
static Eigen::Vector3d ConvertToVector3d(const data::NDArrayPtr &)
Definition: EigenConverter.cpp:51
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::aron::converter::AronEigenConverter
::armarx::aron::data::converter::AronEigenConverter AronEigenConverter
Definition: EigenConverter.h:237
armarx::aron::converter
Definition: EigenConverter.h:235
armarx::aron::data::converter::AronEigenConverter::ConvertToQuaternion
static Eigen::Quaternion< T > ConvertToQuaternion(const data::NDArray &nav)
Definition: EigenConverter.h:71
armarx::aron::data::converter::AronEigenConverter::ConvertToDynamicArray
static Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic > ConvertToDynamicArray(const data::NDArray &nav)
Definition: EigenConverter.h:179
armarx::aron::data::converter::AronEigenConverter::ConvertToMatrix4d
static Eigen::Matrix4d ConvertToMatrix4d(const data::NDArrayPtr &)
Definition: EigenConverter.cpp:63
armarx::aron::data::converter::AronEigenConverter::ConvertToMatrix
static Eigen::Matrix< T, Rows, Cols > ConvertToMatrix(const data::NDArrayPtr &nav)
Definition: EigenConverter.h:101
armarx::aron::data::converter::AronEigenConverter::ConvertToVector
static Eigen::Matrix< T, Size, 1 > ConvertToVector(const data::NDArrayPtr &nav)
Definition: EigenConverter.h:82
armarx::aron::data::converter::AronEigenConverter::ConvertToDynamicMatrix
static Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > ConvertToDynamicMatrix(const data::NDArray &nav)
Definition: EigenConverter.h:109
armarx::aron::data::converter::AronEigenConverter::ConvertFromArray
static data::NDArrayPtr ConvertFromArray(const Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic > &mat)
Definition: EigenConverter.h:210
armarx::aron::data::converter::AronEigenConverter::ConvertToQuaternionf
static Eigen::Quaternion< float > ConvertToQuaternionf(const data::NDArrayPtr &)
Definition: EigenConverter.cpp:33
armarx::aron::data::converter::AronEigenConverter::ConvertToArray
static Eigen::Array< T, Rows, Cols > ConvertToArray(const data::NDArray &nav)
Definition: EigenConverter.h:193
ExpressionException.h
GfxTL::Matrix4f
MatrixXX< 4, 4, float > Matrix4f
Definition: MatrixXX.h:601
armarx::aron::data::converter::AronEigenConverter::ConvertToMatrix
static Eigen::Matrix< T, Rows, Cols > ConvertToMatrix(const data::NDArray &nav)
Definition: EigenConverter.h:122
Eigen::Matrix
Definition: EigenForwardDeclarations.h:27
T
float T
Definition: UnscentedKalmanFilterTest.cpp:35
ARMARX_CHECK_EQUAL
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
Definition: ExpressionException.h:130
armarx::aron::data::NDArray::getData
unsigned char * getData() const
Definition: NDArray.cpp:126
armarx::aron::data::converter
Definition: aron_conversions.cpp:3
armarx::aron::data::converter::AronEigenConverter
Definition: EigenConverter.h:41
armarx::aron::data::converter::AronEigenConverter::ConvertToVector3f
static Eigen::Vector3f ConvertToVector3f(const data::NDArrayPtr &)
Definition: EigenConverter.cpp:45
NDArray.h