From bcce53f895230a1958ecc27a8bb3f01676a5e250 Mon Sep 17 00:00:00 2001 From: Fabian Reister <fabian.reister@kit.edu> Date: Thu, 10 Jun 2021 08:50:23 +0200 Subject: [PATCH] eigen converter: convert to dynamic matrix --- .../aron/converter/eigen/EigenConverter.h | 75 ++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/source/RobotAPI/libraries/aron/converter/eigen/EigenConverter.h b/source/RobotAPI/libraries/aron/converter/eigen/EigenConverter.h index 787ae30a2..4a5a02e56 100644 --- a/source/RobotAPI/libraries/aron/converter/eigen/EigenConverter.h +++ b/source/RobotAPI/libraries/aron/converter/eigen/EigenConverter.h @@ -28,6 +28,7 @@ // Eigen #include <Eigen/Geometry> #include <Eigen/Core> +#include <Eigen/src/Core/util/Constants.h> // ArmarX #include <ArmarXCore/core/exceptions/local/ExpressionException.h> @@ -103,9 +104,26 @@ namespace armarx::aron::converter return ConvertToMatrix<T, Rows, Cols>(*nav); } - template<typename T, int Rows, int Cols> + template<typename T> + static Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> ConvertToDynamicMatrix(const datanavigator::NDArrayNavigator& nav) + { + const auto dims = nav.getDimensions(); + + using MatrixT = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>; + + MatrixT ret; + memcpy(reinterpret_cast<unsigned char*>(ret.data()), nav.getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<>())); + return ret; + } + + template<typename T, int Rows = Eigen::Dynamic, int Cols = Eigen::Dynamic> static Eigen::Matrix<T, Rows, Cols> ConvertToMatrix(const datanavigator::NDArrayNavigator& nav) { + if constexpr(Rows == Eigen::Dynamic and Cols == Eigen::Dynamic) + { + return ConvertToDynamicMatrix<T>(nav); + } + checkDimensions(nav, {Rows, Cols, sizeof(T)}, "ConvertToMatrix"); auto dims = nav.getDimensions(); @@ -114,6 +132,61 @@ namespace armarx::aron::converter return ret; } + template<typename T> + static datanavigator::NDArrayNavigatorPtr ConvertFromMatrix(const Eigen::Matrix < T, Eigen::Dynamic, Eigen::Dynamic >& mat) + { + datanavigator::NDArrayNavigatorPtr ndArr(new datanavigator::NDArrayNavigator); + + ndArr->setDimensions({static_cast<int>(mat.rows()), static_cast<int>(mat.cols())}); + ndArr->setData(sizeof(T) * mat.size(), reinterpret_cast <const unsigned char* >(mat.data())); + + return ndArr; + } + + + // Eigen::Array + + template<typename T> + static Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic> ConvertToDynamicArray(const datanavigator::NDArrayNavigator& nav) + { + const auto dims = nav.getDimensions(); + + using ArrayT = Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>; + + ArrayT ret; + memcpy(reinterpret_cast<unsigned char*>(ret.data()), nav.getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<>())); + return ret; + } + + template<typename T, int Rows = Eigen::Dynamic, int Cols = Eigen::Dynamic> + static Eigen::Matrix<T, Rows, Cols> ConvertToArray(const datanavigator::NDArrayNavigator& nav) + { + if constexpr(Rows == Eigen::Dynamic and Cols == Eigen::Dynamic) + { + return ConvertToDynamicArray<T>(nav); + } + + checkDimensions(nav, {Rows, Cols, sizeof(T)}, "ConvertToMatrix"); + auto dims = nav.getDimensions(); + + Eigen::Array<T, Rows, Cols> ret; + memcpy(reinterpret_cast<unsigned char*>(ret.data()), nav.getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>())); + return ret; + } + + template<typename T> + static datanavigator::NDArrayNavigatorPtr ConvertFromArray(const Eigen::Array < T, Eigen::Dynamic, Eigen::Dynamic >& mat) + { + datanavigator::NDArrayNavigatorPtr ndArr(new datanavigator::NDArrayNavigator); + + ndArr->setDimensions({static_cast<int>(mat.rows()), static_cast<int>(mat.cols())}); + ndArr->setData(sizeof(T) * mat.size(), reinterpret_cast <const unsigned char* >(mat.data())); + + return ndArr; + } + + + private: /** -- GitLab