43 #include <tf2/LinearMath/Quaternion.h>
44 #include <tf2/LinearMath/Vector3.h>
46 #include <unordered_map>
49 #include <cached_ik_kinematics_parameters.hpp>
53 static const rclcpp::Logger LOGGER =
81 Pose(
const geometry_msgs::msg::Pose& pose);
93 using IKEntry = std::pair<std::vector<Pose>, std::vector<double>>;
104 void initializeCache(
const std::string& robot_id,
const std::string& group_name,
const std::string& cache_name,
115 void updateCache(
const IKEntry& nearest,
const std::vector<Pose>& poses,
const std::vector<double>& config)
const;
121 double configDistance2(
const std::vector<double>& config1,
const std::vector<double>& config2)
const;
153 class IKCacheMap :
public std::unordered_map<std::string, IKCache*>
159 IKCacheMap(
const std::string& robot_description,
const std::string& group_name,
unsigned int num_joints);
166 const std::vector<std::string>& active,
167 const std::vector<Pose>& poses)
const;
173 const std::vector<std::string>& active,
const std::vector<Pose>& poses,
174 const std::vector<double>& config);
177 std::string
getKey(
const std::vector<std::string>& fixed,
const std::vector<std::string>& active)
const;
186 template <
typename KinematicsPlugin,
typename =
bool>
191 template <
typename KinematicsPlugin>
192 struct HasRobotModelApi<KinematicsPlugin, decltype(std::declval<KinematicsPlugin&>().initialize(
193 std::declval<const rclcpp::Node::SharedPtr&>(),
194 std::declval<const moveit::core::RobotModel&>(), std::string(),
195 std::string(), std::vector<std::string>(), 0.0))> : std::true_type
199 template <
typename KinematicsPlugin,
typename =
bool>
204 template <
typename KinematicsPlugin>
206 decltype(std::declval<KinematicsPlugin&>().KinematicsPlugin::initialize(
207 std::string(), std::string(), std::string(), std::vector<std::string>(), 0.0))>
213 template <
class KinematicsPlugin>
229 const std::string& group_name,
const std::string& base_frame,
230 const std::vector<std::string>& tip_frames,
double search_discretization)
override
234 std::string kinematics_param_prefix =
"robot_description_kinematics." + group_name;
235 param_listener_ = std::make_shared<cached_ik_kinematics::ParamListener>(node, kinematics_param_prefix);
236 params_ = param_listener_->get_params();
238 return initializeImpl(node, robot_model, group_name, base_frame, tip_frames, search_discretization);
241 bool getPositionIK(
const geometry_msgs::msg::Pose& ik_pose,
const std::vector<double>& ik_seed_state,
242 std::vector<double>& solution, moveit_msgs::msg::MoveItErrorCodes& error_code,
245 bool searchPositionIK(
const geometry_msgs::msg::Pose& ik_pose,
const std::vector<double>& ik_seed_state,
246 double timeout, std::vector<double>& solution, moveit_msgs::msg::MoveItErrorCodes& error_code,
249 bool searchPositionIK(
const geometry_msgs::msg::Pose& ik_pose,
const std::vector<double>& ik_seed_state,
250 double timeout,
const std::vector<double>& consistency_limits, std::vector<double>& solution,
251 moveit_msgs::msg::MoveItErrorCodes& error_code,
254 bool searchPositionIK(
const geometry_msgs::msg::Pose& ik_pose,
const std::vector<double>& ik_seed_state,
255 double timeout, std::vector<double>& solution,
const IKCallbackFn& solution_callback,
256 moveit_msgs::msg::MoveItErrorCodes& error_code,
259 bool searchPositionIK(
const geometry_msgs::msg::Pose& ik_pose,
const std::vector<double>& ik_seed_state,
260 double timeout,
const std::vector<double>& consistency_limits, std::vector<double>& solution,
261 const IKCallbackFn& solution_callback, moveit_msgs::msg::MoveItErrorCodes& error_code,
265 rclcpp::Node::SharedPtr node_;
266 std::shared_ptr<cached_ik_kinematics::ParamListener> param_listener_;
267 cached_ik_kinematics::Params params_;
271 void initCache(
const std::string& robot_id,
const std::string& group_name,
const std::string& cache_name);
276 template <
class T = KinematicsPlugin>
277 typename std::enable_if<HasRobotModelApi<T>::value,
bool>::type
279 const std::string& group_name,
const std::string& base_frame,
280 const std::vector<std::string>& tip_frames,
double search_discretization)
282 if (tip_frames.size() != 1)
284 RCLCPP_ERROR(LOGGER,
"This solver does not support multiple tip frames");
289 if (!KinematicsPlugin::initialize(node, robot_model, group_name, base_frame, tip_frames, search_discretization))
291 initCache(robot_model.
getName(), group_name, base_frame + tip_frames[0]);
295 template <
class T = KinematicsPlugin>
296 typename std::enable_if<!HasRobotModelApi<T>::value,
bool>::type
298 const std::string& ,
const std::string& ,
299 const std::vector<std::string>& ,
double )
304 template <
class T = KinematicsPlugin>
305 typename std::enable_if<HasRobotDescApi<T>::value,
bool>::type
306 initializeImpl(
const std::string& robot_description,
const std::string& group_name,
const std::string& base_frame,
307 const std::string& tip_frame,
double search_discretization)
310 if (!KinematicsPlugin::initialize(robot_description, group_name, base_frame, tip_frame, search_discretization))
312 initCache(robot_description, group_name, base_frame + tip_frame);
316 template <
class T = KinematicsPlugin>
317 typename std::enable_if<!HasRobotDescApi<T>::value,
bool>::type
318 initializeImpl(
const std::string& ,
const std::string& ,
const std::string& ,
319 const std::string& ,
double )
336 template <
class KinematicsPlugin>
346 const std::string& group_name,
const std::string& base_frame,
347 const std::vector<std::string>& tip_frames,
double search_discretization)
override;
349 bool searchPositionIK(
const std::vector<geometry_msgs::msg::Pose>& ik_poses,
const std::vector<double>& ik_seed_state,
350 double timeout,
const std::vector<double>& consistency_limits, std::vector<double>& solution,
351 const IKCallbackFn& solution_callback, moveit_msgs::msg::MoveItErrorCodes& error_code,
~CachedIKKinematicsPlugin() override
CachedIKKinematicsPlugin()
bool getPositionIK(const geometry_msgs::msg::Pose &ik_pose, const std::vector< double > &ik_seed_state, std::vector< double > &solution, moveit_msgs::msg::MoveItErrorCodes &error_code, const KinematicsQueryOptions &options=KinematicsQueryOptions()) const override
bool initialize(const rclcpp::Node::SharedPtr &node, const moveit::core::RobotModel &robot_model, const std::string &group_name, const std::string &base_frame, const std::vector< std::string > &tip_frames, double search_discretization) override
kinematics::KinematicsQueryOptions KinematicsQueryOptions
kinematics::KinematicsBase::IKCallbackFn IKCallbackFn
bool searchPositionIK(const geometry_msgs::msg::Pose &ik_pose, const std::vector< double > &ik_seed_state, double timeout, std::vector< double > &solution, moveit_msgs::msg::MoveItErrorCodes &error_code, const KinematicsQueryOptions &options=KinematicsQueryOptions()) const override
bool searchPositionIK(const std::vector< geometry_msgs::msg::Pose > &ik_poses, const std::vector< double > &ik_seed_state, double timeout, const std::vector< double > &consistency_limits, std::vector< double > &solution, const IKCallbackFn &solution_callback, moveit_msgs::msg::MoveItErrorCodes &error_code, const KinematicsQueryOptions &options=KinematicsQueryOptions(), const moveit::core::RobotState *context_state=nullptr) const override
bool initialize(const rclcpp::Node::SharedPtr &node, const moveit::core::RobotModel &robot_model, const std::string &group_name, const std::string &base_frame, const std::vector< std::string > &tip_frames, double search_discretization) override
kinematics::KinematicsQueryOptions KinematicsQueryOptions
const IKEntry & getBestApproximateIKSolution(const std::vector< std::string > &fixed, const std::vector< std::string > &active, const std::vector< Pose > &poses) const
std::string getKey(const std::vector< std::string > &fixed, const std::vector< std::string > &active) const
std::string robot_description_
void updateCache(const IKEntry &nearest, const std::vector< std::string > &fixed, const std::vector< std::string > &active, const std::vector< Pose > &poses, const std::vector< double > &config)
IKCacheMap(const std::string &robot_description, const std::string &group_name, unsigned int num_joints)
A cache of inverse kinematic solutions.
double min_pose_distance_
unsigned int max_cache_size_
const IKEntry & getBestApproximateIKSolution(const Pose &pose) const
std::pair< std::vector< Pose >, std::vector< double > > IKEntry
unsigned int last_saved_cache_size_
void verifyCache(kdl_kinematics_plugin::KDLKinematicsPlugin &fk) const
NearestNeighborsGNAT< IKEntry * > ik_nn_
double configDistance2(const std::vector< double > &config1, const std::vector< double > &config2) const
std::filesystem::path cache_file_name_
void initializeCache(const std::string &robot_id, const std::string &group_name, const std::string &cache_name, const unsigned int num_joints, const Options &opts=Options())
double min_config_distance2_
void updateCache(const IKEntry &nearest, const Pose &pose, const std::vector< double > &config) const
IKCache(const IKCache &)=delete
std::vector< IKEntry > ik_cache_
Specific implementation of kinematics using KDL. This version supports any kinematic chain,...
std::function< void(const geometry_msgs::msg::Pose &, const std::vector< double > &, moveit_msgs::msg::MoveItErrorCodes &)> IKCallbackFn
Signature for a callback to validate an IK solution. Typically used for collision checking.
Definition of a kinematic model. This class is not thread safe, however multiple instances can be cre...
const std::string & getName() const
Get the model name.
Representation of a robot's state. This includes position, velocity, acceleration and effort.
rclcpp::Logger get_logger()
double min_joint_config_distance
std::string cached_ik_path
unsigned int max_cache_size
class to represent end effector pose
double distance(const Pose &pose) const
tf2::Quaternion orientation
A set of options for the kinematics solver.