Control Libraries 6.3.4
Loading...
Searching...
No Matches
bind_parameters.cpp
1#include "state_representation_bindings.h"
2
3#include <state_representation/parameters/ParameterType.hpp>
4#include <state_representation/parameters/Parameter.hpp>
5#include <state_representation/parameters/ParameterMap.hpp>
6
7#include <state_representation/space/cartesian/CartesianState.hpp>
8#include <state_representation/space/cartesian/CartesianPose.hpp>
9#include <state_representation/space/joint/JointState.hpp>
10#include <state_representation/space/joint/JointPositions.hpp>
11#include <state_representation/geometry/Ellipsoid.hpp>
12
13#include "parameter_container.h"
14#include "py_parameter_map.h"
15
16using namespace py_parameter;
17
18void parameter_type(py::module_& m) {
19 py::enum_<ParameterType>(m, "ParameterType")
20 .value("INT", ParameterType::INT)
21 .value("INT_ARRAY", ParameterType::INT_ARRAY)
22 .value("DOUBLE", ParameterType::DOUBLE)
23 .value("DOUBLE_ARRAY", ParameterType::DOUBLE_ARRAY)
24 .value("BOOL", ParameterType::BOOL)
25 .value("BOOL_ARRAY", ParameterType::BOOL_ARRAY)
26 .value("STRING", ParameterType::STRING)
27 .value("STRING_ARRAY", ParameterType::STRING_ARRAY)
28 .value("STATE", ParameterType::STATE)
29 .value("VECTOR", ParameterType::VECTOR)
30 .value("MATRIX", ParameterType::MATRIX)
31 .export_values();
32}
33
34void parameter_interface(py::module_& m) {
35 py::class_<ParameterInterface, std::shared_ptr<ParameterInterface>, State> c(m, "ParameterInterface");
36
37 c.def(py::init<const std::string&, const ParameterType&, const StateType&>(), "Constructor of a ParameterInterface with name, parameter type and parameter state type", "name"_a, "type"_a, "parameter_state_type"_a=StateType::NONE);
38 c.def(py::init<const ParameterInterface&>(), "Copy constructor from another ParameterInterface", "parameter"_a);
39
40 c.def("get_parameter_type", &ParameterInterface::get_parameter_type, "Get the parameter type.");
41 c.def("get_parameter_state_type", &ParameterInterface::get_parameter_state_type, "Get the state type of the parameter.");
42}
43
44void parameter(py::module_& m) {
45 py::class_<ParameterContainer, std::shared_ptr<ParameterContainer>, ParameterInterface> c(m, "Parameter");
46
47 c.def(py::init<const std::string&, const ParameterType&, const StateType&>(), "Constructor of a parameter with name, parameter type and parameter state type", "name"_a, "type"_a, "parameter_state_type"_a=StateType::NONE);
48 c.def(py::init<const std::string&, const py::object&, const ParameterType&, const StateType&>(), "Constructor of a parameter with name, value, parameter type and parameter state type", "name"_a, "value"_a, "type"_a, "parameter_state_type"_a=StateType::NONE);
49 c.def(py::init<const ParameterContainer&>(), "Copy constructor from another Parameter", "parameter"_a);
50 c.def(py::init([](const std::shared_ptr<ParameterInterface>& parameter) { return interface_ptr_to_container(parameter); }), "Constructor from a parameter interface pointer", "parameter"_a);
51
52 c.def("get_value", &ParameterContainer::get_value, "Getter of the value attribute.");
53 c.def("set_value", &ParameterContainer::set_value, "Setter of the value attribute.", py::arg("value"));
54
55 c.def("__copy__", [](const ParameterContainer& parameter) {
56 return ParameterContainer(parameter);
57 });
58 c.def("__deepcopy__", [](const ParameterContainer& parameter, py::dict) {
59 return ParameterContainer(parameter);
60 }, "memo"_a);
61 c.def("__repr__", [](const ParameterContainer& parameter) {
62 std::stringstream buffer;
63 switch (parameter.get_parameter_type()) {
64 case ParameterType::INT: {
65 Parameter<int> param(parameter.get_name(), parameter.values.int_value);
66 buffer << param;
67 break;
68 }
69 case ParameterType::INT_ARRAY: {
70 Parameter<std::vector<int>> param(parameter.get_name(), parameter.values.int_array_value);
71 buffer << param;
72 break;
73 }
74 case ParameterType::DOUBLE: {
75 Parameter<double> param(parameter.get_name(), parameter.values.double_value);
76 buffer << param;
77 break;
78 }
79 case ParameterType::DOUBLE_ARRAY: {
80 Parameter<std::vector<double>> param(parameter.get_name(), parameter.values.double_array_value);
81 buffer << param;
82 break;
83 }
84 case ParameterType::BOOL: {
85 Parameter<bool> param(parameter.get_name(), parameter.values.bool_value);
86 buffer << param;
87 break;
88 }
89 case ParameterType::BOOL_ARRAY: {
90 Parameter<std::vector<bool>> param(parameter.get_name(), parameter.values.bool_array_value);
91 buffer << param;
92 break;
93 }
94 case ParameterType::STRING: {
95 Parameter<std::string> param(parameter.get_name(), parameter.values.string_value);
96 buffer << param;
97 break;
98 }
99 case ParameterType::STRING_ARRAY: {
100 Parameter<std::vector<std::string>> param(parameter.get_name(), parameter.values.string_array_value);
101 buffer << param;
102 break;
103 }
104 case ParameterType::STATE: {
105 try {
106 switch (parameter.get_parameter_state_type()) {
107 case StateType::CARTESIAN_STATE: {
109 (parameter.get_name(), *std::dynamic_pointer_cast<CartesianState>(parameter.values.state_pointer));
110 buffer << param;
111 break;
112 }
113 case StateType::CARTESIAN_POSE: {
115 (parameter.get_name(), *std::dynamic_pointer_cast<CartesianPose>(parameter.values.state_pointer));
116 buffer << param;
117 break;
118 }
119 case StateType::JOINT_STATE: {
121 (parameter.get_name(), *std::dynamic_pointer_cast<JointState>(parameter.values.state_pointer));
122 buffer << param;
123 break;
124 }
125 case StateType::JOINT_POSITIONS: {
127 (parameter.get_name(), *std::dynamic_pointer_cast<JointPositions>(parameter.values.state_pointer));
128 buffer << param;
129 break;
130 }
131 case StateType::GEOMETRY_ELLIPSOID: {
133 (parameter.get_name(), *std::dynamic_pointer_cast<Ellipsoid>(parameter.values.state_pointer));
134 buffer << param;
135 break;
136 }
137 default:
138 buffer << "Parameter " << parameter.get_name() << " contains an unsupported state type" << std::endl;
139 break;
140 }
141 } catch (const std::exception&) {
142 buffer << "Parameter " << parameter.get_name() << " is invalid" << std::endl;
143 break;
144 }
145 break;
146 }
147 case ParameterType::MATRIX: {
148 Parameter<Eigen::MatrixXd> param(parameter.get_name(), parameter.values.matrix_value);
149 buffer << param;
150 break;
151 }
152 case ParameterType::VECTOR: {
153 Parameter<Eigen::VectorXd> param(parameter.get_name(), parameter.values.vector_value);
154 buffer << param;
155 break;
156 }
157 default:
158 break;
159 }
160 return buffer.str();
161 });
162}
163
164void parameter_map(py::module_& m) {
165 py::class_<ParameterMap, std::shared_ptr<ParameterMap>, PyParameterMap> c(m, "ParameterMap");
166
167 c.def(py::init(), "Empty constructor");
168 c.def(
169 py::init([](const std::map<std::string, ParameterContainer>& parameters) {
170 auto parameter_map = container_to_interface_ptr_map(parameters);
171 return ParameterMap(parameter_map);
172 }), "Construct the parameter map with an initial list of parameters", "parameters"_a
173 );
174 c.def(
175 py::init([](const std::list<ParameterContainer>& parameters) {
176 auto parameter_list = container_to_interface_ptr_list(parameters);
177 return ParameterMap(parameter_list);
178 }), "Construct the parameter map with an initial map of parameters", "parameters"_a);
179
180 c.def(
181 "get_parameter", [](ParameterMap& self, const std::string& name) -> ParameterContainer {
182 return interface_ptr_to_container(self.get_parameter(name));
183 } , "Get a parameter by its name", "name"_a
184 );
185 c.def(
186 "get_parameters", [](ParameterMap& self) {
187 return interface_ptr_to_container_map(self.get_parameters());
188 } , "Get a map of all the <name, parameter> pairs"
189 );
190 c.def(
191 "get_parameter_value", [](ParameterMap& self, const std::string& name) -> py::object {
192 return interface_ptr_to_container(self.get_parameter(name)).get_value();
193 }, "Get a parameter value by its name", "name"_a
194 );
195 c.def(
196 "get_parameter_list", [](ParameterMap& self) {
197 return interface_ptr_to_container_list(self.get_parameter_list());
198 } , "Get a list of all the parameters"
199 );
200
201 c.def("set_parameter", [](ParameterMap& self, const ParameterContainer& parameter) {
202 self.set_parameter(container_to_interface_ptr(parameter));
203 }, "Set a parameter", "parameter"_a);
204 c.def("set_parameters", [](ParameterMap& self, const std::list<ParameterContainer>& parameters) {
205 self.set_parameters(container_to_interface_ptr_list(parameters));
206 }, "Set parameters from a list of parameters", "parameters"_a);
207 c.def("set_parameters", [](ParameterMap& self, const std::map<std::string, ParameterContainer>& parameters) {
208 self.set_parameters(container_to_interface_ptr_map(parameters));
209 }, "Set parameters from a map with <name, parameter> pairs", "parameters"_a);
210 c.def(
211 "set_parameter_value", [](ParameterMap& self, const std::string& name, const py::object& value, const ParameterType& type, const StateType& parameter_state_type) -> void {
212 auto param = ParameterContainer(name, value, type, parameter_state_type);
213 self.set_parameter(container_to_interface_ptr(param));
214 }, "Set a parameter value by its name", "name"_a, "value"_a, "type"_a, "parameter_state_type"_a=StateType::NONE
215 );
216 c.def("remove_parameter", &ParameterMap::remove_parameter, "Remove a parameter from the parameter map.", "name"_a);
217}
218
219void bind_parameters(py::module_& m) {
220 parameter_type(m);
221 parameter_interface(m);
222 parameter(m);
223 parameter_map(m);
224}
StateType get_parameter_state_type() const
Get the state type of the parameter.
ParameterType get_parameter_type() const
Get the parameter type.
A wrapper class to contain a map of Parameter pointers by name and provide robust access methods.
ParameterInterfaceMap get_parameters() const
Get a map of all the <name, parameter> pairs.
ParameterInterfaceList get_parameter_list() const
Get a list of all the parameters.
std::shared_ptr< ParameterInterface > get_parameter(const std::string &name) const
Get a parameter by its name.
void remove_parameter(const std::string &name)
Remove a parameter from the parameter map.
void set_parameters(const ParameterInterfaceList &parameters)
Set parameters from a list of parameters.
void set_parameter(const std::shared_ptr< ParameterInterface > &parameter)
Set a parameter.
Abstract class to represent a state.
Definition: State.hpp:25
ParameterType
The parameter value types.
StateType
The class types inheriting from State.
Definition: StateType.hpp:13