The move_group_interface

时间:2016-08-17 13:52:07   收藏:0   阅读:470

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了。这里有一些有用的提示,来告诉我们当错误出现时如何进行修复。

6. 参考资源

moveit.ros.org/documentation/tutorials/

 

原文:http://www.cnblogs.com/kevinrobot/p/5779562.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!