首页 > 其他分享 >Ros2 Moveit2 之 围绕对象进行规划 - 添加障碍物

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

时间:2024-08-05 11:49:51浏览次数:18  
标签:box 障碍物 primitive pose object collision msg Moveit2 Ros2


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

先决条件

如果您还没有这样做,请确保您已完成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

概括

标签:box,障碍物,primitive,pose,object,collision,msg,Moveit2,Ros2
From: https://www.cnblogs.com/ai-ldj/p/18342948

相关文章

  • Ros2 Moveit2 之 在Riz2中可视化
     本教程将向您介绍一个工具,通过在RViz中呈现可视化效果,该工具可以帮助您更轻松地了解MoveIt应用程序正在做什么。先决条件如果你还没有完成,请确保你已经完成了你的第一个项目hello_moveit中的步骤。这个项目假设你从上一个教程结束的地方开始。步骤1添加依赖moveit_v......
  • Ros2 Moveit2 之 moveit_visual_tools.prompt
    moveit_visual_tools.prompt是MoveIt!的一个功能,用于在可视化工具中暂停程序执行并提示用户进行某些操作。在机器人开发和调试过程中,通常需要与用户进行交互,比如等待用户在界面上点击按钮或在某个状态下继续执行程序。moveit_visual_tools.prompt提供了一种简单的方法来实现这......
  • Ros2 Moveit2 第一个C++项目
     本教程将指导您使用MoveIt编写第一个C++应用程序。警告:MoveIt中的大多数功能将无法正常工作,因为完整的MoveGroup功能需要附加参数。如需完整设置,请继续阅读MoveGroupC++接口教程。先决条件如果您还没有这样做,请确保您已经完成入门指南中的步骤。本教程假设您了......
  • Ros2 Moveit2 Rviz2 快速入门
     这里将教您如何使用RViz和MoveItDisplay插件在MoveIt中创建运动计划。Rviz是ROS中的主要可视化工具,也是调试机器人的非常有用的工具。MoveItDisplay插件允许您设置虚拟环境(规划场景)、以交互方式为机器人创建起始和目标状态、测试各种运动规划器并可视化输出。让我......
  • franka ros2
    franka_ros2在Windows上不受支持。franka_ros2repo包含libfranka的ROS2集成 。 警告:franka_ros2正在快速开发中。预计会出现重大变化。在 GitHub上报告错误。先决条件ROS2Humble安装( ros-humble-desktop)或带有DevContainer的VSCodeIDE。PREEMPT_RT......
  • ros2 自定义一个控制器
    在ROS2中,自定义一个控制器并进行使用涉及几个步骤,包括编写控制器代码、配置控制器参数、编写控制器启动文件以及在运行时加载和使用控制器。以下是一个详细的步骤指南:1.编写控制器代码首先,创建一个控制器类,该类继承自controller_interface::ControllerInterface。下面是一......
  • 障碍物地图(三)写一张障碍物地图
    花了不少时间看完了障碍物地图的大致思路,这里简单根据前面的思路来写一个简易版的障碍物地图。1.订阅一张地图首先,我们需要一张静态地图作为原始数据,这个我们可以订阅当前的map来获取:voidmap_test1::MapCallback(constnav_msgs::OccupancyGrid::ConstPtr&map){map_or......
  • 障碍物地图(二)
    上一篇大致看完了障碍物地图的初始化内容以及对于传感器数据的处理,我们知道在该部分算法维护了一个ObservationBuffer,其中存储了一段时间内的点云数据。每次新的数据进来后,还会根据设定的时间参数observation_keep_time抛弃比较久远的障碍物点云。但是在看的过程中,我们也产生了一......
  • 障碍物地图
    前面我们看完了栅格地图,知道了地图的基本数据结构,今天进一步的看一下障碍物地图。障碍物地图的存在更多是用于局部路径规划中所使用,因为大部分时候全局地图都是比较大的,那么很难保证其始终是一成不变的,所以如果我们只是按照全局地图进行路径规划,很可能会出现原有的地图中没有障碍......
  • ROS2对比ROS
    ROS(RobotOperatingSystem)和ROS2(RobotOperatingSystem2)是两个广泛使用的机器人软件框架,它们由OpenRobotics组织维护和开发。尽管名称中包含“操作系统”,但ROS和ROS2实际上是一组工具、库和约定,用于帮助开发机器人软件。下面列出了ROS2相对于ROS的一......