首页 > 其他分享 >NVIDIA Isaac Sim 入门教程(三)ROS2 联合仿真

NVIDIA Isaac Sim 入门教程(三)ROS2 联合仿真

时间:2025-01-20 09:28:13浏览次数:3  
标签:机器人 入门教程 导入 NVIDIA Isaac 关节 URDF 节点 Sim

系列文章目录


前言


一、导入 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 软件包。请随意绕过软件源中的其他软件包。

  1. 在本系列教程中,我们将使用 Isaac 环境,但您也可以将机器人导入到您选择的任何环境中。进入视口下方的 “内容 ”选项卡打开环境,找到 Isaac/Environments/Simple_Room/simple_room.usd。如果不想使用提供的环境,只需确保环境中有一个地面平面和一个物理场景。两者都可以在创建 -> 物理场景中找到。您可能还需要一些灯光,请在创建 -> 灯光中使用各种类型的灯光,以获得所需的效果。
  2. 在一个新的舞台上,将 simple_room.usd 拖到舞台上,并将其置于原点,方法是将变换属性中的所有 “平移 ”组件清零。您可能需要放大一些才能看到房间内的桌子。
  3. 打开 URDF 导入器 Isaac Utils > Workflows > URDF Importer。
  4. 在提示窗口的 “导入选项 ”部分,取消选中 “清除舞台 ”以保留现有环境,取消选中 “固定基础链接”(因为这是一个移动机器人),将 “关节驱动类型 ”改为 “速度”,以便稍后可以正确驱动车轮。
  5. 在 “导入 ”部分,首先在 “输入文件 ”中找到要导入的 URDF 文件。只有选定文件后,导入按钮才会启用。
  6. 资产导入到 Omniverse Kit 后,将自动保存一份 .usd 版本的资产副本。如果您希望在 “输出目录 ”中保存资产的文件夹与 .urdf 文件所在的文件夹不同,请指定该文件夹。与 .urdf 文件匹配的文件夹名称将在指定目录中创建,.usd 文件将位于新创建的文件夹中。
  7. 确保取消选择舞台上的所有内容,方法是点击舞台选项卡内的空白处,或选择树上的/World。否则,你可能会将 Turtlebot 作为树上随机对象的子对象导入。
  8. 点击导入。
  9. 第一次导入 Turtlebot 时,它将位于桌面上。使用小工具将它放在房间地板的正上方。
  10. 按下 “播放 ”键,你会看到海龟宝宝掉到地板上。

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 网络。

进一步学习

  1. 更多详情 URDF Importer.
  2. 世界构建的更多详情 组装一个简单的机器人
  3. 增益调谐器扩展和(已删除)衔接检查器扩展的更多详情

二、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

此面板包含目标路径和导入按钮。

  • Output Directory

保存转换后的 URDF 的路径。

  • Import

用于导入 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 导入工作流程

  1. 选择更符合您需求的导入选项
  2. 选择用于转换为美元的输入值
  3. 审查接头和驱动
  4. 导入

2.7 从 ROS2 节点导入 URDF

要启用此功能,请启用 omni.isaac.ros2_bridge.robot_description 扩展。这将改变URDF导入器的用户界面,允许在选择包含机器人描述的urdf文件或ROS2节点之间进行切换。

要选择适当的节点,请在节点文本框中键入节点名称。如果对导入设置或发布的节点进行了更改,请点击 “刷新”。如果节点名称在

注意

只有启用 ROS2 桥接器后,才能使用此功能。

2.8 机器人属性

您可能需要调整机器人的许多属性。这些属性可能分布在许多不同的模式和应用程序接口中。

获取和设置参数的一般步骤是

  1. 查找参数所属的应用程序接口。最常见的参数可在 Pixar USD API 中找到。
  2. 获取应用 API 的 prim 句柄。例如,关节(Articulation)和驱动(Drive)API 应用于关节,质量(MassAPIs)应用于刚体。
  3. 获取 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 命令。

注意事项

  1. 在关节驱动上使用位置控制时,应设置驱动刚度参数。
  2. 在关节驱动上使用速度控制时,应设置驱动阻尼参数。
  3. 在驱动器上同时设置刚度和阻尼将导致同时应用两个目标,这在位置控制中对减少振动非常有用。

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

  1. 源代码 ROS 2
  2. 启动机器人描述节点的转换发布器(例如,ros2 launch ur_description view_ur.launch.py ur_type:=ur10e)

终端 2

  1. 源 ROS 2
  2. 使用 ros2 节点列表为刚刚创建的节点选择 ROS 2 节点名称。(例如:robot_state_publisher)

终端 3

  1. 源 ROS 2
  2. 启动 isaac 模拟
  3. 启用扩展 omni.isaac.ros2_bridge.robot_description
  4. 使用 Isaac Utils > Workflows > URDF Importer 菜单打开 URDF Importer
  5. 在 “输入 ”部分,选中 “使用 ROS2 节点”。
  6. 在文本框中输入节点名称
  7. 定义输出目录
  8. 导入

尝试其他步骤:

终端 1

  1. 停止发布器,将其更改为另一个机器人,然后再次启动服务(例如,ros2 launch ur_description view_ur.launch.py ur_type:=ur3)

终端 3

  1. 点击刷新按钮
  2. 更改输出目录
  3. 导入

2.10.2 示例

  1. 卡特示例: 以撒示例 > 导入机器人 > 卡特 URDF
  2. Franka 示例: 以赛示例 > 导入机器人 > 弗兰卡 URDF
  3. Kaya 示例: 以赛示例 > 导入机器人 > 卡亚 URDF
  4. UR10 示例: 以赛示例 > 导入机器人 > UR10 URDF

注意事项

对于这些示例,请等待加载材料。您可以在用户界面右下角跟踪进度。

2.10.2.1 卡特 URDF 示例

运行示例

  1. 转到顶部菜单栏,单击 Isaac Examples(以撒示例)> Import Robots(导入机器人)> Carter URDF。
  2. 按下 “加载机器人 ”按钮,将 URDF 导入舞台,添加地平面、灯光和物理场景。
  3.  按下 “Configure Drives(配置驱动器)”按钮,配置关节驱动器并允许后枢轴自由旋转。
  4. 按下 “Open Source Code(打开源代码)”按钮查看源代码。源代码说明了如何使用 Python API 导入和集成机器人。
  5. 按下 PLAY(播放)按钮开始模拟。
  6.  按下 Move to Pose 按钮,使机器人向前移动。

2.10.2.2 弗兰卡 URDF 示例
  1. 转到顶部菜单栏,单击 Isaac Examples(以赛示例)> Import Robots(导入机器人)> Franka URDF。
  2. 按 “加载机器人”(Load Robot)按钮将 URDF 导入舞台,添加地平面、灯光和物理场景。
  3. 按下 “Configure Drives(配置驱动器)”按钮配置关节驱动器。这将设置每个驱动器的刚度和阻尼值。
  4. 按 “打开源代码 ”按钮查看源代码。源代码说明了如何使用 Python API 导入和集成机器人。
  5. 按 “播放 ”按钮开始模拟。
  6. 按下 “移动到姿势 ”按钮,使机器人移动到原点/静止位置。

2.10.2.3 卡亚 URDF 示例
  1. 转到顶部菜单栏,单击 Isaac Examples(以赛示例)> Import Robots(导入机器人)> Kaya URDF。
  2. 按 “加载机器人”(Load Robot)按钮将 URDF 导入舞台,添加地平面、灯光和物理场景。
  3. 按下 “Configure Drives(配置驱动器)”按钮配置关节驱动器。这将设置每个滚轮的驱动刚度和阻尼值,并将所有滚轮设置为自由旋转。
  4. 按 “打开源代码 ”按钮查看源代码。源代码说明了如何使用 Python API 导入和集成机器人。
  5. 按下 PLAY(播放)按钮开始模拟。
  6. 按下 Move to Pose 按钮,使机器人原地旋转。

2.10.2.4 UR10 URDF 示例
  1. 转到顶部菜单栏,单击 Isaac Examples(以撒示例)> Import Robots(导入机器人)> Kaya URDF。
  2. 按 “加载机器人”(Load Robot)按钮将 URDF 导入舞台,添加地平面、灯光和物理场景。
  3. 按下 “Configure Drives(配置驱动器)”按钮配置关节驱动器。这将设置每个驱动器的刚度和阻尼值。
  4. 按 “打开源代码 ”按钮查看源代码。源代码说明了如何使用 Python API 导入和集成机器人。
  5. 按 “播放 ”按钮开始模拟。
  6. 按下 “移动到姿势 ”按钮,使机器人移动到原点/静止位置。

三、组装简单的机器人

Omniverse Isaac Sim 的图形用户界面功能与 NVIDIA Omniverse™ USD Composer 相同,后者是一款专门用于构建世界的应用程序。在本系列教程中,我们将重点介绍与机器人用途最相关的图形用户界面功能。如需了解更复杂的通用世界创建功能,请查阅 Omniverse Composer。

在本教程中,我们将为一个简单的 “机器人 ”装配三个链接和两个外旋关节,以介绍关节和衔接的基本概念。我们将使用在 “添加简单对象 ”中添加到舞台上的对象,并将其转化为具有矩形身体和两个圆柱形轮子的模拟移动机器人。虽然从 extensions:isaac_onshape_importer_tutorials_importing 或 URDF Importer 中导入的机器人不需要这一步,但这些概念对于调整机器人和组装带有关节的对象非常重要。

3.1 学习目标

本教程详细介绍如何装配双轮移动机器人,包括如何

  • 组织阶段树层次结构
  • 在两个刚体之间添加关节
  • 添加关节驱动和关节属性
  • 添加关节
  • 通过关节速度控制器移动机器人

3.2 入门指南

先决条件

完成所有入门教程。

3.2.1 添加关节

  1. 如果您是从入门教程继续学习的,并且已经保存了自己的 mock_robot.usd,请使用文件> 打开将其打开。否则,请加载 Isaac/Samples/Rigging/MockRobot/mock_robot_noo_joints.usd 中提供的资产。请勿将其作为参考载入,因为您必须对该文件进行永久修改。
  2. 为便于组织,请右键单击 “创建”>“范围”Create > Scope,创建一个范围来存储关节。
  3. 要在两个躯体之间添加关节,请单击父躯体,然后单击子躯体。对于我们的模拟机器人,选择主体,然后按住 Ctrl + Shift 键,选择 wheel_left。突出显示两个主体后,右键单击并选择 “创建”>“物理”>“关节”>“旋进关节”。RevoluteJoint 出现在舞台树的 wheel_left 下。将其重命名为 wheel_joint_left。
  4. 在 “属性 ”选项卡中确认 body0 为 /mock_robot/body(立方体),body1 为 /mock_robot/wheel_left(圆柱体)。
  5. 将关节的轴改为 Y。
  6. 如果你仔细观察,关节的两个局部框架是错位的。要纠正这种情况,请转到局部旋转 0,使 x = 0 度。然后转到局部旋转 1,使 x = -90 度。这里的示例只显示了方向错位,根据机器人的具体情况,您可能会看到平移错位。
  7. 对右侧车轮关节重复步骤 1-4。

在添加关节之前,按下 “播放 ”键后,三个刚体分别落地。现在添加了关节后,三个刚体下落时就像连接在一起一样。要想看到它们像通过旋转接头连接在一起一样移动,可以按住 Shift 键,在视口中单击并拖动机器人的任何部分。

3.2.2 添加连接驱动

添加接头可增加机械连接。为了能够控制和驱动关节,必须添加关节驱动 API。选择两个关节并单击 “属性 ”选项卡中的 “+ 添加 ”按钮,然后选择 “物理”>“角度驱动”,即可同时为两个关节添加驱动。

  • 位置控制: 对于位置控制关节,请设置较高的刚度和相对较低的阻尼或零阻尼。
  • 速度控制: 对于速度控制关节,设置高阻尼和零刚度。

对于轮子上的关节,速度控制更为合理,因此将两个轮子的阻尼都设为 1e4*,目标速度设为 200。如果您正在使用范围有限的关节,可以在 “属性 ”选项卡的 “原始美元属性”>“下(上)限 ”中进行设置。按 “播放 ”键,观看模拟移动机器人驶离。

3.2.3 添加关节

尽管直接驱动关节可以移动机器人,但这并不是计算效率最高的方法。将物体制作成关节可以实现更高的模拟保真度,减少关节误差,并能处理关节体之间更大的质量比。有关其背后的物理模拟的更多信息,请参阅物理核心: 关节连接。要将一系列连接的刚体和关节转化为衔接,需要设置一个衔接根来锚定衔接树。请参阅物理核心:衔接中关于定义衔接树的说明: 衔接:

对于固定基铰接,可在以下任一位置添加铰接根组件 1)连接衔接基点和世界的固定关节,或 2)USD 层次结构中固定关节的祖先。第二个选项允许从添加到场景中的单个根组件创建多个衔接。每个后代固定关节都定义了一个衔接基础链接。对于浮动基础铰接,可将铰接根组件添加到以下任一位置: 1) 根刚体链接或 2) USD 层次结构中根链接的祖先。

在本教程中,将衔接根添加到机器人上:

  1. 选择树中的 mock_robot。
  2. 在 “属性 ”选项卡中打开 + 添加。
  3. 添加物理特性 > 铰接根。

验证生成的机器人是否与 Isaac/Samples/Rigging/MockRobot/mock_robot_rigged.usd 中提供的资产相匹配。

3.2.4 添加控制器

在关节成为衔接的一部分后,就可以使用工具来测试机器人的运动了。

  1. 转到 Isaac Utils > Common Omnigraphs,添加一个 “关节速度控制 ”图。通过该图表,您可以设置每个关节的目标速度,从而控制机器人的运动。
  2. 系统会提示您输入必要的参数。单击 “关节连接根 ”的添加按钮,然后选择具有关节连接根 API 的基元,本例中为 /mock_robot/body。
  3. 由于该机器人的衔接根 API 与机器人的根基元不同,因此必须添加 “机器人根 ”参数。本例中为 /mock_robot。
  4. 点击 “确定 ”创建图形。
  5. 要移动机器人,请按 “播放”(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 设置舞台

  1. 在新舞台上单击右键,选择 “创建”>“物理”>“地面平面”。
  2. 使用内容浏览器导航至 /Isaac/Robots/JetBot。
  3. 单击并拖动 jetbot.usd 到舞台上。
  4. 将 JetBot 放置在地面平面的正上方。
  5. 完成后,请检查喷射机器人是否位于上下文树中的 /World/jetbot 下,并且舞台看起来类似于:

注意事项

点击播放!验证 JetBot 是否掉落并着陆在舞台上。继续之前请单击停止。

根据您的默认渲染设置,JetBot 的摄像头可能有一个占位网格(看起来像一个灰色的电视摄像头)。要隐藏这些网格,请单击视口中的 eyecon 图标,然后选择 “按类型显示”->“摄像机”。

4.4.2 构建图表

  1. 从编辑器顶部的下拉菜单中选择窗口 -> 可视化脚本 -> 动作图表。图表编辑器与内容浏览器出现在同一窗格中。
  2. 单击 “新建动作图表 ”打开一个空图表。
  3. 在图形编辑器的搜索栏中键入控制器。
  4. 将衔接控制器和差分控制器拖到图形上。
  5. 衔接控制器将驱动命令(以力、位置或速度的形式)应用到任何具有衔接根的基元的指定关节。

要告诉控制器它将控制哪个机器人,请执行以下操作

  1. 选择图形中的衔接控制器节点,打开属性窗格。
  2. 您可以
    1. 单击 usePath 并在 robotPath 中键入机器人 /World/jetbot 的路径,或者
    2. 单击窗格顶部输入:targetPrim附近的 “添加目标”,然后在弹出窗口中选择 “JetBot”。

差分控制器在给定目标线速度和角速度的情况下,计算双轮机器人的驱动指令。与关节控制器一样,它也需要进行配置。

  1. 在图形中选择差分控制器节点。
  2. 在属性窗格中,将车轮距离(wheelDistance)设为 0.1125,车轮半径(wheelRadius)设为 0.03,最大角速度(maxAngularSpeed)设为 0.2。
  3. 验证控制器的属性是否如下所示:

关节衔接控制器还需要知道要衔接哪些关节。它希望以标记或索引值列表的形式获得这些信息。机器人的每个关节都有一个名称,而 JetBot 恰好有两个。通过检查舞台上下文树中的 JetBot 验证这一点。在 /World/jetbot/chassis 中有两个名为 left_wheel_joint 和 right_wheel_joint 的旋转物理关节。

  1. 在图表编辑器的搜索栏中输入令牌。
  2. 在图形中添加两个常量令牌节点。
  3. 选择其中一个,在属性窗格中将其值设为 left_wheel_joint。
  4. 对另一个常量标记节点重复上述操作,但将其值设为 right_wheel_joint。
  5. 在图形编辑器的搜索栏中输入 make array。
  6. 在图形中添加 Make Array 节点。
  7. 选择 Make Array 节点,点击属性窗格菜单输入部分的 + 图标,添加第二个输入。
  8. 从同一窗格的下拉菜单中将 arraySize 设置为 2,将输入类型设置为 token[]。
  9. 将常量标记节点连接到 “制作数组 ”节点的输入 0 和输入 1,然后将该节点的输出连接到 “关节控制器 ”节点的 “关节名称 ”输入。

最后一个节点是事件节点。

  1. 在图形编辑器的搜索栏中搜索重放。
  2. 在图形中添加 “On Playback Tick ”节点。该节点每帧都会发出一个执行事件,但仅限于模拟播放时。
  3. 将 On Playback Tick 节点的 Tick 输出连接到两个控制器节点的 Exec In 输入。
  4. 将差分控制器的 “速度指令 ”输出连接到衔接控制器的 “速度指令 ”输入。
  5. 验证图形是否类似于
  6. 按播放按钮。
  7. 选择图表中的差分控制器节点。
  8. 点击并拖动属性窗格中的角速度或线速度值,以更改其值(或直接点击并输入所需值)。

注意

探索可用的 OmniGraph 节点,并尝试设置一个用键盘控制 JetBot 的图形。下图是用键盘控制 JetBot 的示例图形。

4.5 全图快捷键

从头开始绘制图形可能会很乏味,尤其是当你需要重复绘制时。我们为常用图形制作了一些快捷方式,这样只需点击几下,就能生成具有多个节点和连接的复杂图形。这些快捷方式可在 Isaac Utils -> Common Omnigraphs 下找到,使用说明在常用 Omnigraph 快捷方式中。

要从菜单快捷方式中使用差分控制器图,请执行以下操作

  1. 删除(或禁用,如果可以选择的话)之前任何控制喷射机器人的 Omnigraphs。
  2. 转到菜单栏,点击 Isaac Utils -> Common Omnigraphs -> Differential Controller。
  3. 系统会提示你输入必要的参数。
  4. 在衔接根中添加“/World/jetbot”,将车轮间距设为 0.1125,车轮半径设为 0.03。
  5. 鉴于 JetBot 只有两个可控关节,其余字段可以留空。
  6. 打开 “使用键盘控制 (WASD)”。
  7. 单击 “确定 ”生成图形。您可以在 /Graph/differential_controller 下打开生成的图形。
  8. 按 “播放 ”开始模拟。
  9. 验证是否可以使用键盘上的 WASD 键移动 JetBot。

小结

本教程包括

  • OmniGraph 的基本概念
  • 设置带有机器人的舞台
  • 使用 OmniGraph 构建机器人接口
  • 使用 Omnigraph 快捷键生成差分控制器图

进一步学习

  • OmniGraph 的更多深入概念
  • 所有 OmniGraph 快捷键的更多详情 常用 Omnigraph 快捷键
  • 使用 OmniGraph 连接输入设备的示例: OmniGraph: 输入设备
  • 通过 Python 脚本合成 OmniGraph 的示例: OmniGraph: Python 脚本
  • 编写自定义 Python 节点的示例: Omnigraph: 自定义 Python 节点

标签:机器人,入门教程,导入,NVIDIA,Isaac,关节,URDF,节点,Sim
From: https://blog.csdn.net/weixin_46300916/article/details/145245345

相关文章

  • 基于Matlab/Simulink光伏储能电解水制氢仿真模型
    今天更新的内容为更详细的光伏储能制氢技术,这个方向我之前在21年就系统研究并发表过相关文章,经过这几年的发展,绿色制氢技术也受到更多高校的注意,本篇博客也是在原先文章的基础上进行更新。首先让大家熟悉一下绿氢制取技术这个概念,就是包括利用风电、水电、太阳能等可再生能源......
  • 风光并网对电网电能质量影响的matlab/simulink仿真建模
      这个课题早在一几年的时候比较热门,之前作电科院配电网的一个项目中也有所涉及,我把其中一部分经典仿真模型思路分享给大家,电能质量影响这部分,我在模型中主要体现的就是不同容量的光伏、风电接入,对并网点的电压影响情况。(主页还有单独风电并网系统,光伏并网发电系统以及微电......
  • Web安全攻防入门教程——hvv行动详解
    Web安全攻防入门教程Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全......
  • Web安全攻防入门教程——hvv行动详解
    Web安全攻防入门教程Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。本......
  • Web安全攻防入门教程——hvv行动详解
    Web安全攻防入门教程Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。本教程......
  • 5MW风电永磁直驱发电机-1200V直流并网Simulink仿真模型
      ......
  • (原创)[开源][.Net Standard 2.0] SimpleMMF (进程间通信框架)更新 v1.1,极低CPU占用
    一、前言在上一篇(原创)[.Net]进程间通信框架(基于共享内存)——SimpleMMF中,发布了v1.0版,最大的问题是:CPU占用较高,至少40-50%。这既与我的开发水平有关,也与SimpleMMF诞生环境有关,这个主要是用在数字孪生各软件之间同步数据,而部署软件的工作站性能都强悍,像我常用的便是一个有着19......
  • Redis 入门教程:什么是 Redis?如何开始使用?
    Redis入门教程:什么是Redis?如何开始使用?Redis是一个开源的内存数据结构存储系统,广泛用于缓存、消息队列、实时数据处理等场景。它不仅速度快,而且支持多种数据结构(如字符串、哈希、列表、集合等),因此非常适合处理大量实时数据。今天,我们将带你一起快速了解Redis,并教你如何上......
  • Makefile快速入门教程
    Makefile快速入门教程本教程旨在帮助读者全面深入地掌握Makefile的编写与使用。Makefile是一种用于自动化编译和构建程序的文件,通过定义一系列规则和命令,能够高效地管理项目的编译过程,尤其在大型项目中,其优势尤为明显。本教程从基础概念入手,逐步深入到高级特性,涵盖了M......
  • CF 265B.Roadside Trees (Simplified Edition)(Java实现)
    题目分析    松鼠的起点在第一棵树的0位置,它的行动轨迹为到达顶端,吃坚果,到另一棵树的同位置,到达顶端,吃坚果。思路分析    根据题目分析,我们需要有一个不断更新的起始位置,单次循环内的时间=到达顶端的距离+吃坚果+跳跃=顶端-起始+1+1代码        ......