4040#include < moveit/planning_scene/planning_scene.h>
4141#include < moveit/trajectory_processing/iterative_time_parameterization.h>
4242
43+ #include < chrono>
44+
4345namespace moveit {
4446namespace task_constructor {
4547namespace solvers {
@@ -53,9 +55,9 @@ void JointInterpolationPlanner::init(const core::RobotModelConstPtr& /*robot_mod
5355
5456bool JointInterpolationPlanner::plan (const planning_scene::PlanningSceneConstPtr& from,
5557 const planning_scene::PlanningSceneConstPtr& to,
56- const moveit::core::JointModelGroup* jmg, double timeout,
58+ const moveit::core::JointModelGroup* jmg, double /* timeout*/ ,
5759 robot_trajectory::RobotTrajectoryPtr& result,
58- const moveit_msgs::Constraints& path_constraints) {
60+ const moveit_msgs::Constraints& /* path_constraints*/ ) {
5961 const auto & props = properties ();
6062
6163 // Get maximum joint distance
@@ -95,12 +97,38 @@ bool JointInterpolationPlanner::plan(const planning_scene::PlanningSceneConstPtr
9597 return true ;
9698}
9799
98- bool JointInterpolationPlanner::plan (const planning_scene::PlanningSceneConstPtr& /* from*/ ,
99- const moveit::core::LinkModel& /* link*/ , const Eigen::Isometry3d& /* target_eigen*/ ,
100- const moveit::core::JointModelGroup* /* jmg*/ , double /* timeout*/ ,
101- robot_trajectory::RobotTrajectoryPtr& /* result*/ ,
102- const moveit_msgs::Constraints& /* path_constraints*/ ) {
103- throw std::runtime_error (" Not yet implemented" );
100+ bool JointInterpolationPlanner::plan (const planning_scene::PlanningSceneConstPtr& from,
101+ const moveit::core::LinkModel& link, const Eigen::Isometry3d& target_eigen,
102+ const moveit::core::JointModelGroup* jmg, double timeout,
103+ robot_trajectory::RobotTrajectoryPtr& result,
104+ const moveit_msgs::Constraints& path_constraints) {
105+ const auto start_time = std::chrono::steady_clock::now ();
106+
107+ auto to{ from->diff () };
108+
109+ kinematic_constraints::KinematicConstraintSet constraints{ to->getRobotModel () };
110+ constraints.add (path_constraints, from->getTransforms ());
111+
112+ auto is_valid{ [&constraints, &to](moveit::core::RobotState* robot_state, const moveit::core::JointModelGroup* jmg,
113+ const double * joint_values) -> bool {
114+ robot_state->setJointGroupPositions (jmg, joint_values);
115+ robot_state->update ();
116+ return to->isStateValid (*robot_state, constraints, jmg->getName ());
117+ } };
118+
119+ if (!to->getCurrentStateNonConst ().setFromIK (jmg, target_eigen, link.getName (), timeout, is_valid)) {
120+ // TODO(v4hn): planners need a way to add feedback to failing plans
121+ // in case of an invalid solution feedback should include unwanted collisions or violated constraints
122+ ROS_WARN_NAMED (" JointInterpolationPlanner" , " IK failed for pose target" );
123+ return false ;
124+ }
125+ to->getCurrentStateNonConst ().update ();
126+
127+ timeout = std::chrono::duration<double >(std::chrono::steady_clock::now () - start_time).count ();
128+ if (timeout <= 0.0 )
129+ return false ;
130+
131+ return plan (from, to, jmg, timeout, result, path_constraints);
104132}
105133} // namespace solvers
106134} // namespace task_constructor
0 commit comments