Why is the transformation chosen in this particular way to induce a successful robot arm manipulation?
I am wondering how to choose a rotation and translation instructing a robot arm to successfully grasps an object. In particular, I am using the moveit task constructor and illustrate my question with the screenshot below.
The frame around the cylinder (to be picked up) is drawn by default and I added the world
and panda_hand
frame. Whether the grasp is successful is determined by a configuration labeled as:
# Gripper grasp frame transform [x,y,z,r,p,y]
grasp_frame_transform: [0, 0, 0.1, 1.571, 0.785, 1.571]
This configuration is read by the following lines of code :
auto wrapper = std::make_unique<stages::ComputeIK>("grasp pose IK", std::move(stage));
wrapper->setIKFrame(grasp_frame_transform_, hand_frame_)
Unfortunately, I do not know why the grasp_frame_transform
specifies this particular transform and what its reference frame is. In particular, to transform the hand frame to the frame around the cylinder, I would rotate first around the x-axis by Pi and then around the z-axis by Pi/2. If I specified the transform around the cylinder in terms of the world frame, I would simply rotate around the z-axis by Pi/2. In contrast, the configuration seems to specify euler angles of [Pi/2, Pi/4, Pi/2].
Does somebody have an idea why the transformation is specified in that particular way? Starting from the robot configuration in its resting position, how would you choose a transformation to guide the robot? Am I making a mistake in my calculations? I am grateful for any help or hints!
Asked by fabian on 2021-02-16 03:53:47 UTC
Comments
I'm not sure and can't look into it right now, but is it the transform from the end effector base (wrist/hand frame) to a frame between the gripper tips (= where they would be when they close)? I think the next stage tries to place that frame at different grasp poses. If that doesn't help, look at what
setIKFrame
does to be sure.Asked by fvd on 2021-02-17 02:49:24 UTC