机器人手臂的PositionConstraint目标:无法构建目标表示

时间:2018-05-30 16:37:10

标签: ros moveit

我在Ubuntu 14.04下有一个ROS indigo,Gazebo的设置。在ROS下,moveit节点正在运行。机器人手臂IRB120被模拟并站在Gazebo。我有一个节点使用moveit(move_group节点)来为Bob想要的目标计划路径(轨迹)。计划的轨迹将被发送到Gazebo以便稍后显示。

Bob可以使用两种方法来描述目的地:

  1. 手臂每个关节的角度:使用六个数字的阵列(手臂的六个关节),定义每个关节和胫骨的形状。这种方法很好。它使用JointConstraint类:

    double goal_poses [] = {0.52,0.50,0.73,-0.02,0.31,6.83};   for(int i = 0; i< 6; i ++)//迭代手臂的关节。   {     moveit_msgs :: JointConstraint jc;     jc.weight = 1.0;     jc.tolerance_above = 0.0001;     jc.tolerance_below = 0.0001;     jc.position = goal_poses [i];     jc.joint_name = names [i];     goal_constraint.joint_constraints.push_back(JC);   }

  2. 仅定义末端效应器的位置和方向。我不能用这种方法。我使用了PositionConstraint类。

  3. 简短问题:我可以使用JointConstraint课程来描述目的地,但我不知道如何在PositionConstraint课程中对其进行描述。 如何描述目标,只需指出末端效应器应该在哪里?

    我如何用PositionConstraint格式描述目标:(我指出了末端效应器的位置以及它的方向应该是什么。)

      moveit_msgs::PositionConstraint pc;
      pc.weight = 1.0;
      geometry_msgs::Pose p;
      p.position.x = 0.3; // not sure if feasible position
      p.position.y = 0.3; // not sure if feasible position
      p.position.z = 0.3; // not sure if feasible position
      pc.link_name="tool0";
      p.orientation.x = 0;
      p.orientation.y = 0;
      p.orientation.z = 0;
      p.orientation.w = 1;
      pc.constraint_region.mesh_poses.push_back(p);
      goal_constraint.position_constraints.push_back(pc);
    

    但是当发送请求时,服务器响应:

    [ERROR] [1527689581.951677797, 295.242000000]: Unable to construct goal representation
    

    注意:

    在这两种情况下,我都会将goal_constraint添加到trajectory_request

    trajectory_request.goal.request.goal_constraints.push_back(goal_constraint);
    // add other details to trajectory_request here...
    

    trajectory_request将被发送到move_group。 (通过在trajectory_request主题上发布/move_group/goal

1 个答案:

答案 0 :(得分:0)

稍有不同的解决方案解决了用末端执行器的方向和位置描述目标的问题

我们可以使用topic库函数moveit来代替将目标发布在computeCartesianPath上以供另一个节点解析和读取。 (在此示例中,用于发布轨迹的代码已注释,部分丢失了)

void planTo(std::vector<double> coordinate, std::vector<double> orientation){

  geometry_msgs::Pose p;
  p.orientation.w = 1.0;
  p.position.x = coordinate[0];
  p.position.y = coordinate[1];
  p.position.z = coordinate[2];

  tf::Quaternion q = tf::createQuaternionFromRPY(
      orientation[0],orientation[1],orientation[2]);

  p.orientation.x = q.getX();
  p.orientation.y = q.getY();
  p.orientation.z = q.getZ();
  p.orientation.w = q.getW();

  std::vector<geometry_msgs::Pose> goals;
  goals.push_back(p);

  moveit::planning_interface::MoveGroup mg("manipulator");
  mg.setStartStateToCurrentState();

  // load the path in the `trajectory` variable:
  moveit_msgs::RobotTrajectory trajectory;
  mg.computeCartesianPath(goals, 0.01, 0.0, trajectory);
  // publish to gazebo:
  // trajectory.joint_trajectory.header.stamp = ros::Time::now();
  // publisher.publish(trajectory.joint_trajectory);
}

几个月前我解决了这个问题,很遗憾,我不记得确切的源代码/教程了。