【MoveIt2-humble】入门教程(翻译自官方文档)三:Planning Around Objects

0 前沿

环境为:

  • Ubuntu22.04
  • ros2-humble
  • MoveIt2-humble

官方文档上的教程,从moveit1的melodic到moveit2的foxy基本一致,但是从最新的humble开始有了很大的变化,其中之一便是 lambda表达式 的广泛使用。

本节为教程的第三节,前提是需要完成上一节的内容,可以在我的专栏中查看。本节的内容为向规划场景添加物体,并围绕其进行规划。
四节教程会手把手带你写一个完整的 Moveit 控制程序,包括轨迹规划、RViz可视化、添加碰撞物体、抓取和放置。

更多信息可以去官方文档查看:https://moveit.picknik.ai/humble/index.html
本系列博客为我个人翻译,方便自己学习使用。

准备工作

完成上一节教程

步骤

1 添加Planning Scene Interface头文件

#include <moveit/planning_scene_interface/planning_scene_interface.h>

2 改变目标位姿

// Set a target Pose
auto const target_pose = [] {
    
    
  geometry_msgs::msg::Pose msg;
  msg.orientation.w = 1.0;
  msg.position.x = 0.28;
  msg.position.y = 0.4;  // <---- This value was changed
  msg.position.z = 0.5;
  return msg;
}();
move_group_interface.setPoseTarget(target_pose);

3 创建一个碰撞物体

在下一个代码块中,我们创建了一个碰撞物体。

第一个需要注意的是,物体被放置在机器人坐标系下。如果我们有一个感知系统,能够报告场景中障碍物的位置,这就是该系统将要建立的一类信息。在本例子中我们手动来创建它。

另外要注意代码块的结尾处,我们设置该信息的操作为ADD,这样能够允许在后面的操作中将物体添加到碰撞场景。

把此代码块插入到【设置目标位姿】和【创建规划】之间。

// 创建用于避障的碰撞对象
auto const collision_object = [frame_id =
                                 move_group_interface.getPlanningFrame()] {
    
    
  moveit_msgs::msg::CollisionObject collision_object;
  collision_object.header.frame_id = frame_id;
  collision_object.id = "box1";
  shape_msgs::msg::SolidPrimitive primitive;

  // 定义盒子的尺寸(单位:m)
  primitive.type = primitive.BOX;
  primitive.dimensions.resize(3);
  primitive.dimensions[primitive.BOX_X] = 0.5;
  primitive.dimensions[primitive.BOX_Y] = 0.1;
  primitive.dimensions[primitive.BOX_Z] = 0.5;

  // 定义盒子的位姿(相对于 frame_id)
  geometry_msgs::msg::Pose box_pose;
  box_pose.orientation.w = 1.0;
  box_pose.position.x = 0.2;
  box_pose.position.y = 0.2;
  box_pose.position.z = 0.25;

  collision_object.primitives.push_back(primitive);
  collision_object.primitive_poses.push_back(box_pose);
  collision_object.operation = collision_object.ADD;

  return collision_object;
}();

4 添加物体到规划场景中

最后,我们需要添加这个物体到碰撞场景中。为了实现这个操作,我们使用PlanningSceneInterface对象,该对象使用 ROS 接口,将规划场景的变化传递给MoveGroup

下面的代码块插入在上面代码块的下面:

// 将碰撞物体添加到场景中
moveit::planning_interface::PlanningSceneInterface planning_scene_interface;
planning_scene_interface.applyCollisionObject(collision_object);

5 运行程序

和上一个教程一样,使用demo.launch.py启动 RViz ,然后运行我们的程序。

在这里插入图片描述

扩展阅读

下一节教程

下一节教程会介绍一个更高级的工具设计,用以解决更难的运动规划。我们会创建一个程序来抓取和放置物体。

猜你喜欢

转载自blog.csdn.net/qq_43557907/article/details/125691746