目录
Intro
NVIDIA Sim 是 NVIDIA 推出的一系列模拟和仿真相关工具和平台,旨在通过高性能计算和图形技术加速各类虚拟环境的创建和仿真过程。NVIDIA Sim 提供了从物理引擎到 AI 驱动的模拟的一站式解决方案,广泛应用于自动驾驶、机器人、工业仿真、游戏开发、科学研究等领域。
本文使用的版本及配置信息
产品名称:Isaac Sim
版本信息及相关配置**:
版本:Isaac Sim 4.2.0
操作系统:Ubuntu 22.04
GPU:NVIDIA Georce RTX 3060 Vram 6GB
CUDA版本:11.6
其他运行配置:
32GB内存
Intel 13代 i7
Install
下载完后,最好把omniverse-launcher-linux.AppImage放在Home目录下,然后在路经终端下运行
sudo chmod +x omniverse-launcher-linux.AppImage
./omniverse-launcher-linux.AppImage
bug
sudo apt install libfuse2
然后再重新
./omniverse-launcher-linux.AppImage
然后注册账号或者登录
然后一直continue即可
Omniverse Isaac Sim可以在Omniverse Launcher的Exchange选项卡上找到并安装。在搜索栏中输入“isaac sim”。点击APPS里的ISAAC SIM。
然后install即可
此处需要科学上网(等待下载完成)
然后再Library中Launch就可以了
然后点击start
运行成功
Bug
基础使用
进入使用
物体基本属性
创建一个cube
移动(MOVE)
鼠标点击物体,按下W可以切换到移动模式(分为Global/Local模式,再次按下W可切换)
通过鼠标拖拽物体上的三根轴,可以沿着轴所在的直线移动物体
通过鼠标拖拽物体上的红、绿、蓝三个小方格,可以使得物体在平面上移动
通过鼠标拖拽物体上中心原点,可以在三维空间中移动物体
旋转(ROTATE)
鼠标点击物体,按下E可以切换到旋转模式(分为Global/Local模式,再次按下E可切换)
通过鼠标拖拽物体上红、绿、蓝线,使得物体绕对应的轴旋转
通过鼠标拖拽物体上的灰色球体部分,使得物体旋转
通过鼠标拖拽物体上的外层蓝色圆环,使得物体绕当前视野相机点与物体所在空间点连线的轴旋转
在Isaac Sim中 旋转角度的正负规则为:
人的视野面向轴的方向,逆时针为正,顺时针为负
缩放(SCALE)
鼠标点击物体,按下R可以切换到缩放模式
通过鼠标拖拽物体上的三根轴,可以沿着轴所在的直线缩放物体
通过鼠标拖拽物体上的红、绿、蓝三个小方格,可以使得物体在构成对应平面的两根轴上等比例缩放
通过鼠标拖拽物体上中心原点,可以在三维空间中等比例整体缩放物体
通过拖拽来变换物体有时候无法达到精确的要求,因此通常也会采用属性的变换方法。
在Isaac Sim的右下角有Transform
面板,其中Translate
、Orient
、Scale
可以分别调整物体的平移、旋转、缩放。
通过双击属性,可以手动输入调整属性的值
通过点击Orient
可以切换ROTATION的表示方式为四元数
视角
再创建一个球体
通过选中物体并按下F
(Focus)来将相机居中对准所选的物体
通过按下鼠标左键
+Alt
来绕球旋转调整视野
通过按下鼠标右键
+Alt
来缩放视野
通过按下鼠标中键
来进行平移视野
stage
Stage是一个基于树的Isaac Sim GUI组件,可以让用户清晰地管理舞台(Stage)上的演员(Actors),它位于Isaac Sim窗口的右上角。
在Isaac Sim中,原始体"Prim
" 可以被理解为primitive
,简而言之,“Prim” 在 USD 中是用来组织场景数据的基本单元
从上图中可以看到,在World
作为defaultPrim
下有在之前的案例中创建的Sphere
和Cube
。
Xform
Xform是一种特殊的 “prim”,它用于表示物体的变换信息,用于控制场景中物体的位置、旋转和缩放。
Xform是 transform的缩写,代表一个变换矩阵,用于表示场景中对象的变换。
Xform提供了一种分层组织和构建场景的方法,支持变换的继承。
在Stage里将Cube拖到刚才新添加的Xform里,这个Cube将作为Xform的Child,随后将Sphere拖动到Xform,此时两个就绑定了
移动Xform就会同时移动两个物体
光照
除了world
中的各个单位,在Stage
舞台里还有和World平级的Environment
,可以看到一个defaultLight
,它提供了环境的基本光源
拖拽相机视角,可以发现这个光在世界的头部,默认的环境光照增强了仿真的真实感,同时也提供了基本的照明。
点击Stage里的defaultLight
,调整defaultLight
的Transform
,你会发现这是一个方向可以调整的光源,在这里Translate和Scale也是可调的,但调节这两个属性没有意义,因为平行光通常只需要考虑Orient。
Transform
只是Property
的一种,在Property里继续往下寻找,找到Light
,随意修改光的属性,比如此处修改了Color
。
Examples
进入该路径下
然后运行
ps:不需要事先打开isaac sim,直接在指定目录下运行以下代码及可
./python.sh standalone_examples/api/omni.isaac.franka/follow_target_with_rmpflow.py
等待后如下图:
可以拖动物体TargetCube
然后franka会跟随移动
以下为上述功能的示例代码
# Copyright (c) 2021-2023, NVIDIA CORPORATION. All rights reserved.
#
# NVIDIA CORPORATION and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto. Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA CORPORATION is strictly prohibited.
#
from omni.isaac.kit import SimulationApp
simulation_app = SimulationApp({"headless": False})
from omni.isaac.core import World
from omni.isaac.franka.controllers.rmpflow_controller import RMPFlowController
from omni.isaac.franka.tasks import FollowTarget
my_world = World(stage_units_in_meters=1.0)
my_task = FollowTarget(name="follow_target_task")
my_world.add_task(my_task)
my_world.reset()
task_params = my_world.get_task("follow_target_task").get_params()
franka_name = task_params["robot_name"]["value"]
target_name = task_params["target_name"]["value"]
my_franka = my_world.scene.get_object(franka_name)
my_controller = RMPFlowController(name="target_follower_controller", robot_articulation=my_franka)
articulation_controller = my_franka.get_articulation_controller()
while simulation_app.is_running():
my_world.step(render=True)
if my_world.is_playing():
if my_world.current_time_step_index == 0:
my_world.reset()
my_controller.reset()
observations = my_world.get_observations()
actions = my_controller.forward(
target_end_effector_position=observations[target_name]["position"],
target_end_effector_orientation=observations[target_name]["orientation"],
)
articulation_controller.apply_action(actions)
simulation_app.close()
多机器人
# Copyright (c) 2021-2023, NVIDIA CORPORATION. All rights reserved.
#
# NVIDIA CORPORATION and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto. Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA CORPORATION is strictly prohibited.
#
from isaacsim import SimulationApp
simulation_app = SimulationApp({"headless": False})
import numpy as np
from omni.isaac.core import World
from omni.isaac.franka.controllers.pick_place_controller import PickPlaceController
from omni.isaac.franka.tasks import PickPlace
my_world = World(stage_units_in_meters=1.0)
tasks = []
num_of_tasks = 2
for i in range(num_of_tasks):
tasks.append(PickPlace(name="task" + str(i), offset=np.array([0, (i * 2) - 3, 0])))
my_world.add_task(tasks[-1])
my_world.reset()
frankas = []
cube_names = []
for i in range(num_of_tasks):
task_params = tasks[i].get_params()
frankas.append(my_world.scene.get_object(task_params["robot_name"]["value"]))
cube_names.append(task_params["cube_name"]["value"])
controllers = []
for i in range(num_of_tasks):
controllers.append(
PickPlaceController(name="pick_place_controller", gripper=frankas[i].gripper, robot_articulation=frankas[i])
)
controllers[-1].reset()
articulation_controllers = []
for i in range(num_of_tasks):
articulation_controllers.append(frankas[i].get_articulation_controller())
my_world.pause()
reset_needed = False
while simulation_app.is_running():
my_world.step(render=True)
if my_world.is_stopped() and not reset_needed:
reset_needed = True
if my_world.is_playing():
if reset_needed:
my_world.reset()
for i in range(num_of_tasks):
controllers[i].reset()
reset_needed = False
observations = my_world.get_observations()
for i in range(num_of_tasks):
articulation_controllers.append(frankas[i].get_articulation_controller())
actions = controllers[i].forward(
picking_position=observations[cube_names[i]]["position"],
placing_position=observations[cube_names[i]]["target_position"],
current_joint_positions=observations[frankas[i].name]["joint_positions"],
end_effector_offset=np.array([0, 0, 0]),
)
articulation_controllers[i].apply_action(actions)
simulation_app.close()
# Copyright (c) 2021-2023, NVIDIA CORPORATION. All rights reserved.
#
# NVIDIA CORPORATION and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto. Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA CORPORATION is strictly prohibited.
#
from isaacsim import SimulationApp
simulation_app = SimulationApp({"headless": False})
import argparse
import sys
import carb
import numpy as np
from omni.isaac.core import World
from omni.isaac.core.robots import Robot
from omni.isaac.core.utils.stage import add_reference_to_stage, get_stage_units
from omni.isaac.core.utils.types import ArticulationAction
from omni.isaac.nucleus import get_assets_root_path
parser = argparse.ArgumentParser()
parser.add_argument("--test", default=False, action="store_true", help="Run in test mode")
args, unknown = parser.parse_known_args()
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()
asset_path = assets_root_path + "/Isaac/Robots/Franka/franka_alt_fingers.usd"
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_1")
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_2")
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_3")
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_4")
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_5")
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_6")
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_7")
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_8")
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_9")
add_reference_to_stage(usd_path=asset_path, prim_path="/World/Franka_10")
articulated_system_1 = my_world.scene.add(Robot(prim_path="/World/Franka_1", name="my_franka_1"))
articulated_system_2 = my_world.scene.add(Robot(prim_path="/World/Franka_2", name="my_franka_2"))
articulated_system_3 = my_world.scene.add(Robot(prim_path="/World/Franka_3", name="my_franka_3"))
articulated_system_4 = my_world.scene.add(Robot(prim_path="/World/Franka_4", name="my_franka_4"))
articulated_system_5 = my_world.scene.add(Robot(prim_path="/World/Franka_5", name="my_franka_5"))
articulated_system_6 = my_world.scene.add(Robot(prim_path="/World/Franka_6", name="my_franka_6"))
articulated_system_7 = my_world.scene.add(Robot(prim_path="/World/Franka_7", name="my_franka_7"))
articulated_system_8 = my_world.scene.add(Robot(prim_path="/World/Franka_8", name="my_franka_8"))
articulated_system_9 = my_world.scene.add(Robot(prim_path="/World/Franka_9", name="my_franka_9"))
articulated_system_10 = my_world.scene.add(Robot(prim_path="/World/Franka_10", name="my_franka_10"))
for i in range(5):
print("resetting...")
my_world.reset()
articulated_system_1.set_world_pose(position=np.array([0.0, 2.0, 0.0]) / get_stage_units())
articulated_system_2.set_world_pose(position=np.array([0.0, -2.0, 0.0]) / get_stage_units())
articulated_system_3.set_world_pose(position=np.array([0.0, -6.0, 0.0]) / get_stage_units())
articulated_system_4.set_world_pose(position=np.array([0.0, -10.0, 0.0]) / get_stage_units())
articulated_system_5.set_world_pose(position=np.array([4.0, -2.0, 0.0]) / get_stage_units())
articulated_system_6.set_world_pose(position=np.array([8.0, -2.0, 0.0]) / get_stage_units())
articulated_system_7.set_world_pose(position=np.array([12.0, -2.0, 0.0]) / get_stage_units())
articulated_system_8.set_world_pose(position=np.array([4.0, -6.0, 0.0]) / get_stage_units())
articulated_system_9.set_world_pose(position=np.array([8.0, -10.0, 0.0]) / get_stage_units())
articulated_system_10.set_world_pose(position=np.array([12.0, -14.0, 0.0]) / get_stage_units())
articulated_system_1.set_joint_positions(np.array([1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5]))
for j in range(500):
my_world.step(render=True)
if j == 100:
articulated_system_2.get_articulation_controller().apply_action(
ArticulationAction(joint_positions=np.array([1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5]))
)
if j == 400:
print("Franka 1's joint positions are: ", articulated_system_1.get_joint_positions())
print("Franka 2's joint positions are: ", articulated_system_2.get_joint_positions())
if args.test is True:
break
simulation_app.close()
在使用 Isaac Sim*进行GPU加速仿真时,我首先创建了一个基础场景,其中包括一个简单的机器人模型。以下是我执行的具体步骤:
1. 创建场景:启动Isaac Sim后,我进入了自定义环境编辑器,选择了预设的机器人模型(如双臂机械手)和环境(如室内工作场景)。创建的场景包括平面地面和几个可交互的物体。
2. 复制多个机器人:在编辑器中,我将机器人模型复制了10次,分布在场景的不同位置,以模拟多个机器人同时执行任务。
3. 设置机器人运动:我为每个机器人设置了简单的直线或圆形运动轨迹,任务是让它们在各自的路径上移动并执行基本操作,例如抓取物体并放置到指定位置。
4. 观察多机器人同步运动:启动仿真后,我观察到10个机器人在运动过程中保持了良好的同步性。由于GPU加速的支持,仿真运行流畅,没有出现明显的卡顿或延迟。
总结
运行的结果反馈
GPU加速在物理计算上的优势尤为明显,使得大量物体和机器人交互时,仿真能够快速响应且不发生明显的帧率下降。
并行计算能力的优势:GPU加速显著提升了物理仿真的并行计算能力。增加物体数量后,虽然仿真计算量显著增加,但通过GPU的并行计算,物理引擎的计算效率得到了很好的保障,保持了高帧率和流畅的操作体验。这种并行计算能力对于工业仿真尤为重要,因为它使得在实际应用中,诸如机器人协作、物料搬运、自动化生产等任务得以高效执行。
综合分析
1. 仿真效率:Isaac Sim通过GPU加速提供了高效的仿真计算能力,能够处理复杂的多机器人任务,保证了仿真过程的实时性和高帧率。
2. 开发便利性:集成的API使得开发者可以非常方便地进行场景编辑、机器人控制以及AI模型训练。Pytorch与Isaac Sim的集成进一步简化了AI开发流程。
潜在应用场景
1. 自动驾驶仿真:Isaac Sim提供了一个高保真度的虚拟环境,可以用于自动驾驶系统的测试和验证,模拟各种驾驶场景和交通情况。
2. 工业机器人协作:多个机器人在同一环境中协同工作,例如制造、包装和装配等领域,能够大大提高生产效率并减少人为失误。
3. 医疗机器人:在复杂的医疗环境中,机器人可以进行手术模拟、物品传送等任务。Isaac Sim能够在仿真中验证和优化机器人算法,提高医疗服务的自动化程度。
运行体验与建议
整体来说,Isaac Sim给我带来了非常流畅且高效的仿真体验。GPU加速和AI框架的集成让仿真不仅高效,而且在多机器人和复杂场景下表现出色。特别是AI训练和物理仿真相结合的功能,大大提高了机器人的任务执行能力。
功能改进建议
1. GPU加速改进:尽管Isaac Sim在GPU加速方面表现优秀,但对于非常大规模的仿真场景(如数百个机器人同时进行任务)可能还存在一定的瓶颈。建议进一步优化并行计算和内存管理,以支持更大规模的仿真。
开发生态与学术研究价值
1. 开发者社区:Isaac Sim的开发者社区活跃,论坛和文档资源丰富。大部分技术问题都能够通过社区和官方文档解决。
2. 学术研究贡献:近年来基于Isaac Sim的学术论文不少,尤其在机器人学、强化学习和自动化控制领域,Isaac Sim为研究提供了可靠且高效的仿真工具。它在机器人算法的验证和优化中,提供了可重复且精确的实验环境,推动了学术研究的发展。
通过本次体验,Isaac Sim是一个强大的仿真平台,特别是在机器人学和工业自动化领域。它的GPU加速和AI框架集成使得仿真效率和开发便捷性得到了极大提升,为未来的机器人技术和自动化应用提供了强有力的支持。