博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
The move_group_interface
阅读量:5154 次
发布时间:2019-06-13

本文共 3292 字,大约阅读时间需要 10 分钟。

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
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
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/

 

转载于:https://www.cnblogs.com/kevinrobot/p/5779562.html

你可能感兴趣的文章
当编程作为一种习惯
查看>>
docker pull理解误区
查看>>
关于标签分类
查看>>
查询数据库大于1G的表
查看>>
数据采集知识
查看>>
Ubuntu下一个好用的MySQL客户端tora
查看>>
折半查找
查看>>
virtual hust 2013.6.20 数论基础题目 E - Uniform Generator
查看>>
Yii2 Start Process and File Loading
查看>>
Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……
查看>>
无重复字符串的最长子串 python
查看>>
使用hibernate可以优化的地方
查看>>
js的eval代码快速解密
查看>>
Mybatis核心配置文件SqlMapConfig.xml
查看>>
HDU 1358 Period KMP
查看>>
HDU 1106 排序
查看>>
utility_VS2015基本操作
查看>>
0626 Django模型(ORM)
查看>>
【BZOJ1060】[ZJOI2007] 时态同步(树形DP)
查看>>
94. Binary Tree Inorder Traversal
查看>>