17#ifndef JOINT_LIMITS__JOINT_LIMITER_INTERFACE_HPP_
18#define JOINT_LIMITS__JOINT_LIMITER_INTERFACE_HPP_
23#include "joint_limits/joint_limits.hpp"
24#include "joint_limits/joint_limits_rosparam.hpp"
25#include "rclcpp/node.hpp"
26#include "rclcpp_lifecycle/lifecycle_node.hpp"
27#include "realtime_tools/realtime_buffer.hpp"
28#include "trajectory_msgs/msg/joint_trajectory_point.hpp"
33template <
typename Jo
intLimitsStateDataType>
56 const std::vector<std::string> & joint_names,
57 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
58 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf,
59 const std::string & robot_description_topic =
"/robot_description")
61 number_of_joints_ = joint_names.size();
62 joint_names_ = joint_names;
63 joint_limits_.resize(number_of_joints_);
64 node_param_itf_ = param_itf;
65 node_logging_itf_ = logging_itf;
74 for (
size_t i = 0; i < number_of_joints_; ++i)
79 node_logging_itf_->get_logger(),
80 "JointLimiter: Joint '%s': parameter declaration has failed", joint_names[i].c_str());
84 if (!
get_joint_limits(joint_names[i], node_param_itf_, node_logging_itf_, joint_limits_[i]))
87 node_logging_itf_->get_logger(),
88 "JointLimiter: Joint '%s': getting parameters has failed", joint_names[i].c_str());
93 node_logging_itf_->get_logger(),
"Limits for joint %zu (%s) are:\n%s", i,
94 joint_names[i].c_str(), joint_limits_[i].to_string().c_str());
96 updated_limits_.writeFromNonRT(joint_limits_);
98 auto on_parameter_event_callback = [
this](
const std::vector<rclcpp::Parameter> & parameters)
100 rcl_interfaces::msg::SetParametersResult set_parameters_result;
101 set_parameters_result.successful =
true;
103 std::vector<joint_limits::JointLimits> updated_joint_limits = joint_limits_;
104 bool changed =
false;
106 for (
size_t i = 0; i < number_of_joints_; ++i)
109 joint_names_[i], parameters, node_logging_itf_, updated_joint_limits[i]);
114 updated_limits_.writeFromNonRT(updated_joint_limits);
115 RCLCPP_INFO(node_logging_itf_->get_logger(),
"Limits are dynamically updated!");
118 return set_parameters_result;
121 parameter_callback_ =
122 node_param_itf_->add_on_set_parameters_callback(on_parameter_event_callback);
130 (void)robot_description_topic;
139 const std::vector<std::string> & joint_names,
140 const std::vector<joint_limits::JointLimits> &
joint_limits,
141 const std::vector<joint_limits::SoftJointLimits> & soft_joint_limits,
142 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & param_itf,
143 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & logging_itf)
145 number_of_joints_ = joint_names.size();
146 joint_names_ = joint_names;
148 soft_joint_limits_ = soft_joint_limits;
149 node_param_itf_ = param_itf;
150 node_logging_itf_ = logging_itf;
151 updated_limits_.writeFromNonRT(joint_limits_);
156 node_logging_itf_->get_logger(),
157 "JointLimiter: Number of joint names and limits do not match: %zu != %zu",
158 number_of_joints_, joint_limits_.size());
160 return (number_of_joints_ == joint_limits_.size()) &&
on_init();
169 const std::vector<std::string> & joint_names,
const rclcpp::Node::SharedPtr & node,
170 const std::string & robot_description_topic =
"/robot_description")
173 joint_names, node->get_node_parameters_interface(), node->get_node_logging_interface(),
174 robot_description_topic);
183 const std::vector<std::string> & joint_names,
184 const rclcpp_lifecycle::LifecycleNode::SharedPtr & lifecycle_node,
185 const std::string & robot_description_topic =
"/robot_description")
188 joint_names, lifecycle_node->get_node_parameters_interface(),
189 lifecycle_node->get_node_logging_interface(), robot_description_topic);
192 virtual bool configure(
const JointLimitsStateDataType & current_joint_states)
208 const JointLimitsStateDataType & current_joint_states,
209 JointLimitsStateDataType & desired_joint_states,
const rclcpp::Duration & dt)
211 joint_limits_ = *(updated_limits_.readFromRT());
212 return on_enforce(current_joint_states, desired_joint_states, dt);
215 virtual void reset_internals() = 0;
232 virtual bool on_configure(
const JointLimitsStateDataType & current_joint_states) = 0;
246 const JointLimitsStateDataType & current_joint_states,
247 JointLimitsStateDataType & desired_joint_states,
const rclcpp::Duration & dt) = 0;
269 size_t number_of_joints_;
270 std::vector<std::string> joint_names_;
271 std::vector<joint_limits::JointLimits> joint_limits_;
272 std::vector<joint_limits::SoftJointLimits> soft_joint_limits_;
273 rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_param_itf_;
274 rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr node_logging_itf_;
277 rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr parameter_callback_;
Definition joint_limiter_interface.hpp:35
virtual bool on_init()=0
Initialize the limiter's internal states and libraries.
virtual bool init(const std::vector< std::string > &joint_names, const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr ¶m_itf, const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr &logging_itf, const std::string &robot_description_topic="/robot_description")
Initialize every JointLimiter.
Definition joint_limiter_interface.hpp:55
bool has_logging_interface() const
Checks if the logging interface is set.
Definition joint_limiter_interface.hpp:257
bool has_parameter_interface() const
Checks if the parameter interface is set.
Definition joint_limiter_interface.hpp:267
virtual bool on_enforce(const JointLimitsStateDataType ¤t_joint_states, JointLimitsStateDataType &desired_joint_states, const rclcpp::Duration &dt)=0
Enforce joint limits for multiple dependent physical quantities.
virtual bool enforce(const JointLimitsStateDataType ¤t_joint_states, JointLimitsStateDataType &desired_joint_states, const rclcpp::Duration &dt)
Enforce joint limits to desired joint state for multiple physical quantities.
Definition joint_limiter_interface.hpp:207
virtual bool on_configure(const JointLimitsStateDataType ¤t_joint_states)=0
Configure the limiter's internal states and libraries.
virtual bool init(const std::vector< std::string > &joint_names, const rclcpp_lifecycle::LifecycleNode::SharedPtr &lifecycle_node, const std::string &robot_description_topic="/robot_description")
Initialize joints using a LifecycleNode pointer.
Definition joint_limiter_interface.hpp:182
virtual bool init(const std::vector< std::string > &joint_names, const rclcpp::Node::SharedPtr &node, const std::string &robot_description_topic="/robot_description")
Initialize joints using a Node pointer.
Definition joint_limiter_interface.hpp:168
virtual bool init(const std::vector< std::string > &joint_names, const std::vector< joint_limits::JointLimits > &joint_limits, const std::vector< joint_limits::SoftJointLimits > &soft_joint_limits, const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr ¶m_itf, const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr &logging_itf)
Initialize joints from directly provided names and limits.
Definition joint_limiter_interface.hpp:138
Definition data_structures.hpp:39
bool check_for_limits_update(const std::string &joint_name, const std::vector< rclcpp::Parameter > ¶meters, 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 ¶m_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 ¶m_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