Skip to content
Snippets Groups Projects
Commit 21e225d8 authored by Rainer Kartmann's avatar Rainer Kartmann
Browse files

Replace all memcpy's by Eigen::Map<>.

Fix segfault in Memory Viewer when displaying Pose
Fix return type of ConvertToArray()
parent 1b2ea4f3
No related branches found
No related tags found
2 merge requests!246Resolve "Add gui actions to Grasp Memory to visualize Grasps",!245Resolve "Gui crashes in context menus of memory viewer"
...@@ -72,8 +72,7 @@ namespace armarx::aron::converter ...@@ -72,8 +72,7 @@ namespace armarx::aron::converter
checkDimensions(nav, {1, 4, sizeof(T)}, "ConvertToQuaternion"); checkDimensions(nav, {1, 4, sizeof(T)}, "ConvertToQuaternion");
auto dims = nav.getShape(); auto dims = nav.getShape();
Eigen::Quaternion<T> ret; Eigen::Map<Eigen::Quaternion<T>> ret(reinterpret_cast<T*>(nav.getData()));
memcpy(reinterpret_cast<unsigned char*>(ret.coeffs().data()), nav.getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()));
return ret; return ret;
} }
...@@ -85,14 +84,14 @@ namespace armarx::aron::converter ...@@ -85,14 +84,14 @@ namespace armarx::aron::converter
return ConvertToVector<T, Size>(*nav); return ConvertToVector<T, Size>(*nav);
} }
template<typename T, int Size> template<typename T, int Size>
static Eigen::Matrix<T, Size, 1> ConvertToVector(const data::NDArray& nav) static Eigen::Matrix<T, Size, 1> ConvertToVector(const data::NDArray& nav)
{ {
checkDimensions(nav, {Size, 1, sizeof(T)}, "ConvertToVector"); checkDimensions(nav, {Size, 1, sizeof(T)}, "ConvertToVector");
auto dims = nav.getShape(); auto dims = nav.getShape();
Eigen::Matrix<T, Size, 1> ret; Eigen::Map<Eigen::Matrix<T, Size, 1>> ret(reinterpret_cast<T*>(nav.getData()));
memcpy(reinterpret_cast<unsigned char*>(ret.data()), nav.getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()));
return ret; return ret;
} }
...@@ -104,19 +103,22 @@ namespace armarx::aron::converter ...@@ -104,19 +103,22 @@ namespace armarx::aron::converter
return ConvertToMatrix<T, Rows, Cols>(*nav); return ConvertToMatrix<T, Rows, Cols>(*nav);
} }
template<typename T> template<typename T>
static Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> ConvertToDynamicMatrix(const data::NDArray& nav) static Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> ConvertToDynamicMatrix(const data::NDArray& nav)
{ {
const auto dims = nav.getShape();
using MatrixT = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>; using MatrixT = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
const auto dims = nav.getShape();
ARMARX_CHECK_EQUAL(dims.size(), 2); // for now ... ARMARX_CHECK_EQUAL(dims.size(), 2); // for now ...
MatrixT ret(dims.at(0), dims.at(1));
memcpy(reinterpret_cast<unsigned char*>(ret.data()), nav.getData(), std::accumulate(std::begin(dims), std::end(dims), sizeof(T), std::multiplies<>())); Eigen::Map<MatrixT> map(
return ret; reinterpret_cast<T*>(nav.getData()), dims.at(0), dims.at(1)
);
return map;
} }
template<typename T, int Rows = Eigen::Dynamic, int Cols = Eigen::Dynamic> template<typename T, int Rows = Eigen::Dynamic, int Cols = Eigen::Dynamic>
static Eigen::Matrix<T, Rows, Cols> ConvertToMatrix(const data::NDArray& nav) static Eigen::Matrix<T, Rows, Cols> ConvertToMatrix(const data::NDArray& nav)
{ {
...@@ -124,17 +126,19 @@ namespace armarx::aron::converter ...@@ -124,17 +126,19 @@ namespace armarx::aron::converter
{ {
return ConvertToDynamicMatrix<T>(nav); return ConvertToDynamicMatrix<T>(nav);
} }
else
{
checkDimensions(nav, {Rows, Cols, sizeof(T)}, "ConvertToMatrix");
checkDimensions(nav, {Rows, Cols, sizeof(T)}, "ConvertToMatrix"); Eigen::Map<Eigen::Matrix<T, Rows, Cols>> map(reinterpret_cast<T*>(nav.getData()));
auto dims = nav.getShape(); return map;
}
Eigen::Matrix<T, Rows, Cols> ret;
memcpy(reinterpret_cast<unsigned char*>(ret.data()), nav.getData(), std::accumulate(std::begin(dims), std::end(dims), sizeof(T), std::multiplies<int>()));
return ret;
} }
template<typename T> template<typename T>
static data::NDArrayPtr ConvertFromMatrix(const Eigen::Matrix < T, Eigen::Dynamic, Eigen::Dynamic >& mat) static data::NDArrayPtr ConvertFromMatrix(
const Eigen::Matrix < T, Eigen::Dynamic, Eigen::Dynamic >& mat)
{ {
data::NDArrayPtr ndArr(new data::NDArray); data::NDArrayPtr ndArr(new data::NDArray);
...@@ -160,7 +164,7 @@ namespace armarx::aron::converter ...@@ -160,7 +164,7 @@ namespace armarx::aron::converter
} }
template<typename T, int Rows = Eigen::Dynamic, int Cols = Eigen::Dynamic> template<typename T, int Rows = Eigen::Dynamic, int Cols = Eigen::Dynamic>
static Eigen::Matrix<T, Rows, Cols> ConvertToArray(const data::NDArray& nav) static Eigen::Array<T, Rows, Cols> ConvertToArray(const data::NDArray& nav)
{ {
if constexpr(Rows == Eigen::Dynamic and Cols == Eigen::Dynamic) if constexpr(Rows == Eigen::Dynamic and Cols == Eigen::Dynamic)
{ {
...@@ -170,8 +174,7 @@ namespace armarx::aron::converter ...@@ -170,8 +174,7 @@ namespace armarx::aron::converter
checkDimensions(nav, {Rows, Cols, sizeof(T)}, "ConvertToMatrix"); checkDimensions(nav, {Rows, Cols, sizeof(T)}, "ConvertToMatrix");
auto dims = nav.getShape(); auto dims = nav.getShape();
Eigen::Array<T, Rows, Cols> ret; Eigen::Map<Eigen::Array<T, Rows, Cols>> ret(reinterpret_cast<T*>(nav.getData()), dims.at(0), dims.at(1));
memcpy(reinterpret_cast<unsigned char*>(ret.data()), nav.getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()));
return ret; return ret;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment