move_group_interface是MoveIt!提供的主要的API接口。支持C++和Python。
该接口使得MoveIt!更容易在ROS中使用。ROS API主要通过constraints等来配置,一个末端执行器的位置约束或者整个机器人的关节约束。
move_group_interface允许用户直接来将这些约束配置设置到一个期望位置,方向。或者做整个机器人的关节配置。
1. 规划到一个姿态目标
下面的代码是展示通过C++ API规划一个机器人到目标姿态。
1 moveit::planning_interface::MoveGroup group("right_arm"); 2 3 geometry_msgs::Pose target_pose1; 4 target_pose1.orientation.w = 1.0; 5 target_pose1.position.x = 0.28; 6 target_pose1.position.y = -0.7; 7 target_pose1.position.z = 1.0; 8 group.setPoseTarget(target_pose1); 9 10 moveit::planning_interface::MoveGroup::Plan my_plan; 11 bool success = group.plan(my_plan);
2. 规划到一个关节目标
1 std::vector<double> group_variable_values; 2 group.getCurrentState()->copyJointGroupPosition(group.getCurrentState()->getRobotModel()->getJointModelGroup(group.getName()),group_variable_values); 3 4 group_variable_values[0] = -1.0; 5 group_setJointValueTarget(group_variable_values); 6 7 moveit::planning_interface::MoveGroup::Plan my_plan; 8 success = group.plan(my_plan);
首先,我们为group获得当前关节的值。然后,我们设置一个关节值来指定新的目标。如果目标是关节限制以外的,就无法进行规划。
3. 移动到目标关节或者姿态。
移动到目标姿态和关节的进程和规划时候基本上是一样的。只是到最后,我们调用的是move()函数而不再是plan()函数。
success = group.move(my_plan);
4. 向环境中添加物体对象。
使用C++或者Python 的API能够很容易的通过Rviz的运动规划插件向环境中添加物体。这个运动规划插件允许用户直接导入.STL文件。可以用来调整的主要参数是添加对象的碰撞模型和物体的定位。MoveIt!允许使用不同类型的碰撞模型,包括像一些基本形状(box,cylinder,sphere,cone)和mesh models网状模型。网状模型应当设置为尽可能少的三角形数量。
工作隔间组件可以直接使用PlanningScenceInterface类来添加。
1 moveit::planning_interface::PlanningSceneInterface planning_scene_interface; 2 moveit_msgs::CollisionObject collision_object; 3 collision_object.header.frame_id = group.getPlanningFrame(); 4 collision_object.id= "box1"; 5 6 /* Define a box to add to the world. */ 7 shape_msgs::SolidPrimitive primitive; 8 primitive.type = primitive.Box; 9 primitive.dimensions.resize(3); 10 primitive.dimensions[0] = 0.4; 11 primitive.dimensions[1] = 0.1; 12 primitive.dimensions[2] = 0.4; 13 14 geometry_msgs::Pose box_pose; 15 box_pose.orientation.w = 1.0; 16 box_pose.orientation.x = 0.6; 17 box_pose.orientation.y = -0.4; 18 box_pose.orientation.z = 1.2; 19 20 collision_object.primitives.push_back(primitive); 21 collision_object.primitives_poses.push_back(box_pose); 22 collision_object.operation = collision_object.ADD; 23 24 std::vector<moveit_msgs::CollisionObject> collision_object; 25 collision_objects.push_back(collision_object); 26 27 planning_scene_interface.addCollisionObjects(collision_objects);
在环境中attach和detach这些碰撞对象也是很简单的。最重要的呢就是要保证在attach之前已经将对象添加到了环境中。
/* Attach the object */ group.attachObject(collision_object.id); /* Detach the object */ group.detachObject(collision_object.id);
5. 有用的一些提示
万一所有的事情并没有按照预期进行的话,就需要用户进行debug了。这里有一些有用的提示,来告诉我们当错误出现时如何进行修复。
- 机器人不动: 如果机器人的关节限制不合适的话,机器人是不会动的。检查机器人的URDF文件,确保每个关节有一个可移动的范围值。检查并确保最大关节值比最小关节值大。
- 当我定义软限制时机器人不移动: 如果在机器人的URDF文件中定义软限制,这些限制都会被MoveIt!所使用,所以一定要确保它们是可用的。
- 运动规划没能正确产生:检查关节配置中有没有两部分产生了自冲突。尤其是你在URDF中添加了新的部分但是还没有用MoveIt! Setup Assistant进行配置时。如果有机器人部件变红,则是他们产生了冲突。运行MoveIt! Setup Assistant来为配置整个机器人以确保碰撞检测。
- GUI接口不能正确工作:6个或者更多自由度的机器人能够在Rviz中很好地运行。少于6个自由度的机器人是比较难通过这个插件进行使用的。
- 动作规划到碰撞区域去了:MoveIt!用一个离散值来检查每一个运动规划片段,如果这个离散值太大的话,运动片段就不能被合适的检查,就有可能产生冲突。这个值在ompl_planning.yaml文件中的longest_valid_segment参数来配置。如果使用Rviz,请确保你在规划之前已经按下了Publish Planning Scene按钮。
6. 参考资源
moveit.ros.org/documentation/tutorials/