Skip to content

Commit ef27a6e

Browse files
committed
ComputeIK supports attached-object ik frame
1 parent e1216aa commit ef27a6e

File tree

1 file changed

+13
-23
lines changed

1 file changed

+13
-23
lines changed

core/src/stages/compute_ik.cpp

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -287,31 +287,21 @@ void ComputeIK::compute() {
287287
ik_pose_msg = boost::any_cast<geometry_msgs::PoseStamped>(value);
288288
Eigen::Isometry3d ik_pose;
289289
tf2::fromMsg(ik_pose_msg.pose, ik_pose);
290-
if (robot_model->hasLinkModel(ik_pose_msg.header.frame_id)) {
291-
link = robot_model->getLinkModel(ik_pose_msg.header.frame_id);
292-
} else {
293-
const robot_state::AttachedBody* attached =
294-
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;
298-
}
299-
const EigenSTL::vector_Isometry3d& tf =
300-
#if MOVEIT_HAS_OBJECT_POSE
301-
attached->getShapePosesInLinkFrame();
290+
291+
if (!scene->getCurrentState().knowsFrameTransform(ik_pose_msg.header.frame_id)) {
292+
ROS_WARN_STREAM_NAMED("ComputeIK", "ik frame unknown in robot: '" << ik_pose_msg.header.frame_id << "'");
293+
return;
294+
}
295+
ik_pose = scene->getCurrentState().getFrameTransform(ik_pose_msg.header.frame_id) * ik_pose;
296+
297+
#if MOVEIT_HAS_STATE_RIGID_PARENT_LINK
298+
link = scene->getCurrentState().getRigidlyConnectedParentLinkModel(ik_pose_msg.header.frame_id);
302299
#else
303-
attached->getFixedTransforms();
300+
link = getRigidlyConnectedParentLinkModel(scene->getCurrentState(), ik_pose_msg.header.frame_id);
304301
#endif
305-
if (tf.empty()) {
306-
ROS_WARN_STREAM_NAMED("ComputeIK", "Attached body doesn't have shapes.");
307-
return;
308-
}
309-
// prepend link
310-
link = attached->getAttachedLink();
311-
ik_pose = tf[0] * ik_pose;
312-
}
302+
313303
// transform target pose such that ik frame will reach there if link does
314-
target_pose = target_pose * ik_pose.inverse();
304+
target_pose = target_pose * ik_pose.inverse() * scene->getCurrentState().getFrameTransform(link->getName());
315305
}
316306

317307
// validate placed link for collisions
@@ -323,7 +313,7 @@ void ComputeIK::compute() {
323313
// markers used for failures
324314
std::deque<visualization_msgs::Marker> failure_markers;
325315
// frames at target pose and ik frame
326-
rviz_marker_tools::appendFrame(failure_markers, target_pose_msg, 0.1, "ik frame");
316+
rviz_marker_tools::appendFrame(failure_markers, target_pose_msg, 0.1, "target frame");
327317
rviz_marker_tools::appendFrame(failure_markers, ik_pose_msg, 0.1, "ik frame");
328318
// visualize placed end-effector
329319
auto appender = [&failure_markers](visualization_msgs::Marker& marker, const std::string& /*name*/) {

0 commit comments

Comments
 (0)