NVIDIA Isaac Sim 机器人设置教程系列

原文来源:NVIDIA Isaac Sim Documentation v5.1.0
本教程系列涵盖从入门到高级的机器人数字孪生构建流程,使用 NVIDIA Isaac Sim 的图形界面功能。

第1课:场景设置 入门

学习使用 Isaac Sim GUI 构建支持物理仿真的虚拟世界

学习目标

本教程教您使用 Isaac Sim GUI 提供的工具构建支持物理仿真的虚拟世界,包括:

  • 设置全局场景属性
  • 设置全局物理属性
  • 添加地面平面
  • 添加灯光

前提条件

要从干净的 Isaac Sim 场景开始,转到 File 菜单并点击 New。提供的场景有一个默认的 World Xform 和一个 defaultLight,两者都可以在视口右侧的场景树中找到。

设置场景属性

在向场景添加任何内容之前,请验证当前场景属性设置是否符合您的预期约定。

  1. 转到 Edit > Preferences 打开 Preferences 面板。
  2. 浏览 Omniverse Kit 中按类别分组的多种设置类型。
  3. 从左侧列选择 Stage 并查看以下属性:
    • 确定 Up(上方)的轴。Isaac Sim 中的默认值是 Z。如果您的资产是在具有不同上轴的程序中创建的,这会导致导入的资产发生旋转。
    • 场景单位。2022.1 之前的 Isaac Sim 版本场景单位为厘米,但现在默认为米。但是,Omniverse Kit 的默认单位仍然是厘米。如果您看到 USD 单位似乎相差 100 倍,请记住这一点。
    • 默认旋转顺序。默认设置为先绕 Z 轴旋转,然后是 Y 轴,最后是 X 轴。
Preferences面板
Preferences 面板中的场景设置

创建物理场景

要添加 Physics Scene 以模拟真实世界的物理效果,包括重力和物理时间步长:

  1. 转到菜单栏,点击 Create > Physics > Physics Scene
  2. 验证 PhysicsScene 已添加到场景树中。
  3. 点击它检查其属性。您可以看到重力设置为 Earth Gravity(地球重力)的大小,即 9.8 米每二次方秒。记住默认长度单位是米。
  4. 除非您正在模拟数百个刚体和机器人,否则使用 CPU 物理更高效:
    • 打开 Physics Scene 的 Property 标签
    • 取消勾选 Enable GPU dynamics
    • Broadphase 类型设置为 MBP
物理场景属性
Physics Scene 属性设置

添加地面平面

地面平面可以防止任何启用物理的对象掉落到其下方。地面平面的碰撞属性无限延伸,即使该平面仅在每个方向上可见 25 米。

要向虚拟环境添加地面平面:

  1. 转到顶部菜单栏,点击 Create > Physics > Ground Plane
  2. 通过点击 eyecon 并选择 Grid 来打开网格,使地面平面更容易看到。

灯光

每个新的 Stage 都预填充了一个 defaultLight,否则您将看不到任何东西。此默认灯光是场景中 Environment Xform 的子级,可以在场景上下文树中找到。

要创建额外的聚光灯:

  1. 添加一个地面平面(如果还没有的话),以便我们可以看到灯光的反射:Create > Physics > Ground Plane
  2. 转到 Create > Light > Sphere Light
  3. 在场景中定位灯光:
    • 在右上方的 Stage 标签中,在场景树中选择新创建的灯光。
    • 在底部的 Property 标签中,在 Transform 部分使用 Translate 工具将其移动到地面上方的位置,例如 (0, 0, 7)
    • Property 标签中,在 Transform 部分,使用 Orient 工具将旋转设置为 (0, 0, 0)
  4. 修改灯光颜色、亮度和范围属性:
    • Property 标签中,在 Main > Color 中更改其颜色,点击颜色条并选择您喜欢的颜色。例如浅绿色 (RGB: 0.5, 1.0, 0.5)
    • Property 标签中,将 Main > Intensity 更改为 1e6Main > Radius 更改为 0.05
    • Shaping 部分,将 cone:angle 更改为 45 度,cone:softness 更改为 0.05
  5. 为了使新聚光灯更容易看到,我们将默认灯光的强度降低:转到其 Property 标签,将 Main > Intensity 设置为 300
灯光设置
灯光属性设置效果

总结

本教程介绍了创建适合物理仿真和测试 Isaac Sim 的虚拟世界的必要步骤。涵盖了以下主题:

  • 添加地面平面、灯光和物理场景。

下一步

继续 第2课:组装简单机器人,学习如何向 Isaac Sim 添加简单对象并编辑它们的属性。

第2课:组装简单机器人 入门

学习添加和操作基本形状,启用物理属性,检查碰撞属性

学习目标

本教程涵盖如何:

  • 添加和操作基本形状
  • 在对象中启用物理属性
  • 检查碰撞属性
  • 编辑物理属性(如摩擦力)
  • 编辑材质属性(如颜色和反射率)

前提条件

向场景添加对象

向场景"添加对象"有很多方法,但它们本质上都做相同的事情,即在场景上下文树中定义一个 USD 原语。目标是创建一个基本的双轮机器人。首先创建一些基本形状并修改它们的属性。车身使用立方体,车轮使用圆柱体。

创建机器人车身

  1. 通过右键点击场景,选择 Create > Xform 创建一个 Xform。
  2. 通过右键点击选择 Rename 将其重命名为 body
  3. 将 Xform 的平移固定为 (0, 0, 1):点击属性面板中的 Translate 部分,设置 X0Y0Z1
  4. 在顶部菜单栏点击 Create > Shape > Cube 创建一个立方体。您应该看到立方体和 Move gizmo(红、蓝、绿色箭头)出现在视口窗口中。
  5. 点击并拖动蓝色箭头将立方体抬升到地面平面上方。
  6. 在应用程序左侧,点击 Scale 图标(或在选中立方体时按 R 键)激活缩放控件。
  7. 点击并拖动控件的红色部分在 x 方向上缩放立方体。
  8. 将立方体放置在特定位置。导航到属性面板中的 Transform > Scale,将缩放设置为 (1, 2, 0.5)
  9. 将立方体拖动到 Body Xform 下。

创建机器人车轮

  1. 通过右键点击场景,选择 Create > Xform 创建一个 Xform。将 Translate 设置为 (1.5, 0, 1)Orient 设置为 90, 0, 0,使车轮 Xform 绕 x 轴旋转 90 度。
  2. 将其重命名为 wheel_left
  3. 在顶部菜单栏点击 Create > Shape > Cylinder 创建一个圆柱体。
  4. 在属性面板中,滚动到 Geometry 部分。将其 Radius 更改为 0.5Height 更改为 1.0
  5. 将圆柱体拖动到 wheel_left Xform 下。
  6. 将圆柱体重命名为 wheel_left
  7. 通过右键点击场景树中的 wheel_left Xform,选择 Duplicate 来复制它,并将其移动到 x = -1.5,同时保持所有其他参数不变。
  8. 将复制的 Xform 重命名为 wheel_right
  9. 将复制的圆柱体重命名为 wheel_right
简单对象车身
基本机器人车身和车轮

添加物理属性

到目前为止添加的立方体和圆柱体严格来说是视觉原语,没有附加任何物理或碰撞属性。当您按 Play 开始仿真并且重力被施加时,这些对象不会移动,因为它们不受物理影响。

要使机器人具有物理特性,将其转换为带有碰撞属性的刚体:

  1. 通过按住 Ctrl + Shift 键点击场景树上的立方体和两个圆柱体来选择它们,或者如果它们在树上连续列出,则只需按 Shift
  2. Property 标签中,点击 + Add 按钮。
  3. 选择 Physics > Rigid Body with Colliders Preset
  4. Play 并验证所有三个对象都落到地面。
注意:Rigid Body with Colliders Preset 会自动将 Rigid Body API 和 Collision API 添加到对象。这两个 API 可以单独应用,因为您可以拥有以下对象:
  • 具有质量并受重力影响,但没有碰撞属性,因此您可以穿过它们
  • 可以被碰撞但悬挂在空中且不受重力影响

检查碰撞网格

要可视化检查对象碰撞网格的轮廓:

  1. 在视口顶部找到眼睛图标。
  2. 点击 Show By Type > Physics > Colliders > All
  3. 验证紫色轮廓出现在任何应用了碰撞 API 的对象周围。例如,验证长方体、圆柱体和平面是否都有紫色轮廓。
碰撞网格
碰撞网格可视化

添加接触和摩擦参数

要修改摩擦属性,您必须创建不同的物理材质,然后将其分配给所需对象。

  1. 转到菜单栏,点击 Create > Physics > Physics Material
  2. 在弹出框中选择 Rigid Body Material。一个新的 PhysicsMaterial 出现在场景树上。
  3. 在其属性标签中调整参数,如摩擦系数和恢复系数。

要将分配的物理材质应用到对象:

  1. 在场景树中选择对象。
  2. Property 标签中找到 Materials on Selected Model 菜单项。
  3. 在下拉菜单中选择所需的材质。
物理材质
物理材质设置

材质属性

对象可能反射之前添加的聚光灯的颜色,但它实际上没有分配任何颜色。您可以通过关闭聚光灯来确认这一点。

要更改对象的颜色,创建不同的材质,然后将其分配给对象,就像物理材质一样。例如,创建两种不同的材质,一种用于车身,一种用于车轮。

  1. 点击 Create > Materials > OmniPBR 两次。
  2. 右键点击场景树上新添加的材质,将它们重命名为 bodywheel
  3. 通过转到其 Property 标签中的 Materials on selected models 项,从下拉菜单中选择匹配的材质,将相应的刚体分配给新创建的材质。
  4. 更改新材质的属性。在场景树上选择其中一个,更改其在 Material and Shader / Albedo 中的基础颜色,并调整其反射率粗糙度等。
  5. 验证您看到汽车上相应部件的颜色相应变化。
新材质
应用新材质后的效果

总结

本教程结束时,您应该有一个带有一个车身和两个车轮的机器人,类似于位于 Samples > Rigging > MockRobot 文件夹中的 mock_robot_no_joints 资产。

下一步

继续到 第3课:为基本机器人添加关节,学习如何将这些几何体变成可移动的汽车。

第3课:为基本机器人添加关节 入门

学习使用关节连接刚体,添加关节驱动和关节属性,添加关节链(Articulation)

学习目标

本教程详细介绍如何装配双轮移动机器人,涵盖:

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

前提条件

  • 在开始本教程之前,完成 第2课:组装简单机器人
  • 或者从 Content Browser 加载位于 Isaac Sim/Samples/Rigging/MockRobot/mock_robot_no_joints 的检查点资产。不要将其作为引用加载,因为您必须对文件进行永久修改。

添加关节

  1. 如果您继续使用 GUI 教程并有自己的 mock_robot.usd 保存的文件,请使用 File > Open 打开它。否则,从 Content Browser 加载位于 Isaac Sim/Samples/Rigging/MockRobot/mock_robot_no_joints 的资产。
  2. 为了组织,创建一个 Scope 来存储关节:右键点击 Create > Scope,将其重命名为 Joints
  3. 要在两个主体之间添加关节,必须首先同时选择它们。在上下文树窗口中点击 body 和 wheel parent transform。对于我们的模拟机器人,选择立方体对象 body,然后按住 Ctrl 键,选择圆柱体对象 wheel_left
  4. 在两个主体高亮显示后,右键点击并选择 Create > Physics > Joints > Revolute JointRevoluteJoint 出现在场景树中 wheel_left 下。将其重命名为 wheel_joint_left
  5. Property 标签中验证 body0/mock_robot/body/body(立方体),body1/mock_robot/wheel_left/wheel_left(圆柱体)。
  6. 将关节的 X 轴设置为 Local Rotation 00.0Local Rotation 1-90.0,以考虑车身和圆柱体之间的变换差异。
  7. 将关节的 Axis 更改为 Y。因为机器人没有局部旋转 0,关节与车身处于相同的姿态。
  8. 为了组织,将刚创建的关节拖动到 Joints scope 下。
  9. 对右侧车轮关节重复前面五个步骤。
关节设置
机器人关节设置

在添加关节之前,三个刚体在按 Play 后分别落到地面。现在有关节连接,主体就像连接了旋转关节一样一起落下。要看到它们像用旋转关节连接一样一起移动,您可以按住 Shift 键并在视口中点击并拖动机器人的任何部分来拖动机器人。

拖动机器人
拖动关节连接的机器人

添加关节驱动

添加关节添加了机械连接。要能够控制和驱动关节,必须添加关节驱动 API。选择两个关节,在 Property 标签中点击 + Add 按钮,选择 Physics > Angular Drive 同时为两个关节添加驱动。

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

对于车轮上的关节,速度控制更有意义,因此将两个车轮的 Damping 设置为 1e4Target Velocity 设置为 200 rad/s。如果您使用的是有限制范围的关节,可以在 Property 标签中的 Raw USD Properties > Lower (Upper) Limit 下设置。按 Play 看模拟移动机器人驶离。

关节驱动
关节驱动配置

添加关节链(Articulation)

即使直接驱动关节可以移动机器人,但这并不是计算效率最高的方式。将物体转换为 articulation(关节链)可以实现更高的仿真精度、更少的关节误差,并能处理关节连接体之间更大的质量比。

要将一系列连接的刚体和关节转换为关节链,设置一个 articulation root 来锚定关节链树:

  1. 在场景树上选择 mock_robot
  2. Property 标签中打开 + Add
  3. 添加 Physics > Articulation Root

验证结果机器人与 Content Browser 中 Isaac Sim/Samples/Rigging/MockRobot/mock_robot_rigged 提供的资产匹配。

添加控制器

在关节成为关节链的一部分后,您可以使用工具测试机器人的运动。

  1. 创建另一个 Scope:右键点击 Create > Scope,将其重命名为 Graphs。这将用于存储 ActionGraph。
  2. Graphs scope 拖到场景树中 mock_robot Xform 下。
  3. 转到 Tools > Robotics > Omnigraph Controllers > Joint Velocity 向场景添加速度控制器图。
  4. 点击 Robot PrimAdd 按钮,选择具有 Articulation Root API 的 prim,在本例中是 /mock_robot
  5. 对于 Graph Path,写入 mock_robot/Graphs/Velocity_Controller,将 ActionGraph 放在上面的 Graphs scope 中。
  6. 点击 OK 创建图。
  7. 要移动机器人,按 Play 开始仿真。如果有任何默认位置或速度目标设置,机器人会立即开始向这些目标移动。要更改关节命令,在场景树中选择 /Graphs/velocity_controller 下的 JointCommandArray,并在属性窗口中更改 input0input1 参数。
注意:关节控制器使用 弧度(radians),而您在场景树上选择单个关节时在 Drive API 下找到的默认 USD 属性是度(degrees)
控制器
添加关节速度控制器

总结

在本教程中,您学习了使用关节连接刚体、添加关节驱动来控制关节、将关节链转换为关节链,以及使用关节速度控制器控制机器人。

下一步

继续 第4课:为机器人添加相机和传感器,学习如何向汽车添加相机。

第4课:为机器人添加相机和传感器 入门

学习添加相机传感器并将其附加到机器人上

学习目标

  • 添加相机
  • 将相机附加到几何体

前提条件

使用 Isaac Sim/Samples/Rigging/MockRobot/mock_robot_rigged.usd 文件开始本教程,以获得标准化的设置。

添加相机

要添加相机:

  1. 转到菜单栏,选择 Create > Camera。相机出现在场景树上,代表相机视图的灰色线框出现在场景中。
  2. 您可以像移动和旋转场景中任何其他对象一样移动和旋转相机的变换。
注意:相机图标在视口中默认隐藏。要查看相机图标,转到视口顶部边缘的 eye 菜单,选择 Show By Type > Cameras。相机图标出现在视口中。

您也可以通过将当前视口中的视图移动到您选择的视图,然后转到视口显示左上角的 Camera 按钮,选择 Camera > Create from View 来添加相机。新相机出现在 Stage 树上,可以在 Camera 按钮中选择的相机会列出。

相机控件
相机创建和管理控件

检查相机

使用相机检查器扩展来检查相机图像并根据需要修改相机状态:

  1. 选择 Tools > Robotics > Camera Inspector
  2. 验证您可以在下拉列表中看到相机。点击 Refresh 按钮查找新相机。
  3. 选择要检查的相机。根据需要创建新视口,并获取和设置相机姿态。

将相机附加到机器人

  1. 将新添加的相机重命名为 car_camera
  2. 如果能看到所需的相机输入流以及它相对于机器人的位置(从外部相机看)会更容易放置相机。转到菜单栏点击 Window > Viewports > Viewport 2 打开第二个视口窗口。将出现一个新视口。
  3. 将一个视口保持在 Perspective 相机视图,将另一个切换到 car_camera 视图。在视口顶部边缘找到 Cameras 菜单,切换到 Camera > car_camera
  4. 验证您有车载相机视图和场景概览。
  5. 通过将 prim 拖到 body 下,将相机附加到机器人的车身。相机与车身一起移动。您可能需要再次切换视口的相机视图。
  6. 将相机稍微向下指并使其面向前方,以便您可以看到汽车和地面。将相机变换平移设置为 x=-6, y=0, z=2.2,方向为 x=0, y=-80, z=-90,缩放为 x=1, y=1, z=1
  7. 验证您看到视口显示车载相机视图在机器人车身和地面之间分割窗口,以及在 Perspective 相机视口中相机相对于机器人的位置和方向。
  8. Play。机器人上的车载相机随机器人一起移动。
提示:如果在显示时移动了相机视图,它会更改相机的属性。相反,在具有正确偏移量的父级上附加一个 prim,然后将相机附加到该新 prim。这样,如果相机位置被意外移动,可以通过将所有位置和方向参数相对于该 prim 归零来重置。

总结

在本教程中,您学习了如何使用相机检查器扩展,以及如何向机器人添加相机。

下一步

继续到 第5课:装配移动机器人,学习如何装配更复杂的机器人。

第5课:装配移动机器人 入门

学习将未装配的叉车 USD 资产转换为可通过 Isaac Sim 命令移动和驱动的叉车

学习目标

在本教程中,将未装配的叉车 USD 资产转换为可通过 Isaac Sim 命令移动和驱动的叉车。30 分钟教程

入门

前提条件

参考 USD

  • 未装配叉车:Isaac Sim/Samples/Rigging/Forklift/forklift_b_unrigged_cm.usd
  • 已装配叉车:Isaac Sim/Samples/Rigging/Forklift/forklift_b_rigged_cm.usd

识别关节

叉车总共有 7 个自由度(DOF):

  • 前部四个较小的滚轮:它们有未驱动的旋转关节,每个有一个绕单轴旋转的自由度。
  • 叉架相对于叉车主车身有线性运动(上下移动以拾取堆叠在托盘上的物体),这意味着叉架和车身之间有一个驱动的移动关节。
  • 后部的大轮负责推动叉车并使其转向。有两个与此轮相关的驱动关节:
    • 一个旋转关节使车轮绕其中心轴旋转,提供前后运动。
    • 后轮底座和叉车车身之间的旋转关节,提供转向的枢轴。

组织层次结构

打开 Content Browser 中的未装配叉车资产:Isaac Sim/Samples/Rigging/Forklift/forklift_b_unrigged_cm.usd

所有作为父 prim 子级的网格在父 prim 移动时预期一起移动。例如,贴纸和链条是叉车车身的一部分,无论车身由多少螺钉或块组成,整个车身都可以被视为该机器人的单个链接。将它们全部组织在单个父 'body' prim 下。

为叉车组织 prims:

  1. 创建两个 XForms,命名为 bodylift
  2. 将组成叉车车身的所有网格移动到 body Xform 下,操作室网格移动到 lift Xform 下。
  3. back wheelback wheel swivel 创建新的 Xforms,为每个前滚轮支撑创建单独的 prims。
  4. 为四个前滚轮创建新的 Xforms。命名为 roller_front_leftroller_front_rightroller_back_leftroller_back_right
  5. 确保所有上述 Xforms 都通过点击 Add > Physics > Rigid Body 设置为刚体。
  6. 对于每个车轮,选择网格,在其属性标签下的 Transform 中,有两个组件 TranslateTranslate:pivot。新创建的 Xform 的变换必须是这两个组件的总和。
  7. 车轮网格的 Translate 需要设置为相应网格的 Translate:pivot 属性的负值。
  8. 将相应的网格移动到 XForm 下。
叉车层次结构
叉车层次结构组织

分配碰撞网格

要确保为网格正确设置碰撞属性。如果没有设置碰撞属性,那么当机器人移动时,它可能会根据关节配置发生自穿。

车身和提升架的正确碰撞网格已为提供的 USD 设置好,因此您不需要手动设置它们。

对于车轮,碰撞近似方法略有不同:使用圆柱体来近似碰撞网格,以避免运动颠簸。

  1. 转到 Create > Shape > Cylinder
  2. 将缩放设置为 X=0.16, Y=0.16, Z=0.08,沿 Y=90 定向。
  3. 右键点击并创建此圆柱体的四个副本,每个对应一个前滚轮。
  4. 将圆柱体拖到相应车轮的 Xform 下,并将所有轴的变换更改为 0
  5. 右键点击圆柱体并 Add > Physics > Collider
  6. 对后轮执行相同过程,将圆柱体缩放修改为 X=0.3, Y=0.3, Z=0.1,沿 Y=90 定向。

添加关节和驱动

移动关节(Prismatic Joint)

  1. 选择 lift Xform,按住 Ctrl 键选择 body Xform。右键点击 Create > Physics > Joints > Prismatic Joint
  2. 找到新创建的移动关节,选择它。在属性标签中,将轴设置为 Z 轴。
  3. Property > Physics > Prismatic Joint 标签中设置下限和上限,暂时设置为 -15200
  4. 左键点击关节,选择 Add > Physics > Linear Drive 添加线性驱动。
  5. Property > Physics > Drive > Linear 标签中,设置目标位置为 -15,阻尼为 10000,刚度为 100000
  6. 右键点击场景创建 Scope,命名为 lift_joint。将移动关节拖到 scope 下。

旋转关节(Revolute Joints)

对于所有滚轮支撑车轮,创建旋转关节:

  1. 选择 body XForm,按住 Ctrl 键选择任何滚轮车轮 XForms。右键点击 Create > Physics > Joint > Revolute Joint
  2. 确保关节位置与车轮的旋转轴匹配,并将旋转轴设置为 "X"。
  3. 对其余三个滚轮支撑执行相同操作。
  4. 创建 Scope 命名为 roller_joints,将滚轮关节拖到 scope 下。

接下来,添加最后两个关节,负责驱动和转向叉车:

  1. 选择 back_wheel_swivelback_wheel XForms,在它们之间添加旋转关节。关节位置必须与后轮中心匹配。
  2. 添加角驱动:Damping=10000, stiffness=100。
  3. 选择 bodyback_wheel_swivel XForm,在它们之间添加旋转关节。确保旋转轴设置为 Z
  4. 将关节轴更改为 Z 轴,下限和上限为 -6060(这是轮底座旋转的角度范围,以度为单位)。
  5. 添加角驱动:Damping = 100, stiffness = 100000。
  6. 转到 Create > Scope,命名为 back_wheel_joints,将后轮关节拖到 scope 下。
  7. 在按 Play 之前,记得添加 Physics Scene 和 Ground Plane。

添加关节链(Articulation)

最后一步是向叉车添加关节链,并将所有关节放入单个关节链中。右键点击 'SMV_Forklift_B01_01' Xform 并 Add > Physics > Articulation Root。在属性中,取消勾选 Self collision

总结

在本教程中,您将一个未装配的叉车 USD 资产进行了:组织结构、添加碰撞、关节和驱动,将其转换为可通过 Isaac Sim 命令移动和驱动的叉车。

第6课:设置机械臂 中级

从 URDF 文件导入 UR10e 机器人和 Robotiq 2F-140 夹爪,并将它们连接在一起

学习目标

这是四课机械臂系列的第一课。本教程展示如何从 Universal Robots 导入 UR10e 机器人和 Robotiq 的 2F-140 夹爪到 NVIDIA Isaac Sim,并将它们连接在一个关节链下。30 分钟教程

前提条件

构建和安装 UR 描述包(仅 Linux)

Isaac Sim 5.1 需要 Python 3.11,ROS 2 UR 描述包不原生支持,因此我们需要从源代码构建包。

克隆 UR 描述包

  1. Universal Robots ROS 2 Description 仓库克隆 UR 描述包。
    git clone https://github.com/UniversalRobots/Universal_Robots_ROS2_Description.git
  2. 切换到与您的 ROS 发行版匹配的分支。
    git checkout humble  # ROS 2 Humble
    git checkout jazzy   # ROS 2 Jazzy
  3. 将仓库复制到您的 Isaac Sim ROS Workspace src 文件夹。

使用 Python 3.11 构建 UR 描述包

  1. 转到 Isaac Sim ROS Workspace,运行以下命令使用 Python 3.11 构建 UR 描述包:
    ./build_ros.sh
  2. Source Python 3.11 ROS 环境并启动 Isaac Sim:
    source build_ws/<ROS distro>/<ROS distro>_ws/install/local_setup.bash
    source build_ws/<ROS distro>/isaac_sim_ros_ws/install/local_setup.bash
    ./path/to/isaac-sim.sh

导入 UR10e 机器人(仅 Linux)

启用 ROS 2 Robot Description URDF Importer Extension

  1. 转到 Window > Extensions
  2. 在搜索框中输入 URDF,找到 ROS 2 Robot Description URDF Importer Extension
  3. 如果找不到,从搜索框中移除 @feature 过滤器。
  4. 如果仍然找不到,确保 Isaac Sim 是从 ROS sourced 的同一终端启动的。
  5. 点击标记为 ENABLE 的切换按钮启用扩展。
  6. 勾选 AUTOLOAD 复选框。

启动 URDF 发布者 Topic

  1. 在系统 ROS sourced 终端中,启动 UR10e 描述:
    ros2 launch ur_description view_ur.launch.py ur_type:=ur10e
  2. 设置另一个终端用于 rqt_graphrqt_graph

将 UR10e 机器人导入 Isaac Sim

  1. 转到 Isaac Sim。
  2. 导航到 File > Import from the ROS 2 URDF Node
    • Node 字段中,输入 robot_state_publisher,点击 Refresh
    • Model 字段中,选择所需输出(例如 ~/Desktop)。
    • 选择 Natural Frequency 进行关节配置。
    • 选择下面列出的所有关节,然后将 Natural Frequency 设置为 300
  3. 点击 Import
UR10e导入
UR10e 导入设置

导入 Robotiq 2F-140 夹爪(仅 Linux)

将 XACRO 转换为 URDF

  1. ros-industrial-attic 下载仓库。
    git clone https://github.com/ros-industrial-attic/robotiq.git
  2. 导航到 robotiq/robotiq_2f_140_gripper_visualization/urdf 文件夹,修改 xacro 文件中的路径引用为相对路径。
  3. 将 xacro 文件转换为 URDF 格式:
    xacro robotiq_arg2f_140_model.xacro > robotiq_2f_140.urdf

将 Robotiq 2F-140 夹爪导入 Isaac Sim

  1. 转到 Isaac Sim,创建新场景:File > New
  2. 导航到 File > Import
  3. 选择 robotiq_2f_140.urdf 文件。
  4. 在导入设置中:
    • 对于 finger_joint,设置 Natural Frequency 为 300
    • 对于其他 target 为 Mimic 的关节,设置 Natural Frequency 为 2500
  5. 点击 Import 完成过程。
夹爪导入
Robotiq 2F-140 夹爪导入设置

连接 UR10e 机器人和 Robotiq 2F-140 夹爪

本节概述两种连接方法:

  • 选项 1:使用固定关节和共享关节链直接连接夹爪。
  • 选项 2:使用 Robot Assembler 和 Variant 连接末端执行器。

选项 1:使用 GUI 连接

  1. 打开 UR10e USD 文件(ur.usd)。
  2. robotiq_2f_140.usd 文件拖放到场景中。
  3. robotiq_2f_140.usd prim 重命名为 ee_link
  4. ee_link xform 设置为 wrist_3_link 的位置和方向:
    • Translate: (1.18425, 0.2907, 0.06085)
    • Orient: (-90, 0, -90)
  5. 选择 ee_link/root_joint
  6. 在 Property Editor 的 Physics Articulation Root 部分,移除 Articulation Root
  7. Joints 部分,设置 Body0/ur/wrist_3_link
手动连接
手动连接夹爪到机械臂

选项 2:使用 Robot Assembler 连接

  1. 打开 UR10e USD 文件(ur.usd)。
  2. robotiq_2f_140.usd 文件拖放到场景中。
  3. robotiq_2f_140 prim 重命名为 ee_link
  4. 打开 Robot Assembler:Tools > Robotics > Asset Editor > Robot Assembler
    • Base Robot 中,设置 Select Base Robot/urAttach Pointwrist_3_link
    • Attach Robot 中,设置 Select Attach Robot/ur/ee_linkAttach Pointrobotiq_arg2f_base_link
    • 设置 Assembly Namespaceee_link
  5. 点击 Begin Assembling Process
  6. 调整附着点方向,点击 Z +90 将夹爪绕 z 轴旋转 90 度。
  7. 点击 Assemble and Simulate 测试。
  8. 点击 End Simulation And Finish 完成。
Robot Assembler
使用 Robot Assembler 连接

运行仿真

  1. 在 Stage 面板中,选择 ur prim。
  2. 在右下角的 Property Editor 中,找到 Variants 部分。
  3. ee_link 旁边,选择 None 将夹爪从机器人上移除。
  4. 选择 robotiq_2f_140 将夹爪添加到机器人上。
  5. 保存资产:File > Save 或按 Ctrl+S

总结

在本教程中,您将 Universal Robots 的 UR10e 机器人和 Robotiq 的 2F-140 夹爪从 URDF 文件导入到 NVIDIA Isaac Sim,并使用 GUI 和 Robot Assembler 将它们连接在一个关节链下。

第7课:配置机械臂 中级

学习配置物理、关节力限制和增益

学习目标

这是四课机械臂系列的第二课。本教程展示如何配置 Universal Robots 的 UR10e 机器人和 Robotiq 的 2F-140 夹爪的物理、关节力限制和增益。30 分钟教程

前提条件

注意:如果未完成前面的教程,可以在 Content Browser 的 Isaac Sim/Samples/Rigging/Manipulator/Import_Manipulator/ur10e/ur/ur_gripper.usd 找到预构建资产。

为操作任务调整关节链

调整 UR10e 机器人的关节链,使其更稳定和精确。打开 UR10e 机器人的物理层(位于 configuration 文件夹中,后缀为 _physics)。

  1. 在 Stage 面板中,选择 ur/root_joint prim。
  2. 在右下角的 Property Editor 中,向下滚动到 Physics/Articulation 部分。
  3. 选择 Articulation Enabled
  4. Solver Position Iterations Count 增加到 64
  5. Solver Velocity Iterations Count 增加到 4
  6. Sleep Threshold 降低到 0.00005
  7. Stabilization Threshold 降低到 0.00001
  8. Ctrl + S 保存更改。
关节链属性
关节链属性设置

添加物理材质

  1. 打开 2F-140 夹爪的物理层(后缀为 _physics)。
  2. 右键点击 robotiq_arg2f_140_model prim,选择 Create > Physics > Physics Material,选择 Rigid Body Material
  3. 将物理材质拖到 robotiq_arg2f_140_model/Looks 文件夹。
  4. 在属性面板中,设置 static friction1.0dynamic friction1.0
  5. 将物理材质应用到夹爪指尖。选择 colliders/left_inner_finger/mesh_1/box,在属性面板中选择创建的物理材质。
  6. colliders/right_inner_finger/mesh_1/box prim 重复相同过程。

配置关节力限制

  1. 在 Stage 面板中,选择 robotiq_arg2f_140_model/joints/finger_joint prim。
  2. 在 Property Editor 中,向下滚动到 Drive/Angular/Max Force 部分。
  3. Max Force 设置为 200
  4. Ctrl + S 保存更改。

检查机器人关节链

  1. 打开 Physics InspectorTools > Physics > Physics Inspector
  2. 选择场景中的 UR 关节链,点击圆形箭头图标刷新关节链。
  3. 尝试用蓝色滑块更改目标位置,验证 DOF 位置达到指定目标。
Physics Inspector
Physics Inspector 检查关节链

使用 Gain Tuner 调节增益

使用 Gain Tuner 扩展验证 UR 机器人和夹爪手指的增益。要临界阻尼机器人增益,设置 Nat. Freq.0.5Damping Ratio1.0

  1. 转到 Tools > Robotics > Asset Editors > Gain Tuner
  2. Gain Tuner 窗口的 Select Robot 下拉列表中,选择场景中的 ur 关节链。
  3. Tune Gains 面板中,调整机器人和夹爪手指关节的增益。使用 Test Gains Settings 面板进行测试。
提示:如果难以调节整个机器人的增益,建议先确定一小部分关节的增益。
  • 如果结果图显示机器人未达到目标位置,可以稍微增加 Nat. Freq.
  • 如果结果图显示机器人超过目标位置,可以稍微降低 Nat. Freq. 并增加 Damping Ratio
  • 禁用重力可以帮助更清晰地看到增益效果。
Gain Tuner
Gain Tuner 界面

总结

在本教程中,您学习了如何使用 Gain Tuner 配置 UR10e 机器人和 Robotiq 2F-140 夹爪的物理、关节力限制和增益。

第8课:生成机器人配置文件 中级

学习生成 UR10e 机器人和 2F-140 夹爪的机器人配置文件

学习目标

这是四课机械臂系列的第三课。本教程展示如何为 UR10e 机器人和 2F-140 夹爪生成机器人配置文件。这些机器人配置文件提供有关机器人运动学、动力学和其他属性的信息,用于 RMPFlow、CuMotion 和 Lula 运动学求解器。30 分钟教程

生成机器人 URDF

启用 USD to URDF Exporter Extension

  1. 转到 Window > Extensions
  2. 输入 URDF 搜索,找到 Isaac Sim USD to URDF Exporter Extension
  3. 点击 ENABLE 启用,勾选 AUTOLOAD

导出 URDF 文件

  1. 打开 ur_gripper.usd 资产。
  2. 点击 File > Export URDF
  3. 将文件名保存为 ur_gripper.urdf
  4. 选择 Mesh Directory Path 保存 URDF 网格。
  5. 点击 Export
导出URDF
导出 URDF 文件设置

生成 Lula 机器人描述文件和碰撞球

启用 Lula Extension

  1. 转到 Window > Extensions,搜索 Lula,启用 Isaac Sim Lula Extension。

准备机器人资产

Lula 机器人描述编辑器不支持可实例化网格。必须取消勾选所有 visualscollisions prims 的 Instantiable 字段。

在 Lula 机器人描述编辑器中配置关节

  1. PLAY 开始仿真。
  2. 点击 Tools > Robotics > Lula Robot Description Editor
  3. Selection Panel 中,选择 ur 关节链。
  4. 向下滚动到 Set Joint Properties 部分。
  5. 对于每个 Universal Robots 关节,将 Joint Status 设置为 Active Joint
  6. 将 Robotiq 2F-140 夹爪关节保持为 Fixed Joint
重要:不要停止仿真,您需要它来生成碰撞球。
Lula编辑器
Lula 机器人描述编辑器

生成碰撞球

  1. 转到 Link Sphere editor 部分。
  2. Selection Panel/Select link 中选择链接(例如 upper_arm_link)。
  3. Link Sphere editor/Generate Spheres/Select Mesh 下拉菜单中选择网格。
  4. 设置 Radius Offset0.03
  5. 设置 Number of Spheres8
  6. 点击 Generate Spheres,球体将变为青色表示已生成。
  7. ur 关节链中的所有其他链接重复相同步骤。
碰撞球编辑器
Link Sphere Editor 生成碰撞球

导出 Lula 机器人描述文件

  1. Lula Robot Description Editor 中,找到 Export To File 部分。
  2. 展开 Export to Lula Robot Description File,点击文件图标,指定文件名为 ur10e.yaml
  3. 点击 Save 导出。
  4. 也可以通过 Export To File > Export to cuMotion XRDF 导出 cuMotion XRDF 文件,指定文件名为 ur10e.xrdf
  5. 导出后停止仿真。
导出机器人描述文件
导出 Lula 机器人描述文件

总结

在本教程中,您学习了如何使用 Lula Robot Description and XRDF Editor 和 USD to URDF Exporter Extension 为 UR10e 机器人和 2F-140 夹爪生成机器人配置文件。

第9课:抓取放置示例 中级

学习使用 UR10e 机器人和 2F-140 夹爪跟随目标并抓取方块

学习目标

这是四课机械臂系列的最后一课。本教程将一切整合在一起,展示如何使用 UR10e 机器人和 2F-140 夹爪跟随目标并抓取方块。我们将使用 Lula 运动学求解器跟随目标,使用 RMPFlow 抓取方块。30 分钟教程

前提条件

夹爪控制示例

以下脚本使用 Parallel Gripper 类控制夹爪关节,使用 Manipulator 类控制机器人关节。步骤 0 到 400 缓慢关闭夹爪。步骤 400 到 800,缓慢打开夹爪,然后重置夹爪位置为 0。

from isaacsim import SimulationApp
simulation_app = SimulationApp({"headless": False})

import numpy as np
from isaacsim.core.api import World
from isaacsim.core.utils.stage import add_reference_to_stage
from isaacsim.core.utils.types import ArticulationAction
from isaacsim.robot.manipulators import SingleManipulator
from isaacsim.robot.manipulators.grippers import ParallelGripper
from isaacsim.storage.native import get_assets_root_path

my_world = World(stage_units_in_meters=1.0)
assets_root_path = get_assets_root_path()
asset_path = assets_root_path + "/Isaac/Samples/Rigging/Manipulator/configure_manipulator/ur10e/ur/ur_gripper.usd"
add_reference_to_stage(usd_path=asset_path, prim_path="/ur")

gripper = ParallelGripper(
    end_effector_prim_path="/ur/ee_link/robotiq_arg2f_base_link",
    joint_prim_names=["finger_joint"],
    joint_opened_positions=np.array([0]),
    joint_closed_positions=np.array([40]),
    action_deltas=np.array([-40]),
    use_mimic_joints=True,
)

my_ur10 = my_world.scene.add(
    SingleManipulator(
        prim_path="/ur", name="ur10_robot",
        end_effector_prim_path="/ur/ee_link/robotiq_arg2f_base_link",
        gripper=gripper,
    )
)
my_world.scene.add_default_ground_plane()
my_world.reset()

i = 0
while simulation_app.is_running():
    my_world.step(render=True)
    if my_world.is_playing():
        i += 1
        gripper_positions = my_ur10.gripper.get_joint_positions()
        if i < 400:
            my_ur10.gripper.apply_action(ArticulationAction(joint_positions=[gripper_positions[0] + 0.1]))
        if i > 400:
            my_ur10.gripper.apply_action(ArticulationAction(joint_positions=[gripper_positions[0] - 0.1]))
        if i == 800:
            i = 0
simulation_app.close()
夹爪控制
夹爪控制示例

使用 Lula 运动学求解器跟随目标

创建使用 Lula 运动学求解器的跟随目标任务,您可以使用立方体指定目标位置,机器人将使其末端执行器移动到目标位置。

运行脚本:./python.sh standalone_examples/api/isaacsim.robot.manipulators/ur10e/follow_target_example.py

将立方体移动到目标位置并运行脚本,查看机器人将其末端执行器移动到目标位置。

跟随目标
使用 Lula IK 的跟随目标示例

RMPFlow 配置

使用 RMPFlow 控制末端执行器。ur10e_rmpflow_common.yaml 文件指定 RMPFlow 控制器的各种参数,包括关节限制缓冲、cspace 目标 RMP、碰撞 RMP 等。

使用 RMPFlow 的跟随目标示例

创建 RMPFlow 控制器将机器人末端执行器移动到目标位置。

运行脚本:./python.sh standalone_examples/api/isaacsim.robot.manipulators/ur10e/follow_target_example_rmpflow.py

RMPFlow跟随目标
使用 RMPFlow 的跟随目标示例

总结

在本教程中,您学习了如何使用夹爪控制、Lula 运动学求解器和 RMPFlow 来控制 UR10e 机器人执行跟随目标和抓取放置任务。

第10课:装配闭环结构 高级

学习使用 USD 层编辑资产、打破闭环关节链、添加 Mimic 关节等技术

学习目标

在本教程中,您将:

  • 使用 USD 层编辑和测试资产
  • 在 CAD 导入后添加材质和调整关节
  • 打破闭环关节链
  • 添加关节驱动,包括 Mimic 关节
  • 调整碰撞形状
  • 使用 Gripper Controller Omnigraph 测试夹爪

30 分钟教程

入门

从 Robotiq 2F-85 并联夹爪的 STP 文件开始,该文件已导入到 Onshape 文档中并建模了关节。

参考 USD 位于 Samples/Rigging/Gripper/Robotiq 2F-85

使用层编辑和测试资产

所有刚体、质量和关节定义都在 Onshape 中完成。导入到 Isaac Sim 后,资产包含基本关节信息和刚体设置。

使用层(Layers)编辑资产。层允许在根资产之上构建场景并保存它,而不更改底层根层资产。

  1. 创建一个没有引用的新场景。
  2. 将此场景保存为 Robotiq_2F_85_config.usd,与导入资产在同一文件夹。
  3. 打开层标签,将 Robotiq_2F_85_edit.usd 拖到 Root Layer 中。
层管理
USD 层管理

导入后调整关节

有时 Onshape Client API 的限制会导致关节从图纸翻转 180 度。要修复此问题,选择翻转的关节,在 Rotation 0 和 Rotation 1 X 轴上应用相等的 180 度偏移。

关节 [left, right]_outer_finger_joint 需要限制 [0,180],[finger_joint, right_outer_knuckle_joint] 需要限制 [0, 75]。

添加指尖物理材质以增加摩擦接触:

  1. 打开菜单 Create > Physics > Physics Material
  2. 选择 Rigid Body Material,重命名为 fingertip_material
  3. 将两个摩擦系数设置为 0.8,摩擦 Combine Mode 设为 Max
  4. 选择 right_inner_fingerleft_inner_finger,应用创建的材质。

打破关节链循环

如果现在尝试仿真此资产,您会在屏幕上看到两个大警告,因为关节链必须是运动学树,但不需要删除任何关节。

循环错误
关节链循环错误警告

要消除这些警告,必须选择一个关节从关节链中排除,使其被视为最大坐标关节。对于此夹爪,最好的选择是移除连接内部连杆到夹爪主体的关节——inner_knuckle_joint

  1. 选择 left_inner_knuckle_joint prim。
  2. 在 Physics 下的 Joint 部分,选择 Exclude From Articulation
  3. right_inner_knuckle_joint 重复此操作。
打破循环
排除关节以打破循环

添加关节驱动

为所有关节添加关节驱动 API:

  1. 选择所有关节,在 Properties 面板中 Add > Physics > Angular Drive(或移动关节用 Linear Drive)。
  2. 将此夹爪建模为力驱动抓取。选择 finger_jointright_outer_knuckle_joint,将 Stiffness 设为零,Damping 设为 5000.0。
  3. 设置 Max Force 为 180.0 以控制夹爪关闭时施加的压力。
  4. 在关节部分的 Advanced 标签下,设置 Maximum Joint Velocity 为 130.0。

总结更改:

  • Maximum Joint Velocity: 130
  • Max Force: 180.0
  • Damping: 5000.0
  • Stiffness: 0.0

添加 Mimic 关节

此夹爪使用单个输入命令同时移动两个手指。这是通过 Mimic Joint 规范将驱动关节组合在一起实现的。

  1. 选择 right_outer_knuckle_joint
  2. 移除或在我们刚添加的关节驱动中将所有值设为零。
  3. 在 Properties 面板上,点击 Add > Physics > Mimic Joint
  4. 在 Mimic 设置中,设置 gearing 为 -1.0。
  5. 设置 Reference Joint 为 finger_joint
  6. 再次运行仿真。

碰撞网格

导入时碰撞网格的默认设置是 Convex Hull。对于夹爪,通常希望指尖具有紧密跟随指尖几何轮廓的碰撞网格。将碰撞近似类型更改为 Convex Decomposition

使用 Gripper Controller Omnigraph 测试

创建一个 Omnigraph 来控制夹爪,以便在仿真中测试其功能。使用 Joint Position 控制器图来驱动夹爪关节。

总结

在本教程中,您学习了处理闭环结构的技术,包括使用 USD 层、打破关节链循环、添加 Mimic 关节和调整碰撞网格。

第11课:调节关节驱动增益 高级

学习使用 Gain Tuner 调节机器人关节,使其按预期行为

学习目标

在本教程中,您学习如何使用 Gain Tuner 调节机器人的关节,使其按预期行为。

Gain Tuner
Gain Tuner 概览

前提条件

  • 如果机器人是 URDF 格式,按照 URDF 导入教程导入。
  • Gain Tuner 扩展设计用于应用了 Robot Schema 的 USD 资产。
  • 建议按照推荐的 Asset Structure 设置机器人。
  • 转到 Tools > Robotics > Asset Editors > Gain Tuner 访问此扩展。

增益调节

调节关节驱动增益是找到平衡稳定性和响应性的最佳值的过程。例如,低阻尼和刚度可能无法克服机器人的惯性,测量值将与目标值偏移;过高的刚度可能导致机器人超调并在目标周围振荡。

位置驱动

对于机器人的每个关节:

  1. 首先将阻尼设为零,仅调节刚度。这将帮助您在没有微分项影响的情况下建立稳定响应。
  2. 增加刚度直到关节能够收敛到接近目标位置。
  3. 将刚度降低一个数量级。
  4. 设置刚度后,添加比刚度低一个数量级的阻尼。这将是您的参数基线,通常不应超调。如果需要更快的响应,可以进一步降低阻尼。
  5. 围绕此建立的基线微调两个增益,以实现所需的性能。
提示:要模拟包含重力补偿的控制,选择机器人的所有刚体,在属性面板中勾选 Disable Gravity。
速度限制和工业机器人

许多机器人,包括大多数工业机器人,都预调了关节驱动的 PD 控制,可以设置为具有完美的位置控制响应,始终以给定的关节速度限制驱动。要重现此行为,可以将关节刚度从先前的调节启发式增加两倍,并在 Properties 面板中的 Joint > Advanced > Maximum Joint velocity 定义最大关节速度。

速度驱动

对于机器人的每个关节:

  1. Stiffness 设为零,仅调节阻尼。
  2. 增加阻尼直到关节能够收敛到接近目标速度。
  3. 如果机器人可能承载额外负载,稍微增加阻尼(例如增加 10%)以考虑额外负载。
  4. 可以通过设置最大关节速度或限制最大关节力来限制关节的输出。

将增益保存到资产

根据 NVIDIA Isaac Sim Asset Structure,关节增益属于物理配置,理想情况下应保存在物理配置层上。Save Gains to Physics Layer 按钮会在资产的物理层中搜索并应用更新的增益。

可视化结果

测试结果以图表形式可视化,其中跟踪的关节位置和速度与命令轨迹进行比较。在左侧面板中选择要可视化的关节,其各自的测试结果将显示在图表中。

增益调节结果
Gain Tuner 结果图

提示

  • 合理的目标是找到一组增益,能够斜坡到位置但将超调保持在目标的 1% 以内。
  • 如果您的机器人具有内置重力补偿或单独的重力补偿控制器,请禁用重力。
  • 将预期一起移动的关节分组,首先单独调节每个组的增益,然后组合它们进行最终测试。
  • 降低您正在调节的关节的最大速度(如果在实践中不期望以那么快的速度被命令)。

总结

本教程介绍了如何使用 Gain Tuner 调节位置驱动和速度驱动的关节增益,以及如何将增益保存到资产并可视化结果。

第12课:资产优化 高级

学习如何使机器人资产更具性能,找到实现更快仿真或渲染时间的权衡

学习目标

本教程详细介绍如何使机器人资产更具性能,以及在哪里可以找到实现更快仿真或渲染时间的权衡。30 分钟教程

入门

本教程探索 NVIDIA Jetbot 机器人资产以改进性能。如果从不同来源(例如自定义 CAD)导入资产,每个刚体可能有大量网格,这会严重影响性能。

Jetbot优化对比
Jetbot 优化前后对比:未优化 40 FPS,优化后 64 FPS

资产结构优化

设置重新父子化和层

  1. 在 Isaac Sim 中,转到 Edit > Preferences
  2. Stage > Authoring 下,确保勾选 Inherit Parent Transform
  3. 打开位于 Isaac Sim/Samples/Rigging/Jetbot/Jetbot_Optimized/Jetbot_optimized.usd 的 Jetbot。
  4. 选择 Layers 面板,点击底部的 Insert Sublayer 按钮,选择 Isaac Sim/Samples/Rigging/Jetbot/Jetbot_Base/Jetbot_base.usd
插入子层
插入子层

创建资产结构

  1. 在 Stage 面板的右侧菜单中,选择 Show Root
  2. 创建一个新的 Xform 叫做 Jetbot_Sim,将其拖到 Root 上。
  3. 右键点击 Jetbot_Sim,选择 Set as Default Prim
  4. 右键点击选择 Create > Scope,命名为 Visuals
  5. 将此 scope 拖到 Root 上,使其从 Jetbot_Sim 中取消父子化。
  6. 选择 Jetbot 下的 prims,将它们拖到 Jetbot_Sim 上。
  7. 验证它们被停用而不是从 Jetbot 中删除。
  8. 全部选择,然后右键点击选择 Activate
  9. 删除 Jetbot_Sim 内 prims 中的内容。

合并网格

  1. 打开 Mesh Merge Tool:Tools > Robotics > Asset Editors > Mesh Merge Tool
  2. 选择 Jetbot/left_wheel prim。
  3. 勾选 Combine Materials 框,插入 Jetbot_Sim/Looks 以在 Jetbot Sim xform 中保存材质。
  4. 点击 Merge
  5. 选择 /Merged/left_wheel 上的结果网格,在属性面板中清除变换。
  6. 右键点击 Visuals scope,创建名为 left_wheel 的 xform,将结果网格拖入其中。从场景中移除 /Merged xform。
  7. 创建对车轮的内部引用:在 left_wheel 内创建 Visuals Xform,右键点击选择 Add > Reference,选择 Jetbot_base.usd,设置 prim_path 为 /Visuals/left_wheel
  8. References 部分清除 Asset Path 条目。
  9. 保存文件(CTRL+S)。
  10. 对其他主体重复上述步骤以完成网格优化。
Mesh Merge Tool
Mesh Merge Tool 合并网格

场景图实例化(Scenegraph Instancing)

场景图实例化支持子图 prims 的可共享、组合表示。这是一个指令,告诉场景合成器场景的某个组件是可重复模式。

  1. 打开 USD 文件 Isaac Sim/Samples/Rigging/Jetbot/Jetbot_Optimized/Jetbot_optimized_post_merge.usd
  2. 左右车轮网格相同。让左右车轮引用同一网格以进一步简化资产。选择 Visuals/left_wheel 重命名为 Visuals/wheel
  3. 删除 Visuals/right_wheel
  4. 选择 Jetbot_Sim/right_wheel/Visuals,将引用 Prim Path 从 /Visuals/right_wheel 替换为 /Visuals/wheel
  5. Shift 选择 /Jetbot_Sim 下的所有 Visuals prims,在 Property 面板中勾选 Instanceable
  6. 保存文件(CTRL+S)。
实例化
设置 Instanceable 后的场景

其他考虑事项

  • 最小化灯光数量:每个灯光都会负面影响渲染性能。默认情况下,如果场景有超过 10 个灯光,渲染会恢复为基于采样的照明。
  • 减少半透明材质:每个半透明材质比默认 OmniPBR 材质产生更大的性能瓶颈。
  • 优化物理性能:搜索可以修改的仿真方面以降低计算成本。碰撞体通常具有高计算成本。碰撞形状越基本,仿真性能越好。减少接触点数量也能带来巨大的性能优势。
  • 近似车轮碰撞体:如果有车轮碰撞体,考虑使用简单的圆柱体或球体碰撞体代替网格碰撞体。这可以显著提高性能,并允许机器人在地形上平稳行驶。

总结

本教程介绍了通过合并网格、场景图实例化和其他优化技术来提高机器人资产性能的方法。

第13课:为运动策略装配腿式机器人 高级

学习装配 H1 人形机器人以匹配运动策略指定的配置

学习目标

本教程的目的是解释装配腿式机器人以匹配运动策略指定的配置的过程。Isaac Sim 的 Policy Controller Class 已在运行时处理机器人的装配过程,因此本教程仅在您希望使用 ROS 等外部进程运行机器人策略时才相关。

在本教程中,您将逐步装配 H1 人形机器人以匹配 H1 平坦地形运动策略的配置:

  1. 设置初始机器人位置
  2. 设置关节配置
  3. 验证关节配置
注意:H1 平坦地形策略环境定义文件可在 此处获取。

设置初始机器人位置

机器人的初始关节位置在环境定义文件的 robot:init_state:joint_pos 部分指定。

robot:
  init_state:
    joint_pos:
      .*_hip_yaw: 0.0
      .*_hip_roll: 0.0
      .*_hip_pitch: -0.28
      .*_knee: 0.79
      .*_ankle: -0.52
      torso: 0.0
      .*_shoulder_pitch: 0.28
      .*_shoulder_roll: 0.0
      .*_shoulder_yaw: 0.0
      .*_elbow: 0.52
    joint_vel:
      .*: 0.0
注意:关节位置以弧度指定,而在 USD 中,关节位置以度指定。

存储机器人的初始状态:

  1. 从 Content Browser 打开 h1.usd 文件(位于 Isaac Sim/Robots/Unitree/H1)。
  2. 创建关节状态 API 以报告机器人关节位置和速度。
  3. 在场景右上角,选择 funnel 图标,点击 Physics Joints 过滤关节列表。
  4. 左键点击第一个关节(left_hip_yaw),按住 Shift 左键点击最后一个关节(right_elbow)选择所有关节。
  5. 右键点击任何选中的关节,点击 Add > Physics > Joint State Angular 创建关节状态 API 属性。
  6. 右键点击任何选中的关节,点击 Add > Physics > Angular drive 创建关节驱动 API 属性。
过滤关节
过滤 Physics Joints
  1. 转到每个关节,在关节驱动 API 的 Target Position 属性中设置上面环境定义文件中指定的值。记得将关节位置和速度从弧度转换为度。
  2. 按 Play,验证机器人移动到环境定义文件中指定的初始位置。
  3. 为防止机器人无限下落,在 /h1/torso_link 上右键点击 Create > Physics > Joint > Fixed Joint 添加固定关节。
H1初始位置
H1 机器人初始位置

为防止关节状态 API 值重置,需要更改仿真设置:

  1. 点击 Edit > Preferences
  2. 在左下方选择 Physics 标签。
  3. 取消勾选 Reset Simulation on Stop
仿真设置
取消勾选 Reset Simulation on Stop
  1. 删除机器人与世界之间的固定关节。
  2. Ctrl+S 保存 USD 文件。
  3. 再次勾选 Reset Simulation on Stop

设置关节配置

将关节配置设置为与策略的机器人配置匹配。关节驱动配置在环境定义文件的 scene:robot:actuators 部分指定。

actuators:
  legs:
    class_type: omni.isaac.lab.actuators.actuator_pd:ImplicitActuator
    joint_names_expr:
    - .*_hip_yaw
    - .*_hip_roll
    - .*_hip_pitch
    - .*_knee
    - torso
    effort_limit: 300
    velocity_limit: 100.0
    stiffness:
      .*_hip_yaw: 150.0
      .*_hip_roll: 150.0
      .*_hip_pitch: 200.0
      .*_knee: 200.0
      torso: 200.0
    damping:
      .*_hip_yaw: 5.0
      .*_hip_roll: 5.0
      .*_hip_pitch: 5.0
      .*_knee: 5.0
      torso: 5.0

设置关节配置:

  1. 左键点击关节(如 left_hip_yaw)。
  2. 在属性面板中,向下滚动到 joint drive 属性,将 stiffnessdamping 设置为环境定义文件中指定的值。记得将刚度和阻尼转换为度。
注意:USD 文件刚度单位为 Kg·m²/(Deg·s²),阻尼单位为 Kg·m²/(Deg·s)。转换公式:
  • S_deg = S_rad × π/180
  • D_deg = D_rad × π/180

effort_limit 是可施加到关节的最大力,将其设置为关节驱动 API 的 Max Force 属性。

向下滚动到 Advanced 标签下的 Raw USD Properties,将 ArmatureJoint Friction 属性设置为环境定义文件中指定的值。

对于 Maximum Joint Velocity 属性,将其设置为 velocity_limit 值,记得转换为度:ω_deg = ω_rad × 180/π

关节配置
关节驱动配置
注意:记得为机器人中所有活动关节设置关节配置。例如,手臂和腿部。

验证关节配置

要验证关节配置,可以播放仿真并在脚本编辑器中运行以下代码片段来打印关节配置:

  1. 播放仿真。
  2. 打开脚本编辑器:Window > Script Editor
  3. 复制并粘贴以下代码:
    from isaacsim.core.prims import SingleArticulation
    
    prim_path = "/h1"
    prim = SingleArticulation(prim_path=prim_path, name="h1")
    print(prim.dof_names)
    print(prim.dof_properties)
  4. 点击 Run 运行。
  5. 验证控制台输出中每个关节的 maxVelocitymaxEffortstiffnessdamping 值与环境定义文件中指定的值匹配。
注意:装配好的 H1 机器人可在 Content Browser 的 Isaac/Samples/Rigging/H1/h1_rigged.usd 找到。

总结

本教程涵盖以下主题:

  • 设置初始机器人位置
  • 设置关节配置(弧度与度的转换)
  • 验证关节配置