95 const std::string & joint_name,
96 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
97 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf)
99 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
102 auto_declare<bool>(param_itf, param_base_name +
".has_position_limits",
false);
103 auto_declare<double>(
104 param_itf, param_base_name +
".min_position", std::numeric_limits<double>::quiet_NaN());
105 auto_declare<double>(
106 param_itf, param_base_name +
".max_position", std::numeric_limits<double>::quiet_NaN());
107 auto_declare<bool>(param_itf, param_base_name +
".has_velocity_limits",
false);
108 auto_declare<double>(
109 param_itf, param_base_name +
".max_velocity", std::numeric_limits<double>::quiet_NaN());
110 auto_declare<bool>(param_itf, param_base_name +
".has_acceleration_limits",
false);
111 auto_declare<double>(
112 param_itf, param_base_name +
".max_acceleration", std::numeric_limits<double>::quiet_NaN());
113 auto_declare<bool>(param_itf, param_base_name +
".has_deceleration_limits",
false);
114 auto_declare<double>(
115 param_itf, param_base_name +
".max_deceleration", std::numeric_limits<double>::quiet_NaN());
116 auto_declare<bool>(param_itf, param_base_name +
".has_jerk_limits",
false);
117 auto_declare<double>(
118 param_itf, param_base_name +
".max_jerk", std::numeric_limits<double>::quiet_NaN());
119 auto_declare<bool>(param_itf, param_base_name +
".has_effort_limits",
false);
120 auto_declare<double>(
121 param_itf, param_base_name +
".max_effort", std::numeric_limits<double>::quiet_NaN());
122 auto_declare<bool>(param_itf, param_base_name +
".angle_wraparound",
false);
123 auto_declare<bool>(param_itf, param_base_name +
".has_soft_limits",
false);
124 auto_declare<double>(
125 param_itf, param_base_name +
".k_position", std::numeric_limits<double>::quiet_NaN());
126 auto_declare<double>(
127 param_itf, param_base_name +
".k_velocity", std::numeric_limits<double>::quiet_NaN());
128 auto_declare<double>(
129 param_itf, param_base_name +
".soft_lower_limit", std::numeric_limits<double>::quiet_NaN());
130 auto_declare<double>(
131 param_itf, param_base_name +
".soft_upper_limit", std::numeric_limits<double>::quiet_NaN());
133 catch (
const std::exception & ex)
135 RCLCPP_ERROR(logging_itf->get_logger(),
"%s", ex.what());
238 const std::string & joint_name,
239 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
240 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
243 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
247 !param_itf->has_parameter(param_base_name +
".has_position_limits") &&
248 !param_itf->has_parameter(param_base_name +
".min_position") &&
249 !param_itf->has_parameter(param_base_name +
".max_position") &&
250 !param_itf->has_parameter(param_base_name +
".has_velocity_limits") &&
251 !param_itf->has_parameter(param_base_name +
".max_velocity") &&
252 !param_itf->has_parameter(param_base_name +
".has_acceleration_limits") &&
253 !param_itf->has_parameter(param_base_name +
".max_acceleration") &&
254 !param_itf->has_parameter(param_base_name +
".has_deceleration_limits") &&
255 !param_itf->has_parameter(param_base_name +
".max_deceleration") &&
256 !param_itf->has_parameter(param_base_name +
".has_jerk_limits") &&
257 !param_itf->has_parameter(param_base_name +
".max_jerk") &&
258 !param_itf->has_parameter(param_base_name +
".has_effort_limits") &&
259 !param_itf->has_parameter(param_base_name +
".max_effort") &&
260 !param_itf->has_parameter(param_base_name +
".angle_wraparound"))
263 logging_itf->get_logger(),
264 "No joint limits specification found for joint '%s' in the parameter server "
266 joint_name.c_str(), param_base_name.c_str());
270 catch (
const std::exception & ex)
272 RCLCPP_ERROR(logging_itf->get_logger(),
"%s", ex.what());
277 if (param_itf->has_parameter(param_base_name +
".has_position_limits"))
279 limits.has_position_limits =
280 param_itf->get_parameter(param_base_name +
".has_position_limits").as_bool();
282 limits.has_position_limits && param_itf->has_parameter(param_base_name +
".min_position") &&
283 param_itf->has_parameter(param_base_name +
".max_position"))
285 limits.min_position = param_itf->get_parameter(param_base_name +
".min_position").as_double();
286 limits.max_position = param_itf->get_parameter(param_base_name +
".max_position").as_double();
290 limits.has_position_limits =
false;
294 !limits.has_position_limits &&
295 param_itf->has_parameter(param_base_name +
".angle_wraparound"))
297 limits.angle_wraparound =
298 param_itf->get_parameter(param_base_name +
".angle_wraparound").as_bool();
303 if (param_itf->has_parameter(param_base_name +
".has_velocity_limits"))
305 limits.has_velocity_limits =
306 param_itf->get_parameter(param_base_name +
".has_velocity_limits").as_bool();
307 if (limits.has_velocity_limits && param_itf->has_parameter(param_base_name +
".max_velocity"))
309 limits.max_velocity = param_itf->get_parameter(param_base_name +
".max_velocity").as_double();
313 limits.has_velocity_limits =
false;
318 if (param_itf->has_parameter(param_base_name +
".has_acceleration_limits"))
320 limits.has_acceleration_limits =
321 param_itf->get_parameter(param_base_name +
".has_acceleration_limits").as_bool();
323 limits.has_acceleration_limits &&
324 param_itf->has_parameter(param_base_name +
".max_acceleration"))
326 limits.max_acceleration =
327 param_itf->get_parameter(param_base_name +
".max_acceleration").as_double();
331 limits.has_acceleration_limits =
false;
336 if (param_itf->has_parameter(param_base_name +
".has_deceleration_limits"))
338 limits.has_deceleration_limits =
339 param_itf->get_parameter(param_base_name +
".has_deceleration_limits").as_bool();
341 limits.has_deceleration_limits &&
342 param_itf->has_parameter(param_base_name +
".max_deceleration"))
344 limits.max_deceleration =
345 param_itf->get_parameter(param_base_name +
".max_deceleration").as_double();
349 limits.has_deceleration_limits =
false;
354 if (param_itf->has_parameter(param_base_name +
".has_jerk_limits"))
356 limits.has_jerk_limits =
357 param_itf->get_parameter(param_base_name +
".has_jerk_limits").as_bool();
358 if (limits.has_jerk_limits && param_itf->has_parameter(param_base_name +
".max_jerk"))
360 limits.max_jerk = param_itf->get_parameter(param_base_name +
".max_jerk").as_double();
364 limits.has_jerk_limits =
false;
369 if (param_itf->has_parameter(param_base_name +
".has_effort_limits"))
371 limits.has_effort_limits =
372 param_itf->get_parameter(param_base_name +
".has_effort_limits").as_bool();
373 if (limits.has_effort_limits && param_itf->has_parameter(param_base_name +
".max_effort"))
375 limits.has_effort_limits =
true;
376 limits.max_effort = param_itf->get_parameter(param_base_name +
".max_effort").as_double();
380 limits.has_effort_limits =
false;
446 const std::string & joint_name,
const std::vector<rclcpp::Parameter> & parameters,
447 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
450 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
451 bool changed =
false;
454 for (
auto & parameter : parameters)
456 const std::string param_name = parameter.get_name();
459 if (param_name == param_base_name +
".min_position")
461 changed |= updated_limits.min_position != parameter.get_value<
double>();
462 updated_limits.min_position = parameter.get_value<
double>();
464 else if (param_name == param_base_name +
".max_position")
466 changed |= updated_limits.max_position != parameter.get_value<
double>();
467 updated_limits.max_position = parameter.get_value<
double>();
469 else if (param_name == param_base_name +
".max_velocity")
471 changed |= updated_limits.max_velocity != parameter.get_value<
double>();
472 updated_limits.max_velocity = parameter.get_value<
double>();
474 else if (param_name == param_base_name +
".max_acceleration")
476 changed |= updated_limits.max_acceleration != parameter.get_value<
double>();
477 updated_limits.max_acceleration = parameter.get_value<
double>();
479 else if (param_name == param_base_name +
".max_deceleration")
481 changed |= updated_limits.max_deceleration != parameter.get_value<
double>();
482 updated_limits.max_deceleration = parameter.get_value<
double>();
484 else if (param_name == param_base_name +
".max_jerk")
486 changed |= updated_limits.max_jerk != parameter.get_value<
double>();
487 updated_limits.max_jerk = parameter.get_value<
double>();
489 else if (param_name == param_base_name +
".max_effort")
491 changed |= updated_limits.max_effort != parameter.get_value<
double>();
492 updated_limits.max_effort = parameter.get_value<
double>();
495 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
497 RCLCPP_WARN(logging_itf->get_logger(),
"Please use the right type: %s", e.what());
501 for (
auto & parameter : parameters)
503 const std::string param_name = parameter.get_name();
506 if (param_name == param_base_name +
".has_position_limits")
508 const bool previous_has_position_limits = updated_limits.has_position_limits;
509 updated_limits.has_position_limits = parameter.get_value<
bool>();
510 if (updated_limits.has_position_limits)
512 if (std::isnan(updated_limits.min_position) || std::isnan(updated_limits.max_position))
515 logging_itf->get_logger(),
516 "PARAMETER NOT UPDATED: Position limits can not be used, i.e., "
517 "'has_position_limits' flag can not be set, if 'min_position' "
518 "and 'max_position' are not set or not have valid double values.");
519 updated_limits.has_position_limits =
false;
521 else if (updated_limits.min_position >= updated_limits.max_position)
524 logging_itf->get_logger(),
525 "PARAMETER NOT UPDATED: Position limits can not be used, i.e., "
526 "'has_position_limits' flag can not be set, if not "
527 "'min_position' < 'max_position'");
528 updated_limits.has_position_limits =
false;
531 changed |= previous_has_position_limits != updated_limits.has_position_limits;
533 else if (param_name == param_base_name +
".has_velocity_limits")
535 const bool previous_has_velocity_limits = updated_limits.has_velocity_limits;
536 updated_limits.has_velocity_limits = parameter.get_value<
bool>();
537 if (updated_limits.has_velocity_limits && std::isnan(updated_limits.max_velocity))
540 logging_itf->get_logger(),
541 "PARAMETER NOT UPDATED: 'has_velocity_limits' flag can not be set if 'min_velocity' "
542 "and 'max_velocity' are not set or not have valid double values.");
543 updated_limits.has_velocity_limits =
false;
545 changed |= previous_has_velocity_limits != updated_limits.has_velocity_limits;
547 else if (param_name == param_base_name +
".has_acceleration_limits")
549 const bool previous_has_acceleration_limits = updated_limits.has_acceleration_limits;
550 updated_limits.has_acceleration_limits = parameter.get_value<
bool>();
551 if (updated_limits.has_acceleration_limits && std::isnan(updated_limits.max_acceleration))
554 logging_itf->get_logger(),
555 "PARAMETER NOT UPDATED: 'has_acceleration_limits' flag can not be set if "
556 "'max_acceleration' is not set or not have valid double values.");
557 updated_limits.has_acceleration_limits =
false;
559 changed |= previous_has_acceleration_limits != updated_limits.has_acceleration_limits;
561 else if (param_name == param_base_name +
".has_deceleration_limits")
563 const bool previous_has_deceleration_limits = updated_limits.has_deceleration_limits;
564 updated_limits.has_deceleration_limits = parameter.get_value<
bool>();
565 if (updated_limits.has_deceleration_limits && std::isnan(updated_limits.max_deceleration))
568 logging_itf->get_logger(),
569 "PARAMETER NOT UPDATED: 'has_deceleration_limits' flag can not be set if "
570 "'max_deceleration' is not set or not have valid double values.");
571 updated_limits.has_deceleration_limits =
false;
573 changed |= previous_has_deceleration_limits != updated_limits.has_deceleration_limits;
575 else if (param_name == param_base_name +
".has_jerk_limits")
577 const bool previous_has_jerk_limits = updated_limits.has_jerk_limits;
578 updated_limits.has_jerk_limits = parameter.get_value<
bool>();
579 if (updated_limits.has_jerk_limits && std::isnan(updated_limits.max_jerk))
582 logging_itf->get_logger(),
583 "PARAMETER NOT UPDATED: 'has_jerk_limits' flag can not be set if 'max_jerk' is not set "
584 "or not have valid double values.");
585 updated_limits.has_jerk_limits =
false;
587 changed |= previous_has_jerk_limits != updated_limits.has_jerk_limits;
589 else if (param_name == param_base_name +
".has_effort_limits")
591 const bool previous_has_effort_limits = updated_limits.has_effort_limits;
592 updated_limits.has_effort_limits = parameter.get_value<
bool>();
593 if (updated_limits.has_effort_limits && std::isnan(updated_limits.max_effort))
596 logging_itf->get_logger(),
597 "PARAMETER NOT UPDATED: 'has_effort_limits' flag can not be set if 'max_effort' is not "
598 "set or not have valid double values.");
599 updated_limits.has_effort_limits =
false;
601 changed |= previous_has_effort_limits != updated_limits.has_effort_limits;
603 else if (param_name == param_base_name +
".angle_wraparound")
605 const bool previous_angle_wraparound = updated_limits.angle_wraparound;
606 updated_limits.angle_wraparound = parameter.get_value<
bool>();
607 if (updated_limits.angle_wraparound && updated_limits.has_position_limits)
610 logging_itf->get_logger(),
611 "PARAMETER NOT UPDATED: 'angle_wraparound' flag can not be set if "
612 "'has_position_limits' flag is set.");
613 updated_limits.angle_wraparound =
false;
615 changed |= previous_angle_wraparound != updated_limits.angle_wraparound;
618 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
621 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();
777 const std::string & joint_name,
const std::vector<rclcpp::Parameter> & parameters,
778 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
781 const std::string param_base_name = fmt::format(FMT_COMPILE(
"joint_limits.{}"), joint_name);
782 bool changed =
false;
784 for (
auto & parameter : parameters)
786 const std::string param_name = parameter.get_name();
789 if (param_name == param_base_name +
".has_soft_limits")
791 if (!parameter.get_value<
bool>())
794 logging_itf->get_logger(),
795 "Parameter 'has_soft_limits' is not set, therefore the limits will not be updated!");
800 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
802 RCLCPP_INFO(logging_itf->get_logger(),
"Please use the right type: %s", e.what());
806 for (
auto & parameter : parameters)
808 const std::string param_name = parameter.get_name();
811 if (param_name == param_base_name +
".k_position")
813 changed |= updated_limits.k_position != parameter.get_value<
double>();
814 updated_limits.k_position = parameter.get_value<
double>();
816 else if (param_name == param_base_name +
".k_velocity")
818 changed |= updated_limits.k_velocity != parameter.get_value<
double>();
819 updated_limits.k_velocity = parameter.get_value<
double>();
821 else if (param_name == param_base_name +
".soft_lower_limit")
823 changed |= updated_limits.min_position != parameter.get_value<
double>();
824 updated_limits.min_position = parameter.get_value<
double>();
826 else if (param_name == param_base_name +
".soft_upper_limit")
828 changed |= updated_limits.max_position != parameter.get_value<
double>();
829 updated_limits.max_position = parameter.get_value<
double>();
832 catch (
const rclcpp::exceptions::InvalidParameterTypeException & e)
834 RCLCPP_INFO(logging_itf->get_logger(),
"Please use the right type: %s", e.what());