ros2_control - rolling
Loading...
Searching...
No Matches
hardware_info.hpp
1// Copyright 2020 ros2_control Development Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef HARDWARE_INTERFACE__HARDWARE_INFO_HPP_
16#define HARDWARE_INTERFACE__HARDWARE_INFO_HPP_
17
18#include <fmt/compile.h>
19
20#include <cstdint>
21#include <stdexcept>
22#include <string>
23#include <unordered_map>
24#include <variant>
25#include <vector>
26
27#include "joint_limits/joint_limits.hpp"
28
29#ifdef TRUE
30#undef TRUE
31#endif
32
33#ifdef FALSE
34#undef FALSE
35#endif
36
37namespace hardware_interface
38{
44{
49 std::string name;
51 std::string min = "";
53 std::string max = "";
55 std::string initial_value = "";
57 std::string data_type = "double";
59 int size;
63 std::unordered_map<std::string, std::string> parameters;
66};
67
70{
71 std::size_t joint_index;
72 std::size_t mimicked_joint_index;
73 double multiplier = 1.0;
74 double offset = 0.0;
75};
76
79{
80 NOT_SET,
81 TRUE,
82 FALSE
83};
84
90{
92 std::string name;
94 std::string type;
95
97 MimicAttribute is_mimic = MimicAttribute::NOT_SET;
98
100 bool enable_limits = true;
101
106 std::vector<InterfaceInfo> command_interfaces;
111 std::vector<InterfaceInfo> state_interfaces;
113 std::unordered_map<std::string, std::string> parameters;
114};
115
118{
119 std::string name;
120 std::vector<std::string> state_interfaces;
121 std::vector<std::string> command_interfaces;
122 std::string role;
123 double mechanical_reduction = 1.0;
124 double offset = 0.0;
125 bool read_only = false;
126};
127
130{
131 std::string name;
132 std::vector<std::string> state_interfaces;
133 std::vector<std::string> command_interfaces;
134 std::string role;
135 double mechanical_reduction = 1.0;
136 double offset = 0.0;
137 bool read_only = false;
138};
139
142{
143 std::string name;
144 std::string type;
145 std::vector<JointInfo> joints;
146 std::vector<ActuatorInfo> actuators;
148 std::unordered_map<std::string, std::string> parameters;
149};
150
155using HANDLE_DATATYPE = std::variant<
156 std::monostate, double, float, bool, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t>;
158{
159public:
160 enum Value : int8_t
161 {
162 UNKNOWN = -1,
163 DOUBLE,
164 FLOAT32,
165 BOOL,
166 UINT8,
167 INT8,
168 UINT16,
169 INT16,
170 UINT32,
171 INT32,
172 };
173
174 HandleDataType() = default;
175 constexpr HandleDataType(Value value) : value_(value) {} // NOLINT(runtime/explicit)
176 explicit HandleDataType(const std::string & data_type)
177 {
178 if (data_type == "double")
179 {
180 value_ = DOUBLE;
181 }
182 else if (data_type == "bool")
183 {
184 value_ = BOOL;
185 }
186 else if (data_type == "float32")
187 {
188 value_ = FLOAT32;
189 }
190 else if (data_type == "uint8")
191 {
192 value_ = UINT8;
193 }
194 else if (data_type == "int8")
195 {
196 value_ = INT8;
197 }
198 else if (data_type == "uint16")
199 {
200 value_ = UINT16;
201 }
202 else if (data_type == "int16")
203 {
204 value_ = INT16;
205 }
206 else if (data_type == "uint32")
207 {
208 value_ = UINT32;
209 }
210 else if (data_type == "int32")
211 {
212 value_ = INT32;
213 }
214 else
215 {
216 value_ = UNKNOWN;
217 }
218 }
219
220 operator Value() const { return value_; }
221
222 explicit operator bool() const = delete;
223
224 constexpr bool operator==(HandleDataType other) const { return value_ == other.value_; }
225 constexpr bool operator!=(HandleDataType other) const { return value_ != other.value_; }
226
227 constexpr bool operator==(Value other) const { return value_ == other; }
228 constexpr bool operator!=(Value other) const { return value_ != other; }
229
230 std::string to_string() const
231 {
232 switch (value_)
233 {
234 case DOUBLE:
235 return "double";
236 case BOOL:
237 return "bool";
238 case FLOAT32:
239 return "float32";
240 case UINT8:
241 return "uint8";
242 case INT8:
243 return "int8";
244 case UINT16:
245 return "uint16";
246 case INT16:
247 return "int16";
248 case UINT32:
249 return "uint32";
250 case INT32:
251 return "int32";
252 default:
253 return "unknown";
254 }
255 }
256
263 {
264 switch (value_)
265 {
266 case DOUBLE: // fallthrough
267 case FLOAT32: // fallthrough
268 case BOOL: // fallthrough
269 case UINT8: // fallthrough
270 case INT8: // fallthrough
271 case UINT16: // fallthrough
272 case INT16: // fallthrough
273 case UINT32: // fallthrough
274 case INT32:
275 return true;
276 default:
277 return false; // unknown type cannot be converted
278 }
279 }
280
288 double cast_to_double(const HANDLE_DATATYPE & value) const
289 {
290 switch (value_)
291 {
292 case DOUBLE:
293 return std::get<double>(value);
294 case FLOAT32:
295 return static_cast<double>(std::get<float>(value));
296 case BOOL:
297 return static_cast<double>(std::get<bool>(value));
298 case UINT8:
299 return static_cast<double>(std::get<uint8_t>(value));
300 case INT8:
301 return static_cast<double>(std::get<int8_t>(value));
302 case UINT16:
303 return static_cast<double>(std::get<uint16_t>(value));
304 case INT16:
305 return static_cast<double>(std::get<int16_t>(value));
306 case UINT32:
307 return static_cast<double>(std::get<uint32_t>(value));
308 case INT32:
309 return static_cast<double>(std::get<int32_t>(value));
310 default:
311 throw std::runtime_error(
312 fmt::format(FMT_COMPILE("Data type : '{}' cannot be casted to double."), to_string()));
313 }
314 }
315
316 HandleDataType from_string(const std::string & data_type) { return HandleDataType(data_type); }
317
318private:
319 Value value_ = UNKNOWN;
320};
321
327{
328 InterfaceDescription(const std::string & prefix_name_in, const InterfaceInfo & interface_info_in)
329 : prefix_name(prefix_name_in),
330 interface_info(interface_info_in),
332 {
333 }
334
338 std::string prefix_name;
339
344
348 std::string interface_name;
349
350 const std::string & get_prefix_name() const { return prefix_name; }
351
352 const std::string & get_interface_name() const { return interface_info.name; }
353
354 const std::string & get_name() const { return interface_name; }
355
356 const std::string & get_data_type_string() const { return interface_info.data_type; }
357
358 HandleDataType get_data_type() const { return HandleDataType(interface_info.data_type); }
359};
360
362{
366 std::string scheduling_policy = "synchronized";
368 std::vector<int> cpu_affinity_cores = {};
370 bool print_warnings = true;
371};
372
375{
377 std::string name;
379 std::string type;
381 std::string group;
383 unsigned int rw_rate;
391 std::unordered_map<std::string, std::string> hardware_parameters;
396 std::vector<ComponentInfo> joints;
400 std::vector<MimicJoint> mimic_joints;
405 std::vector<ComponentInfo> sensors;
410 std::vector<ComponentInfo> gpios;
415 std::vector<TransmissionInfo> transmissions;
419 std::string original_xml;
423 std::unordered_map<std::string, joint_limits::JointLimits> limits;
424
430 std::unordered_map<std::string, joint_limits::SoftJointLimits> soft_limits;
431};
432
433} // namespace hardware_interface
434#endif // HARDWARE_INTERFACE__HARDWARE_INFO_HPP_
Definition hardware_info.hpp:158
bool is_castable_to_double() const
Check if the HandleDataType can be casted to double.
Definition hardware_info.hpp:262
double cast_to_double(const HANDLE_DATATYPE &value) const
Cast the given value to double.
Definition hardware_info.hpp:288
Definition mujoco_system_interface.hpp:57
MimicAttribute
This enum is used to store the mimic attribute of a joint.
Definition hardware_info.hpp:79
std::variant< std::monostate, double, float, bool, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t > HANDLE_DATATYPE
Definition hardware_info.hpp:156
Contains semantic info about a given actuator loaded from URDF for a transmission.
Definition hardware_info.hpp:130
Definition hardware_info.hpp:90
bool enable_limits
Whether limits are enabled for this component (set at joint level with <limits enable="....
Definition hardware_info.hpp:100
std::vector< InterfaceInfo > command_interfaces
Definition hardware_info.hpp:106
std::unordered_map< std::string, std::string > parameters
(Optional) Key-value pairs of component parameters, e.g. min/max values or serial number.
Definition hardware_info.hpp:113
std::vector< InterfaceInfo > state_interfaces
Definition hardware_info.hpp:111
std::string name
Name of the component.
Definition hardware_info.hpp:92
MimicAttribute is_mimic
Hold the value of the mimic attribute if given, NOT_SET otherwise.
Definition hardware_info.hpp:97
std::string type
Type of the component: sensor, joint, or GPIO.
Definition hardware_info.hpp:94
Definition hardware_info.hpp:362
bool print_warnings
Whether to print warnings when the async thread doesn't meet its deadline.
Definition hardware_info.hpp:370
std::string scheduling_policy
Scheduling policy for the async worker thread.
Definition hardware_info.hpp:366
int thread_priority
Thread priority for the async worker thread.
Definition hardware_info.hpp:364
std::vector< int > cpu_affinity_cores
CPU affinity cores for the async worker thread.
Definition hardware_info.hpp:368
This structure stores information about hardware defined in a robot's URDF.
Definition hardware_info.hpp:375
std::string type
Type of the hardware: actuator, sensor or system.
Definition hardware_info.hpp:379
std::vector< MimicJoint > mimic_joints
Definition hardware_info.hpp:400
std::string hardware_plugin_name
Name of the pluginlib plugin of the hardware that will be loaded.
Definition hardware_info.hpp:389
std::unordered_map< std::string, joint_limits::JointLimits > limits
Definition hardware_info.hpp:423
HardwareAsyncParams async_params
Async Parameters.
Definition hardware_info.hpp:387
std::unordered_map< std::string, std::string > hardware_parameters
(Optional) Key-value pairs for hardware parameters.
Definition hardware_info.hpp:391
std::string group
Hardware group to which the hardware belongs.
Definition hardware_info.hpp:381
bool is_async
Component is async.
Definition hardware_info.hpp:385
std::unordered_map< std::string, joint_limits::SoftJointLimits > soft_limits
Definition hardware_info.hpp:430
std::vector< ComponentInfo > gpios
Definition hardware_info.hpp:410
std::vector< ComponentInfo > joints
Definition hardware_info.hpp:396
std::string original_xml
Definition hardware_info.hpp:419
std::string name
Name of the hardware.
Definition hardware_info.hpp:377
std::vector< ComponentInfo > sensors
Definition hardware_info.hpp:405
std::vector< TransmissionInfo > transmissions
Definition hardware_info.hpp:415
unsigned int rw_rate
Component's read and write rates in Hz.
Definition hardware_info.hpp:383
Definition hardware_info.hpp:327
InterfaceInfo interface_info
Definition hardware_info.hpp:343
std::string interface_name
Definition hardware_info.hpp:348
std::string prefix_name
Definition hardware_info.hpp:338
Definition hardware_info.hpp:44
std::string max
(Optional) Maximal allowed values of the interface.
Definition hardware_info.hpp:53
std::string initial_value
(Optional) Initial value of the interface.
Definition hardware_info.hpp:55
std::string name
Definition hardware_info.hpp:49
int size
(Optional) If the handle is an array, the size of the array.
Definition hardware_info.hpp:59
std::string min
(Optional) Minimal allowed values of the interface.
Definition hardware_info.hpp:51
std::string data_type
(Optional) The datatype of the interface, e.g. "bool", "int".
Definition hardware_info.hpp:57
std::unordered_map< std::string, std::string > parameters
Definition hardware_info.hpp:63
bool enable_limits
(Optional) enable or disable the limits for the command interfaces
Definition hardware_info.hpp:65
Contains semantic info about a given joint loaded from URDF for a transmission.
Definition hardware_info.hpp:118
This structure stores information about a joint that is mimicking another joint.
Definition hardware_info.hpp:70
Contains semantic info about a given transmission loaded from URDF.
Definition hardware_info.hpp:142
std::unordered_map< std::string, std::string > parameters
(Optional) Key-value pairs of custom parameters
Definition hardware_info.hpp:148