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());
228 const std::string & joint_name,
229 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
230 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
233 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
237 !param_itf->has_parameter(param_base_name +
".has_position_limits") &&
238 !param_itf->has_parameter(param_base_name +
".min_position") &&
239 !param_itf->has_parameter(param_base_name +
".max_position") &&
240 !param_itf->has_parameter(param_base_name +
".has_velocity_limits") &&
241 !param_itf->has_parameter(param_base_name +
".max_velocity") &&
242 !param_itf->has_parameter(param_base_name +
".has_acceleration_limits") &&
243 !param_itf->has_parameter(param_base_name +
".max_acceleration") &&
244 !param_itf->has_parameter(param_base_name +
".has_deceleration_limits") &&
245 !param_itf->has_parameter(param_base_name +
".max_deceleration") &&
246 !param_itf->has_parameter(param_base_name +
".has_jerk_limits") &&
247 !param_itf->has_parameter(param_base_name +
".max_jerk") &&
248 !param_itf->has_parameter(param_base_name +
".has_effort_limits") &&
249 !param_itf->has_parameter(param_base_name +
".max_effort") &&
250 !param_itf->has_parameter(param_base_name +
".angle_wraparound"))
253 logging_itf->get_logger(),
254 "No joint limits specification found for joint '%s' in the parameter server "
256 joint_name.c_str(), param_base_name.c_str());
260 catch (
const std::exception & ex)
262 RCLCPP_ERROR(logging_itf->get_logger(),
"%s", ex.what());
267 if (param_itf->has_parameter(param_base_name +
".has_position_limits"))
269 limits.has_position_limits =
270 param_itf->get_parameter(param_base_name +
".has_position_limits").as_bool();
272 limits.has_position_limits && param_itf->has_parameter(param_base_name +
".min_position") &&
273 param_itf->has_parameter(param_base_name +
".max_position"))
275 limits.min_position = param_itf->get_parameter(param_base_name +
".min_position").as_double();
276 limits.max_position = param_itf->get_parameter(param_base_name +
".max_position").as_double();
280 limits.has_position_limits =
false;
284 !limits.has_position_limits &&
285 param_itf->has_parameter(param_base_name +
".angle_wraparound"))
287 limits.angle_wraparound =
288 param_itf->get_parameter(param_base_name +
".angle_wraparound").as_bool();
293 if (param_itf->has_parameter(param_base_name +
".has_velocity_limits"))
295 limits.has_velocity_limits =
296 param_itf->get_parameter(param_base_name +
".has_velocity_limits").as_bool();
297 if (limits.has_velocity_limits && param_itf->has_parameter(param_base_name +
".max_velocity"))
299 limits.max_velocity = param_itf->get_parameter(param_base_name +
".max_velocity").as_double();
303 limits.has_velocity_limits =
false;
308 if (param_itf->has_parameter(param_base_name +
".has_acceleration_limits"))
310 limits.has_acceleration_limits =
311 param_itf->get_parameter(param_base_name +
".has_acceleration_limits").as_bool();
313 limits.has_acceleration_limits &&
314 param_itf->has_parameter(param_base_name +
".max_acceleration"))
316 limits.max_acceleration =
317 param_itf->get_parameter(param_base_name +
".max_acceleration").as_double();
321 limits.has_acceleration_limits =
false;
326 if (param_itf->has_parameter(param_base_name +
".has_deceleration_limits"))
328 limits.has_deceleration_limits =
329 param_itf->get_parameter(param_base_name +
".has_deceleration_limits").as_bool();
331 limits.has_deceleration_limits &&
332 param_itf->has_parameter(param_base_name +
".max_deceleration"))
334 limits.max_deceleration =
335 param_itf->get_parameter(param_base_name +
".max_deceleration").as_double();
339 limits.has_deceleration_limits =
false;
344 if (param_itf->has_parameter(param_base_name +
".has_jerk_limits"))
346 limits.has_jerk_limits =
347 param_itf->get_parameter(param_base_name +
".has_jerk_limits").as_bool();
348 if (limits.has_jerk_limits && param_itf->has_parameter(param_base_name +
".max_jerk"))
350 limits.max_jerk = param_itf->get_parameter(param_base_name +
".max_jerk").as_double();
354 limits.has_jerk_limits =
false;
359 if (param_itf->has_parameter(param_base_name +
".has_effort_limits"))
361 limits.has_effort_limits =
362 param_itf->get_parameter(param_base_name +
".has_effort_limits").as_bool();
363 if (limits.has_effort_limits && param_itf->has_parameter(param_base_name +
".max_effort"))
365 limits.has_effort_limits =
true;
366 limits.max_effort = param_itf->get_parameter(param_base_name +
".max_effort").as_double();
370 limits.has_effort_limits =
false;
434 const std::string & joint_name,
const std::vector<rclcpp::Parameter> & parameters,
435 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
438 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
439 bool changed =
false;
442 for (
auto & parameter : parameters)
444 const std::string param_name = parameter.get_name();
447 if (param_name == param_base_name +
".min_position")
449 changed = updated_limits.min_position != parameter.get_value<
double>();
450 updated_limits.min_position = parameter.get_value<
double>();
452 else if (param_name == param_base_name +
".max_position")
454 changed = updated_limits.max_position != parameter.get_value<
double>();
455 updated_limits.max_position = parameter.get_value<
double>();
457 else if (param_name == param_base_name +
".max_velocity")
459 changed = updated_limits.max_velocity != parameter.get_value<
double>();
460 updated_limits.max_velocity = parameter.get_value<
double>();
462 else if (param_name == param_base_name +
".max_acceleration")
464 changed = updated_limits.max_acceleration != parameter.get_value<
double>();
465 updated_limits.max_acceleration = parameter.get_value<
double>();
467 else if (param_name == param_base_name +
".max_deceleration")
469 changed = updated_limits.max_deceleration != parameter.get_value<
double>();
470 updated_limits.max_deceleration = parameter.get_value<
double>();
472 else if (param_name == param_base_name +
".max_jerk")
474 changed = updated_limits.max_jerk != parameter.get_value<
double>();
475 updated_limits.max_jerk = parameter.get_value<
double>();
477 else if (param_name == param_base_name +
".max_effort")
479 changed = updated_limits.max_effort != parameter.get_value<
double>();
480 updated_limits.max_effort = parameter.get_value<
double>();
483 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
485 RCLCPP_WARN(logging_itf->get_logger(),
"Please use the right type: %s", e.what());
489 for (
auto & parameter : parameters)
491 const std::string param_name = parameter.get_name();
494 if (param_name == param_base_name +
".has_position_limits")
496 updated_limits.has_position_limits = parameter.get_value<
bool>();
497 if (updated_limits.has_position_limits)
499 if (std::isnan(updated_limits.min_position) || std::isnan(updated_limits.max_position))
502 logging_itf->get_logger(),
503 "PARAMETER NOT UPDATED: Position limits can not be used, i.e., "
504 "'has_position_limits' flag can not be set, if 'min_position' "
505 "and 'max_position' are not set or not have valid double values.");
506 updated_limits.has_position_limits =
false;
508 else if (updated_limits.min_position >= updated_limits.max_position)
511 logging_itf->get_logger(),
512 "PARAMETER NOT UPDATED: Position limits can not be used, i.e., "
513 "'has_position_limits' flag can not be set, if not "
514 "'min_position' < 'max_position'");
515 updated_limits.has_position_limits =
false;
523 else if (param_name == param_base_name +
".has_velocity_limits")
525 updated_limits.has_velocity_limits = parameter.get_value<
bool>();
526 if (updated_limits.has_velocity_limits && std::isnan(updated_limits.max_velocity))
529 logging_itf->get_logger(),
530 "PARAMETER NOT UPDATED: 'has_velocity_limits' flag can not be set if 'min_velocity' "
531 "and 'max_velocity' are not set or not have valid double values.");
532 updated_limits.has_velocity_limits =
false;
539 else if (param_name == param_base_name +
".has_acceleration_limits")
541 updated_limits.has_acceleration_limits = parameter.get_value<
bool>();
542 if (updated_limits.has_acceleration_limits && std::isnan(updated_limits.max_acceleration))
545 logging_itf->get_logger(),
546 "PARAMETER NOT UPDATED: 'has_acceleration_limits' flag can not be set if "
547 "'max_acceleration' is not set or not have valid double values.");
548 updated_limits.has_acceleration_limits =
false;
555 else if (param_name == param_base_name +
".has_deceleration_limits")
557 updated_limits.has_deceleration_limits = parameter.get_value<
bool>();
558 if (updated_limits.has_deceleration_limits && std::isnan(updated_limits.max_deceleration))
561 logging_itf->get_logger(),
562 "PARAMETER NOT UPDATED: 'has_deceleration_limits' flag can not be set if "
563 "'max_deceleration' is not set or not have valid double values.");
564 updated_limits.has_deceleration_limits =
false;
571 else if (param_name == param_base_name +
".has_jerk_limits")
573 updated_limits.has_jerk_limits = parameter.get_value<
bool>();
574 if (updated_limits.has_jerk_limits && std::isnan(updated_limits.max_jerk))
577 logging_itf->get_logger(),
578 "PARAMETER NOT UPDATED: 'has_jerk_limits' flag can not be set if 'max_jerk' is not set "
579 "or not have valid double values.");
580 updated_limits.has_jerk_limits =
false;
587 else if (param_name == param_base_name +
".has_effort_limits")
589 updated_limits.has_effort_limits = parameter.get_value<
bool>();
590 if (updated_limits.has_effort_limits && std::isnan(updated_limits.max_effort))
593 logging_itf->get_logger(),
594 "PARAMETER NOT UPDATED: 'has_effort_limits' flag can not be set if 'max_effort' is not "
595 "set or not have valid double values.");
596 updated_limits.has_effort_limits =
false;
603 else if (param_name == param_base_name +
".angle_wraparound")
605 updated_limits.angle_wraparound = parameter.get_value<
bool>();
606 if (updated_limits.angle_wraparound && updated_limits.has_position_limits)
609 logging_itf->get_logger(),
610 "PARAMETER NOT UPDATED: 'angle_wraparound' flag can not be set if "
611 "'has_position_limits' flag is set.");
612 updated_limits.angle_wraparound =
false;
620 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
623 logging_itf->get_logger(),
"PARAMETER NOT UPDATED: Please use the right type: %s",
664 const std::string & joint_name,
665 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
666 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
669 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
673 !param_itf->has_parameter(param_base_name +
".has_soft_limits") &&
674 !param_itf->has_parameter(param_base_name +
".k_velocity") &&
675 !param_itf->has_parameter(param_base_name +
".k_position") &&
676 !param_itf->has_parameter(param_base_name +
".soft_lower_limit") &&
677 !param_itf->has_parameter(param_base_name +
".soft_upper_limit"))
680 logging_itf->get_logger(),
681 "No soft joint limits specification found for joint '%s' in the parameter server "
683 joint_name.c_str(), param_base_name.c_str());
687 catch (
const std::exception & ex)
689 RCLCPP_ERROR(logging_itf->get_logger(),
"%s", ex.what());
694 if (param_itf->has_parameter(param_base_name +
".has_soft_limits"))
697 param_itf->get_parameter(param_base_name +
".has_soft_limits").as_bool() &&
698 param_itf->has_parameter(param_base_name +
".k_position") &&
699 param_itf->has_parameter(param_base_name +
".k_velocity") &&
700 param_itf->has_parameter(param_base_name +
".soft_lower_limit") &&
701 param_itf->has_parameter(param_base_name +
".soft_upper_limit"))
703 soft_limits.k_position =
704 param_itf->get_parameter(param_base_name +
".k_position").as_double();
705 soft_limits.k_velocity =
706 param_itf->get_parameter(param_base_name +
".k_velocity").as_double();
707 soft_limits.min_position =
708 param_itf->get_parameter(param_base_name +
".soft_lower_limit").as_double();
709 soft_limits.max_position =
710 param_itf->get_parameter(param_base_name +
".soft_upper_limit").as_double();
775 const std::string & joint_name,
const std::vector<rclcpp::Parameter> & parameters,
776 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
779 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
780 bool changed =
false;
782 for (
auto & parameter : parameters)
784 const std::string param_name = parameter.get_name();
787 if (param_name == param_base_name +
".has_soft_limits")
789 if (!parameter.get_value<
bool>())
792 logging_itf->get_logger(),
793 "Parameter 'has_soft_limits' is not set, therefore the limits will not be updated!");
798 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
800 RCLCPP_INFO(logging_itf->get_logger(),
"Please use the right type: %s", e.what());
804 for (
auto & parameter : parameters)
806 const std::string param_name = parameter.get_name();
809 if (param_name == param_base_name +
".k_position")
811 changed = updated_limits.k_position != parameter.get_value<
double>();
812 updated_limits.k_position = parameter.get_value<
double>();
814 else if (param_name == param_base_name +
".k_velocity")
816 changed = updated_limits.k_velocity != parameter.get_value<
double>();
817 updated_limits.k_velocity = parameter.get_value<
double>();
819 else if (param_name == param_base_name +
".soft_lower_limit")
821 changed = updated_limits.min_position != parameter.get_value<
double>();
822 updated_limits.min_position = parameter.get_value<
double>();
824 else if (param_name == param_base_name +
".soft_upper_limit")
826 changed = updated_limits.max_position != parameter.get_value<
double>();
827 updated_limits.max_position = parameter.get_value<
double>();
830 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
832 RCLCPP_INFO(logging_itf->get_logger(),
"Please use the right type: %s", e.what());