1#include "parameter_container.hpp"
3#include <state_representation/exceptions/InvalidCastException.hpp>
4#include <state_representation/exceptions/InvalidParameterException.hpp>
5#include <state_representation/space/cartesian/CartesianState.hpp>
6#include <state_representation/space/cartesian/CartesianPose.hpp>
7#include <state_representation/space/joint/JointState.hpp>
8#include <state_representation/space/joint/JointPositions.hpp>
9#include <state_representation/geometry/Ellipsoid.hpp>
11namespace py_parameter {
13ParameterContainer::ParameterContainer(
16 if (type == ParameterType::STATE) {
17 switch (parameter_state_type) {
18 case StateType::CARTESIAN_STATE:
19 values.state_pointer = std::make_shared<CartesianState>();
21 case StateType::CARTESIAN_POSE:
22 values.state_pointer = std::make_shared<CartesianPose>();
24 case StateType::JOINT_STATE:
25 values.state_pointer = std::make_shared<JointState>();
27 case StateType::JOINT_POSITIONS:
28 values.state_pointer = std::make_shared<JointPositions>();
30 case StateType::GEOMETRY_ELLIPSOID:
31 values.state_pointer = std::make_shared<Ellipsoid>();
35 "The desired StateType for parameter '" + this->get_name() +
"' is not supported");
40ParameterContainer::ParameterContainer(
41 const std::string& name,
const py::object& value,
const ParameterType& type,
const StateType& parameter_state_type
46ParameterContainer::ParameterContainer(
const ParameterContainer& parameter) :
47 ParameterInterface(parameter.get_name(), parameter.get_parameter_type(), parameter.get_parameter_state_type()) {
49 set_value(parameter.get_value());
53void ParameterContainer::set_value(py::object value) {
55 switch (this->get_parameter_type()) {
56 case ParameterType::INT:
57 values.int_value = value.cast<
int>();
59 case ParameterType::INT_ARRAY:
60 values.int_array_value = value.cast < std::vector < int >> ();
62 case ParameterType::DOUBLE:
63 values.double_value = value.cast<
double>();
65 case ParameterType::DOUBLE_ARRAY:
66 values.double_array_value = value.cast < std::vector < double >> ();
68 case ParameterType::BOOL:
69 values.bool_value = value.cast<
bool>();
71 case ParameterType::BOOL_ARRAY:
72 values.bool_array_value = value.cast < std::vector < bool >> ();
74 case ParameterType::STRING:
75 values.string_value = value.cast<std::string>();
77 case ParameterType::STRING_ARRAY:
78 values.string_array_value = value.cast < std::vector < std::string >> ();
80 case ParameterType::STATE:
81 switch (this->get_parameter_state_type()) {
82 case StateType::CARTESIAN_STATE:
83 values.state_pointer = std::make_shared<CartesianState>(value.cast<
CartesianState>());
85 case StateType::CARTESIAN_POSE:
86 values.state_pointer = std::make_shared<CartesianPose>(value.cast<
CartesianPose>());
88 case StateType::JOINT_STATE:
89 values.state_pointer = std::make_shared<JointState>(value.cast<
JointState>());
91 case StateType::JOINT_POSITIONS:
92 values.state_pointer = std::make_shared<JointPositions>(value.cast<
JointPositions>());
94 case StateType::GEOMETRY_ELLIPSOID:
95 values.state_pointer = std::make_shared<Ellipsoid>(value.cast<
Ellipsoid>());
99 "The StateType of parameter '" + this->get_name() +
"' is not supported");
102 case ParameterType::MATRIX:
103 values.matrix_value = value.cast<Eigen::MatrixXd>();
105 case ParameterType::VECTOR:
106 values.vector_value = value.cast<Eigen::VectorXd>();
111 }
catch (
const pybind11::cast_error& ex) {
113 std::string(
"Could not cast the given object to the required parameter type: ") + ex.what());
115 this->set_empty(
false);
118py::object ParameterContainer::get_value()
const {
120 switch (this->get_parameter_type()) {
121 case ParameterType::INT:
122 return py::cast(values.int_value);
123 case ParameterType::INT_ARRAY:
124 return py::cast(values.int_array_value);
125 case ParameterType::DOUBLE:
126 return py::cast(values.double_value);
127 case ParameterType::DOUBLE_ARRAY:
128 return py::cast(values.double_array_value);
129 case ParameterType::BOOL:
130 return py::cast(values.bool_value);
131 case ParameterType::BOOL_ARRAY:
132 return py::cast(values.bool_array_value);
133 case ParameterType::STRING:
134 return py::cast(values.string_value);
135 case ParameterType::STRING_ARRAY:
136 return py::cast(values.string_array_value);
137 case ParameterType::STATE:
138 switch (this->get_parameter_state_type()) {
139 case StateType::CARTESIAN_STATE:
140 return py::cast(*std::dynamic_pointer_cast<CartesianState>(values.state_pointer));
141 case StateType::CARTESIAN_POSE:
142 return py::cast(*std::dynamic_pointer_cast<CartesianPose>(values.state_pointer));
143 case StateType::JOINT_STATE:
144 return py::cast(*std::dynamic_pointer_cast<JointState>(values.state_pointer));
145 case StateType::JOINT_POSITIONS:
146 return py::cast(*std::dynamic_pointer_cast<JointPositions>(values.state_pointer));
147 case StateType::GEOMETRY_ELLIPSOID:
148 return py::cast(*std::dynamic_pointer_cast<Ellipsoid>(values.state_pointer));
151 "The StateType of parameter '" + this->get_name() +
"' is not supported");
153 case ParameterType::MATRIX:
154 return py::cast(values.matrix_value);
155 case ParameterType::VECTOR:
156 return py::cast(values.vector_value);
160 }
catch (
const pybind11::cast_error& ex) {
165void ParameterContainer::reset() {
170ParameterContainer interface_ptr_to_container(
const std::shared_ptr<ParameterInterface>& parameter) {
171 if (parameter->is_empty()) {
173 parameter->get_name(), parameter->get_parameter_type(), parameter->get_parameter_state_type());
176 switch (parameter->get_parameter_type()) {
177 case ParameterType::INT:
178 return ParameterContainer(
179 parameter->get_name(), py::cast(parameter->get_parameter_value<
int>()), ParameterType::INT);
180 case ParameterType::INT_ARRAY:
181 return ParameterContainer(
182 parameter->get_name(), py::cast(parameter->get_parameter_value<std::vector<int>>()), ParameterType::INT_ARRAY);
183 case ParameterType::DOUBLE:
184 return ParameterContainer(
185 parameter->get_name(), py::cast(parameter->get_parameter_value<
double>()), ParameterType::DOUBLE);
186 case ParameterType::DOUBLE_ARRAY:
187 return ParameterContainer(
188 parameter->get_name(), py::cast(parameter->get_parameter_value < std::vector<double>>()), ParameterType::DOUBLE_ARRAY);
189 case ParameterType::BOOL:
190 return ParameterContainer(
191 parameter->get_name(), py::cast(parameter->get_parameter_value<
bool>()), ParameterType::BOOL);
192 case ParameterType::BOOL_ARRAY:
193 return ParameterContainer(
194 parameter->get_name(), py::cast(parameter->get_parameter_value<std::vector<bool>>()), ParameterType::BOOL_ARRAY);
195 case ParameterType::STRING:
196 return ParameterContainer(
197 parameter->get_name(), py::cast(parameter->get_parameter_value<std::string>()), ParameterType::STRING);
198 case ParameterType::STRING_ARRAY:
199 return ParameterContainer(
200 parameter->get_name(), py::cast(parameter->get_parameter_value<std::vector<std::string>>()), ParameterType::STRING_ARRAY);
201 case ParameterType::STATE:
202 switch (parameter->get_parameter_state_type()) {
203 case StateType::CARTESIAN_STATE:
204 return ParameterContainer(
205 parameter->get_name(), py::cast(parameter->get_parameter_value<
CartesianState>()), ParameterType::STATE,
206 StateType::CARTESIAN_STATE);
207 case StateType::CARTESIAN_POSE:
208 return ParameterContainer(
209 parameter->get_name(), py::cast(parameter->get_parameter_value<
CartesianPose>()), ParameterType::STATE,
210 StateType::CARTESIAN_POSE);
211 case StateType::JOINT_STATE:
212 return ParameterContainer(
213 parameter->get_name(), py::cast(parameter->get_parameter_value<
JointState>()), ParameterType::STATE,
214 StateType::JOINT_STATE);
215 case StateType::JOINT_POSITIONS:
216 return ParameterContainer(
217 parameter->get_name(), py::cast(parameter->get_parameter_value<
JointPositions>()), ParameterType::STATE,
218 StateType::JOINT_POSITIONS);
219 case StateType::GEOMETRY_ELLIPSOID:
220 return ParameterContainer(
221 parameter->get_name(), py::cast(parameter->get_parameter_value<
Ellipsoid>()), ParameterType::STATE,
222 StateType::GEOMETRY_ELLIPSOID);
225 "The StateType of parameter '" + parameter->get_name() +
"' is not supported");
227 case ParameterType::MATRIX:
228 return ParameterContainer(
229 parameter->get_name(), py::cast(parameter->get_parameter_value<Eigen::MatrixXd>()), ParameterType::MATRIX);
230 case ParameterType::VECTOR:
231 return ParameterContainer(
232 parameter->get_name(), py::cast(parameter->get_parameter_value<Eigen::VectorXd>()), ParameterType::VECTOR);
236 }
catch (
const pybind11::cast_error& ex) {
241std::shared_ptr<ParameterInterface> container_to_interface_ptr(
const ParameterContainer& parameter) {
242 if (parameter.is_empty()) {
243 return make_shared_parameter_interface(
244 parameter.get_name(), parameter.get_parameter_type(), parameter.get_parameter_state_type());
246 switch (parameter.get_parameter_type()) {
247 case ParameterType::INT:
248 return make_shared_parameter(parameter.get_name(), parameter.values.int_value);
249 case ParameterType::INT_ARRAY:
250 return make_shared_parameter(parameter.get_name(), parameter.values.int_array_value);
251 case ParameterType::DOUBLE:
252 return make_shared_parameter(parameter.get_name(), parameter.values.double_value);
253 case ParameterType::DOUBLE_ARRAY:
254 return make_shared_parameter(parameter.get_name(), parameter.values.double_array_value);
255 case ParameterType::BOOL:
256 return make_shared_parameter(parameter.get_name(), parameter.values.bool_value);
257 case ParameterType::BOOL_ARRAY:
258 return make_shared_parameter(parameter.get_name(), parameter.values.bool_array_value);
259 case ParameterType::STRING:
260 return make_shared_parameter(parameter.get_name(), parameter.values.string_value);
261 case ParameterType::STRING_ARRAY:
262 return make_shared_parameter(parameter.get_name(), parameter.values.string_array_value);
263 case ParameterType::STATE:
264 switch (parameter.get_parameter_state_type()) {
265 case StateType::CARTESIAN_STATE:
266 return make_shared_parameter(
267 parameter.get_name(), *std::dynamic_pointer_cast<CartesianState>(parameter.values.state_pointer));
268 case StateType::CARTESIAN_POSE:
269 return make_shared_parameter(
270 parameter.get_name(), *std::dynamic_pointer_cast<CartesianPose>(parameter.values.state_pointer));
271 case StateType::JOINT_STATE:
272 return make_shared_parameter(
273 parameter.get_name(), *std::dynamic_pointer_cast<JointState>(parameter.values.state_pointer));
274 case StateType::JOINT_POSITIONS:
275 return make_shared_parameter(
276 parameter.get_name(), *std::dynamic_pointer_cast<JointPositions>(parameter.values.state_pointer));
277 case StateType::GEOMETRY_ELLIPSOID:
278 return make_shared_parameter(
279 parameter.get_name(), *std::dynamic_pointer_cast<Ellipsoid>(parameter.values.state_pointer));
282 "The StateType of parameter '" + parameter.get_name() +
"' is not supported");
284 case ParameterType::MATRIX:
285 return make_shared_parameter(parameter.get_name(), parameter.values.matrix_value);
286 case ParameterType::VECTOR:
287 return make_shared_parameter(parameter.get_name(), parameter.values.vector_value);
293std::map<std::string, ParameterContainer>
294interface_ptr_to_container_map(
const std::map<std::string, std::shared_ptr<ParameterInterface>>& parameters) {
295 std::map<std::string, ParameterContainer> parameter_list;
296 for (
const auto& param_it: parameters) {
297 parameter_list.insert(
298 std::pair<std::string, ParameterContainer>(param_it.first, interface_ptr_to_container(param_it.second)));
300 return parameter_list;
303std::map<std::string, std::shared_ptr<ParameterInterface>>
304container_to_interface_ptr_map(
const std::map<std::string, ParameterContainer>& parameters) {
305 std::map<std::string, std::shared_ptr<ParameterInterface>> parameter_list;
306 for (
const auto& param_it: parameters) {
307 parameter_list.insert(
308 std::pair<std::string, std::shared_ptr<ParameterInterface>>(
309 param_it.first, container_to_interface_ptr(param_it.second)
313 return parameter_list;
316std::list<ParameterContainer>
317interface_ptr_to_container_list(
const std::list<std::shared_ptr<ParameterInterface>>& parameters) {
318 std::list<ParameterContainer> parameter_list;
319 for (
const auto& param_it: parameters) {
320 parameter_list.emplace_back(interface_ptr_to_container(param_it));
322 return parameter_list;
325std::list<std::shared_ptr<ParameterInterface>>
326container_to_interface_ptr_list(
const std::list<ParameterContainer>& parameters) {
327 std::list<std::shared_ptr<ParameterInterface>> parameter_list;
328 for (
const auto& param_it: parameters) {
329 parameter_list.emplace_back(container_to_interface_ptr(param_it));
331 return parameter_list;
Class to define Cartesian pose in Cartesian space as 3D position and quaternion based orientation.
Class to represent a state in Cartesian space.
Class to define positions of the joints.
Class to define a state in joint space.
virtual void reset()
Reset the object to a post-construction state.
ParameterType
The parameter value types.
StateType
The class types inheriting from State.