首页 > 其他分享 >ROS2- Moveit2 -Planning Scene ROS API (规划场景 ROS API)

ROS2- Moveit2 -Planning Scene ROS API (规划场景 ROS API)

时间:2024-09-02 13:25:10浏览次数:4  
标签:API 物体 object attached scene Scene planning diff ROS

在本教程中,我们将研究如何使用规划场景差异来执行两项操作:

  • 在世界中添加和移除物体

  • 将物体安装到机器人上或从机器人上卸下

入门

如果您还没有这样做,请确保您已经完成入门指南中的步骤。

运行代码

打开两个 shell。在第一个 shell 中启动 RViz 并等待所有内容完成加载:

ros2 launch moveit2_tutorials move_group.launch.py

在第二个 shell 中,运行此演示的启动文件:

ros2 launch moveit2_tutorials planning_scene_ros_api_tutorial.launch.py

片刻之后,RViz 窗口应会出现,看起来类似于可视化教程中的此步骤。要完成每个演示步骤,请按屏幕底部RvizVisualToolsGui面板中的下一步按钮,或选择屏幕顶部工具面板中的Key Tool ,然后在 RViz 处于焦点时按下键盘上的0 。

预期输出

在 RViz 中,您应该能够看到以下内容:
  • 物体出现在规划场景中。

  • 物体附着在机器人上。

  • 物体与机器人分离。

  • 对象已从规划场景中移除。

完整代码

完整代码可以在 MoveIt GitHub 项目中看到。

可视化

MoveItVisualTools 包提供了许多在 RViz 中可视化对象、机器人和轨迹的功能,以及调试工具。

rviz_visual_tools::RvizVisualTools visual_tools("panda_link0", "planning_scene_ros_api_tutorial", node);
visual_tools.loadRemoteControl();
visual_tools.deleteAllMarkers();

ROS应用程序接口

ROS API 通过使用“diffs”的主题接口与规划场景发布者进行交互。规划场景差异是当前规划场景(由 move_group 节点维护)与用户所需的新规划场景之间的差异。

通告所需主题

我们创建一个发布者并等待订阅者。请注意,可能需要在启动文件中重新映射此主题。

rclcpp::Publisher<moveit_msgs::msg::PlanningScene>::SharedPtr planning_scene_diff_publisher =
    node->create_publisher<moveit_msgs::msg::PlanningScene>("planning_scene", 1);
while (planning_scene_diff_publisher->get_subscription_count() < 1)
{
  rclcpp::sleep_for(std::chrono::milliseconds(500));
}
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");

定义附加对象消息

我们将使用此消息从世界中添加或减去物体,并将物体附加到机器人上。

moveit_msgs::msg::AttachedCollisionObject attached_object;
attached_object.link_name = "panda_hand";
/* The header must contain a valid TF frame*/
attached_object.object.header.frame_id = "panda_hand";
/* The id of the object */
attached_object.object.id = "box";

/* A default pose */
geometry_msgs::msg::Pose pose;
pose.position.z = 0.11;
pose.orientation.w = 1.0;

/* Define a box to be attached */
shape_msgs::msg::SolidPrimitive primitive;
primitive.type = primitive.BOX;
primitive.dimensions.resize(3);
primitive.dimensions[0] = 0.075;
primitive.dimensions[1] = 0.075;
primitive.dimensions[2] = 0.075;

attached_object.object.primitives.push_back(primitive);
attached_object.object.primitive_poses.push_back(pose);

注意,将对象附加到机器人需要将相应的操作指定为 ADD 操作。

attached_object.object.operation = attached_object.object.ADD;

由于我们将物体附着在机械手上以模拟拾取物体,因此我们希望碰撞检查器忽略物体和机械手之间的碰撞。

attached_object.touch_links = std::vector<std::string>{ "panda_hand", "panda_leftfinger", "panda_rightfinger" };

将对象添加到环境中

通过将对象添加到规划场景的“世界”部分的碰撞对象集合中,将其添加到环境中。请注意,我们在这里仅使用 attachment_object 消息的“object”字段。

RCLCPP_INFO(LOGGER, "Adding the object into the world at the location of the world.");
moveit_msgs::msg::PlanningScene planning_scene;
planning_scene.world.collision_objects.push_back(attached_object.object);
planning_scene.is_diff = true;
planning_scene_diff_publisher->publish(planning_scene);
visual_tools.prompt("Press 'next' in the RvizVisualToolGui window to continue the demo.");

插曲:同步更新与异步更新

有两种单独的机制可用于使用 diff 与 move_group 节点进行交互:

  • 通过 rosservice 调用发送差异并阻止,直到应用差异(同步更新)

  • 通过主题发送差异,即使差异可能尚未应用也继续(异步更新)

虽然本教程的大部分内容都使用后一种机制(考虑到为了可视化目的而插入的长睡眠,异步更新不会造成问题),但用以下服务客户端替换 planning_scene_diff_publisher 是完全合理的:

rclcpp::Client<moveit_msgs::srv::ApplyPlanningScene>::SharedPtr planning_scene_diff_client =
    node->create_client<moveit_msgs::srv::ApplyPlanningScene>("apply_planning_scene");
planning_scene_diff_client->wait_for_service();

并通过服务调用将差异发送到规划现场:

auto request = std::make_shared<moveit_msgs::srv::ApplyPlanningScene::Request>();
request->scene = planning_scene;
std::shared_future<std::shared_ptr<moveit_msgs::srv::ApplyPlanningScene_Response>> response_future;
response_future = planning_scene_diff_client->async_send_request(request).future.share();

等待服务响应

std::chrono::seconds wait_time(1);
std::future_status fs = response_future.wait_for(wait_time);
if (fs == std::future_status::timeout)
{
  RCLCPP_ERROR(LOGGER, "Service timed out.");
}
else
{
  std::shared_ptr<moveit_msgs::srv::ApplyPlanningScene_Response> planning_response;
  planning_response = response_future.get();
  if (planning_response->success)
  {
    RCLCPP_INFO(LOGGER, "Service successfully added object.");
  }
  else
  {
    RCLCPP_ERROR(LOGGER, "Service failed to add object.");
  }
}

请注意,直到我们确定已应用差异后,此过程才会继续。

将物体附着到机器人上

当机器人从环境中拾取一个物体时,我们需要将该物体“附着”到机器人上,以便任何处理机器人模型的组件都知道要考虑附着的物体,例如进行碰撞检查。

附加对象需要两个操作

  • 从环境中移除原始对象

  • 将物体附着到机器人上

/* First, define the REMOVE object message*/
moveit_msgs::msg::CollisionObject remove_object;
remove_object.id = "box";
remove_object.header.frame_id = "panda_hand";
remove_object.operation = remove_object.REMOVE;

请注意,我们如何通过首先清除这些字段来确保差异消息不包含其他附加对象或碰撞对象。

/* Carry out the REMOVE + ATTACH operation */
RCLCPP_INFO(LOGGER, "Attaching the object to the hand and removing it from the world.");
planning_scene.world.collision_objects.clear();
planning_scene.world.collision_objects.push_back(remove_object);
planning_scene.robot_state.attached_collision_objects.push_back(attached_object);
planning_scene.robot_state.is_diff = true;
planning_scene_diff_publisher->publish(planning_scene);
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");

从机器人上拆下一个物体

从机器人上拆卸物体需要两个操作

  • 将物体从机器人上拆下

  • 将物体重新引入环境中

/* First, define the DETACH object message*/
moveit_msgs::msg::AttachedCollisionObject detach_object;
detach_object.object.id = "box";
detach_object.link_name = "panda_hand";
detach_object.object.operation = attached_object.object.REMOVE;

请注意,我们如何通过首先清除这些字段来确保差异消息不包含其他附加对象或碰撞对象。

/* Carry out the DETACH + ADD operation */
RCLCPP_INFO(LOGGER, "Detaching the object from the robot and returning it to the world.");
planning_scene.robot_state.attached_collision_objects.clear();
planning_scene.robot_state.attached_collision_objects.push_back(detach_object);
planning_scene.robot_state.is_diff = true;
planning_scene.world.collision_objects.clear();
planning_scene.world.collision_objects.push_back(attached_object.object);
planning_scene.is_diff = true;
planning_scene_diff_publisher->publish(planning_scene);
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");

从碰撞世界中移除物体

从碰撞世界中移除对象只需使用先前定义的移除对象消息即可。请注意,我们如何通过首先清除这些字段来确保 diff 消息不包含其他附加对象或碰撞对象。'

RCLCPP_INFO(LOGGER, "Removing the object from the world.");
planning_scene.robot_state.attached_collision_objects.clear();
planning_scene.world.collision_objects.clear();
planning_scene.world.collision_objects.push_back(remove_object);
planning_scene_diff_publisher->publish(planning_scene);

 

 

 

  

标签:API,物体,object,attached,scene,Scene,planning,diff,ROS
From: https://www.cnblogs.com/ai-ldj/p/18392528

相关文章

  • Ros2-Moveit2-PlanningSceneMonitor(规划场景监控)
    PlanningSceneMonitor是维护最新规划场景的推荐接口。RobotState、CurrentStateMonitor、PlanningScene、PlanningSceneMonitor和PlanningSceneInterface之间的关系一开始可能非常令人困惑。本教程旨在阐明这些关键概念。机器人状态RobotState是机器人的快照。它包含RobotMod......
  • 电影票小程序API接口对接方式注册和申请接入流程
    电影票API接口对接方式注册和申请接入:注册成为合作伙伴或开发者:在API提供商处注册账号,并按照其指引填写相关信息,申请API密钥和相关文档 。了解使用条款和限制:明确API提供商的使用条款,包括请求频率限制、数据使用权限、隐私政策、版权信息、计费规则等,确保在使用过......
  • 鸿蒙跨端实践-ArkTS和CAPI的混合开发实现
    一、背景在动态化-鸿蒙跨端方案文章中,讲述了动态化适配鸿蒙的方案实现,当在鸿蒙系统进行UI渲染的时候,我们使用了系统的组件进行递归渲染。在iOS和Android也是借助各自系统组件进行的渲染,但是在鸿蒙系统会存在以下4个严重问题:1.UI层级过多以金融APP理财频道页中的一个乐高楼层中的“......
  • 教会小白如何使用淘宝API接口获取商品数据
    随着互联网的普及,越来越多的人开始接触网络购物,而淘宝作为中国最大的电商平台之一,成为了众多消费者首选的购物平台。然而,对于一些小白用户来说,如何通过淘宝API接口获取商品数据可能是一个难题。本文将详细介绍如何教会小白使用淘宝API接口获取商品数据。一、了解淘宝API接口淘宝......
  • 使用OpenSceneGraph(OSG)库将osg模型转为obj格式
    使用osgconv将多个osgb转为obj在百度上搜索.osgb格式转.obj格式,往往需要使用付费软件;而OSG库自带的osgconv.exe其实就具备三维模型格式转换的功能,以多个osgb文件合并为一个obj文件为例,仅需要运行下面格式的命令:osgconv-OOutputTextureFilesOSGB文件1OSGB文件2OSGB文......
  • 【法如faro】三维激光软件Scene2023数据处理(自动配准并转换坐标)流程
    Scene2023数据处理(自动配准并转换坐标)的主要流程为:新建项目、导入数据、处理、自动注册、坐标系转换、模型导出立和面模型导出等。文章目录一、新建项目二、导入数据三、处理四、自动注册五、坐标系转换六、模型导出七、立面模型导出八、创建项目点云九、导......
  • 【机器学习】8. 逻辑斯蒂回归 Logistic function(sigmoid),cross-entropy error,Log-l
    Logisticfunction线性分类器Logisticfunction(sigmoid)极大似然估计Log-likelihoodloss线性分类器Logisticregression是一个线性分类器。如图,1为蓝色,0为红色。这条直线叫做直线边界Logisticfunction(sigmoid)......
  • .Net 5.0 WebAPI 发布至 Linux 系统
    阅读目录〇、前言一、Linux环境准备1.1CentOS7.x在线安装.net5.01.2CentOS8.x在线安装.net5.01.3查看是否安装成功二、示例项目创建和发布2.1创建一个测试项目2.2发布步骤三、服务开启和配置自启动3.1服务开启3.2将服务配置为系统自启动......
  • ROS 入门-如何在Ubuntu系统中安装不同版本的ROS并编写基本示例
    引言在当今快速发展的科技时代,机器人技术正以前所未有的速度改变着我们的生活。从工业生产线上的自动化装配,到家庭中的智能助手,再到医疗领域的精密手术,机器人无处不在。然而,随着机器人应用范围的不断扩展,如何高效地开发和部署复杂的机器人系统成为了亟待解决的问题。正是在......
  • ROS1 入门 —— 编写自定义节点Node
    引言机器人操作系统(RobotOperatingSystem,ROS)是一个开源的元操作系统,用于开发机器人的软件。它并不是一个真正的操作系统,而是一套软件框架和服务,设计用来帮助开发者构建复杂的机器人系统。ROS提供了硬件抽象、设备驱动、库、消息传递和工具包等,使得机器人软件的开发变得......