4#include <mrs_lib/param_loader.h>
12 void ParamLoader::printValue(
const resolved_name_t& name,
const T& value)
const
14 if (m_node_name.empty())
15 std::cout <<
"\t" << name <<
":\t" << value << std::endl;
17 RCLCPP_INFO_STREAM(m_node->get_logger(),
"[" << m_node_name <<
"]: parameter '" << name <<
"':\t" << value);
21 std::ostream&
operator<<(std::ostream& os,
const Eigen::MatrixX<T>& var)
25 const Eigen::IOFormat fmt;
26 return os << var.format(fmt);
35 std::pair<ParamLoader::MatrixX<T>,
bool> ParamLoader::loadMatrixX(
const std::string& name,
const MatrixX<T>& default_value,
int rows,
int cols,
36 optional_t optional, unique_t unique, swap_t swap,
bool printValues)
39 MatrixX<T> loaded = default_value;
40 bool used_rosparam_value =
false;
42 if (unique && check_duplicit_loading(resolved_name))
43 return {loaded, used_rosparam_value};
49 printError(std::string(
"Invalid expected matrix dimensions for parameter ") + resolved_name.str);
50 m_load_successful =
false;
51 return {loaded, used_rosparam_value};
53 const bool expect_zero_matrix = rows == 0;
54 if (expect_zero_matrix)
58 printError(std::string(
"Invalid expected matrix dimensions for parameter ") + resolved_name.str
59 +
". One dimension indicates zero matrix, but other expects non-zero.");
60 m_load_successful =
false;
61 return {loaded, used_rosparam_value};
65 bool cur_load_successful =
true;
66 bool check_size_exact =
true;
68 check_size_exact =
false;
70 std::vector<T> tmp_vec;
72 const bool success = m_pp.
getParam(resolved_name, tmp_vec);
74 bool correct_size = (int)tmp_vec.size() == rows * cols;
75 if (!check_size_exact && !expect_zero_matrix)
76 correct_size = (int)tmp_vec.size() % rows == 0;
78 if (success && correct_size)
82 if (cols <= 0 && rows > 0)
83 cols = tmp_vec.size() / rows;
85 std::swap(rows, cols);
86 loaded = Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>, Eigen::Unaligned>(tmp_vec.data(), rows, cols);
87 used_rosparam_value =
true;
90 if (success && !correct_size)
94 std::string(
"Matrix parameter ") + resolved_name.str
95 + std::string(
" could not be loaded because the vector has a wrong length " + std::to_string(tmp_vec.size()) +
" instead of expected ");
98 warning = warning + std::string(
"number divisible by ") + std::to_string(rows);
100 warning = warning + std::to_string(rows * cols);
101 printWarning(warning);
107 printError(std::string(
"Could not load non-optional parameter ") + resolved_name.str);
108 cur_load_successful =
false;
113 if (cur_load_successful)
115 if (m_print_values && printValues)
116 printValue(resolved_name, loaded);
117 m_loaded_params.insert(resolved_name);
120 m_load_successful =
false;
123 return {loaded, used_rosparam_value};
128 template <
int rows,
int cols,
typename T>
129 std::pair<Eigen::Matrix<T, rows, cols>,
bool>
130 ParamLoader::loadMatrixStatic_internal(
const std::string& name,
const Eigen::Matrix<T, rows, cols>& default_value, optional_t optional, unique_t unique)
132 const auto [dynamic, loaded_ok] = loadMatrixX(name, MatrixX<T>(default_value), rows, cols, optional, unique, NO_SWAP);
133 return {dynamic, loaded_ok};
138 template <
typename T>
139 std::pair<ParamLoader::MatrixX<T>,
bool> ParamLoader::loadMatrixKnown_internal(
const std::string& name,
const MatrixX<T>& default_value,
int rows,
int cols,
140 optional_t optional, unique_t unique)
142 MatrixX<T> loaded = default_value;
144 if (rows <= 0 || cols <= 0)
146 printError(std::string(
"Invalid expected matrix dimensions for parameter ") + m_pp.
resolveName(name).str + std::string(
" (use loadMatrixDynamic?)"));
147 m_load_successful =
false;
148 return {loaded,
false};
151 return loadMatrixX(name, default_value, rows, cols, optional, unique, NO_SWAP);
156 template <
typename T>
157 std::pair<ParamLoader::MatrixX<T>,
bool> ParamLoader::loadMatrixDynamic_internal(
const std::string& name,
const MatrixX<T>& default_value,
int rows,
int cols,
158 optional_t optional, unique_t unique)
160 MatrixX<T> loaded = default_value;
163 if (rows <= 0 && cols <= 0)
165 printError(std::string(
"Invalid expected matrix dimensions for parameter ") + m_pp.
resolveName(name).str
166 + std::string(
" (at least one dimension must be specified)"));
167 m_load_successful =
false;
168 return {loaded,
false};
171 swap_t swap = NO_SWAP;
174 std::swap(rows, cols);
177 return loadMatrixX(name, default_value, rows, cols, optional, unique, swap);
182 template <
typename T>
183 std::vector<ParamLoader::MatrixX<T>> ParamLoader::loadMatrixArray_internal(
const std::string& name,
const std::vector<MatrixX<T>>& default_value,
184 optional_t optional, unique_t unique)
188 std::vector<long int> cols;
190 success = success && m_pp.
getParam(resolved_name_t(resolved_name.str +
"/rows"), rows);
191 success = success && m_pp.
getParam(resolved_name_t(resolved_name.str +
"/cols"), cols);
193 std::vector<MatrixX<T>> loaded;
194 loaded.reserve(cols.size());
201 printError(std::string(
"Failed to load ") + resolved_name.str + std::string(
"/rows or ") + resolved_name.str + std::string(
"/cols"));
202 m_load_successful =
false;
203 return default_value;
207 printError(std::string(
"Invalid expected matrix dimensions for parameter ") + resolved_name.str + std::string(
" (rows and cols must be >= 0)"));
208 m_load_successful =
false;
209 return default_value;
211 for (
const auto& col : cols)
215 printError(std::string(
"Invalid expected matrix dimensions for parameter ") + resolved_name.str + std::string(
" (rows and cols must be >= 0)"));
216 m_load_successful =
false;
217 return default_value;
224 const auto [loaded_matrix, loaded_ok] = loadMatrixX(name +
"/data", MatrixX<T>(), rows, total_cols, optional, unique, NO_SWAP,
false);
228 if (loaded_matrix.rows() != rows || loaded_matrix.cols() != total_cols)
230 m_load_successful =
false;
231 return default_value;
235 for (
unsigned it = 0; it < cols.size(); it++)
237 const int cur_cols = cols.at(it);
238 const MatrixX<T> cur_mat = loaded_matrix.block(0, cols_loaded, rows, cur_cols);
240 loaded.push_back(cur_mat);
241 cols_loaded += cur_cols;
242 printValue(resolved_name_t(resolved_name.str +
"/matrix#" + std::to_string(it)), cur_mat);
262 template <
typename T>
263 std::pair<T, bool> ParamLoader::load(
const std::string& name,
const T& default_value, optional_t optional, unique_t unique)
266 T loaded = default_value;
267 if (unique && check_duplicit_loading(resolved_name))
268 return {loaded,
false};
270 bool cur_load_successful =
true;
272 const bool success = m_pp.
getParam(resolved_name, loaded);
276 loaded = default_value;
280 printError(std::string(
"Could not load non-optional parameter ") + resolved_name.str);
281 cur_load_successful =
false;
285 if (cur_load_successful)
289 printValue(resolved_name, loaded);
291 m_loaded_params.insert(resolved_name);
294 m_load_successful =
false;
297 return {loaded, success};
303 template <
typename T>
306 const auto [ret, success] = load<T>(name, default_value, OPTIONAL, UNIQUE);
321 template <
typename T>
324 const auto loaded = load<T>(name, default_value, OPTIONAL, UNIQUE);
339 template <
typename T>
342 const auto [ret, success] = load<T>(name, default_value, OPTIONAL, REUSABLE);
357 template <
typename T>
360 const auto [ret, success] = load<T>(name, default_value, OPTIONAL, REUSABLE);
377 template <
typename T>
380 const auto [ret, success] = load<T>(name, T(), COMPULSORY, UNIQUE);
394 template <
typename T>
397 const auto [ret, success] = load<T>(name, T(), COMPULSORY, UNIQUE);
411 template <
typename T>
414 const auto [ret, success] = load<T>(name, T(), COMPULSORY, REUSABLE);
428 template <
typename T>
431 const auto [ret, success] = load<T>(name, T(), COMPULSORY, REUSABLE);
452 template <
typename T>
455 const int rows = default_value.rows();
456 const int cols = default_value.cols();
474 template <
typename T>
503 template <
int rows,
int cols,
typename T>
506 const auto [ret, loaded_ok] = loadMatrixStatic_internal<rows, cols, T>(name, Eigen::Matrix<T, rows, cols>::Zero(), COMPULSORY, UNIQUE);
528 template <
int rows,
int cols,
typename T,
typename Derived>
531 const auto [ret, loaded_ok] = loadMatrixStatic_internal<rows, cols, T>(name, Eigen::Matrix<T, rows, cols>(default_value), OPTIONAL, UNIQUE);
552 template <
int rows,
int cols,
typename T>
555 Eigen::Matrix<T, rows, cols> ret;
576 template <
int rows,
int cols,
typename T,
typename Derived>
579 Eigen::Matrix<T, rows, cols> ret;
602 template <
typename T>
605 const auto [ret, loaded_ok] = loadMatrixKnown_internal(name, MatrixX<T>(), rows, cols, COMPULSORY, UNIQUE);
625 template <
typename T,
typename Derived>
628 const auto [ret, loaded_ok] = loadMatrixKnown_internal(name, MatrixX<T>(default_value), rows, cols, OPTIONAL, UNIQUE);
647 template <
typename T>
669 template <
typename T,
typename Derived>
695 template <
typename T>
698 const auto [ret, loaded_ok] = loadMatrixDynamic_internal(name, MatrixX<T>(), rows, cols, COMPULSORY, UNIQUE);
719 template <
typename T,
typename Derived>
722 const auto [ret, loaded_ok] = loadMatrixDynamic_internal(name, MatrixX<T>(default_value), rows, cols, OPTIONAL, UNIQUE);
741 template <
typename T>
763 template <
typename T,
typename Derived>
806 template <
typename T>
809 mat = loadMatrixArray2<double>(name);
823 template <
typename T>
839 template <
typename T>
842 return loadMatrixArray_internal(name, std::vector<MatrixX<T>>(), COMPULSORY, UNIQUE);
856 template <
typename T>
859 return loadMatrixArray_internal(name, default_value, OPTIONAL, UNIQUE);
bool loadMatrixKnown(const std::string &name, MatrixX< T > &mat, int rows, int cols)
Specialized method for loading compulsory Eigen matrix parameters.
Definition param_loader.hpp:603
std::vector< MatrixX< T > > loadMatrixArray2(const std::string &name)
Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matric...
Definition param_loader.hpp:840
void loadMatrixArray(const std::string &name, std::vector< MatrixX< T > > &mat)
Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matric...
Definition param_loader.hpp:807
T loadParam2(const std::string &name, const T &default_value)
Loads a parameter from the rosparam server with a default value.
Definition param_loader.hpp:322
Eigen::Matrix< T, rows, cols > loadMatrixStatic2(const std::string &name)
Specialized method for loading compulsory Eigen matrix parameters.
Definition param_loader.hpp:553
bool loadParam(const std::string &name, T &out_value, const T &default_value)
Loads a parameter from the rosparam server with a default value.
Definition param_loader.hpp:304
bool loadMatrixStatic(const std::string &name, Eigen::Matrix< T, rows, cols > &mat)
Specialized method for loading compulsory Eigen matrix parameters.
Definition param_loader.hpp:504
MatrixX< T > loadMatrixKnown2(const std::string &name, int rows, int cols)
Specialized method for loading compulsory Eigen matrix parameters.
Definition param_loader.hpp:648
bool loadMatrixDynamic(const std::string &name, MatrixX< T > &mat, int rows, int cols)
Specialized method for loading compulsory dynamic Eigen matrix parameters.
Definition param_loader.hpp:696
bool loadParamReusable(const std::string &name, T &out_value, const T &default_value)
Loads a parameter from the rosparam server with a default value.
Definition param_loader.hpp:340
MatrixX< T > loadMatrixDynamic2(const std::string &name, int rows, int cols)
Specialized method for loading compulsory dynamic Eigen matrix parameters.
Definition param_loader.hpp:742
T loadParamReusable2(const std::string &name, const T &default_value)
Loads an optional reusable parameter from the rosparam server.
Definition param_loader.hpp:358
resolved_name_t resolveName(const std::string ¶m_name) const
Returns the parameter name with prefixes and subnode namespaces.
Definition param_provider.cpp:160
bool getParam(const std::string ¶m_name, T &value_out) const
Gets the value of a parameter.
Definition param_provider.hpp:83
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition attitude_converter.h:24
std::ostream & operator<<(std::ostream &os, const Eigen::MatrixX< T > &var)
Helper overload for printing of Eigen matrices.
Definition param_loader.hpp:21