机械臂的 PositionConstraint 目标:无法构建目标表示

PositionConstraint goal for robot arm: Unable to construct goal representation

我在 Ubuntu 14.04 下设置了 ROS indigo、Gazebo。 ROS下,moveit节点为运行。机器人手臂 IRB120 被模拟并站立在 Gazebo 中。我有一个使用 moveit(move_group 节点)的节点 目的地 规划路径(轨迹)鲍勃想要的。规划的轨迹会发送到Gazebo稍后显示。

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

  1. 手臂各关节的角度:使用六个数字的数组(对于手臂的六个关节),定义每个关节和小腿的形式。这种方法效果很好。它使用 JointConstraint class:

    双 goal_poses [] = {0.52, 0.50, 0.73, -0.02, 0.31, 6.83}; for(int i = 0 ; i < 6; i++) // 遍历手臂的关节。 { moveit_msgs::JointConstraintjc; jc.weight = 1.0; jc.tolerance_above = 0.0001; jc.tolerance_below = 0.0001; jc.position = goal_poses[i]; jc.joint_name = 名字[i]; goal_constraint.joint_constraints.push_back(jc); }

  2. 仅定义末端执行器的位置和方向。我不能使用这种方法。我用过 PositionConstraint class.

简而言之问题:我可以用JointConstraint class描述一个目的地,但我不知道如何用[=15描述它=] class。 如何通过指出末端执行器的位置来描述目标?

我如何以 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的。 (通过在 /move_group/goal 主题上发布 trajectory_request

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

我们可以使用 moveit 库函数 computeCartesianPath,而不是将目标发布到 topic 上供另一个节点解析和读取。 (在这个例子中,发布轨迹的代码被注释掉了,部分缺失了)

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);
}

几个月前我解决了这个问题,不幸的是我不记得确切的 source/tutorial。