ros2_control - rolling
Loading...
Searching...
No Matches
joint_limits_rosparam.hpp
1// Copyright 2020 PAL Robotics S.L.
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
16
17#ifndef JOINT_LIMITS__JOINT_LIMITS_ROSPARAM_HPP_
18#define JOINT_LIMITS__JOINT_LIMITS_ROSPARAM_HPP_
19
20#include <fmt/compile.h>
21
22#include <limits>
23#include <string>
24#include <vector>
25
26#include "joint_limits/joint_limits.hpp"
27#include "rclcpp/node.hpp"
28#include "rclcpp_lifecycle/lifecycle_node.hpp"
29
30namespace // utilities
31{
39template <typename ParameterT>
40auto auto_declare(
41 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
42 const std::string & name, const ParameterT & default_value)
43{
44 if (!param_itf->has_parameter(name))
45 {
46 auto param_default_value = rclcpp::ParameterValue(default_value);
47 param_itf->declare_parameter(name, param_default_value);
48 }
49 return param_itf->get_parameter(name).get_value<ParameterT>();
50}
51} // namespace
52
53namespace joint_limits
54{
89 const std::string & joint_name,
90 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
91 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf)
92{
93 const std::string param_base_name = fmt::format(FMT_COMPILE("joint_limits.{}"), joint_name);
94 try
95 {
96 auto_declare<bool>(param_itf, param_base_name + ".has_position_limits", false);
97 auto_declare<double>(
98 param_itf, param_base_name + ".min_position", std::numeric_limits<double>::quiet_NaN());
99 auto_declare<double>(
100 param_itf, param_base_name + ".max_position", std::numeric_limits<double>::quiet_NaN());
101 auto_declare<bool>(param_itf, param_base_name + ".has_velocity_limits", false);
102 auto_declare<double>(
103 param_itf, param_base_name + ".max_velocity", std::numeric_limits<double>::quiet_NaN());
104 auto_declare<bool>(param_itf, param_base_name + ".has_acceleration_limits", false);
105 auto_declare<double>(
106 param_itf, param_base_name + ".max_acceleration", std::numeric_limits<double>::quiet_NaN());
107 auto_declare<bool>(param_itf, param_base_name + ".has_deceleration_limits", false);
108 auto_declare<double>(
109 param_itf, param_base_name + ".max_deceleration", std::numeric_limits<double>::quiet_NaN());
110 auto_declare<bool>(param_itf, param_base_name + ".has_jerk_limits", false);
111 auto_declare<double>(
112 param_itf, param_base_name + ".max_jerk", std::numeric_limits<double>::quiet_NaN());
113 auto_declare<bool>(param_itf, param_base_name + ".has_effort_limits", false);
114 auto_declare<double>(
115 param_itf, param_base_name + ".max_effort", std::numeric_limits<double>::quiet_NaN());
116 auto_declare<bool>(param_itf, param_base_name + ".angle_wraparound", false);
117 auto_declare<bool>(param_itf, param_base_name + ".has_soft_limits", false);
118 auto_declare<double>(
119 param_itf, param_base_name + ".k_position", std::numeric_limits<double>::quiet_NaN());
120 auto_declare<double>(
121 param_itf, param_base_name + ".k_velocity", std::numeric_limits<double>::quiet_NaN());
122 auto_declare<double>(
123 param_itf, param_base_name + ".soft_lower_limit", std::numeric_limits<double>::quiet_NaN());
124 auto_declare<double>(
125 param_itf, param_base_name + ".soft_upper_limit", std::numeric_limits<double>::quiet_NaN());
126 }
127 catch (const std::exception & ex)
128 {
129 RCLCPP_ERROR(logging_itf->get_logger(), "%s", ex.what());
130 return false;
131 }
132 return true;
133}
134
147inline bool declare_parameters(const std::string & joint_name, const rclcpp::Node::SharedPtr & node)
148{
149 return declare_parameters(
150 joint_name, node->get_node_parameters_interface(), node->get_node_logging_interface());
151}
152
166 const std::string & joint_name, const rclcpp_lifecycle::LifecycleNode::SharedPtr & lifecycle_node)
167{
168 return declare_parameters(
169 joint_name, lifecycle_node->get_node_parameters_interface(),
170 lifecycle_node->get_node_logging_interface());
171}
172
232 const std::string & joint_name,
233 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
234 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
235 JointLimits & limits)
236{
237 const std::string param_base_name = fmt::format(FMT_COMPILE("joint_limits.{}"), joint_name);
238 try
239 {
240 if (
241 !param_itf->has_parameter(param_base_name + ".has_position_limits") &&
242 !param_itf->has_parameter(param_base_name + ".min_position") &&
243 !param_itf->has_parameter(param_base_name + ".max_position") &&
244 !param_itf->has_parameter(param_base_name + ".has_velocity_limits") &&
245 !param_itf->has_parameter(param_base_name + ".max_velocity") &&
246 !param_itf->has_parameter(param_base_name + ".has_acceleration_limits") &&
247 !param_itf->has_parameter(param_base_name + ".max_acceleration") &&
248 !param_itf->has_parameter(param_base_name + ".has_deceleration_limits") &&
249 !param_itf->has_parameter(param_base_name + ".max_deceleration") &&
250 !param_itf->has_parameter(param_base_name + ".has_jerk_limits") &&
251 !param_itf->has_parameter(param_base_name + ".max_jerk") &&
252 !param_itf->has_parameter(param_base_name + ".has_effort_limits") &&
253 !param_itf->has_parameter(param_base_name + ".max_effort") &&
254 !param_itf->has_parameter(param_base_name + ".angle_wraparound"))
255 {
256 RCLCPP_ERROR(
257 logging_itf->get_logger(),
258 "No joint limits specification found for joint '%s' in the parameter server "
259 "(param name: %s).",
260 joint_name.c_str(), param_base_name.c_str());
261 return false;
262 }
263 }
264 catch (const std::exception & ex)
265 {
266 RCLCPP_ERROR(logging_itf->get_logger(), "%s", ex.what());
267 return false;
268 }
269
270 // Position limits
271 if (param_itf->has_parameter(param_base_name + ".has_position_limits"))
272 {
273 limits.has_position_limits =
274 param_itf->get_parameter(param_base_name + ".has_position_limits").as_bool();
275 if (
276 limits.has_position_limits && param_itf->has_parameter(param_base_name + ".min_position") &&
277 param_itf->has_parameter(param_base_name + ".max_position"))
278 {
279 limits.min_position = param_itf->get_parameter(param_base_name + ".min_position").as_double();
280 limits.max_position = param_itf->get_parameter(param_base_name + ".max_position").as_double();
281 }
282 else
283 {
284 limits.has_position_limits = false;
285 }
286
287 if (
288 !limits.has_position_limits &&
289 param_itf->has_parameter(param_base_name + ".angle_wraparound"))
290 {
291 limits.angle_wraparound =
292 param_itf->get_parameter(param_base_name + ".angle_wraparound").as_bool();
293 }
294 }
295
296 // Velocity limits
297 if (param_itf->has_parameter(param_base_name + ".has_velocity_limits"))
298 {
299 limits.has_velocity_limits =
300 param_itf->get_parameter(param_base_name + ".has_velocity_limits").as_bool();
301 if (limits.has_velocity_limits && param_itf->has_parameter(param_base_name + ".max_velocity"))
302 {
303 limits.max_velocity = param_itf->get_parameter(param_base_name + ".max_velocity").as_double();
304 }
305 else
306 {
307 limits.has_velocity_limits = false;
308 }
309 }
310
311 // Acceleration limits
312 if (param_itf->has_parameter(param_base_name + ".has_acceleration_limits"))
313 {
314 limits.has_acceleration_limits =
315 param_itf->get_parameter(param_base_name + ".has_acceleration_limits").as_bool();
316 if (
317 limits.has_acceleration_limits &&
318 param_itf->has_parameter(param_base_name + ".max_acceleration"))
319 {
320 limits.max_acceleration =
321 param_itf->get_parameter(param_base_name + ".max_acceleration").as_double();
322 }
323 else
324 {
325 limits.has_acceleration_limits = false;
326 }
327 }
328
329 // Deceleration limits
330 if (param_itf->has_parameter(param_base_name + ".has_deceleration_limits"))
331 {
332 limits.has_deceleration_limits =
333 param_itf->get_parameter(param_base_name + ".has_deceleration_limits").as_bool();
334 if (
335 limits.has_deceleration_limits &&
336 param_itf->has_parameter(param_base_name + ".max_deceleration"))
337 {
338 limits.max_deceleration =
339 param_itf->get_parameter(param_base_name + ".max_deceleration").as_double();
340 }
341 else
342 {
343 limits.has_deceleration_limits = false;
344 }
345 }
346
347 // Jerk limits
348 if (param_itf->has_parameter(param_base_name + ".has_jerk_limits"))
349 {
350 limits.has_jerk_limits =
351 param_itf->get_parameter(param_base_name + ".has_jerk_limits").as_bool();
352 if (limits.has_jerk_limits && param_itf->has_parameter(param_base_name + ".max_jerk"))
353 {
354 limits.max_jerk = param_itf->get_parameter(param_base_name + ".max_jerk").as_double();
355 }
356 else
357 {
358 limits.has_jerk_limits = false;
359 }
360 }
361
362 // Effort limits
363 if (param_itf->has_parameter(param_base_name + ".has_effort_limits"))
364 {
365 limits.has_effort_limits =
366 param_itf->get_parameter(param_base_name + ".has_effort_limits").as_bool();
367 if (limits.has_effort_limits && param_itf->has_parameter(param_base_name + ".max_effort"))
368 {
369 limits.has_effort_limits = true;
370 limits.max_effort = param_itf->get_parameter(param_base_name + ".max_effort").as_double();
371 }
372 else
373 {
374 limits.has_effort_limits = false;
375 }
376 }
377
378 return true;
379}
380
396 const std::string & joint_name, const rclcpp::Node::SharedPtr & node, JointLimits & limits)
397{
398 return get_joint_limits(
399 joint_name, node->get_node_parameters_interface(), node->get_node_logging_interface(), limits);
400}
401
417 const std::string & joint_name, const rclcpp_lifecycle::LifecycleNode::SharedPtr & lifecycle_node,
418 JointLimits & limits)
419{
420 return get_joint_limits(
421 joint_name, lifecycle_node->get_node_parameters_interface(),
422 lifecycle_node->get_node_logging_interface(), limits);
423}
424
440 const std::string & joint_name, const std::vector<rclcpp::Parameter> & parameters,
441 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
442 JointLimits & updated_limits)
443{
444 const std::string param_base_name = fmt::format(FMT_COMPILE("joint_limits.{}"), joint_name);
445 bool changed = false;
446
447 // update first numerical values to make later checks for "has" limits members
448 for (auto & parameter : parameters)
449 {
450 const std::string param_name = parameter.get_name();
451 try
452 {
453 if (param_name == param_base_name + ".min_position")
454 {
455 changed |= updated_limits.min_position != parameter.get_value<double>();
456 updated_limits.min_position = parameter.get_value<double>();
457 }
458 else if (param_name == param_base_name + ".max_position")
459 {
460 changed |= updated_limits.max_position != parameter.get_value<double>();
461 updated_limits.max_position = parameter.get_value<double>();
462 }
463 else if (param_name == param_base_name + ".max_velocity")
464 {
465 changed |= updated_limits.max_velocity != parameter.get_value<double>();
466 updated_limits.max_velocity = parameter.get_value<double>();
467 }
468 else if (param_name == param_base_name + ".max_acceleration")
469 {
470 changed |= updated_limits.max_acceleration != parameter.get_value<double>();
471 updated_limits.max_acceleration = parameter.get_value<double>();
472 }
473 else if (param_name == param_base_name + ".max_deceleration")
474 {
475 changed |= updated_limits.max_deceleration != parameter.get_value<double>();
476 updated_limits.max_deceleration = parameter.get_value<double>();
477 }
478 else if (param_name == param_base_name + ".max_jerk")
479 {
480 changed |= updated_limits.max_jerk != parameter.get_value<double>();
481 updated_limits.max_jerk = parameter.get_value<double>();
482 }
483 else if (param_name == param_base_name + ".max_effort")
484 {
485 changed |= updated_limits.max_effort != parameter.get_value<double>();
486 updated_limits.max_effort = parameter.get_value<double>();
487 }
488 }
489 catch (const rclcpp::exceptions::InvalidParameterTypeException & e)
490 {
491 RCLCPP_WARN(logging_itf->get_logger(), "Please use the right type: %s", e.what());
492 }
493 }
494
495 for (auto & parameter : parameters)
496 {
497 const std::string param_name = parameter.get_name();
498 try
499 {
500 if (param_name == param_base_name + ".has_position_limits")
501 {
502 const bool previous_has_position_limits = updated_limits.has_position_limits;
503 updated_limits.has_position_limits = parameter.get_value<bool>();
504 if (updated_limits.has_position_limits)
505 {
506 if (std::isnan(updated_limits.min_position) || std::isnan(updated_limits.max_position))
507 {
508 RCLCPP_WARN(
509 logging_itf->get_logger(),
510 "PARAMETER NOT UPDATED: Position limits can not be used, i.e., "
511 "'has_position_limits' flag can not be set, if 'min_position' "
512 "and 'max_position' are not set or not have valid double values.");
513 updated_limits.has_position_limits = false;
514 }
515 else if (updated_limits.min_position >= updated_limits.max_position)
516 {
517 RCLCPP_WARN(
518 logging_itf->get_logger(),
519 "PARAMETER NOT UPDATED: Position limits can not be used, i.e., "
520 "'has_position_limits' flag can not be set, if not "
521 "'min_position' < 'max_position'");
522 updated_limits.has_position_limits = false;
523 }
524 }
525 changed |= previous_has_position_limits != updated_limits.has_position_limits;
526 }
527 else if (param_name == param_base_name + ".has_velocity_limits")
528 {
529 const bool previous_has_velocity_limits = updated_limits.has_velocity_limits;
530 updated_limits.has_velocity_limits = parameter.get_value<bool>();
531 if (updated_limits.has_velocity_limits && std::isnan(updated_limits.max_velocity))
532 {
533 RCLCPP_WARN(
534 logging_itf->get_logger(),
535 "PARAMETER NOT UPDATED: 'has_velocity_limits' flag can not be set if 'min_velocity' "
536 "and 'max_velocity' are not set or not have valid double values.");
537 updated_limits.has_velocity_limits = false;
538 }
539 changed |= previous_has_velocity_limits != updated_limits.has_velocity_limits;
540 }
541 else if (param_name == param_base_name + ".has_acceleration_limits")
542 {
543 const bool previous_has_acceleration_limits = updated_limits.has_acceleration_limits;
544 updated_limits.has_acceleration_limits = parameter.get_value<bool>();
545 if (updated_limits.has_acceleration_limits && std::isnan(updated_limits.max_acceleration))
546 {
547 RCLCPP_WARN(
548 logging_itf->get_logger(),
549 "PARAMETER NOT UPDATED: 'has_acceleration_limits' flag can not be set if "
550 "'max_acceleration' is not set or not have valid double values.");
551 updated_limits.has_acceleration_limits = false;
552 }
553 changed |= previous_has_acceleration_limits != updated_limits.has_acceleration_limits;
554 }
555 else if (param_name == param_base_name + ".has_deceleration_limits")
556 {
557 const bool previous_has_deceleration_limits = updated_limits.has_deceleration_limits;
558 updated_limits.has_deceleration_limits = parameter.get_value<bool>();
559 if (updated_limits.has_deceleration_limits && std::isnan(updated_limits.max_deceleration))
560 {
561 RCLCPP_WARN(
562 logging_itf->get_logger(),
563 "PARAMETER NOT UPDATED: 'has_deceleration_limits' flag can not be set if "
564 "'max_deceleration' is not set or not have valid double values.");
565 updated_limits.has_deceleration_limits = false;
566 }
567 changed |= previous_has_deceleration_limits != updated_limits.has_deceleration_limits;
568 }
569 else if (param_name == param_base_name + ".has_jerk_limits")
570 {
571 const bool previous_has_jerk_limits = updated_limits.has_jerk_limits;
572 updated_limits.has_jerk_limits = parameter.get_value<bool>();
573 if (updated_limits.has_jerk_limits && std::isnan(updated_limits.max_jerk))
574 {
575 RCLCPP_WARN(
576 logging_itf->get_logger(),
577 "PARAMETER NOT UPDATED: 'has_jerk_limits' flag can not be set if 'max_jerk' is not set "
578 "or not have valid double values.");
579 updated_limits.has_jerk_limits = false;
580 }
581 changed |= previous_has_jerk_limits != updated_limits.has_jerk_limits;
582 }
583 else if (param_name == param_base_name + ".has_effort_limits")
584 {
585 const bool previous_has_effort_limits = updated_limits.has_effort_limits;
586 updated_limits.has_effort_limits = parameter.get_value<bool>();
587 if (updated_limits.has_effort_limits && std::isnan(updated_limits.max_effort))
588 {
589 RCLCPP_WARN(
590 logging_itf->get_logger(),
591 "PARAMETER NOT UPDATED: 'has_effort_limits' flag can not be set if 'max_effort' is not "
592 "set or not have valid double values.");
593 updated_limits.has_effort_limits = false;
594 }
595 changed |= previous_has_effort_limits != updated_limits.has_effort_limits;
596 }
597 else if (param_name == param_base_name + ".angle_wraparound")
598 {
599 const bool previous_angle_wraparound = updated_limits.angle_wraparound;
600 updated_limits.angle_wraparound = parameter.get_value<bool>();
601 if (updated_limits.angle_wraparound && updated_limits.has_position_limits)
602 {
603 RCLCPP_WARN(
604 logging_itf->get_logger(),
605 "PARAMETER NOT UPDATED: 'angle_wraparound' flag can not be set if "
606 "'has_position_limits' flag is set.");
607 updated_limits.angle_wraparound = false;
608 }
609 changed |= previous_angle_wraparound != updated_limits.angle_wraparound;
610 }
611 }
612 catch (const rclcpp::exceptions::InvalidParameterTypeException & e)
613 {
614 RCLCPP_WARN(
615 logging_itf->get_logger(), "PARAMETER NOT UPDATED: Please use the right type: %s",
616 e.what());
617 }
618 }
619
620 return changed;
621}
622
658 const std::string & joint_name,
659 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
660 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
661 SoftJointLimits & soft_limits)
662{
663 const std::string param_base_name = fmt::format(FMT_COMPILE("joint_limits.{}"), joint_name);
664 try
665 {
666 if (
667 !param_itf->has_parameter(param_base_name + ".has_soft_limits") &&
668 !param_itf->has_parameter(param_base_name + ".k_velocity") &&
669 !param_itf->has_parameter(param_base_name + ".k_position") &&
670 !param_itf->has_parameter(param_base_name + ".soft_lower_limit") &&
671 !param_itf->has_parameter(param_base_name + ".soft_upper_limit"))
672 {
673 RCLCPP_DEBUG(
674 logging_itf->get_logger(),
675 "No soft joint limits specification found for joint '%s' in the parameter server "
676 "(param name: %s).",
677 joint_name.c_str(), param_base_name.c_str());
678 return false;
679 }
680 }
681 catch (const std::exception & ex)
682 {
683 RCLCPP_ERROR(logging_itf->get_logger(), "%s", ex.what());
684 return false;
685 }
686
687 // Override soft limits if complete specification is found
688 if (param_itf->has_parameter(param_base_name + ".has_soft_limits"))
689 {
690 if (
691 param_itf->get_parameter(param_base_name + ".has_soft_limits").as_bool() &&
692 param_itf->has_parameter(param_base_name + ".k_position") &&
693 param_itf->has_parameter(param_base_name + ".k_velocity") &&
694 param_itf->has_parameter(param_base_name + ".soft_lower_limit") &&
695 param_itf->has_parameter(param_base_name + ".soft_upper_limit"))
696 {
697 soft_limits.k_position =
698 param_itf->get_parameter(param_base_name + ".k_position").as_double();
699 soft_limits.k_velocity =
700 param_itf->get_parameter(param_base_name + ".k_velocity").as_double();
701 soft_limits.min_position =
702 param_itf->get_parameter(param_base_name + ".soft_lower_limit").as_double();
703 soft_limits.max_position =
704 param_itf->get_parameter(param_base_name + ".soft_upper_limit").as_double();
705 return true;
706 }
707 }
708
709 return false;
710}
711
726 const std::string & joint_name, const rclcpp::Node::SharedPtr & node,
727 SoftJointLimits & soft_limits)
728{
729 return get_joint_limits(
730 joint_name, node->get_node_parameters_interface(), node->get_node_logging_interface(),
731 soft_limits);
732}
733
748 const std::string & joint_name, const rclcpp_lifecycle::LifecycleNode::SharedPtr & lifecycle_node,
749 SoftJointLimits & soft_limits)
750{
751 return get_joint_limits(
752 joint_name, lifecycle_node->get_node_parameters_interface(),
753 lifecycle_node->get_node_logging_interface(), soft_limits);
754}
755
771 const std::string & joint_name, const std::vector<rclcpp::Parameter> & parameters,
772 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
773 SoftJointLimits & updated_limits)
774{
775 const std::string param_base_name = fmt::format(FMT_COMPILE("joint_limits.{}"), joint_name);
776 bool changed = false;
777
778 for (auto & parameter : parameters)
779 {
780 const std::string param_name = parameter.get_name();
781 try
782 {
783 if (param_name == param_base_name + ".has_soft_limits")
784 {
785 if (!parameter.get_value<bool>())
786 {
787 RCLCPP_WARN(
788 logging_itf->get_logger(),
789 "Parameter 'has_soft_limits' is not set, therefore the limits will not be updated!");
790 return false;
791 }
792 }
793 }
794 catch (const rclcpp::exceptions::InvalidParameterTypeException & e)
795 {
796 RCLCPP_INFO(logging_itf->get_logger(), "Please use the right type: %s", e.what());
797 }
798 }
799
800 for (auto & parameter : parameters)
801 {
802 const std::string param_name = parameter.get_name();
803 try
804 {
805 if (param_name == param_base_name + ".k_position")
806 {
807 changed |= updated_limits.k_position != parameter.get_value<double>();
808 updated_limits.k_position = parameter.get_value<double>();
809 }
810 else if (param_name == param_base_name + ".k_velocity")
811 {
812 changed |= updated_limits.k_velocity != parameter.get_value<double>();
813 updated_limits.k_velocity = parameter.get_value<double>();
814 }
815 else if (param_name == param_base_name + ".soft_lower_limit")
816 {
817 changed |= updated_limits.min_position != parameter.get_value<double>();
818 updated_limits.min_position = parameter.get_value<double>();
819 }
820 else if (param_name == param_base_name + ".soft_upper_limit")
821 {
822 changed |= updated_limits.max_position != parameter.get_value<double>();
823 updated_limits.max_position = parameter.get_value<double>();
824 }
825 }
826 catch (const rclcpp::exceptions::InvalidParameterTypeException & e)
827 {
828 RCLCPP_INFO(logging_itf->get_logger(), "Please use the right type: %s", e.what());
829 }
830 }
831
832 return changed;
833}
834
835} // namespace joint_limits
836
837#endif // JOINT_LIMITS__JOINT_LIMITS_ROSPARAM_HPP_
Definition data_structures.hpp:39
bool check_for_limits_update(const std::string &joint_name, const std::vector< rclcpp::Parameter > &parameters, const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr &logging_itf, JointLimits &updated_limits)
Check if any of updated parameters are related to JointLimits.
Definition joint_limits_rosparam.hpp:439
bool declare_parameters(const std::string &joint_name, const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &param_itf, const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr &logging_itf)
Declare JointLimits and SoftJointLimits parameters for joint with joint_name using node parameters in...
Definition joint_limits_rosparam.hpp:88
bool get_joint_limits(const std::string &joint_name, const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr &param_itf, const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr &logging_itf, JointLimits &limits)
Populate a JointLimits instance from the node parameters.
Definition joint_limits_rosparam.hpp:231
Store joint limits values from YAML definition or URDF <limits> tag.
Definition joint_limits.hpp:36
Store soft joint limits values from the URDF <safety_controller> tag.
Definition joint_limits.hpp:130