系列文章目录
前言
一、导入 URDF 模型: Turtlebot
Omniverse Isaac Sim 拥有多种工具,可促进与 ROS 系统的集成。我们有 ROS 和 ROS2 桥接器、URDF 导入器等等。本系列教程将举例说明如何使用这些工具。
1.1 学习目标
在本示例中,我们将在 Isaac Sim 中设置一个 Turtlebot3,并使其能够四处行驶。
如果你已经有了一个已装配好关节和属性的 USD 格式机器人,并希望直接使用我们的 ROS 桥接器,请转到本系列的下一个教程 通过 ROS2 消息驱动 TurtleBot。
1.2 开始使用
重要事项
在运行 Isaac Sim 之前,请确保在终端中为 ROS 2 安装源代码。如果 ROS 2 的源代码是 bashrc 的一部分,则可以直接运行 Isaac Sim。
1.2.1 前提条件
- 完成 ROS 和 ROS 2 安装,以便 ROS2 可用、ROS2 扩展已启用、必要的环境变量已设置。
- 基本了解 ROS 工作区。
- 下载 Nucleus 以访问 Isaac 环境。
1.3 导入 TurtleBot URDF
如果您还没有下载并构建 Turtlebot3 的说明包,请下载并构建。您可以在提供的 ROS2 工作区中构建它。
git clone -b <distro>-devel https://github.com/ROBOTIS-GIT/turtlebot3.git turtlebot3
在 turtlebot3/turtlebot3_description/urdf/turtlebot3_burger.urdf 中找到 Turtlebot3 Burger 的 Urdf 文件。
在本教程中,您只需构建 turtlebot3_description 软件包。请随意绕过软件源中的其他软件包。
- 在本系列教程中,我们将使用 Isaac 环境,但您也可以将机器人导入到您选择的任何环境中。进入视口下方的 “内容 ”选项卡打开环境,找到 Isaac/Environments/Simple_Room/simple_room.usd。如果不想使用提供的环境,只需确保环境中有一个地面平面和一个物理场景。两者都可以在创建 -> 物理场景中找到。您可能还需要一些灯光,请在创建 -> 灯光中使用各种类型的灯光,以获得所需的效果。
- 在一个新的舞台上,将 simple_room.usd 拖到舞台上,并将其置于原点,方法是将变换属性中的所有 “平移 ”组件清零。您可能需要放大一些才能看到房间内的桌子。
- 打开 URDF 导入器 Isaac Utils > Workflows > URDF Importer。
- 在提示窗口的 “导入选项 ”部分,取消选中 “清除舞台 ”以保留现有环境,取消选中 “固定基础链接”(因为这是一个移动机器人),将 “关节驱动类型 ”改为 “速度”,以便稍后可以正确驱动车轮。
- 在 “导入 ”部分,首先在 “输入文件 ”中找到要导入的 URDF 文件。只有选定文件后,导入按钮才会启用。
- 资产导入到 Omniverse Kit 后,将自动保存一份 .usd 版本的资产副本。如果您希望在 “输出目录 ”中保存资产的文件夹与 .urdf 文件所在的文件夹不同,请指定该文件夹。与 .urdf 文件匹配的文件夹名称将在指定目录中创建,.usd 文件将位于新创建的文件夹中。
- 确保取消选择舞台上的所有内容,方法是点击舞台选项卡内的空白处,或选择树上的/World。否则,你可能会将 Turtlebot 作为树上随机对象的子对象导入。
- 点击导入。
- 第一次导入 Turtlebot 时,它将位于桌面上。使用小工具将它放在房间地板的正上方。
- 按下 “播放 ”键,你会看到海龟宝宝掉到地板上。
1.3.1 调整机器人
只要 Omniverse Isaac Sim 中的材料、物理和关节属性是可用的,并且有匹配的类别,URDF 导入器就会自动导入。但是,如果没有可用的或匹配的类别,或者两个系统的单位不同,自动填入的内容就可能不准确,从而改变机器人的行为。以下是一些可以调整以纠正机器人行为的属性。
1.3.1.1 摩擦属性
如果机器人的轮子打滑,可尝试按照添加简单物体中的 3.4.2 步骤更改轮子的摩擦系数,也可以更改地面的摩擦系数。
1.3.1.2 物理属性
如果没有给出明确的质量或惯性属性,物理引擎将从几何网格中估算出这些属性。要更新质量和惯性属性,请找到包含给定链接刚体的底图(您可以在其属性选项卡下找到 “物理 > 刚体 ”来验证)。如果其 “物理 ”属性选项卡下已有 “质量 ”类别,请进行相应修改。如果还没有 “质量 ”类别,可以点击属性选项卡顶部的+添加按钮,然后选择 “物理 > 质量 ”来添加。
1.3.1.3 关节属性
如果您的机器人在关节处摆动或移动速度太慢,请查看关节的刚度和阻尼参数。高刚度会使关节更快、更坚硬地卡住预期目标,而高阻尼会使关节运动更平滑,但也会减慢运动速度。对于纯位置驱动,应设置相对较高的刚度和较低的阻尼。对于速度驱动,刚度必须设置为零,阻尼不能为零。
注意事项
URDF 导入程序结束后,舞台上出现的机器人通常会作为参照载入。这可以通过舞台树视孔中机器人底图上的橙色箭头来确认。如果您在更改参数和保存参数时遇到问题,可能需要编辑参考所指向的原始 USD 文件。要查找原始 USD 文件的文件路径,请导航至 “属性 ”选项卡,并转至 “引用”>“资产路径”。
内容总结
本教程涵盖以下主题:
- 导入 URDF
- 调整机器人参数
下一步
继续阅读我们的 ROS 教程系列中的下一篇教程:通过 ROS2 消息驱动 TurtleBot,了解如何添加 omnigraph 节点来移动机器人,以及如何添加 ROS2 桥接节点来连接 ROS 网络。
进一步学习
- 更多详情 URDF Importer.
- 世界构建的更多详情 组装一个简单的机器人
- 增益调谐器扩展和(已删除)衔接检查器扩展的更多详情
二、URDF 导入器
2.1 关于
注意事项
从 Isaac Sim 2023.1.0 版开始,URDF 导入器已开源。源代码和贡献信息可在我们的 github repo 上找到。
URDF 导入扩展用于导入机器人的 URDF 表示法。统一机器人描述格式(URDF)是一种在 ROS 中表示机器人模型的 XML 格式。
要访问该扩展,请进入顶部菜单栏,点击 Isaac Utils > Workflows > URDF Importer。
该扩展默认已启用。如果被禁用,可在扩展管理器中搜索 omni.importer.urdf 重新启用。
2.2 公约
警告
为遵守美元 prim 名称约定,不支持链接或连接名称中的特殊字符,并将用下划线代替。如果由于替换而导致名称以下划线开头,则会预先加上 a。建议直接在 urdf 中更改名称。
有关 Omniverse Isaac Sim 约定的完整列表,请参阅 Isaac Sim 约定文档。
2.3 用户界面
参考编号 | 项目 | 说明 |
---|---|---|
1 | Information | 该面板包含有关此扩展的有用信息。 |
2 | Import Options | 此面板具有测试为衔接设置的增益的实用功能。详情请参阅下面的导入选项。 |
3 | Input | 此面板包含输入选项(默认情况下通过 URDF 文件)。 |
4 | Import | 此面板包含目标路径和导入按钮。 |
— |
| 保存转换后的 URDF 的路径。 |
— |
| 用于导入 URDF 并将其保存为 USD。 |
2.4 导入选项
项目 | 描述 |
---|---|
Merge Fixed Joints | 合并由固定关节连接的链接,使衔接只应用于移动的关节。合并后的框架仍将作为被合并的父框架的子框架显示。 |
Replace Cylinders with Capsules | 用 “胶囊 ”基元替换所有 “圆柱体 ”基元(本应转换为网格)。 |
Fix Base Link | 选中此项后,机器人的底座将固定在世界坐标中的位置。 |
Import Inertia Tensor | 勾选后可直接从 urdf 加载惯性。如果 urdf 未指定惯性张量,则将使用身份并按比例因子缩放。如果未选中,Physx 将自动计算。非对角线惯性矩阵分量将与对角线一起用于计算主轴表示。 |
Stage Units Per Meter | 您可以在此设置缩放因子,以便与 URDF 中使用的单位相匹配。目前,URDF 导入器仅支持全局统一缩放。针对不同轴和特定网格部分应用不同的缩放比例(即使用 URDF 网格标签下的缩放比例参数)将在未来版本中提供。如果您的 URDF 中有缩放比例参数,您可能需要手动调整 URDF 中的其他值,以便所有参数都使用相同的单位。 |
Link Density | 如果链接没有给定的质量,则使用该密度(Kg/m^3)根据链接体积计算质量。如果数值为 0.0,则物理引擎也会自动计算密度。 |
Joint Drive Type | 默认关节驱动类型,值可以是 “无”、“位置 ”和 “速度”。也可以在导入前对每个关节单独进行更改。 |
Override Joint Dynamics | 如果选中此项,将使用关节驱动强度和阻尼,而不考虑 URDF 中提供的值。 |
Joint Drive Strength | 驱动强度是位置驱动关节的刚度,或速度驱动关节的阻尼。 |
Joint Position Drive Damping | 如果驱动类型设置为位置,则使用默认阻尼值。 |
Clear Stage | 选中此项时,将在加载新的 URDF 之前清除平台,否则将加载到位置(0,0,0)处的当前打开平台上。 |
Normals Subdivision | 法线细分方案。如果导入的网格包含自动绘制的法线,请选择 “无 ”以避免覆盖这些法线。 |
Convex Decomposition | 如果选中,碰撞对象将由一组凸面网格组成,以更好地匹配视觉资产。否则将使用碰撞对象上的凸壳。 |
Self Collision | 启用相邻链接之间的自碰撞。如果碰撞网格在连接处相交,可能会导致不稳定。 |
Collision From Visuals | 如果碰撞没有作为自己的网格自动生成,则选中此项以使用可视化网格定义碰撞器。 |
Create Physics Scene | 在舞台上创建默认物理场景。由于该物理场景是在机器人资产之外创建的,因此不会加载到与机器人资产一起组成的其他场景中。 |
Create Instanceable Asset | 选择此项可创建具有可实例化网格的资产。这对包含同一机器人多个实例的场景(如强化学习任务)非常有用。 |
Parse Mimic Joint Tag | 如果选择此选项,将在导入时解析拟态标签,否则将导入关节,但不会将其添加为拟态。 |
注意事项
建议将 “自碰撞 ”设置为 “假”,除非您确定机器人上的链接不会发生自碰撞。
注意事项
已知问题: 如果 URDF 中有多个资产包含相同的材质名称,则只会创建一个材质,无论材质中的参数是否不同(例如,两个网格的材质名称为 “material”,其中一个为蓝色,另一个为红色。) 这也适用于纹理材质。
注意事项
您必须有写入权限访问用于导入的输出目录,该目录默认为当前打开的阶段,请根据需要进行更改。
2.5 每个关节驱动设置
选择源后,屏幕上会显示所有机器人关节的列表,您可以选择更适合每个关节的关节驱动类型和模式。例如,一个移动底座与一个 6-DOF 机械臂共同连接,就会有速度驱动的车轮关节和基于位置的机械臂关节。
2.6 导入工作流程
- 选择更符合您需求的导入选项
- 选择用于转换为美元的输入值
- 审查接头和驱动
- 导入
2.7 从 ROS2 节点导入 URDF
要启用此功能,请启用 omni.isaac.ros2_bridge.robot_description 扩展。这将改变URDF导入器的用户界面,允许在选择包含机器人描述的urdf文件或ROS2节点之间进行切换。
要选择适当的节点,请在节点文本框中键入节点名称。如果对导入设置或发布的节点进行了更改,请点击 “刷新”。如果节点名称在
注意
只有启用 ROS2 桥接器后,才能使用此功能。
2.8 机器人属性
您可能需要调整机器人的许多属性。这些属性可能分布在许多不同的模式和应用程序接口中。
获取和设置参数的一般步骤是
- 查找参数所属的应用程序接口。最常见的参数可在 Pixar USD API 中找到。
- 获取应用 API 的 prim 句柄。例如,关节(Articulation)和驱动(Drive)API 应用于关节,质量(MassAPIs)应用于刚体。
- 获取 API 的句柄。然后,您就可以获取或设置与该 API 相关的属性。
例如,如果我们要设置车轮的驱动速度和致动器的刚度,就需要找到 DriveAPI:
# 为两个车轮获取驱动 API 的句柄
left_wheel_drive = UsdPhysics.DriveAPI.Get(stage.GetPrimAtPath("/carter/chassis_link/left_wheel"), "angular")
right_wheel_drive = UsdPhysics.DriveAPI.Get(stage.GetPrimAtPath("/carter/chassis_link/right_wheel"), "angular")
# 以度/秒为单位设置速度驱动目标
left_wheel_drive.GetTargetVelocityAttr().Set(150)
right_wheel_drive.GetTargetVelocityAttr().Set(150)
# 设置驱动阻尼,控制速度驱动的强度
left_wheel_drive.GetDampingAttr().Set(15000)
right_wheel_drive.GetDampingAttr().Set(15000)
# 设置驱动刚度,控制位置驱动的强度
# 在本例中,由于我们要进行速度控制,因此应将其设置为零
left_wheel_drive.GetStiffnessAttr().Set(0)
right_wheel_drive.GetStiffnessAttr().Set(0)
另外,您也可以使用 Omniverse 命令工具扩展来更改用户界面中的值,并获取更改属性的相关 Omniverse 命令。
注意事项
- 在关节驱动上使用位置控制时,应设置驱动刚度参数。
- 在关节驱动上使用速度控制时,应设置驱动阻尼参数。
- 在驱动器上同时设置刚度和阻尼将导致同时应用两个目标,这在位置控制中对减少振动非常有用。
2.9 自定义 Isaac Sim URDF 属性和标记
2.9.1 sensor.isaac_sim_config
该属性用于传感器标签,为传感器提供 Isaac sim 配置。有两种可能的用途--随 Isaac sim 提供的预配置激光雷达或用户自定义配置。与用户自定义配置一起使用时,必须提供配置 json 的位置,否则就必须提供预配置激光雷达的配置名称。URDF Importer 的测试中提供了一个示例配置文件,位于 data/lidar_sensor_template 中。
注意事项
使用自定义激光雷达配置时,导入程序会尝试在 omni.isaac.sensor` 文件夹中创建一个指向配置的符号链接。如果在 Windows 环境下出现错误代码 请尝试以管理员权限运行 Isaac Sim,或在导入后手动创建符号链接。或者,将导入资产路径添加到 omni.isaac.sensor 的查找文件夹中。如果在 Windows 系统中出现错误代码 183 表示符号链接已经存在,请仔细检查并在必要时手动替换。
示例
<robot>
<link name="root_link"/>
<joint name="root_to_base" type="fixed">
<parent link="root_link"/>
<child link="link_1"/>
</joint>
<link name="link_1"/>
<sensor name="custom_lidar" type="ray" update_rate="30" isaac_sim_config="../lidar_sensor_template/lidar_template.json">
<parent link="link_1"/>
<origin xyz="0.5 0.5 0" rpy="0 0 0"/>
</sensor>
<sensor name="preconfigured_lidar" type="ray" update_rate="30" isaac_sim_config="Velodyne_VLS128">
<parent link="link_1"/>
<origin xyz="0.5 1.5 0" rpy="0 0 0"/>
</sensor>
</robot>
2.10 教程和示例
以下教程和示例展示了如何最好地使用该扩展:
2.10.1 教程
从 ROS2 节点导入
注意
这些教程仅支持 Linux 系统。
2.10.1.1 前提条件
ROS 2
带有机器人说明的 ROS 2 工作区(例如 Universal Robots ROS2 说明)。
2.10.1.2 步骤
终端 1
- 源代码 ROS 2
- 启动机器人描述节点的转换发布器(例如,ros2 launch ur_description view_ur.launch.py ur_type:=ur10e)
终端 2
- 源 ROS 2
- 使用 ros2 节点列表为刚刚创建的节点选择 ROS 2 节点名称。(例如:robot_state_publisher)
终端 3
- 源 ROS 2
- 启动 isaac 模拟
- 启用扩展 omni.isaac.ros2_bridge.robot_description
- 使用 Isaac Utils > Workflows > URDF Importer 菜单打开 URDF Importer
- 在 “输入 ”部分,选中 “使用 ROS2 节点”。
- 在文本框中输入节点名称
- 定义输出目录
- 导入
尝试其他步骤:
终端 1
- 停止发布器,将其更改为另一个机器人,然后再次启动服务(例如,ros2 launch ur_description view_ur.launch.py ur_type:=ur3)
终端 3
- 点击刷新按钮
- 更改输出目录
- 导入
2.10.2 示例
- 卡特示例: 以撒示例 > 导入机器人 > 卡特 URDF
- Franka 示例: 以赛示例 > 导入机器人 > 弗兰卡 URDF
- Kaya 示例: 以赛示例 > 导入机器人 > 卡亚 URDF
- UR10 示例: 以赛示例 > 导入机器人 > UR10 URDF
注意事项
对于这些示例,请等待加载材料。您可以在用户界面右下角跟踪进度。
2.10.2.1 卡特 URDF 示例
运行示例
- 转到顶部菜单栏,单击 Isaac Examples(以撒示例)> Import Robots(导入机器人)> Carter URDF。
- 按下 “加载机器人 ”按钮,将 URDF 导入舞台,添加地平面、灯光和物理场景。
- 按下 “Configure Drives(配置驱动器)”按钮,配置关节驱动器并允许后枢轴自由旋转。
- 按下 “Open Source Code(打开源代码)”按钮查看源代码。源代码说明了如何使用 Python API 导入和集成机器人。
- 按下 PLAY(播放)按钮开始模拟。
- 按下 Move to Pose 按钮,使机器人向前移动。
2.10.2.2 弗兰卡 URDF 示例
- 转到顶部菜单栏,单击 Isaac Examples(以赛示例)> Import Robots(导入机器人)> Franka URDF。
- 按 “加载机器人”(Load Robot)按钮将 URDF 导入舞台,添加地平面、灯光和物理场景。
- 按下 “Configure Drives(配置驱动器)”按钮配置关节驱动器。这将设置每个驱动器的刚度和阻尼值。
- 按 “打开源代码 ”按钮查看源代码。源代码说明了如何使用 Python API 导入和集成机器人。
- 按 “播放 ”按钮开始模拟。
- 按下 “移动到姿势 ”按钮,使机器人移动到原点/静止位置。
2.10.2.3 卡亚 URDF 示例
- 转到顶部菜单栏,单击 Isaac Examples(以赛示例)> Import Robots(导入机器人)> Kaya URDF。
- 按 “加载机器人”(Load Robot)按钮将 URDF 导入舞台,添加地平面、灯光和物理场景。
- 按下 “Configure Drives(配置驱动器)”按钮配置关节驱动器。这将设置每个滚轮的驱动刚度和阻尼值,并将所有滚轮设置为自由旋转。
- 按 “打开源代码 ”按钮查看源代码。源代码说明了如何使用 Python API 导入和集成机器人。
- 按下 PLAY(播放)按钮开始模拟。
- 按下 Move to Pose 按钮,使机器人原地旋转。
2.10.2.4 UR10 URDF 示例
- 转到顶部菜单栏,单击 Isaac Examples(以撒示例)> Import Robots(导入机器人)> Kaya URDF。
- 按 “加载机器人”(Load Robot)按钮将 URDF 导入舞台,添加地平面、灯光和物理场景。
- 按下 “Configure Drives(配置驱动器)”按钮配置关节驱动器。这将设置每个驱动器的刚度和阻尼值。
- 按 “打开源代码 ”按钮查看源代码。源代码说明了如何使用 Python API 导入和集成机器人。
- 按 “播放 ”按钮开始模拟。
- 按下 “移动到姿势 ”按钮,使机器人移动到原点/静止位置。
三、组装简单的机器人
Omniverse Isaac Sim 的图形用户界面功能与 NVIDIA Omniverse™ USD Composer 相同,后者是一款专门用于构建世界的应用程序。在本系列教程中,我们将重点介绍与机器人用途最相关的图形用户界面功能。如需了解更复杂的通用世界创建功能,请查阅 Omniverse Composer。
在本教程中,我们将为一个简单的 “机器人 ”装配三个链接和两个外旋关节,以介绍关节和衔接的基本概念。我们将使用在 “添加简单对象 ”中添加到舞台上的对象,并将其转化为具有矩形身体和两个圆柱形轮子的模拟移动机器人。虽然从 extensions:isaac_onshape_importer_tutorials_importing 或 URDF Importer 中导入的机器人不需要这一步,但这些概念对于调整机器人和组装带有关节的对象非常重要。
3.1 学习目标
本教程详细介绍如何装配双轮移动机器人,包括如何
- 组织阶段树层次结构
- 在两个刚体之间添加关节
- 添加关节驱动和关节属性
- 添加关节
- 通过关节速度控制器移动机器人
3.2 入门指南
先决条件
完成所有入门教程。
3.2.1 添加关节
- 如果您是从入门教程继续学习的,并且已经保存了自己的 mock_robot.usd,请使用文件> 打开将其打开。否则,请加载 Isaac/Samples/Rigging/MockRobot/mock_robot_noo_joints.usd 中提供的资产。请勿将其作为参考载入,因为您必须对该文件进行永久修改。
- 为便于组织,请右键单击 “创建”>“范围”Create > Scope,创建一个范围来存储关节。
- 要在两个躯体之间添加关节,请单击父躯体,然后单击子躯体。对于我们的模拟机器人,选择主体,然后按住 Ctrl + Shift 键,选择 wheel_left。突出显示两个主体后,右键单击并选择 “创建”>“物理”>“关节”>“旋进关节”。RevoluteJoint 出现在舞台树的 wheel_left 下。将其重命名为 wheel_joint_left。
- 在 “属性 ”选项卡中确认 body0 为 /mock_robot/body(立方体),body1 为 /mock_robot/wheel_left(圆柱体)。
- 将关节的轴改为 Y。
- 如果你仔细观察,关节的两个局部框架是错位的。要纠正这种情况,请转到局部旋转 0,使 x = 0 度。然后转到局部旋转 1,使 x = -90 度。这里的示例只显示了方向错位,根据机器人的具体情况,您可能会看到平移错位。
- 对右侧车轮关节重复步骤 1-4。
在添加关节之前,按下 “播放 ”键后,三个刚体分别落地。现在添加了关节后,三个刚体下落时就像连接在一起一样。要想看到它们像通过旋转接头连接在一起一样移动,可以按住 Shift 键,在视口中单击并拖动机器人的任何部分。
3.2.2 添加连接驱动
添加接头可增加机械连接。为了能够控制和驱动关节,必须添加关节驱动 API。选择两个关节并单击 “属性 ”选项卡中的 “+ 添加 ”按钮,然后选择 “物理”>“角度驱动”,即可同时为两个关节添加驱动。
- 位置控制: 对于位置控制关节,请设置较高的刚度和相对较低的阻尼或零阻尼。
- 速度控制: 对于速度控制关节,设置高阻尼和零刚度。
对于轮子上的关节,速度控制更为合理,因此将两个轮子的阻尼都设为 1e4*,目标速度设为 200。如果您正在使用范围有限的关节,可以在 “属性 ”选项卡的 “原始美元属性”>“下(上)限 ”中进行设置。按 “播放 ”键,观看模拟移动机器人驶离。
3.2.3 添加关节
尽管直接驱动关节可以移动机器人,但这并不是计算效率最高的方法。将物体制作成关节可以实现更高的模拟保真度,减少关节误差,并能处理关节体之间更大的质量比。有关其背后的物理模拟的更多信息,请参阅物理核心: 关节连接。要将一系列连接的刚体和关节转化为衔接,需要设置一个衔接根来锚定衔接树。请参阅物理核心:衔接中关于定义衔接树的说明: 衔接:
对于固定基铰接,可在以下任一位置添加铰接根组件 1)连接衔接基点和世界的固定关节,或 2)USD 层次结构中固定关节的祖先。第二个选项允许从添加到场景中的单个根组件创建多个衔接。每个后代固定关节都定义了一个衔接基础链接。对于浮动基础铰接,可将铰接根组件添加到以下任一位置: 1) 根刚体链接或 2) USD 层次结构中根链接的祖先。
在本教程中,将衔接根添加到机器人上:
- 选择树中的 mock_robot。
- 在 “属性 ”选项卡中打开 + 添加。
- 添加物理特性 > 铰接根。
验证生成的机器人是否与 Isaac/Samples/Rigging/MockRobot/mock_robot_rigged.usd 中提供的资产相匹配。
3.2.4 添加控制器
在关节成为衔接的一部分后,就可以使用工具来测试机器人的运动了。
- 转到 Isaac Utils > Common Omnigraphs,添加一个 “关节速度控制 ”图。通过该图表,您可以设置每个关节的目标速度,从而控制机器人的运动。
- 系统会提示您输入必要的参数。单击 “关节连接根 ”的添加按钮,然后选择具有关节连接根 API 的基元,本例中为 /mock_robot/body。
- 由于该机器人的衔接根 API 与机器人的根基元不同,因此必须添加 “机器人根 ”参数。本例中为 /mock_robot。
- 点击 “确定 ”创建图形。
- 要移动机器人,请按 “播放”(Play)键开始模拟。如果设置了默认位置或速度目标,机器人将立即开始向这些目标移动。要更改关节命令,请在 /World/Graphs/articulation_velocity_controller{_n}/JointCommandArray 下的舞台树中选中关节命令阵列(JointCommandArray),然后在 “属性管理器 ”选项卡 -> “原始 USD 属性 ”中更改关节角度。
注意
关节控制器使用弧度,而在舞台树上选择单个关节时,在驱动 API 下找到的默认 USD 属性是以度为单位的。
对于该特定机器人,也可使用差分控制器进行控制。有关 Omnigraph 控制器快捷方式的更多信息,请访问常用 Omnigraph 快捷方式。
四、OmniGraph
OmniGraph 是 Omniverse 的可视化编程框架。它提供了一个图形框架,用于连接 Omniverse 内部多个系统的功能。它也是一个计算框架,允许高度定制节点,以便将自己的功能集成到 Omniverse 中,并自动利用高效的计算后台。
在 Omniverse Isaac Sim 中,OmniGraph 是复制器、ROS 和 ROS2 桥接器、传感器接入、控制器、外部输入/输出设备、用户界面等的主要引擎。
本教程将向您介绍通过 OmniGraph 进行可视化编程的世界。我们强烈建议您同时阅读 OmniGraph,因为它是 Omniverse Kit 的关键组件。
4.1 学习目标
本教程旨在
- 向您介绍 OmniGraph 的基本概念
- 指导您在 Isaac Sim 中构建控制机器人(特别是 Jetbot)的动作图。
- 向您展示如何使用 Omnigraph 快捷键为 Jetbot 生成差分控制器图。
4.2 入门
前提条件
- 在开始本教程之前,完成 Isaac Sim 界面。
- 完成 “组装一个简单机器人”,设置自己的机器人。
图形编辑器
有两个图形编辑器:动作图形和通用图形。它们都可以在 “窗口 > 可视化脚本 ”下找到。在 Isaac Sim 中的大多数情况下,您将使用动作图。
节点搜索
OmniGraph 中有大量节点可供使用。打开图表编辑器后,左侧面板会列出所有节点类别。您可以在面板顶部的搜索栏中键入单个节点进行搜索。
4.3 基本概念
4.3.1 动作图与推送图
每当触发一个执行节点时,就会执行 “动作图”,有时也称为 “执行图”。在许多 Isaac Sim 案例中,触发器是一个 “tick ”节点,该节点被设置为每模拟帧 tick 时触发一次,因此在模拟未运行时,图形不会执行任何操作,而在模拟开始后,每渲染一帧就会触发一次。如果从动作图中移除 tick 节点,按下 “播放 ”键后,动作图将不会运行。
动作图还可以有其他触发器,如键盘/鼠标输入或舞台事件。您可以在 “事件 ”节点类别下找到相关节点。
推送图(有时也称为 “通用图”)将在每个渲染帧上自动执行,而不需要 “执行 ”节点。由于默认视口始终在运行并进行渲染,因此即使模拟没有 “播放”,您拖入 “推送图 ”编辑器的任何节点都会立即开始执行。您可以将 “Print Text(打印文本)”节点拖入推送图编辑器,打开控制台选项卡并允许其发布 “Informational(信息)”级别的日志来测试这一点。然后,只要您在打印节点的 “文本 ”部分输入内容,文本就会被打印出来。
如果你的图有基于连接的程序顺序,那么推送图将按照该程序顺序计算节点。否则,它将不按固定顺序执行所有节点。
4.4 试一试
让我们构建一个动作图来控制 Isaac Sim 中的机器人 Jetbot。
4.4.1 设置舞台
- 在新舞台上单击右键,选择 “创建”>“物理”>“地面平面”。
- 使用内容浏览器导航至 /Isaac/Robots/JetBot。
- 单击并拖动 jetbot.usd 到舞台上。
- 将 JetBot 放置在地面平面的正上方。
- 完成后,请检查喷射机器人是否位于上下文树中的 /World/jetbot 下,并且舞台看起来类似于:
注意事项
点击播放!验证 JetBot 是否掉落并着陆在舞台上。继续之前请单击停止。
根据您的默认渲染设置,JetBot 的摄像头可能有一个占位网格(看起来像一个灰色的电视摄像头)。要隐藏这些网格,请单击视口中的 eyecon 图标,然后选择 “按类型显示”->“摄像机”。
4.4.2 构建图表
- 从编辑器顶部的下拉菜单中选择窗口 -> 可视化脚本 -> 动作图表。图表编辑器与内容浏览器出现在同一窗格中。
- 单击 “新建动作图表 ”打开一个空图表。
- 在图形编辑器的搜索栏中键入控制器。
- 将衔接控制器和差分控制器拖到图形上。
- 衔接控制器将驱动命令(以力、位置或速度的形式)应用到任何具有衔接根的基元的指定关节。
要告诉控制器它将控制哪个机器人,请执行以下操作
- 选择图形中的衔接控制器节点,打开属性窗格。
- 您可以
- 单击 usePath 并在 robotPath 中键入机器人 /World/jetbot 的路径,或者
- 单击窗格顶部输入:targetPrim附近的 “添加目标”,然后在弹出窗口中选择 “JetBot”。
差分控制器在给定目标线速度和角速度的情况下,计算双轮机器人的驱动指令。与关节控制器一样,它也需要进行配置。
- 在图形中选择差分控制器节点。
- 在属性窗格中,将车轮距离(wheelDistance)设为 0.1125,车轮半径(wheelRadius)设为 0.03,最大角速度(maxAngularSpeed)设为 0.2。
- 验证控制器的属性是否如下所示:
关节衔接控制器还需要知道要衔接哪些关节。它希望以标记或索引值列表的形式获得这些信息。机器人的每个关节都有一个名称,而 JetBot 恰好有两个。通过检查舞台上下文树中的 JetBot 验证这一点。在 /World/jetbot/chassis 中有两个名为 left_wheel_joint 和 right_wheel_joint 的旋转物理关节。
- 在图表编辑器的搜索栏中输入令牌。
- 在图形中添加两个常量令牌节点。
- 选择其中一个,在属性窗格中将其值设为 left_wheel_joint。
- 对另一个常量标记节点重复上述操作,但将其值设为 right_wheel_joint。
- 在图形编辑器的搜索栏中输入 make array。
- 在图形中添加 Make Array 节点。
- 选择 Make Array 节点,点击属性窗格菜单输入部分的 + 图标,添加第二个输入。
- 从同一窗格的下拉菜单中将 arraySize 设置为 2,将输入类型设置为 token[]。
- 将常量标记节点连接到 “制作数组 ”节点的输入 0 和输入 1,然后将该节点的输出连接到 “关节控制器 ”节点的 “关节名称 ”输入。
最后一个节点是事件节点。
- 在图形编辑器的搜索栏中搜索重放。
- 在图形中添加 “On Playback Tick ”节点。该节点每帧都会发出一个执行事件,但仅限于模拟播放时。
- 将 On Playback Tick 节点的 Tick 输出连接到两个控制器节点的 Exec In 输入。
- 将差分控制器的 “速度指令 ”输出连接到衔接控制器的 “速度指令 ”输入。
- 验证图形是否类似于
- 按播放按钮。
- 选择图表中的差分控制器节点。
- 点击并拖动属性窗格中的角速度或线速度值,以更改其值(或直接点击并输入所需值)。
注意
探索可用的 OmniGraph 节点,并尝试设置一个用键盘控制 JetBot 的图形。下图是用键盘控制 JetBot 的示例图形。
4.5 全图快捷键
从头开始绘制图形可能会很乏味,尤其是当你需要重复绘制时。我们为常用图形制作了一些快捷方式,这样只需点击几下,就能生成具有多个节点和连接的复杂图形。这些快捷方式可在 Isaac Utils -> Common Omnigraphs 下找到,使用说明在常用 Omnigraph 快捷方式中。
要从菜单快捷方式中使用差分控制器图,请执行以下操作
- 删除(或禁用,如果可以选择的话)之前任何控制喷射机器人的 Omnigraphs。
- 转到菜单栏,点击 Isaac Utils -> Common Omnigraphs -> Differential Controller。
- 系统会提示你输入必要的参数。
- 在衔接根中添加“/World/jetbot”,将车轮间距设为 0.1125,车轮半径设为 0.03。
- 鉴于 JetBot 只有两个可控关节,其余字段可以留空。
- 打开 “使用键盘控制 (WASD)”。
- 单击 “确定 ”生成图形。您可以在 /Graph/differential_controller 下打开生成的图形。
- 按 “播放 ”开始模拟。
- 验证是否可以使用键盘上的 WASD 键移动 JetBot。
小结
本教程包括
- OmniGraph 的基本概念
- 设置带有机器人的舞台
- 使用 OmniGraph 构建机器人接口
- 使用 Omnigraph 快捷键生成差分控制器图
进一步学习
- OmniGraph 的更多深入概念
- 所有 OmniGraph 快捷键的更多详情 常用 Omnigraph 快捷键
- 使用 OmniGraph 连接输入设备的示例: OmniGraph: 输入设备
- 通过 Python 脚本合成 OmniGraph 的示例: OmniGraph: Python 脚本
- 编写自定义 Python 节点的示例: Omnigraph: 自定义 Python 节点