Setup Assistant

MoveIt Setup Assistant 是一个图形用户界面,用于配置任意机器人以配合 MoveIt 使用。 它的主要功能是为你的机器人生成语义机器人描述格式(Semantic Robot Description Format,SRDF)文件, 该文件指定了 MoveIt 所需的附加信息,例如规划组(planning group)、末端执行器(end effector)以及各种运动学参数。 此外,它还会生成 MoveIt 流水线所需的其他必要配置文件。 要使用 MoveIt Setup Assistant,你需要拥有机器人的 URDF 文件。
有了 URDF 文件后,你就可以打开 MoveIt Setup Assistant 并导入你的 URDF。 本教程将引导你完成一系列步骤,以配置机器人的各个方面, 例如定义其运动学结构、指定规划组和末端执行器,以及与碰撞检查相关的设置。 想了解更多关于 URDF 和 SRDF 的信息,可以参考 URDF 与 SRDF 概述页面。
MoveIt 与 ROS 2
-
如果还没有安装 MoveIt,请先按照安装 MoveIt 的说明中的说明进行操作。
-
我们使用 moveit_resources_panda_description 包。如果你已经完成了 MoveIt 的安装说明,这个包应该已经包含在你的工作空间中了。
第 1 步:启动
Section titled “第 1 步:启动”-
启动 MoveIt Setup Assistant:
Terminal window ros2 launch moveit_setup_assistant setup_assistant.launch.py -
这将打开启动界面,界面中有两个选项:创建新的 MoveIt 配置包(Create New MoveIt Configuration Package)或编辑现有的 MoveIt 配置包(Edit Existing MoveIt Configuration Package)。
-
点击 创建新的 MoveIt 配置包(Create New MoveIt Configuration Package) 按钮,将出现以下界面:

-
点击 浏览(Browse) 按钮,导航到
moveit_resources_panda_description包中的panda.urdf文件,该文件位于以下路径:Terminal window ~/ws_moveit2/src/moveit_resources/panda_description/urdf/panda.urdf选择该文件,然后点击 加载文件(Load Files)。Setup Assistant 将加载这些文件(这可能需要几秒钟),并显示以下界面:

第 2 步:生成自碰撞矩阵
Section titled “第 2 步:生成自碰撞矩阵”默认的自碰撞(Self-Collision)矩阵生成器可以帮助减少运动规划时间,方法是禁用机器人上已知安全的连杆对之间的碰撞检查。 这是通过确定哪些连杆对始终处于碰撞状态、哪些从未碰撞、哪些在机器人的默认位姿下碰撞,或者沿运动学链彼此相邻来实现的。
你可以设置采样密度,它决定了要检查多少个随机机器人位姿来进行自碰撞检查。 虽然生成器默认检查 10,000 个随机位姿,但建议使用最大采样密度值,以确保获得更准确的结果。 碰撞检查以并行方式执行,以减少生成碰撞矩阵的整体处理时间。
要生成碰撞矩阵,请在 MoveIt Setup Assistant 左侧选择 自碰撞(Self-Collisions) 面板,并调整自碰撞采样密度。 然后,点击 生成碰撞矩阵(Generate Collision Matrix) 按钮开始计算。 Setup Assistant 将花费几秒钟计算自碰撞矩阵,其中包括检查哪些连杆对可以安全地从碰撞检查中禁用。

计算完成后,结果将显示在主表格中。 表格显示了已被识别为可以安全禁用或不能安全禁用碰撞检查的连杆对。 可以安全禁用的连杆对带有勾选标记。你可以根据需要手动调整勾选标记,以启用或禁用特定连杆对的自碰撞检查。

第 3 步:添加虚拟关节
Section titled “第 3 步:添加虚拟关节”虚拟关节主要用于将机器人连接到世界坐标系。
对于 Panda 机械臂这种固定基座机械臂来说,定义固定的虚拟关节是可选的。
不过,我们将定义一个 fixed 虚拟关节,将机械臂的 panda_link0 连接到 world 坐标系。
这个虚拟关节表示机械臂的基座在世界坐标系中保持静止。
-
点击 虚拟关节(Virtual Joints) 面板选择器。点击 添加虚拟关节(Add Virtual Joint)。
-
将关节名称设置为
virtual_joint。 -
将子连杆(child link)设置为
panda_link0,父坐标系(parent frame)名称设置为world。 -
将关节类型(Joint Type)设置为
fixed。 -
点击 保存(Save),你应该会看到以下界面:

注意:虚拟关节对于具有移动基座的机器人(例如移动机械臂)尤其有用。它们使得可以对机器人基座的运动进行建模,这对于运动规划和控制至关重要。例如,可以使用虚拟平面关节将机器人基座坐标系连接到里程计坐标系,从而有效地表示机器人在环境中的移动。
第 4 步:添加规划组
Section titled “第 4 步:添加规划组”MoveIt 中的规划组以语义方式描述机器人的不同部分,例如手臂或末端执行器,以方便运动规划。
move group 可以配置为对应机器人上的特定运动学链,即一组连杆和关节,它们定义了从机器人基座到末端执行器的变换序列。 例如,可以定义一个 move group 来表示机器人的手臂,它将包含移动手臂所需的所有连杆和关节。
move group 也可以由机器人上对应的连杆或关节集合来表示。 例如,可以定义一个 move group 来表示机器人的夹爪,它将包含协同运动以实现夹爪张开或闭合动作所需的所有连杆或关节。
-
点击 规划组(Planning Groups) 面板选择器。
-
点击 添加组(Add Group),你应该会看到以下界面:

添加手臂(arm)组
-
我们首先将 Panda 手臂添加为规划组:

-
现在,点击 添加关节(Add Joints) 按钮。你会看到左侧有一个关节列表。你需要选择属于手臂的所有关节并将它们添加到右侧。 关节按照内部树结构中存储的顺序排列。这使得选择串联关节链变得很容易。
- 点击
virtual_joint,按住键盘上的 Shift 键,然后点击panda_joint8。现在点击 > 按钮,将这些关节添加到右侧的 已选关节(Selected Joints) 列表中。
- 点击

- 点击 保存(Save) 以保存所选组。

添加末端执行器(end effector)组

注意:末端执行器不是由串联链连接的连杆组成的。因此,该组的 运动学求解器(Kinematic Solver) 应设置为 无(None)。
-
请按以下步骤操作:
-
点击 添加组(Add Group) 按钮。
-
将 组名称(Group Name) 输入为
hand。 -
让 运动学求解器(Kinematic Solver) 保持默认值,即 无(None)。
-
让 运动学搜索分辨率(Kin. Search Resolution) 和 运动学搜索超时(Kin. Search Timeout) 保持默认值。
-
点击 添加连杆(Add Links) 按钮。
-
选择
panda_hand、panda_leftfinger和panda_rightfinger,并将它们添加到右侧的 已选连杆(Selected Links) 列表中。 -
点击 保存(Save)。
-

添加完手臂组和手部组后,自定义组列表应如下所示。

注意:也可以使用 添加子组(Add Subgroup) 选项构建由其他 move group 组成的 move group。 在需要同时控制多个 move group 的情况下(例如规划多臂系统的同步运动时),这会很有用。
第 5 步:添加机器人位姿
Section titled “第 5 步:添加机器人位姿”Setup Assistant 允许你向机器人配置中添加预定义位姿,这对于定义特定的初始位姿或就绪位姿非常有用。 之后,可以使用 MoveIt API 命令机器人移动到这些位姿。
为手臂添加就绪(ready)位姿
-
点击 机器人位姿(Robot Poses) 面板。
-
点击 添加位姿(Add Pose)。为位姿选择一个名称。机器人将处于默认位姿,所有关节都设为零值。 移动各个关节,直到你满意为止,然后 保存 该位姿。注意位姿与特定组关联。你可以为每个组保存单独的位姿。
-
选择
panda_arm,并为它定义一个ready位姿,关节值如下{0.0, -0.785, 0.0, -2.356, 0.0, 1.571, 0.785}。 -
重要提示:试着移动所有关节。如果你的 URDF 中的关节限位(joint limits)有问题,你应该能立即在这里看到。

为夹爪添加张开(open)和闭合(close)位姿
-
按照为手臂定义位姿的相同步骤操作,但选择
hand组。 -
为
hand组添加一个open位姿,关节值为0.035。

- 为
hand组添加一个close位姿,关节值为0.0。

注意:列表中只出现
panda_finger_joint1,因为panda_finger_joint2是模仿它值的关节(mimic joint)。
完成上述步骤后,应该为 panda_arm 和 hand 组定义以下这组机器人位姿。

第 6 步:标记末端执行器
Section titled “第 6 步:标记末端执行器”既然我们已经将 Panda 的手部添加为 move group,我们就可以将它指定为末端执行器。 通过将组指定为末端执行器,MoveIt 可以对它执行某些特殊操作。 例如,在执行抓取与放置(pick-and-place)任务时,可以使用末端执行器将物体附着到手臂上。
-
点击 末端执行器(End Effectors) 面板。
-
点击 添加末端执行器(Add End Effector)。
-
选择
hand作为夹爪的 末端执行器名称(End Effector Name)。 -
选择
hand作为 末端执行器组(End Effector Group)。 -
选择
panda_link8作为该末端执行器的 父连杆(Parent Link)。 -
将 父组(Parent Group) 留空。

第 7 步:添加被动关节
Section titled “第 7 步:添加被动关节”被动关节(Passive Joints) 面板用于指定机器人中可能存在的任何被动关节。 这些关节没有驱动,也就是说它们不能被直接控制。 指定被动关节很重要,这样规划器才能知道它们的存在并避免为它们规划。 如果规划器不知道被动关节的存在,它们可能会尝试规划涉及移动被动关节的轨迹,这将导致无效的规划。 Panda 机器人手臂没有任何被动关节,所以我们将跳过这一步。
第 8 步:ros2_control URDF 修改
Section titled “第 8 步:ros2_control URDF 修改”ros2_control URDF 修改(ros2_control URDF Modification) 面板帮助修改机器人 URDF,使其能与 ros2_control 配合工作。
注意:如果你的机器人 URDF/xacro 已经包含
ros2_control.xacro,你可以跳过这一步。
这种修改会为所定义 move group 中的每个关节添加命令接口和状态接口标签。
command_interface 标签定义了可以发送来控制该关节的命令类型。
state_interface 标签定义了可以从该关节读取的状态信息类型。
默认情况下,MoveIt Setup Assistant 假定使用 position 命令接口,以及 position 和 velocity 状态接口,我们将沿用这一设置。

如有必要,为你的机器人关节选择所需的命令或状态接口,然后点击 添加接口(Add Interfaces) 按钮。
第 9 步:ROS 2 控制器
Section titled “第 9 步:ROS 2 控制器”ROS 2 Control 是一个用于机器人实时控制的框架,旨在管理和简化新机器人硬件的集成。 更多细节,请查看 ros2_control 文档。
ROS 2 控制器(ROS 2 Controllers) 面板可用于自动生成模拟控制器来驱动机器人关节。

添加手臂控制器
-
点击 ROS 2 控制器(ROS 2 Controllers) 面板选择器。
-
点击 添加控制器(Add Controller),你应该会看到以下界面:
-
我们将首先添加 Panda 手臂的关节轨迹控制器(joint trajectory controller)。
-
将 控制器名称(Controller Name) 输入为
panda_arm_controller。 -
选择 joint_trajectory_controller/JointTrajectoryController 作为控制器类型:

-
接下来,我们需要选择控制器的关节。关节可以单独添加,也可以通过 move group 添加。
-
现在,点击 添加规划组关节(Add Planning Group Joints)。
-
从 可用组(Available Groups) 选项卡中选择
panda_arm组,并将其添加到 已选组(Selected Groups)。 -
点击 保存(Save) 以保存所选控制器。

添加手部控制器
- 按照与手臂相同的步骤操作,但选择 position_controllers/GripperActionController:

-
从 可用组(Available Groups) 选项卡中选择
hand组,并将其添加到 已选组(Selected Groups)。 -
点击 保存(Save) 以保存所选控制器。

选择手臂和手部控制器后,控制器列表应如下所示。

第 10 步:MoveIt 控制器
Section titled “第 10 步:MoveIt 控制器”MoveIt 需要具有 FollowJointTrajectoryAction 接口的轨迹控制器来执行规划的轨迹。
该接口将生成的轨迹发送给机器人的 ROS 2 控制器。
MoveIt 控制器(MoveIt Controllers) 面板可用于自动生成 MoveIt 控制器管理器要使用的控制器。 确保控制器名称与上一步 ROS 2 控制器步骤中配置的名称一致。 这一步的用户界面与上一步类似。

添加手臂的 MoveIt 控制器
-
点击 MoveIt 控制器(MoveIt Controllers) 面板选择器。
-
点击 添加控制器(Add Controller) 以创建新的手臂控制器。
-
将 控制器名称(Controller Name) 输入为
panda_arm_controller。 -
选择 FollowJointTrajectory 控制器类型。
-
使用
panda_arm规划组选择控制器关节。 -
保存控制器。

添加手部的 MoveIt 控制器
-
点击 添加控制器(Add Controller) 以创建新控制器。
-
将 控制器名称(Controller Name) 输入为
hand_controller。 -
选择 Gripper Command 控制器类型。
-
使用
hand规划组选择控制器关节。 -
保存控制器。

完成上述步骤后,手臂和手部的 MoveIt 控制器列表应如下所示。

第 11 步:感知
Section titled “第 11 步:感知”Setup Assistant 中的感知(Perception)选项卡用于配置机器人使用的 3D 传感器设置。 这些设置保存在名为 sensors_3d.yaml 的 YAML 配置文件中。
如果不需要 sensors_3d.yaml,请选择 无(None) 并进入下一步。

要生成 point_cloud 配置参数,请参见以下示例:
注意:此配置对 Panda 机器人手臂无效,因为它没有
head_mounted_kinect相机。

有关这些参数的更多细节,请参阅感知流水线教程。
第 12 步:启动文件
Section titled “第 12 步:启动文件”在 启动文件(Launch Files) 面板中,你可以查看将要生成的启动文件列表。 默认选项通常就足够了,但如果你对应用程序有特定要求,可以按需修改。 点击每个文件可以查看其功能的摘要。

第 13 步:添加作者信息
Section titled “第 13 步:添加作者信息”Colcon 需要作者信息用于发布。
-
点击 作者信息(Author Information) 面板。
-
输入你的姓名和电子邮件地址。
第 14 步:生成配置文件
Section titled “第 14 步:生成配置文件”快完成了。最后一步——生成开始使用 MoveIt 所需的全部配置文件。
-
点击 配置文件(Configuration Files) 面板。为将要生成的、包含你的新配置文件的 ROS 2 包选择一个位置和名称。 点击 浏览(Browse),选择一个合适的位置(例如你的 ROS 2 工作空间的 src 目录),点击 创建文件夹(Create Folder), 将其命名为
panda_moveit_config,然后点击 打开(Open)。所有生成的文件将直接进入你选择的目录。 -
点击 生成包(Generate Package) 按钮。Setup Assistant 现在将在你选择的目录中生成一组启动文件和配置文件。 所有生成的文件都会出现在“待生成文件”(files to be generated)选项卡中,你可以点击每个文件查看其功能说明。 有关生成文件的更多信息,请参阅文档中的配置一节。

恭喜!你现在已经完成了生成 MoveIt 所需配置文件的工作。
构建 panda_moveit_config 包并运行演示
Section titled “构建 panda_moveit_config 包并运行演示”要只构建生成的 panda_moveit_config 包并运行演示,请按以下步骤操作。
cd ~/ws_moveit2colcon build --packages-select panda_moveit_configsource install/setup.bash启动 MoveIt 演示,在 RViz 中交互式地规划并执行机器人的运动。
ros2 launch panda_moveit_config demo.launch.py查看这段简短的 YouTube 视频,了解如何命令机器人移动到预定义的 ready 位姿,并在手部执行 open 和 close 动作的示例。
接下来做什么
Section titled “接下来做什么”使用 RViz 开始 MoveIt 运动规划
- 学习如何使用生成的配置文件在 RViz 中使用 MoveIt 规划和可视化运动。 请参阅 MoveIt Quickstart in RViz 教程获取分步指南。
编写你的第一个 C++ MoveIt 应用程序
URDF 与 SRDF:了解差异
- 参见 URDF 与 SRDF页面,了解本教程中提到的 URDF 和 SRDF 组件的更多细节。
探索可用的逆运动学求解器