爱折腾-创客智造实验室 - ROS2与MoveIt2教程
type: channel
link: https://www.ncnynl.com/category/ROS2-MoveIt2/
description: 通过ROS3与MoveIt2入门教程学习，了解MoveIt2的主要功能、主要特征
items: ROS2与MoveIt2入门教程-目录
items: ROS2与MoveIt2入门教程-MoveIt2简介
items: ROS2与MoveIt2入门教程-MoveIt2软件安装
items: ROS2与MoveIt2入门教程-MoveIt2基本概念
items: ROS2与MoveIt2入门教程-MoveIt2中可用的规划器
items: ROS2与MoveIt2入门教程-插件接口
items: ROS2与MoveIt2入门教程-在RViz中快速上手MoveIt2
items: ROS2与MoveIt2入门教程-Move Group C++接口
items: ROS2与MoveIt2入门教程-机器人模型和机器人状态
items: ROS2与MoveIt2入门教程-规划场景

ROS2与MoveIt2入门教程-目录
type: item
date: 2021-10-20T08:22:00+00:00
description: 说明： 介绍ROS2与MoveIt2的目录 目录： ROS2与MoveIt2入门教程-MoveIt2简介 ROS2与MoveIt2入门教程-MoveIt2软件安装 ROS2与MoveIt2入门教程-MoveIt2基本概念 ROS2与MoveIt2入门教程-MoveIt2中可用的规划器 ROS2与MoveIt2入门教程-插件接口 ROS2与MoveIt2入门教程-在RViz中快速上手MoveIt2 ROS2与MoveIt2入门教程-Move Group C++接口 ROS2与MoveIt2入门教程-机器人模型和机器人状态 ROS2与MoveIt2入门教程-规划场景 ROS2与MoveIt2入门教程-规划场景监视器 ROS2与MoveIt2入门教程-规划场景ROS API ROS2与MoveIt2入门教程-MoveItCpp教程 ROS2与MoveIt2入门教程-URDF与SRDF ROS2与MoveIt2入门教程-实时机械臂伺服

ROS2与MoveIt2入门教程-MoveIt2简介
type: item
date: 2021-10-20T08:23:00+00:00
description: 说明： 介绍MoveIt2 MoveIt2简介 MoveIt2是专门为ROS 2从MoveIt迁移过来、主要用于机器人机械手或机械臂的运动规划软件框架，有助于将机器人带入未来。该框架综合了运动规划、机械（手）臂操纵、3D感知、运动学、控制和导航等方面的最新成果 MoveIt2的主要功能 该软件框架的主要功能包括： 运动规划 生成可顺利通过杂乱环境的高自由度轨迹 生成的轨迹或者路径可以避免（逃离）局部最小值 机械臂操纵 通过抓取生成（grasp generation）对机器人环境进行分析，并与该环境进行交互 逆运动学（Inverse Kinematics） 求解给定位姿的关节位置，甚至可用于过度制动的机械臂 控制 通过通用接口，对底层硬件控制器执行时间参数化的关节轨迹 3D感知 通过Octomaps，可以连接深度传感器和点云 碰撞检测 使用几何图元、网格或点云避开障碍物 MoveIt2的主要特征 该软件框架的主要特征有： 拥有3D交互式可视化工具Rviz，功能十分强大 该工具开箱即用的视觉展示功能允许新用户针对障碍物尝试各种避障规划算法。而在物理硬件上执行这些算法只需单击一下即可。 可充分利用仿真工具Gazebo，技术处于前沿 MoveIt通过充分利用基于物理的仿真工具，可以加速开发和测试周期。组合Gazebo、ROS Control和MoveIt，可以打造强大的机器人开发平台。 具有向导式配置助手，使用非常容易 通过使用逐步配置向导或者使用普遍的预配置设置，可以快速设置任何机器人以使用MoveIt。还可以配置Gazebo和ROS Control。 具有任务构造器，技术十分先进 可以一种灵活透明的方式来定义和规划由多个相互依赖的子任务组成的动作（actions）。 利用抓取生成技术，具有智能化特征 拥有基于几何和机器学习的抓取生成库，可用于MoveIt的机器人拾取和放置任务管道。 为什么要使用MoveIt2？ MoveIt是使用最广泛的机械臂操纵软件，已在150多种机器人上使用。该软件框架是根据 BSD 许可条款发布的，因此可以免费用于工业、商业和研究用途。 通过综合运动规划、机械臂操纵、3D感知、运动学、控制和导航方面的最新进展，MoveIt是最先进的移动机械臂操纵软件。 当前版本 截至目前（2021年10月），MoveIt2的版本为2.2，包含三个发行版或者分支，即适用于ROS 2 Foxy的Foxy 2.2 LST版本（长期支持版）、适用于ROS 2 Galactic的Galactic 2.2版本（推荐版本）、适用于ROS 2 Rolling的Rolling 2.2版本（开发版）。另外，目前维护的MoveIt版本为适用于ROS 1 Noetic的Noetic 1.1 LST版本 引用MoveIt相关论文 如果在研究中使用了MoveIt软件框架，请在您的出版物中包含以下引文之一： （1）David Coleman, Ioan A. Șucan, Sachin Chitta, Nikolaus Correll, Reducing the Barrier to Entry of Complex Robotic Software: a MoveIt! Case Study, Journal of Software Engineering for Robotics, 5(1):3–16, May 2014. doi: 10.6092/JOSER_2014_05_01_p3. （2）Ioan A. Sucan and Sachin Chitta, "MoveIt", [Online] Available at moveit.ros.org. （3）M. Görner, R. Haschke, H. Ritter, and J. Zhang, “Moveit! task constructor for task-level motion planning,” in IEEE Intl. Conf. on Robotics and Automation, pp. 190–196, May 2019. doi: 10.1109/ICRA.2019.8793898. 英语原文网址：https://moveit.ros.org/

ROS2与MoveIt2入门教程-MoveIt2软件安装
type: item
date: 2021-10-20T08:24:00+00:00
description: 说明： 介绍如何通过三种方式进行安装：二进制安装、从源代码编译安装、使用MoveIt2 LXD容器进行安装。 步骤： 二进制安装 MoveIt2的二进制安装方法最为简单，但目前仅适用于Ubuntu 20.04上的ROS 2 Foxy、ROS 2 Galactic 和 ROS 2 Rolling这三个发行版。如果机器上已经安装好了ROS 2的上述三个发行版之一，则MoveIt2的二进制安装命令为： sudo apt install ros-foxy-moveit 或者 sudo apt install ros-galactic-moveit 或者 sudo apt install ros-rolling-moveit 这样就可以完成MoveIt2二进制软件包的安装。 从源代码编译安装 目前主要支持在Linux操作系统（具体来说应该是Ubuntu）上从源代码编译安装MoveIt2软件框架 使用MoveIt2 LXD容器进行安装 对许多ROS用户来说，试用ROS 2的最大障碍之一就是需要付出很多努力来设置一切。MoveIt2 Foxy工作空间要求在Ubuntu 20.04操作系统上安装ros-foxy-desktop，而许多用户恰好没有时间或者能力进行这项工作。LXD镜像moveit2-foxy在Ubuntu 20.04环境中提供了一个预编译好的MoveIt2 Foxy工作空间，允许用户立即开始测试和调试。为此，用户需要做的就是下载该LXD镜像，并使用这个一步一步教你如何做的教程所述的gui配置文件启动该镜像。该镜像下载地址为：https://moveit-lxd-images.s3.us-east-2.amazonaws.com/moveit2-foxy.tar.gz 安装并初始化LXD sudo snap install lxd sudo lxd init 下载MoveIt2镜像并使用命令行客户端lxc将其导入到您的LXD寄存器中 lxc image import moveit2-foxy.tar.gz --alias moveit2-foxy 验证所有导入的镜像 lxc image list 应用 LXD GUI 配置文件。为了从LXD容器内部运行RViz或任何其他GUI应用程序，需要通过应用LXD启动配置文件来访问主机X11会话。为此，需要使用以下内容创建一个新文件gui.txt： config: environment.DISPLAY: :0 raw.idmap: both 1000 1000 user.user-data: | #cloud-config runcmd: - 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf' - 'echo export PULSE_SERVER=unix:/tmp/.pulse-native | tee --append /home/ubuntu/.profile' packages: - x11-apps - mesa-utils - pulseaudio description: GUI LXD profile devices: PASocket: path: /tmp/.pulse-native source: /run/user/1000/pulse/native type: disk X0: path: /tmp/.X11-unix/X0 source: /tmp/.X11-unix/X0 type: disk mygpu: type: gpu name: gui used_by: 创建一个新的名为gui的容器配置文件： lxc profile create gui cat gui.txt | lxc profile edit gui 启动LXD容器。使用默认配置文件和gui将镜像moveit2-foxy作为容器 moveit2-foxy启动： lxc launch --profile default --profile gui moveit2-foxy moveit2-foxy 具有sudo权限的用户ubuntu在正在运行的容器实例中打开一个bash shell： lxc exec moveit2-foxy -- sudo --user ubuntu --login 通过运行glxgears来验证GUI是否正常工作。如果glxgears不可用或命令失败，则请参阅下面的“GUI故障排除”部分 登录后，就可以在~/ws_ros2中找到预编译好的和源ROS2工作空间目录。现在已经准备就绪，可以开始运行MoveIt2的演示了（MoveItCpp、MoveGroup、MoveIt Servo…

ROS2与MoveIt2入门教程-MoveIt2基本概念
type: item
date: 2021-10-20T08:24:00+00:00
description: 说明： 介绍MoveIt2基本概念 基本概念： 本节教程是MoveIt2工作原理的概述。有关更具体的文档和详细信息，请参阅MoveIt2教程或面向开发人员的MoveIt2概念。 MoveIt2系统架构 MoveIt2快速高层图解** Move_Group节点 上图显示了MoveIt2提供的名为move_group的主要节点的高级系统架构。该节点在此充当了集成器：将所有单个组件聚集到一起，以提供一组ROS动作和服务供用户使用 用户接口（User Interface） 用户可以通过以下三种方式访问由move_group节点提供的各个动作和服务： 在C++中—使用move_group_interface软件包，该软件包为move_group提供了一个易于设置的C++接口 在Python中—使用moveit_commander软件包 通过GUI—使用Rviz（ROS可视化工具）的Motion Planning插件 节点move_group可以使用ROS参数服务器进行配置，而且该节点还会从ROS参数服务器中获取机器人的URDF和SRDF。 配置（Configuration） move_group是一个ROS节点。它使用ROS参数服务器来获取以下三类信息： URDF信息—节点move_group会在ROS参数服务器上查找robots_description参数以获取机器人的URDF。 SRDF信息—节点move_group会在ROS参数服务器上查找robots_description_semantic参数以获取机器人的SRDF。SRDF通常是由用户使用MoveIt设置助手（Setup Assistant）一次性创建的。 MoveIt其它配置信息—节点move_group会在ROS参数服务器上查找特定于MoveIt的其它配置信息，包括关节限制、运动学、运动规划、感知和其它信息。这些组件的配置文件由MoveIt设置助手自动生成，并存储在机器人对应的MoveIt配置软件包的config目录中。 机器人接口（Robot Interface） 节点move_group通过ROS话题和动作与机器人进行对话。该节点与机器人通信以获取机器人的当前状态信息（关节位置等），从机器人传感器上获取点云和其他传感器数据，并与机器人上的控制器进行对话。 关节状态信息 节点move_group侦听/joint_states话题以确定当前状态信息，即确定机器人的每个关节位于何处。节点move_group能够同时侦听多个该话题发布者发布的信息，即使这些发布者只发布有关机器人状态的部分信息（例如，单独的发布者可能用于发布机器人的手臂和移动底座的状态信息）。请注意，节点move_group不会设置自己的关节状态发布者—这是必须在每个机器人上实现的任务。 坐标变换信息 节点move_group使用ROS的TF库监控坐标变换信息。这允许节点获取有关机器人位姿的全局信息（以及其它信息）。例如，ROS 导航堆栈会将机器人的地图坐标系和底座坐标系之间的坐标变换发布到TF上。节点move_group就可以使用TF来计算内部使用的这种坐标变换。注意节点move_group只侦听TF。要从您的机器人发布TF信息，您将需要在您的机器人上运行一个robots_state_publisher节点。 控制器接口 节点move_group使用FollowJointTrajectoryAction接口与机器人上的控制器进行对话。这是一个ROS 动作接口。机器人上的服务器需要为这个动作提供服务——这个服务器不是由move_group节点本身提供的。节点move_group只会实例化一个客户端来与你机器人上的这个控制器动作服务器进行对话。 规划场景（Planning Scene） 节点move_group使用规划场景监视器（Planning Scene Monitor）来维护一个规划场景，规划场景是机器人世界和机器人当前状态的表示。机器人状态可以包括连接到机器人（由其携带）的任何物体，这些物体被认为是刚性连接到机器人上的。在下面的规划场景部分将概述有关用于维护和更新规划场景的体系结构的更多详细信息。 可扩展的功能 节点move_group的结构易于扩展—诸如拾取和放置、运动学、运动规划等单个功能实际上是作为具有一个公共基类的单独插件实现的。这些插件可以使用ROS通过一组ROS yaml参数和通过使用ROS pluginlib库进行配置。大多数用户不必配置move_group插件，因为这些插件是在MoveIt设置助手生成的启动文件中自动配置的。 动规划 运动规划插件 MoveIt2通过插件界面与运动规划器协同工作。这允许MoveIt2与来自多个库的不同运动规划器进行通信并使用这些运动规划器，从而使MoveIt…

ROS2与MoveIt2入门教程-MoveIt2中可用的规划器
type: item
date: 2021-10-20T08:30:00+00:00
description: 说明： 介绍在MoveIt2中可用的规划器 MoveIt2中可用的规划器 MoveIt2被设计成可以使用许多不同类型的规划器，非常适合根据以前的方法对改进的规划器进行基准测试。下面列出了已经可以在MoveIt2中使用的规划器，按其在MoveIt2中受欢迎程度/支持程度的降序排列 开源运动规划库（Open Motion Planning Library, OMPL） OMPL是一个开源运动规划库，该库主要实现了随机运动规划器。MoveIt2直接与OMPL集成，并使用该库中的各个运动规划器作为其主要/默认规划器集。OMPL中的规划器是抽象的；即OMPL没有机器人的概念。而MoveIt2会对OMPL进行配置，并为OMPL提供后端以处理机器人问题。该库在MoveIt2中是完全支持的 Pilz工业运动规划器 Pilz工业运动规划器是用于圆周运动和线性运动的确定性生成器。此外，它还支持使用MoveIt2功能将多个运动段混合在一起。 运动规划随机轨迹优化（STOMP） 运动规划随机轨迹优化STOMP（Stochastic Trajectory Optimization for Motion Planning）是一种基于优化的运动规划器，该规划器是基于 PI^2（路径积分策略改进，Theodorou等人，2010）算法之上的。该规划器可以为机械臂规划平滑的轨迹、避开障碍物并优化约束。该算法不需要梯度，因此可以优化成本函数中的任意项，如电机力（motor efforts）。该规划器在MoveIt2中是部分支持的 基于搜索的规划库（SBPL） 是一组通用的运动规划器，这些规划器使用基于搜索的规划方法来离散化空间。该规划库正在集成到最新版本的MoveIt2中 运动规划协变哈密顿优化（CHOMP） 运动规划协变哈密顿优化CHOMP（Covariant Hamiltonian Optimization for Motion Planning）是一种新颖的基于梯度的轨迹优化程序，它使许多日常运动规划问题变得既简单又可训练（Ratliff等人，2009c）。大多数高维运动规划器均将轨迹生成过程分割为规划和优化两个不同的阶段，而此算法在优化阶段利用协变梯度和函数梯度方法来设计完全基于轨迹优化的运动规划算法。在给定一个不可行的初始轨迹的情况下，CHOMP会对周围环境做出反应，以快速将轨迹从碰撞中脱离出来，同时优化诸如关节速度和加速度等动力学量。该算法可以迅速收敛到一条平滑无碰撞的轨迹，该轨迹可以在机器人上高效执行。此规划器正在集成到最新版本的MoveIt2中 参考英语原文地址：https://moveit.ros.org/documentation/planners/

ROS2与MoveIt2入门教程-插件接口
type: item
date: 2021-10-20T08:32:00+00:00
description: 说明: 介绍MoveIt2中不同类型的插件 概述： MoveIt2涉及到多个不同的领域，并提供了许多接口，以便让用户可以覆盖MoveIt2框架的不同部分和实现新的概念，而无需触碰该框架的核心。下面列出了MoveIt2中不同类型的插件，并概述了这些插件在该框架内的用途 MoveGroupCapability接口 用法 通过实现move_group_capability.h接口，可以实现需要频繁执行的功能。每个功能都可以访问move group context，包括例如避免碰撞的障碍物 应用领域 这种类型的插件通常以ros-action或简单的ros-topic的形式创建通信功能，并且可以在move group context上运行。因此，可能的应用非常多样化 接口说明 该接口在move_group_capability.h中定义。该接口主要由一个必须被覆盖的初始化函数组成 具体实现 MoveIt2提供了许多默认功能。可以在此处找到这些默认功能插件的说明。 一个具体的插件示例就是cartesian_path_service_capability。这个具体插件可用于计算笛卡尔路径。其初始化函数的实现如下所示。在这个示例中，该插件会发布一个包含有关轨迹信息的话题，以及一个用于计算新轨迹的服务。 void move_group::MoveGroupCartesianPathService::initialize() { display_path_ = node_handle_.advertise<moveit_msgs::DisplayTrajectory> (planning_pipeline::PlanningPipeline::DISPLAY_PATH_TOPIC, 10, true); cartesian_path_service_ = root_node_handle_.advertiseService(CARTESIAN_PATH_SERVICE_NAME, &MoveGroupCartesianPathService::computeService, this); } KinematicsBase接口 kinematics::KinematicsBase KinematicsBase接口使您能够： 编写您自己的正运动学和逆运动学解算器 封装外部的运动学解算器库 接口说明 具有良好文档的此接口位于此处。 具体实现 KinematicsBase接口的实现示例包括： KDL插件：header, cpp SrvKinematicsPlugin插件: header, cpp PlannerManager接口 planning_interface::PlannerManager 用法 MoveIt2规划器的基类。通过实现该类，可以将自己的规划器用于 MoveIt2中 接口说明 该接口是在planning_interface.h中定义的。 具体实现 MoveIt2这个接口的默认实现是OMPL规划器。 PlanningRequestAdapter接口 planning_request_adapter::PlanningRequestAdapter 此类型插件的概念已经作为“MoveIt2基本概念”文档的一部分进行了说明。 用法 在传递给解算器之前更新/调整运动规划请求，并操纵由该规划器生成的结果运动规划。默认情况下，MoveIt2中会使用以下适配器： AddTimeParameterization：将速度和加速度值添加到基于最大值的一条运动轨迹，用于后期处理 FixWorkspaceBounds：如果未指定，则添加一个规划量 FixStartStateBounds：确保关节编码器报告的关节值不超过关节极限值 FixStartStateCollision：有的时候，根据网格和URDF，关节编码器报告的当前机器人状态会被认为处于碰撞状态—这是由于噪声和建模不准确造成的 FixStartStatePathConstraints：修复违反路径约束的问题，例如在拿着一杯水时抓手的方位 ResolveConstraintFrames：将通过子级坐标系（例如位姿目标cup/handle）定义的约束坐标系变更为物体或机器人坐标系（例如cup） 接口说明 该接口位于这里 具体实现 该规划请求适配器当前是在为每个机器人生成的 ompl_planning_pipeline.launch中指定的。PlanningRequestAdapters的实现示例都可以在这个moveit_ros_planning文件夹中找到 MoveItControllerManager接口 moveit_controller_manager::MoveItControllerManage…

ROS2与MoveIt2入门教程-在RViz中快速上手MoveIt2
type: item
date: 2021-10-20T08:33:00+00:00
description: 说明： 介绍如何在RViz中快速上手MoveIt2 概述： 本教程将通过RViz和MoveIt2插件，快速让您使用MoveIt2进行运动规划。Rviz是ROS中的主要可视化工具，也是调试机器人的非常有用的工具。MoveIt2的Rviz插件允许您设置虚拟环境（场景）、以交互方式为机器人创建起始和目标状态、测试各种运动规划器以及可视化输出。现在让我们开始吧！ 第一步：启动演示和配置插件 启动演示，其命令为： ros2 launch moveit2_tutorials demo.launch.py rviz_tutorial:=true 如果是第一次启动该演示，则应该会在RViz中看到一个空白世界（如下图所示），且必须通过以下步骤添加运动规划插件（Motion Planning Plugin）： 在RViz左侧的“显示（Display）”子窗口的左下角，按下“添加（Add）”按钮； 从弹出的“创建可视化（Create Visualization）”对话框中，点击选择“By display type”选项卡中“moveit_ros_visualization”目录下的“Motion Planning”作为显示类型，按下“确定（Ok）”按钮； 现在应该会在RViz中看见熊猫（Panda）机器人，如下图所示： 一旦加载了运动规划插件（Motion Planning Plugin），就可以对其进行配置。在“显示（Display）”子窗口的“全局选项（Global Options）”选项卡中，将“固定坐标系（Fixed Frame）”字段的值设置为/panda_link0 现在，可以开始为您的机器人（在本例中为 Panda）配置运动规划插件了。点击“显示（Display）”子窗口中的“运动规划（Motion Planning）”项。 确保“机器人描述（Robot Description）”字段值设置为robot_description。 确保“规划场景话题（Planning Scene Topic）”字段值设置为 /monitored_planning_scene。点击话题名称（topic name）以显示话题名称下拉列表。 确保“规划路径（Planned Path）”下的“轨迹话题（Trajectory Topic）”设置为/display_planned_path。 在“规划请求（Planning Request）”中，将“规划组（Planning Group）”更改为panda_arm。这个设置也可以在左下角的“运动规划（MotionPlanning）”面板中看到（如下图所示）。 第二步：玩玩可视化机器人 有四种不同的可重叠可视化： 在/monitored_planning_scene规划环境中的机器人配置（默认处于激状态活）。 机器人的规划路径（默认情况下处于激活状态）。 绿色：运动规划的起始状态（默认情况下是禁用的）。 橙色：运动规划的目标状态（默认情况下处于激活状态）。 可以使用复选框打开和关闭每个可视化的显示状态： 使用“场景机器人（Scene Robot）”选项卡中的“显示机器人视觉（Show Robot Visual）”复选框来打开和关闭规划场景机器人。 使用“规划路径（Planned Path）”选项卡中的“显示机器人视觉（Show Robot Visual）”复选框来打开和关闭规划路径。 使用“规划请求（Planning Request）”选项卡中的“查询起始状态（Query Start State）”复选框来打开和关闭起始状态。 使用“规划请求（Planning Request）”选项卡中的“查询目标状态（Query Goal State）”复选框来打开和关闭目标状态。 使用所有这些复选框来打开和关闭不同的可视化。 第三步：与Panda机器人进行交互 对于接下来的步骤，只需要场景机器人、起始状态和目标状态： 选中“场景机器人（Scene Robot）”选项卡中的“显示机器人视觉（Show Robot Visual）”复选框。 取消选中“规划路径（Planned Path）”选项卡中的“显示机器人视觉（Show Robot Visual）”复选框。 选中“规划请求（Planning Request）”选项卡中的“查询目标状态（Query Goal State）”复选框。 选中“规划请求（Planning Request）”选项卡中的“查询起始状态（Query Start State）”复选框。 现在应该有两个交互标记。橙色手臂对应的标记将用于设置运动规划的“目标状态”，而绿色手臂对应的另一个标记用于设置运动规划的“起始状态”。如果没有看到交互标记，请按下RViz顶部菜单中的“交互（Interact）”按钮（注意：某些工具…

ROS2与MoveIt2入门教程-Move Group C++接口
type: item
date: 2021-10-20T08:34:00+00:00
description: 说明： 介绍Move Group C++接口 概述： 在MoveIt2中，最简单的用户界面可以通过MoveGroupInterface类来建立。该类为用户可能想要执行的大多数操作提供了易于使用的功能，特别是设置关节或位姿目标、创建运动规划、移动机器人、将物体添加到环境中以及将物体连接到机器人或者将物体从机器人上分离出来。该接口通过ROS话题、服务和动作与MoveGroup节点进行通信。 运行代码 打开两个终端。在第一个终端中启动RViz，然后等待加载完所有项目： ros2 launch moveit2_tutorials move_group.launch.py 在第二个终端中运行启动文件： ros2 launch moveit2_tutorials move_group_interface_tutorial.launch.py 片刻之后，RViz窗口应该会出现，并且看起来与本节教程开头的图片类似。要完成每个演示步骤，请按屏幕底部RvizVisualToolsGui面板中的“下一步（Next）”按钮，或者在光标聚焦RViz时选择屏幕顶部“工具（Tools）”面板中的“关键工具（Key Tool）”后按键盘上的N字母键。 预期输出 要查看预期输出，请观看本节教程顶部的YouTube视频。在RViz中，我们应该能够看到以下输出： 机器人将其手臂移动到其前方的位姿目标处。 机器人将其手臂移动到其侧面的关节目标处。 机器人将其手臂移回到一个新的位姿目标，同时保持末端执行器处于水平状态。 机器人沿着期望的笛卡尔路径（一个三角形向下、向右、向上+向左）移动其手臂。 一个盒子物体被添加到环境中位于机器人手臂右侧位置上。 机器人将手臂移动到位姿目标，避免与该盒子发生碰撞。 该物体被连接到机械臂手腕上（其颜色会变成紫色/橙色/绿色）。 该物体从机械臂手腕上分离开来（其颜色会变回绿色）。 该物体从环境中移除。 完整代码及其说明 完整代码可以在此处的MoveIt GitHub项目中看到。接下来将逐段解释各代码段的功能。 MoveIt2对称为“规划组（planning group）”的关节集合进行操作，并将它们存储在一个称为JointModelGroup的对象中。在整个MoveIt2中，术语“规划组（planning group）”和“关节模型组（joint model group）”是可以互换使用的。 static const std::string PLANNING_GROUP = "panda_arm"; 只需使用您想要控制和规划的规划组名称，即可轻松设置 MoveGroupInterface类 moveit::planning_interface::MoveGroupInterface move_group(move_group_node, PLANNING_GROUP); 这里将会使用PlanningSceneInterface类以便在“虚拟世界”场景中添加和删除碰撞物体： moveit::planning_interface::PlanningSceneInterface planning_scene_interface; 裸指针（raw pointers）频繁用于引用规划组以提高性能： const moveit::core::JointModelGroup* joint_model_group = move_group.getCurrentState()->getJointModelGroup(PLANNING_GROUP); 可视化 namespace rvt = rviz_visual_tools; moveit_visual_tools::MoveItVisualTools visual_tools(move_group_node, "panda_link0", "move_group_tutorial", move_group.getRobotModel()); visual_tools.deleteAllMarkers(); /* Remote control is an introspection tool that allows users to step through a high level script */ /* via buttons and keyboard shortcuts in RViz */ visual_tools.loadRemoteControl(); RViz提供了多种类型的标记，在这个演示中将会使用文本、圆柱体和球体标记： Eigen::Isometry3d text_pose = Eigen::Isometry3d::Identity(); text_pose.translation().…

ROS2与MoveIt2入门教程-机器人模型和机器人状态
type: item
date: 2021-10-20T08:37:00+00:00
description: 说明： 介绍MoveItCpp 概述： 在本节教程中，将会引导您了解MoveIt2中使用运动学的C++ API。 RobotModel和RobotState类 RobotModel和RobotState类是MoveIt2的核心类，可以让用户访问机器人运动学。 RobotModel类包含所有链接和关节之间的关系，包括从URDF加载的关节限制等属性。RobotModel类也会将机器人的链接和关节划分成SRDF中定义的多个规划组。可以在此处找到有关URDF和SRDF的单独教程：URDF和SRDF教程。 RobotState类包含有关机器人在某个时间点的信息，存储关节位置向量以及可选的速度和加速度。该信息可用于获取有关机器人的运动学信息，该信息取决于机器人当前状态，例如末端执行器的雅可比矩阵。 RobotState类也包含用于根据末端执行器位置（笛卡尔位姿）设置手臂位置和计算笛卡尔轨迹的辅助函数。 在本教程示例中，将会逐步引导用户了解这些类在Panda机器人上使用的过程。 运行代码 本教程中的所有代码都可以从作为MoveIt2安装组成部分之一的 moveit2_tutorials软件包中编译和运行。 使用ros2 launch命令直接从moveit2_tutorials软件包中的启动文件来运行该代码： ros2 launch moveit2_tutorials robot_model_and_robot_state_tutorial.launch.py 预期输出 预期输出会采用以下形式。由于这里使用的是随机关节值，因此数字会不相同： ... [robot_model_and_state_tutorial]: Model frame: world ... [robot_model_and_state_tutorial]: Joint panda_joint1: 0.000000 ... [robot_model_and_state_tutorial]: Joint panda_joint2: 0.000000 ... [robot_model_and_state_tutorial]: Joint panda_joint3: 0.000000 ... [robot_model_and_state_tutorial]: Joint panda_joint4: 0.000000 ... [robot_model_and_state_tutorial]: Joint panda_joint5: 0.000000 ... [robot_model_and_state_tutorial]: Joint panda_joint6: 0.000000 ... [robot_model_and_state_tutorial]: Joint panda_joint7: 0.000000 ... [robot_model_and_state_tutorial]: Current state is not valid ... [robot_model_and_state_tutorial]: Current state is valid ... [robot_model_and_state_tutorial]: Translation: -0.368232 0.645742 0.752193 ... [robot_model_and_state_tutorial]: Rotation: 0.362374 -0.925408 -0.11093 0.911735 0.327259 0.248275 -0.193453 -0.191108 0.962317 ... [robot_model_and_state_tutorial]: Joint panda_joint1: 2.263889 ... [robot_model_and_state_tutorial]: Joint panda_joint2: 1.004608 ... [robot_model_and_state_tutorial]: Joint panda_joint3: -1.125652 ... [robot_model_and_state_tutorial]: Joint panda_joint4: -0.278822 ... [robot_model_and_state_tutorial]: Joint panda_joint5: -2.150242 ... [robot_model_and_state_tutorial]: Joint panda_joint6: 2.274891 ... [robot_model_and_state_tutorial]: Joint panda_joint7: …

ROS2与MoveIt2入门教程-规划场景
type: item
date: 2021-10-20T09:33:00+00:00
description: 说明： 介绍如何使用规划场景 概述： PlanningScene类提供了用于碰撞检测和约束检测的主要接口。在本教程中，将会探索这个类的C++接口。 完整代码 本教程的完整代码可以在此处的MoveIt GitHub项目中看到。 设置。可以使用RobotModel或URDF和SRDF来轻松设置和配置PlanningScene类。 但是，这并不是实例化PlanningScene的推荐方法。PlanningSceneMonitor（会在下一个教程中详细介绍）是使用机器人关节和机器人上传感器数据来创建和维护当前规划场景的推荐方法。在本教程中，将会直接实例化一个PlanningScene类，但这种实例化方法仅用于演示目的。 robot_model_loader::RobotModelLoader robot_model_loader(planning_scene_tutorial_node, "robot_description"); const moveit::core::RobotModelPtr& kinematic_model = robot_model_loader.getModel(); planning_scene::PlanningScene planning_scene(kinematic_model); 自碰撞检测。我们要做的第一件事情就是检测当前状态下的机器人是否处于自碰撞状态，即机器人当前的配置是否会导致机器人各个部件之间的相互碰撞。为此，会构造一个CollisionRequest对象和一个CollisionResult对象并将它们传递给碰撞检测函数。请注意，机器人是否自碰撞会包含在该检测结果中。自碰撞检测会使用未填充（unpadded）版本的机器人，即直接使用URDF中提供的碰撞网格而没有添加额外的填充。 collision_detection::CollisionRequest collision_request; collision_detection::CollisionResult collision_result; planning_scene.checkSelfCollision(collision_request, collision_result); RCLCPP_INFO_STREAM(LOGGER, "Test 1: Current state is " << (collision_result.collision ? "in" : "not in") << " self collision"); 改变状态。现在，让我们来改变机器人的当前状态。规划场景会在内部维护机器人当前状态。我们可以获得对当前状态的引用并更改它，然后对机器人新配置进行碰撞检测。请特别注意，在发出新的碰撞检测请求之前需要清除collision_result对象值。 moveit::core::RobotState& current_state = planning_scene.getCurrentStateNonConst(); current_state.setToRandomPositions(); collision_result.clear(); planning_scene.checkSelfCollision(collision_request, collision_result); RCLCPP_INFO_STREAM(LOGGER, "Test 2: Current state is " << (collision_result.collision ? "in" : "not in") << " self collision"); 对规划组进行碰撞检测。现在，我们将仅对Panda机器人的手进行碰撞检测，即会检查该机器人的手和机器人身体的其他部分之间是否有任何碰撞。我们可以通过在碰撞请求中添加规划组名“hand”来具体要求这一点。 collision_request.group_name = "hand"; current_state.setToRandomPositions(); collision_result.clear(); planning_scene.checkSelfCollision(collision_request, collision_result); RCLCPP_INFO_STREAM(LOGGER, "Test 3: Current state is " << (collision_result.collision ? "in" : "not in") << " self collision"); 获取接触信息。首先，手动将Panda机器人的手臂（arm）设置到内部知道自碰撞确实会发…