From 198c54d6ef1f9a665e5af4266acbbc2b46abaf2f Mon Sep 17 00:00:00 2001 From: Rohan Budhiraja <budhiraja@laas.fr> Date: Fri, 29 Jan 2016 20:57:36 +0100 Subject: [PATCH] Patch for inputing Eigen::Transform as Matrix4d --- include/dynamic-graph/value.h | 15 +++++----- src/command/command.cpp | 2 +- src/command/value.cpp | 53 +++++++++++++++++++++++++++-------- 3 files changed, 49 insertions(+), 21 deletions(-) diff --git a/include/dynamic-graph/value.h b/include/dynamic-graph/value.h index d8adc30..ffa43c0 100644 --- a/include/dynamic-graph/value.h +++ b/include/dynamic-graph/value.h @@ -30,8 +30,6 @@ namespace dynamicgraph { class Value; class DYNAMIC_GRAPH_DLLAPI EitherType { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - EitherType(const Value& value); ~EitherType(); operator bool () const; @@ -41,16 +39,14 @@ namespace dynamicgraph { operator double () const; operator std::string () const; operator Vector () const; - operator Matrix () const; + operator Eigen::MatrixXd () const; + operator Eigen::Matrix4d () const; private: const Value* value_; }; class DYNAMIC_GRAPH_DLLAPI Value { public: - - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - enum Type { NONE, BOOL, @@ -61,6 +57,7 @@ namespace dynamicgraph { STRING, VECTOR, MATRIX, + MATRIX4D, NB_TYPES }; ~Value(); @@ -72,7 +69,8 @@ namespace dynamicgraph { explicit Value(const double& value); explicit Value(const std::string& value); explicit Value(const Vector& value); - explicit Value(const Matrix& value); + explicit Value(const Eigen::MatrixXd& value); + explicit Value(const Eigen::Matrix4d& value); /// Copy constructor Value(const Value& value); // Construct an empty value (None) @@ -108,7 +106,8 @@ namespace dynamicgraph { double doubleValue() const; std::string stringValue() const; Vector vectorValue() const; - Matrix matrixValue() const; + Eigen::MatrixXd matrixXdValue() const; + Eigen::Matrix4d matrix4dValue() const; Type type_; const void* const value_; }; diff --git a/src/command/command.cpp b/src/command/command.cpp index 7cd2b51..350a6af 100644 --- a/src/command/command.cpp +++ b/src/command/command.cpp @@ -50,7 +50,7 @@ namespace dynamicgraph { for (unsigned int iParam=0; iParam < values.size(); iParam++) { if (values[iParam].type() != paramTypes[iParam]) { std::stringstream ss; - ss << "argument " << iParam << "is of wrong type: " + ss << "argument " << iParam << " is of wrong type: " << Value::typeName(paramTypes[iParam]) << " expected, got " << Value::typeName(values[iParam].type()); throw ExceptionAbstract(ExceptionAbstract::TOOLS, ss.str()); diff --git a/src/command/value.cpp b/src/command/value.cpp index ed77090..4ff3123 100644 --- a/src/command/value.cpp +++ b/src/command/value.cpp @@ -61,9 +61,14 @@ namespace dynamicgraph { { return value_->vectorValue(); } - EitherType::operator Matrix() const + EitherType::operator Eigen::MatrixXd() const { - return value_->matrixValue(); + return value_->matrixXdValue(); + } + + EitherType::operator Eigen::Matrix4d() const + { + return value_->matrix4dValue(); } void Value::deleteValue () @@ -91,7 +96,10 @@ namespace dynamicgraph { delete(const Vector*)value_; break; case MATRIX: - delete(const Matrix*)value_; + delete(const Eigen::MatrixXd*)value_; + break; + case MATRIX4D: + delete(const Eigen::Matrix4d*)value_; break; default:; } @@ -129,8 +137,12 @@ namespace dynamicgraph { value_(new Vector(value)) { } - Value::Value(const Matrix& value) : type_(MATRIX), - value_(new Matrix(value)) + Value::Value(const Eigen::MatrixXd& value) : type_(MATRIX), + value_(new Eigen::MatrixXd(value)) + { + } + Value::Value(const Eigen::Matrix4d& value) : type_(MATRIX4D), + value_(new Eigen::Matrix4d(value)) { } @@ -168,7 +180,10 @@ namespace dynamicgraph { copy = new Vector(value.vectorValue()); break; case Value::MATRIX: - copy = new Matrix(value.matrixValue()); + copy = new Eigen::MatrixXd(value.matrixXdValue()); + break; + case Value::MATRIX4D: + copy = new Eigen::Matrix4d(value.matrix4dValue()); break; default: abort(); @@ -262,12 +277,20 @@ namespace dynamicgraph { "value is not an vector"); } - Matrix Value::matrixValue() const + Eigen::MatrixXd Value::matrixXdValue() const { if(type_ == MATRIX) - return *((const Matrix*)value_); + return *((const Eigen::MatrixXd*)value_); + throw ExceptionAbstract(ExceptionAbstract::TOOLS, + "value is not a Eigen matrixXd"); + } + + Eigen::Matrix4d Value::matrix4dValue() const + { + if(type_ == MATRIX4D) + return *((const Eigen::Matrix4d*)value_); throw ExceptionAbstract(ExceptionAbstract::TOOLS, - "value is not a matrix"); + "value is not a Eigen matrix4d"); } std::string Value::typeName(Type type) @@ -288,7 +311,9 @@ namespace dynamicgraph { case VECTOR: return std::string("vector"); case MATRIX: - return std::string("matrix"); + return std::string("matrixXd"); + case MATRIX4D: + return std::string("matrix4d"); default: return std::string("unknown"); } @@ -321,7 +346,10 @@ namespace dynamicgraph { os << value.vectorValue(); break; case Value::MATRIX: - os << value.matrixValue(); + os << value.matrixXdValue(); + break; + case Value::MATRIX4D: + os << value.matrix4dValue(); break; default: return os; @@ -336,7 +364,8 @@ namespace dynamicgraph { template<> const Value::Type ValueHelper<double>::TypeID = Value::DOUBLE; template<> const Value::Type ValueHelper<std::string>::TypeID = Value::STRING; template<> const Value::Type ValueHelper<Vector>::TypeID = Value::VECTOR; - template<> const Value::Type ValueHelper<Matrix>::TypeID = Value::MATRIX; + template<> const Value::Type ValueHelper<Eigen::MatrixXd>::TypeID = Value::MATRIX; + template<> const Value::Type ValueHelper<Eigen::Matrix4d>::TypeID = Value::MATRIX4D; } // namespace command } //namespace dynamicgraph -- GitLab