ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Bimanual Pick and Place

asked 2018-08-01 05:57:54 -0600

DebasmitaGhose gravatar image

updated 2018-08-01 06:06:44 -0600

Problem Description

I have been attempting to modify the pick and place tutorial for panda arm from this tutorial for a bimanual pick and place.

I am working on a customised humanoid where there are 2 torso joints, and 5 joints on each arm and a 4 fingered hand attached to each hand. I am using ROS Kinetic on Ubuntu 16.04.

As told in this answer, I have created 4 planning groups. Here are the relevant snippets from my SRDF files.

  <group name = "left_arm">
        <joint name="lh_arm_platform" />
        <joint name="lh_arm_0_joint" />
        <joint name="lh_arm_1_joint" />
        <joint name="lh_arm_2_joint" />
        <joint name="lh_arm_3_joint" />
        <joint name="lh_arm_4_joint" />
    <group name = "right_arm">
        <joint name="rh_arm_platform" />
        <joint name="rh_arm_0_joint" />
        <joint name="rh_arm_1_joint" />
        <joint name="rh_arm_2_joint" />
        <joint name="rh_arm_3_joint" />
        <joint name="rh_arm_4_joint" />
    </group>  <group name="rh_ee">
       <chain base_link="rh_arm_0_link" tip_link="rh_arm_4_link" />
    <group name="lh_ee">
       <chain base_link="lh_arm_0_link" tip_link="lh_arm_4_link" />

And my end effector is described as:

  <end_effector name="ee_lh" parent_link="lh_arm_0_link" group="lh_ee" parent_group="left_arm" />
  <end_effector name="ee_rh" parent_link="rh_arm_0_link" group="rh_ee" parent_group="right_arm" />

I also have a move group for the upper body of the robot, which includes the torso and both hands.

<group name = "complete_robot">
       <group name = "left_hand" />
       <group name = "right_hand" />
       <group name = "left_arm" />
       <group name = "right_arm" />
       <group name = "torso" />

In the pick and place code, I have one function for opening the gripper and one function for closing the gripper, which includes all joints of the robot that would have a role to play for correctly grasping the object.

void openGripper(trajectory_msgs::JointTrajectory& posture)
  // BEGIN_SUB_TUTORIAL open_gripper
  /* Add both finger joints of panda robot. */
  posture.joint_names[0] = "torso_1_joint";
  posture.joint_names[1] = "torso_2_joint";
  posture.joint_names[2] = "lh_arm_0_joint";
  posture.joint_names[3] = "lh_arm_1_joint";
  posture.joint_names[4] = "lh_arm_2_joint";
  posture.joint_names[5] = "lh_arm_3_joint";
  posture.joint_names[6] = "lh_arm_4_joint";
  posture.joint_names[7] = "rh_arm_0_joint";
  posture.joint_names[8] = "rh_arm_1_joint";
  posture.joint_names[9] = "rh_arm_2_joint";
  posture.joint_names[10] = "rh_arm_3_joint";
  posture.joint_names[11] = "rh_arm_4_joint";

  /* Set them as open, wide enough for the object to fit. */
  posture.points.resize(1);  //number of waypoints
  posture.points[0].positions.resize(12); //number of joints
  /*point p and joint j --- joint_names<j> corresponds to points<p>.positions<j>*/
  // positions are in the joint space
  // open - gripper -- ready
  posture.points[0].positions[0] = 0.00;
  posture.points[0].positions[1] = 0.00;
  posture.points[0].positions[2] = 0.1792;
  posture.points[0].positions[3] = -1.0268;
  posture.points[0].positions[4] = 0.1629;
  posture.points[0].positions[5] = 1.6461;
  posture.points[0].positions[6] = -1.0593;
  posture.points[0].positions[7] = -0.1792;
  posture.points[0].positions[8] = 1.2224;
  posture.points[0].positions[9] = -0.1629;
  posture.points[0].positions[10] = -1.6461;
  posture.points[0].positions[11] = 1.0593;


This is the open_gripper function and the closed gripper function is defined in a similar manner.

In my "pick" function, I have specified the target position of the parent link of the end effector, to be center of the object that will be manipulated. In order to simplify the problem, I use ... (more)

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted

answered 2018-08-01 09:22:15 -0600

fvd gravatar image
  1. No. Those functions in the tutorial supply the end effector postures in opened and closed state, which are then entered into the moveit_msgs/Grasp.msg. Yes, you should do it how it is done in the tutorial.

  2. The move group of the robot, whose joints you are actuating to move the end effector to the desired grasp pose. Just like in the tutorial.

  3. I don't understand what you mean by "reference roll, pitch and yaw values" of any robot. Just try some orientations, and move the robot to them if you are confused.

  4. There is a separate setting inside MoveIt that affects planning attempts of the solver (if I remember right), but each grasp pose supplied to the Pick and Place functions also starts a separate pipeline that attempts the solution of the whole manipulation problem (approach, attach/detach, retreat). Each pipeline is somewhat like a new planning attempt. The code defining them is here.

  5. I don't know how to answer, because it seems like you are misunderstanding something fundamental. The Kinetic tutorial also uses a PoseStamped object to define the grasp pose. tf::createQuaternionMsgFromRollPitchYaw(-M_PI / 2, -M_PI / 4, -M_PI / 2); just sets the orientation of the Pose.

With that said, it looks like your end effector groups are still incorrect (don't they include the same joints as "left_arm" and "right_arm"?), although the last answer told you about this, and I told you here before. Considering that this is the sixth place I see you asking about this, I strongly suggest that you spend more time reading the tutorials on your own. Most of your questions would be solved by studying the code, making small changes, and figuring out what was affected by each change.

As gvdhoorn commented in your last thread, there is no ready-made solution for your bimanual manipulation problem. You will have to develop it, and you won't be able to do that without being able to read and understand the underlying code. Lastly, I don't want to be mean, but before you post the next question, consider this, and try to spend an extra day debugging.

edit flag offensive delete link more


If you are confused about what goes in the manipulator group and what goes in the end effector group, go back to your previous question and look at the links I gave you. The screen shots make it clear.

Geoff gravatar image Geoff  ( 2018-08-01 17:35:27 -0600 )edit

Question Tools

1 follower


Asked: 2018-08-01 05:57:54 -0600

Seen: 398 times

Last updated: Aug 01 '18