YamlConversion.hpp
Go to the documentation of this file.
00001 /*
00002  * Conversion.h
00003  *
00004  *  Created on: Oct 13, 2011
00005  *      Author: mriedel
00006  */
00007 
00008 #ifndef YAMLCONVERSION_HPP_
00009 #define YAMLCONVERSION_HPP_
00010 
00011 #include <telekyb_defines/telekyb_defines.hpp>
00012 
00013 #include <telekyb_defines/enum.hpp>
00014 
00015 // stl
00016 #include <string>
00017 #include <vector>
00018 
00019 // ros
00020 #include <ros/console.h>
00021 
00022 // boost
00023 #include <boost/array.hpp>
00024 
00025 // Eigen
00026 #include <Eigen/Dense>
00027 
00028 // Yaml
00029 #include <yaml-cpp/yaml.h>
00030 
00031 
00032 
00033 // New Structure
00034 namespace YAML {
00035 
00036 // Enum
00037 template<class ENUM_, class TYPE_>
00038 struct convert<boost::detail::enum_base<ENUM_, TYPE_> > {
00039         static Node encode(const boost::detail::enum_base<ENUM_, TYPE_>& rhs) {
00040                 Node node( rhs.str() );
00041                 return node;
00042         }
00043 
00044         static bool decode(const Node& node, boost::detail::enum_base<ENUM_, TYPE_>& rhs) {
00045                 std::string strValue = node.as<std::string>();
00046 
00047                 boost::optional<ENUM_> result = ENUM_::get_by_name(strValue.c_str());
00048                 if (result) {
00049                         rhs = *result;
00050                 } else {
00051                         ROS_ERROR_STREAM("Unknown enum " << ENUM_::getEnumName() << "::"
00052                                         << strValue << "! Possible Values: "
00053                                         << ENUM_::getAllDomainNames(',') << ".");
00054                         return false;
00055                 }
00056                 return true;
00057         }
00058 };
00059 
00060 
00061 template < class _T, std::size_t _N>
00062 struct convert< boost::array<_T, _N> > {
00063         static Node encode(const boost::array<_T, _N>& rhs) {
00064                 Node node(NodeType::Sequence);
00065                 for (size_t i = 0; i < _N; i++) {
00066                         node.push_back(rhs[i]);
00067                 }
00068                 return node;
00069         }
00070 
00071         static bool decode(const Node& node, boost::array<_T, _N>& rhs) {
00072                 if (node.size() != _N) {
00073                         ROS_ERROR_STREAM("Unable to create boost::array. Input is of wrong size! boost::array("<<
00074                                         _N <<") != Tokens("<< node.size() << ")");
00075                         return false;
00076                 }
00077                 for (size_t i = 0; i < _N; i++) {
00078                         rhs[i] = node[i].as<_T>();
00079                         //node[i] >> value[i];
00080                 }
00081                 return true;
00082         }
00083 };
00084 
00085 template < typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
00086 struct convert< Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > {
00087         static Node encode(const Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& matrix) {
00088                 Node node(NodeType::Sequence);
00089 
00090                 int nValues = matrix.rows() * matrix.cols();
00091 
00092                 for (int i = 0; i < nValues; ++i) {
00093                         node.push_back( matrix(i / matrix.cols(), i % matrix.cols() ) );
00094                 }
00095 
00096                 return node;
00097         }
00098 
00099         static bool decode(const Node& node, Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& matrix) {
00100 
00101                 // Totally Dynamic sized arrays are not supported
00102                 if (_Rows == Eigen::Dynamic && _Cols == Eigen::Dynamic) {
00103                         ROS_ERROR("Double Dynamic Matrices are not supported! Matrices may only be dynamic in one dimension!");
00104                         return false;
00105                 }
00106 
00107                 int nSize = node.size(); // Sequence check is implicit
00108 
00109                 // If one dimension is dynamic -> calculate and resize
00110 
00111                 // Rows Dynamic
00112                 if (_Rows == Eigen::Dynamic) {
00113                         // Check
00114                         if (nSize % _Cols != 0) {
00115                                 ROS_ERROR("Inputsize (%d) of dynamic row matrix is not a multiple of fixed column size (%d)", nSize, _Cols);
00116                                 return false;
00117                         }
00118 
00119                         int nDynRows = nSize / _Cols;
00120                         matrix.resize(nDynRows, Eigen::NoChange);
00121                 }
00122 
00123                 // Cols Dynamic
00124                 if (_Cols == Eigen::Dynamic) {
00125                         // Check
00126                         if (nSize % _Rows != 0) {
00127                                 ROS_ERROR("Inputsize (%d) of dynamic column matrix is not a multiple of fixed row size (%d)", nSize, _Rows);
00128                                 return false;
00129                         }
00130 
00131                         int nDynCols = nSize / _Rows;
00132                         matrix.resize(Eigen::NoChange, nDynCols);
00133                 }
00134 
00135 
00136                 if (nSize != matrix.rows() * matrix.cols()) {
00137                         ROS_ERROR_STREAM("Unable to create Eigen::Matrix. Input is of wrong size! Matrix("<<
00138                                         matrix.rows() <<"x"<< matrix.cols() <<") != Tokens("<< nSize <<")");
00139                         return false;
00140                 } else {
00141                         // fill
00142                         for (int i = 0; i < matrix.rows(); i++) {
00143                                 for (int j = 0; j < matrix.cols(); j++) {
00144                                         //ROS_INFO_STREAM("Node pos: " << i*matrix.rows() + j << "Matrix: " << i << "," << j);
00145 //                                      YAML::Node field = node[i + j*matrix.cols()];
00146 //                                      matrix(i,j) = field.as<_Scalar>();
00147 
00148                                         matrix(i,j) = node[(int)(i*matrix.cols() + j)].as<_Scalar>();
00149                                 }
00150                         }
00151                 }
00152                 return true;
00153         }
00154 };
00155 
00156 
00157 
00158 template<typename _Scalar, int _Options>
00159 struct convert< Eigen::Quaternion<_Scalar,_Options> > {
00160         static Node encode(const Eigen::Quaternion<_Scalar,_Options>& quaternion) {
00161                 Node node(NodeType::Sequence);
00162 
00163                 node[0] = quaternion.w();
00164                 node[1] = quaternion.x();
00165                 node[2] = quaternion.y();
00166                 node[3] = quaternion.z();
00167 
00168                 return node;
00169         }
00170 
00171         static bool decode(const Node& node, Eigen::Quaternion<_Scalar,_Options>& quaternion) {
00172 
00173                 int nSize = node.size(); // Sequence check is implicit
00174                 if (nSize != 4) {
00175                         ROS_ERROR_STREAM("Unable to create Eigen::QuaternionBase< Eigen::Quaternion<_Scalar,_Options> >. Input is of wrong size! Matrix("<<
00176                                         nSize <<") != 4");
00177                         return false;
00178                 } else {
00179                         // fill
00180                         quaternion.w() = node[0].as<_Scalar>();
00181                         quaternion.x() = node[1].as<_Scalar>();
00182                         quaternion.y() = node[2].as<_Scalar>();
00183                         quaternion.z() = node[3].as<_Scalar>();
00184                 }
00185                 return true;
00186         }
00187 };
00188 
00189 
00190 }
00191 
00192 
00193 // Implementation of StringCoversion Classes
00194 namespace TELEKYB_NAMESPACE
00195 {
00196 
00197 // ENUM
00198 //template < class ENUM_, class TYPE_ >
00199 //void operator >> (const YAML::Node& node, boost::detail::enum_base<ENUM_, TYPE_>& value)
00200 //{
00201 //      std::string strValue = node.as<std::string>();
00202 //      //node >> strValue;
00203 //      boost::optional<ENUM_> result = ENUM_::get_by_name(strValue.c_str());
00204 //      if (result) {
00205 //              value = *result;
00206 //      } else {
00207 //              std::stringstream sstream;
00208 //              sstream << "Unknown enum " << ENUM_::getEnumName() << "::" << strValue <<
00209 //                              "! Possible Values: "<< ENUM_::getAllDomainNames(',') << ".";
00210 //              throw YAML::Exception(YAML::Mark::null(), sstream.str());
00211 //      }
00212 //}
00213 
00214 //template < class ENUM_, class TYPE_ >
00215 //void operator >> (const boost::detail::enum_base<ENUM_, TYPE_>& value, YAML::Node& node)
00216 //{
00217 //      value.str() >> node;
00218 //}
00219 
00220 // boost array
00221 //template < class _T, std::size_t _N>
00222 //void operator >> (const YAML::Node& node, boost::array<_T, _N>& value)
00223 //{
00224 //      if (node.size() != _N) {
00225 //              std::stringstream sstream;
00226 //              sstream << "Unable to create boost::array. Input is of wrong size! boost::array("<<
00227 //                              _N <<") != Tokens("<< node.size() << ")";
00228 //              throw YAML::Exception(YAML::Mark::null(), sstream.str());
00229 //      }
00230 //      for (size_t i = 0; i < _N; i++) {
00231 //              value[i] = node.as<_T>();
00232 //              //node[i] >> value[i];
00233 //      }
00234 //}
00235 
00236 //template < class _T, std::size_t _N>
00237 //void operator >> (const boost::array<_T, _N>& value, YAML::Node& node)
00238 //{
00239 //      for (size_t i = 0; i < _N; i++) {
00240 //              value.at(i) >> node[i];
00241 //      }
00242 //}
00243 
00244 // Eigen::Matrix
00245 //template < typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
00246 //void operator >> (const YAML::Node& node, Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& matrix)
00247 //{
00248 //      //ROS_INFO_STREAM("Entered YAML Conversion Matrix....");
00249 //      int nSize = node.size();
00250 //      if (nSize != matrix.rows() * matrix.cols()) {
00251 //              std::stringstream sstream;
00252 //              sstream << "Unable to create Eigen::Matrix. Input is of wrong size! Matrix("<<
00253 //                              matrix.rows() <<"x"<< matrix.cols() <<") != Tokens("<< nSize <<")";
00254 //                              throw YAML::Exception(YAML::Mark::null(), sstream.str());
00255 //      } else {
00256 //              // fill
00257 //              for (int i = 0; i < matrix.rows(); i++) {
00258 //                      for (int j = 0; j < matrix.cols(); j++) {
00259 //                              //ROS_INFO_STREAM("Node pos: " << i*matrix.rows() + j << "Matrix: " << i << "," << j);
00260 //                              //node[i + j*matrix.cols()] >> matrix(i, j);
00261 //                              //matrix(i,j) = node[i + j*matrix.cols()].as<_Scalar>();
00262 //                      }
00263 //              }
00264 //      }
00265 //}
00266 
00267 //template < class ENUM_, class TYPE_ >
00268 //void operator >> (const boost::detail::enum_base<ENUM_, TYPE_>& value, YAML::Node& node)
00269 //{
00270 //
00271 //}
00272 //
00273 //
00274 //template < class _T, std::size_t _N>
00275 //void operator >> (const boost::array<_T, _N>& value, YAML::Node& node)
00276 //{
00277 //      //todo
00278 //}
00279 //
00281 //template < typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
00282 //void operator >> (const Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& matrix, YAML::Node& node)
00283 //{
00284 //      // todo
00285 //}
00286 
00287 
00288 
00289 } // namespace
00290 
00291 #endif /* CONVERSION_H_ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Defines


telekyb_base
Author(s): Dr. Antonio Franchi and Martin Riedel
autogenerated on Mon Nov 11 2013 11:12:34