Skip to content

Commit 86fe752

Browse files
committed
InterpolationPlanner: implement simple IK-based solver for pose targets
1 parent ef86799 commit 86fe752

File tree

2 files changed

+38
-10
lines changed

2 files changed

+38
-10
lines changed

core/src/solvers/joint_interpolation.cpp

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
#include <moveit/planning_scene/planning_scene.h>
4141
#include <moveit/trajectory_processing/iterative_time_parameterization.h>
4242

43+
#include <chrono>
44+
4345
namespace moveit {
4446
namespace task_constructor {
4547
namespace solvers {
@@ -53,9 +55,9 @@ void JointInterpolationPlanner::init(const core::RobotModelConstPtr& /*robot_mod
5355

5456
bool 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

core/test/test_move_to.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ TEST_F(PandaMoveTo, stateTarget) {
7070
EXPECT_ONE_SOLUTION;
7171
}
7272

73-
TEST_F(PandaMoveTo, DISABLED_pointTarget) {
73+
TEST_F(PandaMoveTo, pointTarget) {
7474
move_to->setGoal([this]() {
7575
RobotState state{ scene->getCurrentState() };
7676
state.setToDefaultValues(t.getRobotModel()->getJointModelGroup("panda_arm"), "extended");
@@ -83,7 +83,7 @@ TEST_F(PandaMoveTo, DISABLED_pointTarget) {
8383
EXPECT_ONE_SOLUTION;
8484
}
8585

86-
TEST_F(PandaMoveTo, DISABLED_poseTarget) {
86+
TEST_F(PandaMoveTo, poseTarget) {
8787
move_to->setGoal([this]() {
8888
RobotState state{ scene->getCurrentState() };
8989
state.setToDefaultValues(t.getRobotModel()->getJointModelGroup("panda_arm"), "extended");

0 commit comments

Comments
 (0)