1#include "parameter_container.h"
3#include <state_representation/space/cartesian/CartesianState.hpp>
4#include <state_representation/space/cartesian/CartesianPose.hpp>
5#include <state_representation/space/joint/JointState.hpp>
6#include <state_representation/space/joint/JointPositions.hpp>
7#include <state_representation/geometry/Ellipsoid.hpp>
9namespace py_parameter {
11ParameterContainer::ParameterContainer(
14 if (type == ParameterType::STATE) {
15 switch (parameter_state_type) {
16 case StateType::CARTESIAN_STATE:
17 values.state_pointer = std::make_shared<CartesianState>();
19 case StateType::CARTESIAN_POSE:
20 values.state_pointer = std::make_shared<CartesianPose>();
22 case StateType::JOINT_STATE:
23 values.state_pointer = std::make_shared<JointState>();
25 case StateType::JOINT_POSITIONS:
26 values.state_pointer = std::make_shared<JointPositions>();
28 case StateType::GEOMETRY_ELLIPSOID:
29 values.state_pointer = std::make_shared<Ellipsoid>();
32 throw std::invalid_argument(
"The desired StateType for parameter " + this->get_name() +
" is not supported.");
38ParameterContainer::ParameterContainer(
39 const std::string& name,
const py::object& value,
const ParameterType& type,
const StateType& parameter_state_type
44ParameterContainer::ParameterContainer(
const ParameterContainer& parameter) :
45 ParameterInterface(parameter.get_name(), parameter.get_parameter_type(), parameter.get_parameter_state_type()),
46 values(parameter.values) {}
48void ParameterContainer::set_value(
const py::object& value) {
49 switch (this->get_parameter_type()) {
50 case ParameterType::INT:
51 values.int_value = value.cast<
int>();
53 case ParameterType::INT_ARRAY:
54 values.int_array_value = value.cast<std::vector<int>>();
56 case ParameterType::DOUBLE:
57 values.double_value = value.cast<
double>();
59 case ParameterType::DOUBLE_ARRAY:
60 values.double_array_value = value.cast<std::vector<double>>();
62 case ParameterType::BOOL:
63 values.bool_value = value.cast<
bool>();
65 case ParameterType::BOOL_ARRAY:
66 values.bool_array_value = value.cast<std::vector<bool>>();
68 case ParameterType::STRING:
69 values.string_value = value.cast<std::string>();
71 case ParameterType::STRING_ARRAY:
72 values.string_array_value = value.cast<std::vector<std::string>>();
74 case ParameterType::STATE:
75 switch (this->get_parameter_state_type()) {
76 case StateType::CARTESIAN_STATE:
77 values.state_pointer = std::make_shared<CartesianState>(value.cast<
CartesianState>());
79 case StateType::CARTESIAN_POSE:
80 values.state_pointer = std::make_shared<CartesianPose>(value.cast<
CartesianPose>());
82 case StateType::JOINT_STATE:
83 values.state_pointer = std::make_shared<JointState>(value.cast<
JointState>());
85 case StateType::JOINT_POSITIONS:
86 values.state_pointer = std::make_shared<JointPositions>(value.cast<
JointPositions>());
88 case StateType::GEOMETRY_ELLIPSOID:
89 values.state_pointer = std::make_shared<Ellipsoid>(value.cast<
Ellipsoid>());
92 throw std::invalid_argument(
"The StateType contained by parameter " + this->get_name() +
" is unsupported.");
96 case ParameterType::MATRIX:
97 values.matrix_value = value.cast<Eigen::MatrixXd>();
99 case ParameterType::VECTOR:
100 values.vector_value = value.cast<Eigen::VectorXd>();
103 throw std::invalid_argument(
"The ParameterType of parameter " + this->get_name() +
" is invalid.");
108py::object ParameterContainer::get_value() {
109 switch (this->get_parameter_type()) {
110 case ParameterType::INT:
111 return py::cast(values.int_value);
112 case ParameterType::INT_ARRAY:
113 return py::cast(values.int_array_value);
114 case ParameterType::DOUBLE:
115 return py::cast(values.double_value);
116 case ParameterType::DOUBLE_ARRAY:
117 return py::cast(values.double_array_value);
118 case ParameterType::BOOL:
119 return py::cast(values.bool_value);
120 case ParameterType::BOOL_ARRAY:
121 return py::cast(values.bool_array_value);
122 case ParameterType::STRING:
123 return py::cast(values.string_value);
124 case ParameterType::STRING_ARRAY:
125 return py::cast(values.string_array_value);
126 case ParameterType::STATE:
128 switch (this->get_parameter_state_type()) {
129 case StateType::CARTESIAN_STATE:
130 return py::cast(*std::dynamic_pointer_cast<CartesianState>(values.state_pointer));
131 case StateType::CARTESIAN_POSE:
132 return py::cast(*std::dynamic_pointer_cast<CartesianPose>(values.state_pointer));
133 case StateType::JOINT_STATE:
134 return py::cast(*std::dynamic_pointer_cast<JointState>(values.state_pointer));
135 case StateType::JOINT_POSITIONS:
136 return py::cast(*std::dynamic_pointer_cast<JointPositions>(values.state_pointer));
137 case StateType::GEOMETRY_ELLIPSOID:
138 return py::cast(*std::dynamic_pointer_cast<Ellipsoid>(values.state_pointer));
140 throw std::invalid_argument(
141 "The StateType contained by parameter " + this->get_name() +
" is unsupported.");
143 }
catch (
const std::exception&) {
144 throw std::runtime_error(
"The ParameterType of parameter " + this->get_name() +
" is invalid.");
147 case ParameterType::MATRIX:
148 return py::cast(values.matrix_value);
149 case ParameterType::VECTOR:
150 return py::cast(values.vector_value);
154 throw std::invalid_argument(
"Could not get the value of parameter " + this->get_name());
157ParameterContainer interface_ptr_to_container(
const std::shared_ptr<ParameterInterface>& parameter) {
158 switch (parameter->get_parameter_type()) {
159 case ParameterType::INT:
160 return ParameterContainer(
161 parameter->get_name(), py::cast(parameter->get_parameter_value<
int>()), ParameterType::INT);
162 case ParameterType::INT_ARRAY:
163 return ParameterContainer(
164 parameter->get_name(), py::cast(parameter->get_parameter_value<std::vector<int>>()),
165 ParameterType::INT_ARRAY);
166 case ParameterType::DOUBLE:
167 return ParameterContainer(
168 parameter->get_name(), py::cast(parameter->get_parameter_value<
double>()), ParameterType::DOUBLE);
169 case ParameterType::DOUBLE_ARRAY:
170 return ParameterContainer(
171 parameter->get_name(), py::cast(parameter->get_parameter_value<std::vector<double>>()),
172 ParameterType::DOUBLE_ARRAY);
173 case ParameterType::BOOL:
174 return ParameterContainer(
175 parameter->get_name(), py::cast(parameter->get_parameter_value<
bool>()), ParameterType::BOOL);
176 case ParameterType::BOOL_ARRAY:
177 return ParameterContainer(
178 parameter->get_name(), py::cast(parameter->get_parameter_value<std::vector<bool>>()),
179 ParameterType::BOOL_ARRAY);
180 case ParameterType::STRING:
181 return ParameterContainer(
182 parameter->get_name(), py::cast(parameter->get_parameter_value<std::string>()), ParameterType::STRING);
183 case ParameterType::STRING_ARRAY:
184 return ParameterContainer(
185 parameter->get_name(), py::cast(parameter->get_parameter_value<std::vector<std::string>>()),
186 ParameterType::STRING_ARRAY);
187 case ParameterType::STATE:
189 switch (parameter->get_parameter_state_type()) {
190 case StateType::CARTESIAN_STATE:
191 return ParameterContainer(
192 parameter->get_name(), py::cast(parameter->get_parameter_value<
CartesianState>()), ParameterType::STATE,
193 StateType::CARTESIAN_STATE);
194 case StateType::CARTESIAN_POSE:
195 return ParameterContainer(
196 parameter->get_name(), py::cast(parameter->get_parameter_value<
CartesianPose>()), ParameterType::STATE,
197 StateType::CARTESIAN_POSE);
198 case StateType::JOINT_STATE:
199 return ParameterContainer(
200 parameter->get_name(), py::cast(parameter->get_parameter_value<
JointState>()), ParameterType::STATE,
201 StateType::JOINT_STATE);
202 case StateType::JOINT_POSITIONS:
203 return ParameterContainer(
204 parameter->get_name(), py::cast(parameter->get_parameter_value<
JointPositions>()), ParameterType::STATE,
205 StateType::JOINT_POSITIONS);
206 case StateType::GEOMETRY_ELLIPSOID:
207 return ParameterContainer(
208 parameter->get_name(), py::cast(parameter->get_parameter_value<
Ellipsoid>()), ParameterType::STATE,
209 StateType::GEOMETRY_ELLIPSOID);
211 throw std::invalid_argument(
212 "The StateType contained by parameter " + parameter->get_name() +
" is unsupported.");
214 }
catch (
const std::exception&) {
215 throw std::runtime_error(
"The ParameterType of parameter " + parameter->get_name() +
" is invalid.");
218 case ParameterType::MATRIX:
219 return ParameterContainer(
220 parameter->get_name(), py::cast(parameter->get_parameter_value<Eigen::MatrixXd>()), ParameterType::MATRIX);
221 case ParameterType::VECTOR:
222 return ParameterContainer(
223 parameter->get_name(), py::cast(parameter->get_parameter_value<Eigen::VectorXd>()), ParameterType::VECTOR);
227 throw std::invalid_argument(
"The conversion from this Parameter to a ParameterContainer is not supported.");
230std::shared_ptr<ParameterInterface> container_to_interface_ptr(
const ParameterContainer& parameter) {
231 switch (parameter.get_parameter_type()) {
232 case ParameterType::INT:
233 return make_shared_parameter(parameter.get_name(), parameter.values.int_value);
234 case ParameterType::INT_ARRAY:
235 return make_shared_parameter(parameter.get_name(), parameter.values.int_array_value);
236 case ParameterType::DOUBLE:
237 return make_shared_parameter(parameter.get_name(), parameter.values.double_value);
238 case ParameterType::DOUBLE_ARRAY:
239 return make_shared_parameter(parameter.get_name(), parameter.values.double_array_value);
240 case ParameterType::BOOL:
241 return make_shared_parameter(parameter.get_name(), parameter.values.bool_value);
242 case ParameterType::BOOL_ARRAY:
243 return make_shared_parameter(parameter.get_name(), parameter.values.bool_array_value);
244 case ParameterType::STRING:
245 return make_shared_parameter(parameter.get_name(), parameter.values.string_value);
246 case ParameterType::STRING_ARRAY:
247 return make_shared_parameter(parameter.get_name(), parameter.values.string_array_value);
248 case ParameterType::STATE:
250 switch (parameter.get_parameter_state_type()) {
251 case StateType::CARTESIAN_STATE:
252 return make_shared_parameter(
253 parameter.get_name(), *std::dynamic_pointer_cast<CartesianState>(parameter.values.state_pointer));
254 case StateType::CARTESIAN_POSE:
255 return make_shared_parameter(
256 parameter.get_name(), *std::dynamic_pointer_cast<CartesianPose>(parameter.values.state_pointer));
257 case StateType::JOINT_STATE:
258 return make_shared_parameter(
259 parameter.get_name(), *std::dynamic_pointer_cast<JointState>(parameter.values.state_pointer));
260 case StateType::JOINT_POSITIONS:
261 return make_shared_parameter(
262 parameter.get_name(), *std::dynamic_pointer_cast<JointPositions>(parameter.values.state_pointer));
263 case StateType::GEOMETRY_ELLIPSOID:
264 return make_shared_parameter(
265 parameter.get_name(), *std::dynamic_pointer_cast<Ellipsoid>(parameter.values.state_pointer));
267 throw std::invalid_argument(
268 "The StateType contained by parameter " + parameter.get_name() +
" is unsupported.");
270 }
catch (
const std::exception&) {
271 throw std::runtime_error(
"The ParameterType of parameter " + parameter.get_name() +
" is invalid.");
274 case ParameterType::MATRIX:
275 return make_shared_parameter(parameter.get_name(), parameter.values.matrix_value);
276 case ParameterType::VECTOR:
277 return make_shared_parameter(parameter.get_name(), parameter.values.vector_value);
281 throw std::invalid_argument(
"The conversion from this ParameterContainer to a Parameter is not supported.");
284std::map<std::string, ParameterContainer>
285interface_ptr_to_container_map(
const std::map<std::string, std::shared_ptr<ParameterInterface>>& parameters) {
286 std::map<std::string, ParameterContainer> parameter_list;
287 for (
const auto& param_it: parameters) {
288 parameter_list.insert(
289 std::pair<std::string, ParameterContainer>(param_it.first, interface_ptr_to_container(param_it.second)));
291 return parameter_list;
294std::map<std::string, std::shared_ptr<ParameterInterface>>
295container_to_interface_ptr_map(
const std::map<std::string, ParameterContainer>& parameters) {
296 std::map<std::string, std::shared_ptr<ParameterInterface>> parameter_list;
297 for (
const auto& param_it: parameters) {
298 parameter_list.insert(
299 std::pair<std::string, std::shared_ptr<ParameterInterface>>(
300 param_it.first, container_to_interface_ptr(param_it.second)
304 return parameter_list;
307std::list<ParameterContainer>
308interface_ptr_to_container_list(
const std::list<std::shared_ptr<ParameterInterface>>& parameters) {
309 std::list<ParameterContainer> parameter_list;
310 for (
const auto& param_it: parameters) {
311 parameter_list.emplace_back(interface_ptr_to_container(param_it));
313 return parameter_list;
316std::list<std::shared_ptr<ParameterInterface>>
317container_to_interface_ptr_list(
const std::list<ParameterContainer>& parameters) {
318 std::list<std::shared_ptr<ParameterInterface>> parameter_list;
319 for (
const auto& param_it: parameters) {
320 parameter_list.emplace_back(container_to_interface_ptr(param_it));
322 return parameter_list;
Class to define CartesianPose in cartesian space as 3D position and quaternion based orientation.
Class to represent a state in Cartesian space.
Class to define a positions of the joints.
Class to define a state in joint space.
ParameterType
The parameter value types.
StateType
The class types inheriting from State.