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{
41 class AronEigenConverter
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&);
56 static Eigen::Matrix4f ConvertToMatrix4f(const data::NDArrayPtr&);
57 static Eigen::Matrix4f ConvertToMatrix4f(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>
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>
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>
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 {
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 {
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 {
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 {
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 {
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 {
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
static Eigen::Matrix< T, Rows, Cols > ConvertToMatrix(const data::NDArray &nav)
static Eigen::Quaternion< double > ConvertToQuaterniond(const data::NDArrayPtr &)
static Eigen::Matrix< T, Rows, Cols > ConvertToMatrix(const data::NDArrayPtr &nav)
static Eigen::Matrix< T, Size, 1 > ConvertToVector(const data::NDArrayPtr &nav)
static Eigen::Matrix< T, Size, 1 > ConvertToVector(const data::NDArray &nav)
static Eigen::Matrix4f ConvertToMatrix4f(const data::NDArrayPtr &)
static Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic > ConvertToDynamicArray(const data::NDArray &nav)
static Eigen::Quaternion< T > ConvertToQuaternion(const data::NDArray &nav)
static Eigen::Vector3f ConvertToVector3f(const data::NDArrayPtr &)
static Eigen::Quaternion< T > ConvertToQuaternion(const data::NDArrayPtr &nav)
static Eigen::Vector3d ConvertToVector3d(const data::NDArrayPtr &)
static data::NDArrayPtr ConvertFromMatrix(const Eigen::Matrix< T, Rows, Cols > &mat)
static Eigen::Matrix4d ConvertToMatrix4d(const data::NDArrayPtr &)
static Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > ConvertToDynamicMatrix(const data::NDArray &nav)
static data::NDArrayPtr ConvertFromQuaternion(const Eigen::Quaternion< T > &quat)
static Eigen::Array< T, Rows, Cols > ConvertToArray(const data::NDArray &nav)
static data::NDArrayPtr ConvertFromArray(const Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic > &mat)
static data::NDArrayPtr ConvertFromMatrix(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat)
static Eigen::Quaternion< float > ConvertToQuaternionf(const data::NDArrayPtr &)
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#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...
#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...
::armarx::aron::data::converter::AronEigenConverter AronEigenConverter
std::shared_ptr< NDArray > NDArrayPtr
Definition NDArray.h:46