有多少人工,就有多少智能

Ros2 Moveit2 之 围绕对象进行规划 - 添加障碍物


本教程将向您介绍如何将对象插入规划场景并围绕它们进行规划。

先决条件

如果您还没有这样做,请确保您已完成RViz 中的可视化hello_moveit中的步骤。本项目假设您从上一个教程结束的地方开始。如果您只想运行本教程,您可以按照Docker 指南启动一个包含已完成教程的容器。

步骤

1 添加规划场景接口

在源文件的顶部,将其添加到包含列表中:

#include <moveit/planning_scene_interface/planning_scene_interface.h>

2 改变目标姿势

首先,通过以下更改更新目标姿势,使机器人规划到不同的位置:

// Set a target Pose with updated values !!!
auto const target_pose = [] {
  geometry_msgs::msg::Pose msg;
  msg.orientation.y = 0.8;
  msg.orientation.w = 0.6;
  msg.position.x = 0.1;
  msg.position.y = 0.4;
  msg.position.z = 0.4;
  return msg;
}();
move_group_interface.setPoseTarget(target_pose);

3 创建碰撞对象

在下一个代码块中,我们创建一个碰撞对象。首先要注意的是,它被放置在机器人的坐标系中。如果我们有一个感知系统来报告场景中障碍物的位置,那么这就是它会构建的消息类型。因为这只是一个示例,所以我们是手动创建的。在这个代码块的末尾要注意的一件事是,我们将此消息上的操作设置为ADD。这会导致对象被添加到碰撞场景中。将此代码块放在上一步设置目标姿势和创建计划之间。

// Create collision object for the robot to avoid
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;

  // Define the size of the box in meters
  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;

  // Define the pose of the box (relative to the frame_id)
  geometry_msgs::msg::Pose box_pose;
  box_pose.orientation.w = 1.0;  // We can leave out the x, y, and z components of the quaternion since they are initialized to 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。此代码块应直接跟在创建碰撞对象的代码块后面。

// Add the collision object to the scene
moveit::planning_interface::PlanningSceneInterface planning_scene_interface;
planning_scene_interface.applyCollisionObject(collision_object);

5 运行程序并观察变化

就像我们在上一个教程中所做的那样,使用demo.launch.py脚本启动 RViz 并运行我们的程序。如果您使用的是 Docker 教程容器之一,则可以指定已添加 RvizVisualToolsGui 面板的其他 RViz 配置:

ros2 launch moveit2_tutorials demo.launch.py rviz_config:=kinova_hello_moveit.rviz

 

../../../_images/planning_around_object.png

概括

posted @ 2024-08-05 11:52  lvdongjie-avatarx  阅读(114)  评论(0编辑  收藏  举报