ROS Indigo中IRB120机械臂使用PositionConstraint规划目标报错求助
解决MoveIt!中用PositionConstraint定义末端位姿目标的问题
我来帮你搞定这个问题!你碰到的Unable to construct goal representation错误,核心原因是没有正确配置PositionConstraint的约束区域结构——你只给了mesh姿态,但没定义实际的约束形状(比如点、盒子或球体),MoveIt!没法识别这个目标约束。另外,你要同时约束末端的位置和姿态,还需要配合OrientationConstraint,因为PositionConstraint只负责位置约束,姿态得单独处理。
错误原因分析
你之前的代码里用了pc.constraint_region.mesh_poses,这个字段是用来定义复杂网格形状的约束区域的,而你只是想让末端到达一个精确的位姿,应该用**基本几何体(primitive)**来定义约束区域,比如一个极小的球体或者盒子,代表末端需要到达的点范围。
正确的实现步骤
下面是针对你的需求(指定末端执行器的位置+姿态)的修正代码,结合ROS Indigo和MoveIt!的特性:
// 1. 初始化目标约束 moveit_msgs::Constraints goal_constraint; // 2. 创建位置约束(PositionConstraint) moveit_msgs::PositionConstraint pc; pc.link_name = "tool0"; // 确认这个是你的末端执行器link名称 pc.weight = 1.0; // 定义约束区域:用一个极小的球体,代表精确位置点 shape_msgs::SolidPrimitive sphere; sphere.type = shape_msgs::SolidPrimitive::SPHERE; sphere.dimensions.push_back(0.001); // 半径0.1mm,几乎是一个点 // 设置目标位置的pose geometry_msgs::Pose target_pose; target_pose.position.x = 0.3; target_pose.position.y = 0.3; target_pose.position.z = 0.3; target_pose.orientation.x = 0.0; target_pose.orientation.y = 0.0; target_pose.orientation.z = 0.0; target_pose.orientation.w = 1.0; // 将几何体和姿态添加到约束区域 pc.constraint_region.primitives.push_back(sphere); pc.constraint_region.primitive_poses.push_back(target_pose); // 3. 创建姿态约束(OrientationConstraint) moveit_msgs::OrientationConstraint oc; oc.link_name = "tool0"; oc.weight = 1.0; oc.orientation = target_pose.orientation; // 复用刚才的目标姿态 // 设置姿态公差(完全精确的姿态可能难以规划,给一点容错空间) oc.absolute_x_axis_tolerance = 0.01; // 弧度 oc.absolute_y_axis_tolerance = 0.01; oc.absolute_z_axis_tolerance = 0.01; // 4. 将两个约束添加到目标约束中 goal_constraint.position_constraints.push_back(pc); goal_constraint.orientation_constraints.push_back(oc); // 5. 添加到轨迹请求(和你之前的代码一致) trajectory_request.goal.request.goal_constraints.push_back(goal_constraint);
关键注意事项
- 确认link名称:确保
tool0是你URDF中定义的末端执行器link的正确名称,可以通过rosrun rqt_tf_tree rqt_tf_tree查看TF树来验证。 - 约束区域的选择:如果你需要的是一个精确点,用极小的球体最方便;如果是一个区域,可以用盒子(
shape_msgs::SolidPrimitive::BOX)并设置对应的长宽高。 - 姿态公差:不要把姿态公差设为0,这样MoveIt!很难找到可行的轨迹,给0.01~0.05弧度的公差通常足够。
- ROS Indigo兼容性:这段代码完全适配Indigo版本的MoveIt!,不需要额外修改。
这样调整后,MoveIt!就能正确识别你的末端位姿目标,生成可行的轨迹发送到Gazebo中了。
内容的提问来源于stack exchange,提问作者Makan
相关产品推荐
相关产品推荐

