Control Libraries 7.4.0
Loading...
Searching...
No Matches
encoders.cpp
1#include "clproto/encoders.hpp"
2
3using namespace state_representation;
4
5namespace clproto {
6
7google::protobuf::RepeatedField<double> matrix_encoder(const Eigen::MatrixXd& matrix) {
8 return encoder(std::vector<double>{matrix.data(), matrix.data() + matrix.size()});
9}
10
11proto::State encoder(const State& state) {
12 proto::State message;
13 message.set_name(state.get_name());
14 message.set_empty(state.is_empty());
15 return message;
16}
17
18proto::SpatialState encoder(const SpatialState& spatial_state) {
19 proto::SpatialState message;
20 *message.mutable_state() = encoder(static_cast<State>(spatial_state));
21 message.set_reference_frame(spatial_state.get_reference_frame());
22 return message;
23}
24
25proto::Vector3d encoder(const Eigen::Vector3d& vector) {
26 proto::Vector3d message;
27 message.set_x(vector.x());
28 message.set_y(vector.y());
29 message.set_z(vector.z());
30 return message;
31}
32
33proto::Quaterniond encoder(const Eigen::Quaterniond& quaternion) {
34 proto::Quaterniond message;
35 message.set_w(quaternion.w());
36 *message.mutable_vec() = encoder(Eigen::Vector3d(quaternion.vec()));
37 return message;
38}
39
40proto::CartesianState encoder(const CartesianState& cartesian_state) {
41 proto::CartesianState message;
42 *message.mutable_spatial_state() = encoder(static_cast<SpatialState>(cartesian_state));
43 if (cartesian_state.is_empty()) {
44 return message;
45 }
46 *message.mutable_position() = encoder(cartesian_state.get_position());
47 *message.mutable_orientation() = encoder(cartesian_state.get_orientation());
48 *message.mutable_linear_velocity() = encoder(cartesian_state.get_linear_velocity());
49 *message.mutable_angular_velocity() = encoder(cartesian_state.get_angular_velocity());
50 *message.mutable_linear_acceleration() = encoder(cartesian_state.get_linear_acceleration());
51 *message.mutable_angular_acceleration() = encoder(cartesian_state.get_angular_acceleration());
52 *message.mutable_force() = encoder(cartesian_state.get_force());
53 *message.mutable_torque() = encoder(cartesian_state.get_torque());
54 return message;
55}
56
57proto::Jacobian encoder(const Jacobian& jacobian) {
58 proto::Jacobian message;
59 *message.mutable_state() = encoder(static_cast<State>(jacobian));
60 *message.mutable_joint_names() = {jacobian.get_joint_names().begin(), jacobian.get_joint_names().end()};
61 message.set_frame(jacobian.get_frame());
62 message.set_reference_frame(jacobian.get_reference_frame());
63 message.set_rows(jacobian.rows());
64 message.set_cols(jacobian.cols());
65 if (jacobian.is_empty()) {
66 return message;
67 }
68 *message.mutable_data() = matrix_encoder(jacobian.data());
69 return message;
70}
71
72proto::JointState encoder(const JointState& joint_state) {
73 proto::JointState message;
74 *message.mutable_state() = encoder(static_cast<State>(joint_state));
75 *message.mutable_joint_names() = {joint_state.get_names().begin(), joint_state.get_names().end()};
76 if (joint_state.is_empty()) {
77 return message;
78 }
79 *message.mutable_positions() = matrix_encoder(joint_state.get_positions());
80 *message.mutable_velocities() = matrix_encoder(joint_state.get_velocities());
81 *message.mutable_accelerations() = matrix_encoder(joint_state.get_accelerations());
82 *message.mutable_torques() = matrix_encoder(joint_state.get_torques());
83 return message;
84}
85
86template<>
87proto::Parameter encoder(proto::Parameter& message, const Parameter<int>& parameter) {
88 if (parameter) {
89 message.mutable_parameter_value()->mutable_int_()->set_value(parameter.get_value());
90 } else {
91 message.mutable_parameter_value()->mutable_int_()->set_value(int());
92 }
93 return message;
94}
95
96template<>
97proto::Parameter encoder(proto::Parameter& message, const Parameter<std::vector<int>>& parameter) {
98 if (parameter) {
99 *message.mutable_parameter_value()->mutable_int_array()->mutable_value() =
100 {parameter.get_value().begin(), parameter.get_value().end()};
101 } else {
102 *message.mutable_parameter_value()->mutable_int_array()->mutable_value() = {};
103 }
104 return message;
105}
106
107template<>
108proto::Parameter encoder(proto::Parameter& message, const Parameter<double>& parameter) {
109 if (parameter) {
110 message.mutable_parameter_value()->mutable_double_()->set_value(parameter.get_value());
111 } else {
112 message.mutable_parameter_value()->mutable_double_()->set_value(double());
113 }
114 return message;
115}
116
117template<>
118proto::Parameter encoder(proto::Parameter& message, const Parameter<std::vector<double>>& parameter) {
119 if (parameter) {
120 *message.mutable_parameter_value()->mutable_double_array()->mutable_value() =
121 {parameter.get_value().begin(), parameter.get_value().end()};
122 } else {
123 *message.mutable_parameter_value()->mutable_double_array()->mutable_value() = {};
124 }
125 return message;
126}
127
128template<>
129proto::Parameter encoder(proto::Parameter& message, const Parameter<bool>& parameter) {
130 if (parameter) {
131 message.mutable_parameter_value()->mutable_bool_()->set_value(parameter.get_value());
132 } else {
133 message.mutable_parameter_value()->mutable_bool_()->set_value(bool());
134 }
135 return message;
136}
137
138template<>
139proto::Parameter encoder(proto::Parameter& message, const Parameter<std::vector<bool>>& parameter) {
140 if (parameter) {
141 *message.mutable_parameter_value()->mutable_bool_array()->mutable_value() =
142 {parameter.get_value().begin(), parameter.get_value().end()};
143 } else {
144 *message.mutable_parameter_value()->mutable_bool_array()->mutable_value() = {};
145 }
146 return message;
147}
148
149template<>
150proto::Parameter encoder(proto::Parameter& message, const Parameter<std::string>& parameter) {
151 if (parameter) {
152 message.mutable_parameter_value()->mutable_string()->set_value(parameter.get_value());
153 } else {
154 message.mutable_parameter_value()->mutable_string()->set_value(std::string ());
155 }
156 return message;
157}
158
159template<>
160proto::Parameter
161encoder(proto::Parameter& message, const Parameter<std::vector<std::string>>& parameter) {
162 if (parameter) {
163 *message.mutable_parameter_value()->mutable_string_array()->mutable_value() =
164 {parameter.get_value().begin(), parameter.get_value().end()};
165 } else {
166 *message.mutable_parameter_value()->mutable_string_array()->mutable_value() = {};
167 }
168 return message;
169}
170
171template<>
172proto::Parameter encoder(proto::Parameter& message, const Parameter<Eigen::VectorXd>& parameter) {
173 if (parameter) {
174 *message.mutable_parameter_value()->mutable_vector()->mutable_value() = matrix_encoder(parameter.get_value());
175 } else {
176 *message.mutable_parameter_value()->mutable_vector()->mutable_value() = matrix_encoder(Eigen::VectorXd());
177 }
178 return message;
179}
180
181template<>
182proto::Parameter encoder(proto::Parameter& message, const Parameter<Eigen::MatrixXd>& parameter) {
183 if (parameter) {
184 *message.mutable_parameter_value()->mutable_matrix()->mutable_value() = matrix_encoder(parameter.get_value());
185 message.mutable_parameter_value()->mutable_matrix()->set_rows(parameter.get_value().rows());
186 message.mutable_parameter_value()->mutable_matrix()->set_cols(parameter.get_value().cols());
187 } else {
188 *message.mutable_parameter_value()->mutable_matrix()->mutable_value() = matrix_encoder(Eigen::MatrixXd());
189 message.mutable_parameter_value()->mutable_matrix()->set_rows(0);
190 message.mutable_parameter_value()->mutable_matrix()->set_cols(0);
191 }
192 return message;
193}
194
195proto::DigitalIOState encoder(const DigitalIOState& io_state) {
196 proto::DigitalIOState message;
197 *message.mutable_state() = encoder(static_cast<State>(io_state));
198 *message.mutable_io_names() = {io_state.get_names().begin(), io_state.get_names().end()};
199 if (io_state.is_empty()) {
200 return message;
201 }
202 std::vector<bool> vec;
203 vec.resize(io_state.get_size());
204 for (unsigned int i = 0; i < vec.size(); ++i) {
205 vec.at(i) = io_state.data()(i);
206 }
207 *message.mutable_values() = encoder(vec);
208 return message;
209}
210
211proto::AnalogIOState encoder(const AnalogIOState& io_state) {
212 proto::AnalogIOState message;
213 *message.mutable_state() = encoder(static_cast<State>(io_state));
214 *message.mutable_io_names() = {io_state.get_names().begin(), io_state.get_names().end()};
215 if (io_state.is_empty()) {
216 return message;
217 }
218 *message.mutable_values() = matrix_encoder(io_state.data());
219 return message;
220}
221}
Class to represent a state in Cartesian space.
Class to define a robot Jacobian matrix.
Definition Jacobian.hpp:21
Class to define a state in joint space.
Class to represent name-value pairs of different types.
Definition Parameter.hpp:18
Abstract class to represent a state.
Definition State.hpp:25
Bindings to encode and decode state objects into serialised binary message.
google::protobuf::RepeatedField< double > matrix_encoder(const Eigen::MatrixXd &matrix)
Encoding helper method for Eigen data into a RepeatedField message type.
Definition encoders.cpp:7
std::string encode(const T &obj)
Encode a control libraries object into a serialized binary string representation (wire format).
state_representation::proto::Parameter encoder(state_representation::proto::Parameter &message, const state_representation::Parameter< ParamT > &parameter)
Encoding helper method for the Parameter type.
Core state variables and objects.