utils.cpp
Go to the documentation of this file.
1 #include <memory>
2 #include <VirtualRobot/MathTools.h>
4 #include "utils.h"
5 
6 
8 {
9 
10 Eigen::VectorXf getEigenVec(nlohmann::json& userConfig, nlohmann::json& defaultConfig, const std::string& entryName, int size, int value)
11 {
12  if (userConfig.find(entryName) != userConfig.end())
13  {
14  auto vec = userConfig[entryName].get<std::vector<float>>();
15  if (vec.size() > 0)
16  {
17  return Eigen::Map<Eigen::VectorXf>(vec.data(), vec.size());
18  }
19  if (size > 0)
20  {
21  return Eigen::VectorXf::Ones(size) * value;
22  }
23  ARMARX_IMPORTANT << "user defined parameter " << entryName << " have size 0, fall back to default";
24  }
25 
26  auto vec = defaultConfig[entryName].get<std::vector<float>>();
27  return Eigen::Map<Eigen::VectorXf>(vec.data(), vec.size());
28 }
29 
30 void getEigenMatrix(nlohmann::json &userConfig, const std::string &entryName, Eigen::MatrixXf& mat)
31 {
32  if (userConfig.find(entryName) != userConfig.end())
33  {
34  auto vec = userConfig[entryName].get<std::vector<std::vector<float>>>();
35  int rows = vec.size();
36  int cols = vec[0].size();
37  ARMARX_INFO << VAROUT(rows) << VAROUT(cols);
40  mat.resize(rows, cols);
41  for (int i = 0; i < rows; i++)
42  {
43  for (int j = 0; j < cols; j++)
44  {
45  mat(i,j) = vec[i][j];
46  }
47  }
48 // memcpy(mat.data(), vec.data(), rows * cols * sizeof(float));
49  }
50  else
51  {
52  ARMARX_ERROR << "values not found in user config";
53  }
54 }
55 
56 Eigen::VectorXf getEigenVecWithDefault(nlohmann::json& userConfig, Eigen::VectorXf defaultValue, const std::string& entryName)
57 {
58  if (userConfig.find(entryName) != userConfig.end())
59  {
60  auto vec = userConfig[entryName].get<std::vector<float>>();
61  if (vec.size() == (unsigned)defaultValue.size())
62  {
63  return Eigen::Map<Eigen::VectorXf>(vec.data(), vec.size());
64  }
65  ARMARX_WARNING << "size of the user defined parameter " << entryName << " doesn't correspond to default size, use default value instead";
66  }
67  return defaultValue;
68 }
69 
70 void getError(Eigen::Matrix4f &currentPose, Eigen::Vector3d &targetPosition, Eigen::Quaterniond &targetQuaternion, double &posiError, double &oriError)
71 {
72  Eigen::Matrix4d currentPosed = currentPose.cast<double>();
73  Eigen::Vector3d currentPosid = currentPosed.block<3,1>(0,3);
74  posiError = (currentPosid - targetPosition).norm();
75 
76  Eigen::Quaterniond currentOrientation = Eigen::Quaterniond {currentPosed.block<3,3>(0,0)};
77  oriError = targetQuaternion.angularDistance(currentOrientation);
78  if (oriError > M_PI)
79  {
80  oriError = 2 * M_PI - oriError;
81  }
82 }
83 
84 void debugEigenPose(StringVariantBaseMap& datafields, const std::string& name, Eigen::Matrix4f pose)
85 {
86  Eigen::Vector3f rpy = VirtualRobot::MathTools::eigen4f2rpy(pose);
87  datafields[name + "_x"] = new Variant(pose(0, 3));
88  datafields[name + "_y"] = new Variant(pose(1, 3));
89  datafields[name + "_z"] = new Variant(pose(2, 3));
90  datafields[name + "_rx"] = new Variant(rpy(0));
91  datafields[name + "_ry"] = new Variant(rpy(1));
92  datafields[name + "_rz"] = new Variant(rpy(2));
93 }
94 
95 void debugEigenVec(StringVariantBaseMap& datafields, const std::string& name, Eigen::VectorXf vec)
96 {
97  for (int i = 0; i < vec.size(); i++)
98  {
99  datafields[name + "_" + std::to_string(i)] = new Variant(vec(i));
100  }
101 }
102 
103 void to_json(nlohmann::json &j, const Pose &fp)
104 {
105  j = nlohmann::json
106  {
107  {"qw", fp.orientation->qw},
108  {"qx", fp.orientation->qx},
109  {"qy", fp.orientation->qy},
110  {"qz", fp.orientation->qz},
111  {"x", fp.position->x},
112  {"y", fp.position->y},
113  {"z", fp.position->z}
114 };
115 }
116 
117 void from_json(const nlohmann::json &j, Pose &fp)
118 {
119  j.at("qw").get_to(fp.orientation->qw);
120  j.at("qx").get_to(fp.orientation->qx);
121  j.at("qy").get_to(fp.orientation->qy);
122  j.at("qz").get_to(fp.orientation->qz);
123  j.at("x").get_to(fp.position->x);
124  j.at("y").get_to(fp.position->y);
125  j.at("z").get_to(fp.position->z);
126 }
127 
128 void to_json(nlohmann::json &j, const PosePtr &fp)
129 {
130  if (fp)
131  {
132  to_json(j, *fp);
133  }
134 }
135 
136 void to_json(nlohmann::json &j, const PoseBasePtr &fp)
137 {
138  if (fp)
139  {
140  to_json(j, PosePtr::dynamicCast(fp));
141  }
142 }
143 
144 void from_json(const nlohmann::json &j, PoseBasePtr &fp)
145 {
146  PosePtr p = new Pose();
147  from_json(j, p);
148  fp = p;
149 }
150 
151 void from_json(const nlohmann::json &j, PosePtr &fp)
152 {
153  fp = new Pose();
154  from_json(j, *fp);
155 }
156 
157 PosePtr dVecToPose(const mplib::core::DVec &dvec)
158 {
159  return new Pose(dVecToMat4(dvec));
160 }
161 
162 Eigen::Matrix4f dVecToMat4(const mplib::core::DVec &dvec)
163 {
164  ARMARX_CHECK_EQUAL(dvec.size(), 7);
165  Eigen::Matrix4f mat = VirtualRobot::MathTools::quat2eigen4f(static_cast<float>(dvec[4]),
166  static_cast<float>(dvec[5]),
167  static_cast<float>(dvec[6]),
168  static_cast<float>(dvec[3]));
169  mat(0, 3) = static_cast<float>(dvec[0]);
170  mat(1, 3) = static_cast<float>(dvec[1]);
171  mat(2, 3) = static_cast<float>(dvec[2]);
172 
173  return mat;
174 }
175 
176 mplib::core::DVec poseToDVec(PosePtr &pose)
177 {
178  Eigen::Matrix4f poseMat = pose->toEigen();
179  return mat4ToDVec(poseMat);
180 }
181 
182 mplib::core::DVec mat4ToDVec(Eigen::Matrix4f &mat)
183 {
184  std::vector<double> result;
185  result.resize(7);
186 
187  for (size_t i = 0; i < 3; ++i)
188  {
189  result.at(i) = static_cast<double>(mat(i, 3));
190  }
191 
192  VirtualRobot::MathTools::Quaternion quat = VirtualRobot::MathTools::eigen4f2quat(mat);
193 
194  result.at(3) = static_cast<double>(quat.w);
195  result.at(4) = static_cast<double>(quat.x);
196  result.at(5) = static_cast<double>(quat.y);
197  result.at(6) = static_cast<double>(quat.z);
198 
199  return result;
200 }
201 
202 std::vector<float> poseToFVec(PosePtr &pose)
203 {
204  Eigen::Matrix4f poseMat = pose->toEigen();
205  return mat4ToFVec(poseMat);
206 }
207 
208 std::vector<float> mat4ToFVec(Eigen::Matrix4f &mat)
209 {
210  std::vector<float> result;
211  result.resize(7);
212 
213  for (size_t i = 0; i < 3; ++i)
214  {
215  result.at(i) = mat(i, 3);
216  }
217 
218  VirtualRobot::MathTools::Quaternion quat = VirtualRobot::MathTools::eigen4f2quat(mat);
219 
220  result.at(3) = quat.w;
221  result.at(4) = quat.x;
222  result.at(5) = quat.y;
223  result.at(6) = quat.z;
224 
225  return result;
226 }
227 
228 std::string dVecToString(const mplib::core::DVec &dvec)
229 {
230  std::string s = "";
231  for (const double& d: dvec)
232  {
233  s = s + std::to_string(d) + " | ";
234  }
235  return s;
236 }
237 
238 Eigen::VectorXf vecToEigen(std::vector<float> &vec)
239 {
240  return Eigen::Map<Eigen::VectorXf>(vec.data(), vec.size());
241 }
242 
243 
244 }
armarx::Variant
The Variant class is described here: Variants.
Definition: Variant.h:224
armarx::control::common::debugEigenPose
void debugEigenPose(StringVariantBaseMap &datafields, const std::string &name, Eigen::Matrix4f pose)
Definition: utils.cpp:84
armarx::StringVariantBaseMap
std::map< std::string, VariantBasePtr > StringVariantBaseMap
Definition: ManagedIceObject.h:111
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:183
armarx::control::common::mat4ToFVec
std::vector< float > mat4ToFVec(Eigen::Matrix4f &mat)
Definition: utils.cpp:208
armarx::navigation::core::Pose
Eigen::Isometry3f Pose
Definition: basic_types.h:31
armarx::control::common::getEigenVecWithDefault
Eigen::VectorXf getEigenVecWithDefault(nlohmann::json &userConfig, Eigen::VectorXf defaultValue, const std::string &entryName)
Definition: utils.cpp:56
armarx::control::common::mat4ToDVec
mplib::core::DVec mat4ToDVec(Eigen::Matrix4f &mat)
Definition: utils.cpp:182
armarx::control::common::getError
void getError(Eigen::Matrix4f &currentPose, Eigen::Vector3d &targetPosition, Eigen::Quaterniond &targetQuaternion, double &posiError, double &oriError)
Definition: utils.cpp:70
armarx::control::common::from_json
void from_json(const nlohmann::json &j, Pose &fp)
Definition: utils.cpp:117
armarx::control::common
This file is part of ArmarX.
Definition: aron_conversions.cpp:25
armarx::VariantType::Quaternion
const VariantTypeId Quaternion
Definition: Pose.h:39
IceInternal::Handle< Pose >
armarx::control::common::poseToFVec
std::vector< float > poseToFVec(PosePtr &pose)
Definition: utils.cpp:202
armarx::control::common::dVecToString
std::string dVecToString(const mplib::core::DVec &dvec)
Definition: utils.cpp:228
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:926
M_PI
#define M_PI
Definition: MathTools.h:17
armarx::control::common::poseToDVec
mplib::core::DVec poseToDVec(PosePtr &pose)
Definition: utils.cpp:176
armarx::control::common::dVecToMat4
Eigen::Matrix4f dVecToMat4(const mplib::core::DVec &dvec)
Definition: utils.cpp:162
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:189
armarx::control::common::dVecToPose
PosePtr dVecToPose(const mplib::core::DVec &dvec)
Definition: utils.cpp:157
ARMARX_CHECK_GREATER_EQUAL
#define ARMARX_CHECK_GREATER_EQUAL(lhs, rhs)
This macro evaluates whether lhs is greater or equal (>=) rhs and if it turns out to be false it will...
Definition: ExpressionException.h:123
armarx::to_string
const std::string & to_string(const std::string &s)
Definition: StringHelpers.h:40
armarx::control::common::debugEigenVec
void debugEigenVec(StringVariantBaseMap &datafields, const std::string &name, Eigen::VectorXf vec)
Definition: utils.cpp:95
utils.h
armarx::control::common::vecToEigen
Eigen::VectorXf vecToEigen(std::vector< float > &vec)
Definition: utils.cpp:238
ExpressionException.h
armarx::Pose
The Pose class.
Definition: Pose.h:242
GfxTL::Matrix4f
MatrixXX< 4, 4, float > Matrix4f
Definition: MatrixXX.h:601
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:174
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:182
armarx::control::common::to_json
void to_json(nlohmann::json &j, const Pose &fp)
Definition: utils.cpp:103
Eigen::Quaterniond
Quaternion< double, 0 > Quaterniond
Definition: EigenForwardDeclarations.h:62
armarx::control::common::getEigenVec
Eigen::VectorXf getEigenVec(nlohmann::json &userConfig, nlohmann::json &defaultConfig, const std::string &entryName, int size, int value)
Definition: utils.cpp:10
ARMARX_CHECK_EQUAL
#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...
Definition: ExpressionException.h:130
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx::control::common::getEigenMatrix
void getEigenMatrix(nlohmann::json &userConfig, const std::string &entryName, Eigen::MatrixXf &mat)
Definition: utils.cpp:30
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
norm
double norm(const Point &a)
Definition: point.hpp:94