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 updated_limits.has_position_limits = parameter.get_value<
bool>();
503 if (updated_limits.has_position_limits)
505 if (std::isnan(updated_limits.min_position) || std::isnan(updated_limits.max_position))
508 logging_itf->get_logger(),
509 "PARAMETER NOT UPDATED: Position limits can not be used, i.e., "
510 "'has_position_limits' flag can not be set, if 'min_position' "
511 "and 'max_position' are not set or not have valid double values.");
512 updated_limits.has_position_limits =
false;
514 else if (updated_limits.min_position >= updated_limits.max_position)
517 logging_itf->get_logger(),
518 "PARAMETER NOT UPDATED: Position limits can not be used, i.e., "
519 "'has_position_limits' flag can not be set, if not "
520 "'min_position' < 'max_position'");
521 updated_limits.has_position_limits =
false;
529 else if (param_name == param_base_name +
".has_velocity_limits")
531 updated_limits.has_velocity_limits = parameter.get_value<
bool>();
532 if (updated_limits.has_velocity_limits && std::isnan(updated_limits.max_velocity))
535 logging_itf->get_logger(),
536 "PARAMETER NOT UPDATED: 'has_velocity_limits' flag can not be set if 'min_velocity' "
537 "and 'max_velocity' are not set or not have valid double values.");
538 updated_limits.has_velocity_limits =
false;
545 else if (param_name == param_base_name +
".has_acceleration_limits")
547 updated_limits.has_acceleration_limits = parameter.get_value<
bool>();
548 if (updated_limits.has_acceleration_limits && std::isnan(updated_limits.max_acceleration))
551 logging_itf->get_logger(),
552 "PARAMETER NOT UPDATED: 'has_acceleration_limits' flag can not be set if "
553 "'max_acceleration' is not set or not have valid double values.");
554 updated_limits.has_acceleration_limits =
false;
561 else if (param_name == param_base_name +
".has_deceleration_limits")
563 updated_limits.has_deceleration_limits = parameter.get_value<
bool>();
564 if (updated_limits.has_deceleration_limits && std::isnan(updated_limits.max_deceleration))
567 logging_itf->get_logger(),
568 "PARAMETER NOT UPDATED: 'has_deceleration_limits' flag can not be set if "
569 "'max_deceleration' is not set or not have valid double values.");
570 updated_limits.has_deceleration_limits =
false;
577 else if (param_name == param_base_name +
".has_jerk_limits")
579 updated_limits.has_jerk_limits = parameter.get_value<
bool>();
580 if (updated_limits.has_jerk_limits && std::isnan(updated_limits.max_jerk))
583 logging_itf->get_logger(),
584 "PARAMETER NOT UPDATED: 'has_jerk_limits' flag can not be set if 'max_jerk' is not set "
585 "or not have valid double values.");
586 updated_limits.has_jerk_limits =
false;
593 else if (param_name == param_base_name +
".has_effort_limits")
595 updated_limits.has_effort_limits = parameter.get_value<
bool>();
596 if (updated_limits.has_effort_limits && std::isnan(updated_limits.max_effort))
599 logging_itf->get_logger(),
600 "PARAMETER NOT UPDATED: 'has_effort_limits' flag can not be set if 'max_effort' is not "
601 "set or not have valid double values.");
602 updated_limits.has_effort_limits =
false;
609 else if (param_name == param_base_name +
".angle_wraparound")
611 updated_limits.angle_wraparound = parameter.get_value<
bool>();
612 if (updated_limits.angle_wraparound && updated_limits.has_position_limits)
615 logging_itf->get_logger(),
616 "PARAMETER NOT UPDATED: 'angle_wraparound' flag can not be set if "
617 "'has_position_limits' flag is set.");
618 updated_limits.angle_wraparound =
false;
626 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
629 logging_itf->get_logger(),
"PARAMETER NOT UPDATED: Please use the right type: %s",
672 const std::string & joint_name,
673 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
674 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
677 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
681 !param_itf->has_parameter(param_base_name +
".has_soft_limits") &&
682 !param_itf->has_parameter(param_base_name +
".k_velocity") &&
683 !param_itf->has_parameter(param_base_name +
".k_position") &&
684 !param_itf->has_parameter(param_base_name +
".soft_lower_limit") &&
685 !param_itf->has_parameter(param_base_name +
".soft_upper_limit"))
688 logging_itf->get_logger(),
689 "No soft joint limits specification found for joint '%s' in the parameter server "
691 joint_name.c_str(), param_base_name.c_str());
695 catch (
const std::exception & ex)
697 RCLCPP_ERROR(logging_itf->get_logger(),
"%s", ex.what());
702 if (param_itf->has_parameter(param_base_name +
".has_soft_limits"))
705 param_itf->get_parameter(param_base_name +
".has_soft_limits").as_bool() &&
706 param_itf->has_parameter(param_base_name +
".k_position") &&
707 param_itf->has_parameter(param_base_name +
".k_velocity") &&
708 param_itf->has_parameter(param_base_name +
".soft_lower_limit") &&
709 param_itf->has_parameter(param_base_name +
".soft_upper_limit"))
711 soft_limits.k_position =
712 param_itf->get_parameter(param_base_name +
".k_position").as_double();
713 soft_limits.k_velocity =
714 param_itf->get_parameter(param_base_name +
".k_velocity").as_double();
715 soft_limits.min_position =
716 param_itf->get_parameter(param_base_name +
".soft_lower_limit").as_double();
717 soft_limits.max_position =
718 param_itf->get_parameter(param_base_name +
".soft_upper_limit").as_double();
785 const std::string & joint_name,
const std::vector<rclcpp::Parameter> & parameters,
786 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
789 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
790 bool changed =
false;
792 for (
auto & parameter : parameters)
794 const std::string param_name = parameter.get_name();
797 if (param_name == param_base_name +
".has_soft_limits")
799 if (!parameter.get_value<
bool>())
802 logging_itf->get_logger(),
803 "Parameter 'has_soft_limits' is not set, therefore the limits will not be updated!");
808 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
810 RCLCPP_INFO(logging_itf->get_logger(),
"Please use the right type: %s", e.what());
814 for (
auto & parameter : parameters)
816 const std::string param_name = parameter.get_name();
819 if (param_name == param_base_name +
".k_position")
821 changed = updated_limits.k_position != parameter.get_value<
double>();
822 updated_limits.k_position = parameter.get_value<
double>();
824 else if (param_name == param_base_name +
".k_velocity")
826 changed = updated_limits.k_velocity != parameter.get_value<
double>();
827 updated_limits.k_velocity = parameter.get_value<
double>();
829 else if (param_name == param_base_name +
".soft_lower_limit")
831 changed = updated_limits.min_position != parameter.get_value<
double>();
832 updated_limits.min_position = parameter.get_value<
double>();
834 else if (param_name == param_base_name +
".soft_upper_limit")
836 changed = updated_limits.max_position != parameter.get_value<
double>();
837 updated_limits.max_position = parameter.get_value<
double>();
840 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
842 RCLCPP_INFO(logging_itf->get_logger(),
"Please use the right type: %s", e.what());