Skip to content

Commit cd43b2d

Browse files
committed
compute ik subrames
1 parent b382540 commit cd43b2d

1 file changed

Lines changed: 18 additions & 16 deletions

File tree

core/src/stages/compute_ik.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)