@@ -290,25 +290,27 @@ void ComputeIK::compute() {
290290 if (robot_model->hasLinkModel (ik_pose_msg.header .frame_id )) {
291291 link = robot_model->getLinkModel (ik_pose_msg.header .frame_id );
292292 } else {
293- const robot_state::AttachedBody* attached =
294- sandbox_scene->getCurrentState ().getAttachedBody (ik_pose_msg.header .frame_id );
295- if (!attached) {
296- ROS_WARN_STREAM_NAMED (" ComputeIK" , " Unknown frame: " << ik_pose_msg.header .frame_id );
297- return ;
293+ if (sandbox_scene->knowsFrameTransform (ik_pose_msg.header .frame_id )) {
294+ // get IK frame in planning frame
295+ Eigen::Isometry3d ik_frame_eigen_world = sandbox_scene->getFrameTransform (ik_pose_msg.header .frame_id );
296+ // determine IK link from group
297+ if (!(link = eef_jmg ? robot_model->getLinkModel (eef_jmg->getEndEffectorParentGroup ().second ) :
298+ jmg->getOnlyOneEndEffectorTip ())) {
299+ ROS_WARN_STREAM_NAMED (" ComputeIK" , " Failed to derive IK target link" );
300+ return ;
301+ }
302+ ik_pose_msg.header .frame_id = link->getName ();
303+ // get planning group tip frame in planning frame
304+ Eigen::Isometry3d link_pose_eigen = sandbox_scene->getCurrentState ().getGlobalLinkTransform (link);
305+ // get IK pose in planning group tip frame
306+ ik_pose = link_pose_eigen.inverse () * ik_frame_eigen_world * ik_pose;
307+ } else {
308+ ROS_WARN_STREAM_NAMED (" ComputeIK" , " Failed to derive IK subframe" );
298309 }
299- const EigenSTL::vector_Isometry3d& tf = attached->getFixedTransforms ();
300- if (tf.empty ()) {
301- ROS_WARN_STREAM_NAMED (" ComputeIK" , " Attached body doesn't have shapes." );
302- return ;
303- }
304- // prepend link
305- link = attached->getAttachedLink ();
306- ik_pose = tf[0 ] * ik_pose;
310+ // transform target pose such that ik frame will reach there if link does
311+ target_pose = target_pose * ik_pose.inverse ();
307312 }
308- // transform target pose such that ik frame will reach there if link does
309- target_pose = target_pose * ik_pose.inverse ();
310313 }
311-
312314 // validate placed link for collisions
313315 collision_detection::CollisionResult collisions;
314316 bool colliding = !ignore_collisions && isTargetPoseColliding (sandbox_scene, target_pose, link, &collisions);
0 commit comments