












参考:
Isaac Sim 是 NVIDIA 开发的,基于 NVIDIA Omniverse 平台构建的,一个物理精确的虚拟环境,用于开发、测试和管理基于 AI 的机器人,它为构建虚拟机器人实验提供了基本功能,包括导入机器人模型以及仿真 RGB-D、激光雷达、接触、超声波和 IMU 等传感器。
Isaac Sim 使用 USD 交换文件格式来表示场景。通用场景描述(USD)是一种易于扩展的开源三维场景描述和文件格式。当然也支持从 URDF、Mujoco XML 文件导入。
*.usd/*.usdc: 一般的USD文件,以二进制存储与压缩,因此读取速率会快一些*.usda: 纯文本形式的USD文件,更方便阅读*.usdz: 以zip压缩文件形式存储的USD文件,可以将多个USD文件打包成一个*.drc: 其它自定义的文件格式
Isaac 是一个“专为机器人和AI打造的加速平台”。
在硬件层面它支持各种类型的硬件,比如RTX的GPU等等。在系统软件层面,依赖于RTX、CUDA、PhysX等框架。在平台层面,依赖于NVIDIA AI和NVIDIA Omniverse,最终就可以实现各类应用,比如机器人数据采集、环境仿真等等。甚至还有专门针对ROS提供的一些硬件加速的函数包,叫Isaac ROS。

WorkStation 版相当于安装了一个独立的应用程序,适合便捷打开 GUI 界面调试,适合通过 GUI 和扩展的方式进行程序开发。如果想通过这种方式运行代码,需要使用安装目录的 isaac-sim.sh,限制了 python 环境的可能性,例如运行 test.py 文件需要:
~/isaacsim/isaac-sim.sh ~/path/test.py
本文使用有显示器的服务器安装 Isaac Sim Workstation 演示,流程参考:https://docs.isaacsim.omniverse.nvidia.com/latest/installation/install_workstation.html 如果你使用无显示器的服务器,可以通过 Docker 安装,参考:https://docs.isaacsim.omniverse.nvidia.com/latest/installation/install_container.html
参考 Isaac Sim Requirements 查看系统是否满足要求。
(1)下载 IsaacSim
打开 Isaac Sim Latest Release 网页:https://docs.isaacsim.omniverse.nvidia.com/latest/installation/download.html#isaac-sim-latest-release
下载第一行最新版的 Isaac Sim 4.5.0 压缩包。
mkdir ~/isaacsim
cd ~/Downloads
unzip "isaac-sim-standalone@4.5.0-rc.36+release.19112.f59b3005.gl.linux-x86_64.release.zip" -d ~/isaacsim
cd ~/isaacsim
./post_install.sh
./isaac-sim.selector.sh

点击 Start 即可运行 Isaac Sim 主程序。
第一次运行会 warm up shader cache 可能会比较慢比较卡。 后续可以运行
~/isaacsim/isaac-sim.sh启动
Python 版在创建的虚拟环境中直接安装 Isaac Sim,更容易和其他代码程序的依赖组合,个人认为更便于机器人开发。
本节参考:Isaac Sim Documents - Python Environment Installation
(1)创建虚拟环境
conda create -n env_isaacsim python=3.10
conda activate env_isaacsim
(2)安装 Isaac Sim 包
首先更新 pip
pip install --upgrade pip
安装 Isaac Sim 完整版包
pip install isaacsim[all]==4.5.0 --extra-index-url https://pypi.nvidia.com
安装 Isaac Sim 缓存扩展
pip install isaacsim[extscache]==4.5.0 --extra-index-url https://pypi.nvidia.com
(3)示例
创建 python 程序如下:
import isaacsim
from isaacsim.simulation_app import SimulationApp
simulation_app = SimulationApp({"headless": True})
## perform any Isaac Sim / Omniverse imports after instantiating the class
运行后效果为打开 Isaac Sim 窗口。
第一次运行会 warm up shader cache 可能会比较慢比较卡。
(1)添加并操作一个立方体
点击 Create->Shape->Cube 添加一个立方体:
E 切换到旋转控制,调整立方体姿态,再按 E 切换到局部坐标系旋转控制R 切换到比例控制,调整立方体形状W 切换回位置控制,调整立方体位置,再按 W 切换到局部坐标系位置控制Esc 取消选中立方体所有的操作都会在右下角的属性面板显示属性变化,也可以直接在右下角输入数值设置立方体参数。

(2)视角控制
F:相机居中并缩放到合适位置Alt+鼠标左键拖动:绕当前视角的中心旋转滚轮 或 Alt+鼠标右键拖动:缩放鼠标中间拖动:平移视角鼠标右键拖动:旋转视角(3)Stage
在窗口右侧有一个 Stage 面板。
此时如果点击 Create->Xform 可以创建一个空坐标系。
可以将方块移动到坐标系内,此时移动坐标系,方块也会跟着移动,因为此时方块是 Xform 的子级,两者之间的变换关系不会因为移动 Xform 而变化。
(4)Property
窗口右下角是属性面板(Property),不同的单元(Xform, Shape, Light)都有着不同的属性数据格式,这是因为它们在 Issac Sim 中都是不同的数据类型。
(1)重力
点击 Create->Physics->Physics Scene 添加 Physics Scene 到右侧的 Stage Tree 中。可以通过它的属性设置重力方向为 -Z 方向,大小为 9.8(默认为国际标准单位)
(2)地面
点击 Create->Physics->Ground Plane 添加地面。
(3)照明
每个创建的 Stage 都会有默认的光源。可以通过点击 Create->Light->Sphere Light 添加一个额外的光源。
Main 中点击右侧的白色方块调整颜色Main 中点击 Intensity 修改光照强度为 1e6Shaping 中点击 cone:angle 将光照范围限制为 45 度,点击 cone:angle 设置边缘柔滑为 0.05。Main->Intensity 为 300。效果如下:

(1)向场景中添加形状
Create->Shapes->Cube 创建立方体Scale 按钮,或按 R 键,激活缩放小部件,调整立方体形状Transform->translate 中设置物体的位置同样,我们可以将其中加入其它形状。
(2)添加物理属性
+ Add,选择 Physics->Rigid Body with Colliders Preset,设置三个形状的物理属性都是带有碰撞的刚体Play 三个物体都会掉落到地面上Rigid Body 和 Collider,可以点击这两个 APIs 的右上角 x 删除属性
(3)添加接触和摩擦
Create->Physics->Physics Material ,选择 Rigid Body Materials 创建新的物理材质,可以在右侧的 Stage 栏中看到Physics materials on selected models,设置零件的材质。(4)添加外观
刚才添加的是物理材质,但是实际上物体没有颜色反光属性(可以通过关闭光源查看),需要为物体创建外观
Create->Materials->OmniPBRMaterials on selected models,设置零件的外观。Material and Shader->Shader->Albedo 修改基础颜色,或修改反射率、粗糙度等查看变化
Isaac 使用 USD 格式作为所有的场景格式。
(1)保存场景
点击 File->Save As... 将当前场景保存为新 USD 文件。(如果点击 Save Flattened As 则是将所有组件保存到同一个 mesh 中)
可以选择 .usd 格式(二进制),.usda(人类可阅读格式)。

(2)加载场景
Files->Open 打开 USD 文件直接编辑。Files->Add Reference 将 USD 文件作为引用添加,无法直接编辑。(直接将文件拖入到文件窗口也是以引用方式添加)(3)引用文件添加的注意事项
引用的文件最好将所有刚体排列成有意义的分层结构,以前面场景中的物体为例,将其视为两轮小车:
File->Open 打开刚才保存的 USD 文件Xform,双击将其重命名为 mock_robot,并将其拖动到空白位置,使其和 World 以及 Environment 同级,右键设置为默认坐标系 Set as Default PrimCube 为 body,两个 Cylinder 分别为 wheel_left, wheel_right,将刚刚创建的刚体(cube, Cylinder),以及 Physics Material 和 Looks 都拖到 mock_robot 坐标系下
新建一个文件,点击 File->Add Reference,可以看到只有机器人被添加进来

使用 File->Open 打开刚才的文件(最好和图中的一样,后面要添加关节)
(1)添加关节
Create->Scope 创建一个 Scope 来存储关节,重命名为 joints。Create->Physics->Joint->Revolute Joint 创建一个旋转关节。body0 是父实体(如 body),body1 是子实体(如 wheel_right)。Revolute Joint 中将旋转轴更改为 Y/Z,根据模型的情况。joint_wheel_right 并拖动到 joints 的 scope 中
点击运行,可以观察到机器人落到了地面,按住 shift 拖动方块,可以发现两个圆柱旋转带动机器人在地面上滚动。

(2)添加关节驱动器
为了能够更好地控制关节,必须添加关节驱动器(位置控制或速度控制)实现驱动。
添加方法:选中关节,点击属性选项卡的 +Add 按钮,选择 Physics->Angular Drive 向关节添加驱动,可以在属性面板下滑找到 Drive 以设置属性。
对于该轮子来说,可以设置高阻尼如 Damping=1e4,目标速度可以设为 Target Velocity=200,点击播放可以看到机器人运动。
(3)添加 Articulation 关节
Articulation 是 Issac 中的另一种关节,与 joint 不同之处在于,它是由一系列 joint 组成的关节组。
添加方法:选择机器人的基坐标系 mock_robot,在属性选项卡中点击 +Add,添加 Physics->Articulation Root
这样就添加完成了。
(4)添加控制器
这部分主要是用来测试。
点击 Issac Utils->Common Omnigraphs->Articulation Velocity Control 添加一个速度控制图表。
Robot Prim 选择机器人基坐标系 mock_robot

点击 Stage 中的 Graphs->Velocity_Controller->JointCommandArray,修改 Input0 和 Input1,例如设置成相反数让机器人差速原地转,点击播放看效果。
(1)创建相机
点击 Create->Camera,会在 Stage 栏中创建一个 camera,同时界面中会出现一个灰色框,代表相机视图。

可以像正常的刚体一样调整相机的位置。
(2)相机扩展
相机扩展可以实现根据相机创建不同可视化视角,查看摄像头覆盖范围,获取和设计相机姿态。
可以点击 Issac Utils->Workflows->Camera Inspector 打开相机扩展

可以看到面板中有 Camera State 一栏,显示了相机的位置姿态,便于编写代码时查看。
(3)创建相机视角
点击面板中的 Create Viewport,可以创建相机视角的窗口,如下图所示:

在该窗口中,点击左上角的菜单中的 Viewport 选项可以调整相机分辨率。
如果在仿真环境中移动相机位置,相机的状态属性等都会自动更新。
(4)将相机连接到机器人
例如现在需要添加一个车载摄像头,将其固定在 body 上,使其能够跟随 body 运动:
car_cameraWindow->Viewport 启动 Viewport2 视窗,并点击上方的电影机按钮将其切换为 car_camera 的视角(注意选中 mock_robot,在视窗内按 f 可以帮助切换到中心画面)car_camera 拖动到 body 下方,将相机与机器人连接在一起
Isaac Sim 仿真程序大概可以分成 Initialization 和 Simulation 两步骤,即首先初始化环境,创建世界和添加各种物体,然后是仿真的 Step 执行,示例代码如下:
##################################################
# Initialization
##################################################
# 导包
from isaacsim import SimulationApp # 第一行一定是导入SimulationApp,就像 Omniverse 打开 Isaac Sim 一样
simulation_app = SimulationApp({"headless": False}) # 创建一个 SimulationApp 对象,参数是一个字典,headless: False 表示显示图形界面
from omni.isaac.core import World
from omni.isaac.core.objects import DynamicCuboid
import numpy as np
# 创建世界,下面相当于 setup_scene
world = World() # 实例化一个 World 对象
world.scene.add_default_ground_plane() # 添加一个默认的地面
# 创建物体
first_cube = world.scene.add(
DynamicCuboid(
prim_path = "/World/first_cube", # 该物体的路径
name = "first_cube", # 该物体的名字
position = np.array([0, 0, 1.0]), # 该物体的位置
scale = np.array([0.5, 0.5, 0.5]), # 该物体的缩放
color = np.array([0.0, 0.0, 1.0]) # 该物体的颜色
)
)
# 重置世界
world.reset() # 重置世界,创建完成之后,一定不要忘了
##################################################
# Simulation
##################################################
# 开始仿真
for i in range(1000): # 或者while True:
position, orientation = first_cube.get_world_pose() # 获取物体的位置和姿态
linear_velocity = first_cube.get_linear_velocity() # 获取物体的线速度
angular_velocity = first_cube.get_angular_velocity() # 获取物体的角速度
print("Cube position: ", position)
print("Cube orientation: ", orientation)
print("Cube linear velocity: ", linear_velocity)
print("Cube angular velocity: ", angular_velocity)
world.step(render=True) # 仿真一步,render=True 表示显示图形界面
# 关闭仿真
simulation_app.close() # 关闭仿真
from isaacsim import SimulationApp
simulation_app = SimulationApp({"headless": False}) # start the simulation app, with GUI open
import sys
import carb
import numpy as np
from isaacsim.core.api import World
from isaacsim.core.prims import Articulation
from isaacsim.core.utils.stage import add_reference_to_stage, get_stage_units
from isaacsim.core.utils.viewports import set_camera_view
from isaacsim.storage.native import get_assets_root_path
# preparing the scene
assets_root_path = get_assets_root_path()
if assets_root_path is None:
carb.log_error("Could not find Isaac Sim assets folder")
simulation_app.close()
sys.exit()
my_world = World(stage_units_in_meters=1.0)
my_world.scene.add_default_ground_plane() # add ground plane
set_camera_view(
eye=[5.0, 0.0, 1.5], target=[0.00, 0.00, 1.00], camera_prim_path="/OmniverseKit_Persp"
) # set camera view
# Add Franka
# asset_path = assets_root_path + "/Isaac/Robots/Franka/franka.usd"
asset_path = '/home/mahaofei/Programs/01_MR+VLM+RL/Simulation/asset/isaac_sim/ur5e_hand/ur5e_hand.usd'
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Arm") # add robot to stage
arm = Articulation(prim_paths_expr="/World/Arm", name="my_arm") # create an articulation object
# set the initial poses of the arm so they don't collide BEFORE the simulation starts
arm.set_world_poses(positions=np.array([[0.0, 1.0, 0.0]]) / get_stage_units())
# initialize the world
my_world.reset()
init_joint_positions = np.array([0.0, -np.pi/2, np.pi/2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
arm.set_joint_positions([init_joint_positions])
arm_joint_positions = init_joint_positions
while True:
# 机器人的关节位置每次变动一点,连续变动
arm_joint_positions[:6] += 0.001
arm.set_joint_positions([arm_joint_positions])
if arm_joint_positions[0] >= np.pi/2:
arm_joint_positions = init_joint_positions
# step the simulation, both rendering and physics
my_world.step(render=True)
simulation_app.close()

(1)常规代码逻辑
simulation_app 的创建必须在所有 isaac sim 引用之前完成,启动 isaacsim 的仿真窗口。
# 启动 Simulation APP
from isaacsim import SimulationApp # 第一行一定是导入SimulationApp
simulation_app = SimulationApp({"headless": False}) # 创建一个 SimulationApp 对象,参数是一个字典,headless: False 表示显示图形界面
import sys
import carb
import numpy as np
from isaacsim.core.api import World
from isaacsim.storage.native import get_assets_root_path
# 准备场景,获取NVIDIA官方asset路径
assets_root_path = get_assets_root_path()
if assets_root_path is None:
carb.log_error("Could not find Isaac Sim assets folder")
simulation_app.close()
sys.exit()
# 创建世界,添加地面,添加相机视角
my_world = World(stage_units_in_meters=1.0)
my_world.scene.add_default_ground_plane() # add ground plane
set_camera_view(
eye=[5.0, 0.0, 1.5], target=[0.00, 0.00, 1.00], camera_prim_path="/OmniverseKit_Persp"
) # set camera view
# 初始化world
arm.set_world_poses(positions=np.array([[0.0, 1.0, 0.0]]) / get_stage_units())
my_world.reset()
# some code
while True:
# some code
my_world.step(render=True)
simulation_app.close() # 关闭仿真
(1)打开 urdf 导入扩展
点击【Windows -> Entensions】,搜索【import wizard】,结果如下,打开此扩展,并且如果需要经常导入模型的话,可以勾选上Autoload,这样每次启动 IsaacSim 都可以自动启动该扩展。

然后点击【Windows】,此时可以发现已经多出了【Isaac Sim Wizard [alpha]】这个选项,这就是我们需要用到的功能,打开它。

(2)导入 URDF 模型
第一个页面,在下方勾选 【Import URDF from File】,当然这里也可以从其它模型文件导入,例如Mujoco使用的MJCF文件等。然后点击【Next】

下一个页面,没有需要操作的,直接Next即可。
然后会出来一个 URDF Importer 的窗口,在这里,我们需要填写或勾选下面图中标出的地方,其中包括

(3)保存USD文件
然后模型就已经被导入了,不过可能因为没有灯光,看不太出来模型,不过这个正常。
直接按 【Ctrl+S】,将模型保存到本地。
如果想查看模型,可以新建一个Stage,将USD模型拖入进来,就可以看到有颜色的模型。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。