The move_group_interface

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/

时间: 2024-10-27 05:59:48

The move_group_interface的相关文章

moveit相关函数解释

//使用moveit需要的头文件#include <moveit/move_group_interface/move_group.h>#include <moveit/planning_scene_interface/planning_scene_interface.h> #include <moveit_msgs/DisplayRobotState.h>#include <moveit_msgs/DisplayTrajectory.h> #include