89 const std::string & joint_name,
90 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
91 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf)
93 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
96 auto_declare<bool>(param_itf, param_base_name +
".has_position_limits",
false);
98 param_itf, param_base_name +
".min_position", std::numeric_limits<double>::quiet_NaN());
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());
127 catch (
const std::exception & ex)
129 RCLCPP_ERROR(logging_itf->get_logger(),
"%s", ex.what());
232 const std::string & joint_name,
233 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
234 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
237 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
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"))
257 logging_itf->get_logger(),
258 "No joint limits specification found for joint '%s' in the parameter server "
260 joint_name.c_str(), param_base_name.c_str());
264 catch (
const std::exception & ex)
266 RCLCPP_ERROR(logging_itf->get_logger(),
"%s", ex.what());
271 if (param_itf->has_parameter(param_base_name +
".has_position_limits"))
273 limits.has_position_limits =
274 param_itf->get_parameter(param_base_name +
".has_position_limits").as_bool();
276 limits.has_position_limits && param_itf->has_parameter(param_base_name +
".min_position") &&
277 param_itf->has_parameter(param_base_name +
".max_position"))
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();
284 limits.has_position_limits =
false;
288 !limits.has_position_limits &&
289 param_itf->has_parameter(param_base_name +
".angle_wraparound"))
291 limits.angle_wraparound =
292 param_itf->get_parameter(param_base_name +
".angle_wraparound").as_bool();
297 if (param_itf->has_parameter(param_base_name +
".has_velocity_limits"))
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"))
303 limits.max_velocity = param_itf->get_parameter(param_base_name +
".max_velocity").as_double();
307 limits.has_velocity_limits =
false;
312 if (param_itf->has_parameter(param_base_name +
".has_acceleration_limits"))
314 limits.has_acceleration_limits =
315 param_itf->get_parameter(param_base_name +
".has_acceleration_limits").as_bool();
317 limits.has_acceleration_limits &&
318 param_itf->has_parameter(param_base_name +
".max_acceleration"))
320 limits.max_acceleration =
321 param_itf->get_parameter(param_base_name +
".max_acceleration").as_double();
325 limits.has_acceleration_limits =
false;
330 if (param_itf->has_parameter(param_base_name +
".has_deceleration_limits"))
332 limits.has_deceleration_limits =
333 param_itf->get_parameter(param_base_name +
".has_deceleration_limits").as_bool();
335 limits.has_deceleration_limits &&
336 param_itf->has_parameter(param_base_name +
".max_deceleration"))
338 limits.max_deceleration =
339 param_itf->get_parameter(param_base_name +
".max_deceleration").as_double();
343 limits.has_deceleration_limits =
false;
348 if (param_itf->has_parameter(param_base_name +
".has_jerk_limits"))
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"))
354 limits.max_jerk = param_itf->get_parameter(param_base_name +
".max_jerk").as_double();
358 limits.has_jerk_limits =
false;
363 if (param_itf->has_parameter(param_base_name +
".has_effort_limits"))
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"))
369 limits.has_effort_limits =
true;
370 limits.max_effort = param_itf->get_parameter(param_base_name +
".max_effort").as_double();
374 limits.has_effort_limits =
false;
440 const std::string & joint_name,
const std::vector<rclcpp::Parameter> & parameters,
441 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
444 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
445 bool changed =
false;
448 for (
auto & parameter : parameters)
450 const std::string param_name = parameter.get_name();
453 if (param_name == param_base_name +
".min_position")
455 changed |= updated_limits.min_position != parameter.get_value<
double>();
456 updated_limits.min_position = parameter.get_value<
double>();
458 else if (param_name == param_base_name +
".max_position")
460 changed |= updated_limits.max_position != parameter.get_value<
double>();
461 updated_limits.max_position = parameter.get_value<
double>();
463 else if (param_name == param_base_name +
".max_velocity")
465 changed |= updated_limits.max_velocity != parameter.get_value<
double>();
466 updated_limits.max_velocity = parameter.get_value<
double>();
468 else if (param_name == param_base_name +
".max_acceleration")
470 changed |= updated_limits.max_acceleration != parameter.get_value<
double>();
471 updated_limits.max_acceleration = parameter.get_value<
double>();
473 else if (param_name == param_base_name +
".max_deceleration")
475 changed |= updated_limits.max_deceleration != parameter.get_value<
double>();
476 updated_limits.max_deceleration = parameter.get_value<
double>();
478 else if (param_name == param_base_name +
".max_jerk")
480 changed |= updated_limits.max_jerk != parameter.get_value<
double>();
481 updated_limits.max_jerk = parameter.get_value<
double>();
483 else if (param_name == param_base_name +
".max_effort")
485 changed |= updated_limits.max_effort != parameter.get_value<
double>();
486 updated_limits.max_effort = parameter.get_value<
double>();
489 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
491 RCLCPP_WARN(logging_itf->get_logger(),
"Please use the right type: %s", e.what());
495 for (
auto & parameter : parameters)
497 const std::string param_name = parameter.get_name();
500 if (param_name == param_base_name +
".has_position_limits")
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)
506 if (std::isnan(updated_limits.min_position) || std::isnan(updated_limits.max_position))
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;
515 else if (updated_limits.min_position >= updated_limits.max_position)
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;
525 changed |= previous_has_position_limits != updated_limits.has_position_limits;
527 else if (param_name == param_base_name +
".has_velocity_limits")
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))
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;
539 changed |= previous_has_velocity_limits != updated_limits.has_velocity_limits;
541 else if (param_name == param_base_name +
".has_acceleration_limits")
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))
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;
553 changed |= previous_has_acceleration_limits != updated_limits.has_acceleration_limits;
555 else if (param_name == param_base_name +
".has_deceleration_limits")
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))
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;
567 changed |= previous_has_deceleration_limits != updated_limits.has_deceleration_limits;
569 else if (param_name == param_base_name +
".has_jerk_limits")
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))
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;
581 changed |= previous_has_jerk_limits != updated_limits.has_jerk_limits;
583 else if (param_name == param_base_name +
".has_effort_limits")
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))
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;
595 changed |= previous_has_effort_limits != updated_limits.has_effort_limits;
597 else if (param_name == param_base_name +
".angle_wraparound")
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)
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;
609 changed |= previous_angle_wraparound != updated_limits.angle_wraparound;
612 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
615 logging_itf->get_logger(),
"PARAMETER NOT UPDATED: Please use the right type: %s",
658 const std::string & joint_name,
659 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
660 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
663 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
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"))
674 logging_itf->get_logger(),
675 "No soft joint limits specification found for joint '%s' in the parameter server "
677 joint_name.c_str(), param_base_name.c_str());
681 catch (
const std::exception & ex)
683 RCLCPP_ERROR(logging_itf->get_logger(),
"%s", ex.what());
688 if (param_itf->has_parameter(param_base_name +
".has_soft_limits"))
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"))
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();
771 const std::string & joint_name,
const std::vector<rclcpp::Parameter> & parameters,
772 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
775 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
776 bool changed =
false;
778 for (
auto & parameter : parameters)
780 const std::string param_name = parameter.get_name();
783 if (param_name == param_base_name +
".has_soft_limits")
785 if (!parameter.get_value<
bool>())
788 logging_itf->get_logger(),
789 "Parameter 'has_soft_limits' is not set, therefore the limits will not be updated!");
794 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
796 RCLCPP_INFO(logging_itf->get_logger(),
"Please use the right type: %s", e.what());
800 for (
auto & parameter : parameters)
802 const std::string param_name = parameter.get_name();
805 if (param_name == param_base_name +
".k_position")
807 changed |= updated_limits.k_position != parameter.get_value<
double>();
808 updated_limits.k_position = parameter.get_value<
double>();
810 else if (param_name == param_base_name +
".k_velocity")
812 changed |= updated_limits.k_velocity != parameter.get_value<
double>();
813 updated_limits.k_velocity = parameter.get_value<
double>();
815 else if (param_name == param_base_name +
".soft_lower_limit")
817 changed |= updated_limits.min_position != parameter.get_value<
double>();
818 updated_limits.min_position = parameter.get_value<
double>();
820 else if (param_name == param_base_name +
".soft_upper_limit")
822 changed |= updated_limits.max_position != parameter.get_value<
double>();
823 updated_limits.max_position = parameter.get_value<
double>();
826 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
828 RCLCPP_INFO(logging_itf->get_logger(),
"Please use the right type: %s", e.what());