
스크립트 편집기
새로운 파일에서 시작한다.

Windows -> Script Editor을 클릭해 스크립트 편집기를 열어준다.
여러 탭을 만들 수 있는데 이 탭들은 동일한 환경을 공유하므로 한 탭에서 실행한 라이브러리나 정의된 변수는 다른 환경에서도 엑세스하여 사용이 가능하다.
REPL 확장
REPL은 'Read Evaluate Print Loop'의 약자로 작은 코드 조각을 읽고 평가할 수 있는 프로그래밍 셀이며 환경 내 변수 상태를 대화형으로 쿼리할 수 있다.
주피터노트북이 REPL 환경의 대표적인 에이다.

Windows -> Extension를 눌러 REPL을 검색해 활성화를 시켜준다. 만약 Isaac Sim을 실행할때마다 활성화하고 싶다면 Autoload를 선택해준다.

이 후 새로운 터미널을 열고
telnet localhost 8223
을 실행해준다.
이후 아래 코드를 복붙하면 저런 시뮬레이션이 만들어진다.
ctrl+d로 셀 환경을 종료할 수 있다.
import numpy as np
from omni.isaac.core.objects import DynamicCuboid
from omni.isaac.core.objects.ground_plane import GroundPlane
from omni.isaac.core.physics_context import PhysicsContext
PhysicsContext()
GroundPlane(prim_path="/World/groundPlane", size=10, color=np.array([0.5, 0.5, 0.5]))
DynamicCuboid(prim_path="/World/cube",
position=np.array([-.5, -.2, 1.0]),
scale=np.array([.5, .5, .5]),
color=np.array([.2,.3,0.]))
만약 오류가 났다면 대부분 코드를 잘못 쓴거니 다시 한번 확인하거나 복붙을 추천
위 코드 자세하게 이해하기
import numpy as np
from omni.isaac.core.objects import DynamicCuboid
from omni.isaac.core.objects.ground_plane import GroundPlane
from omni.isaac.core.physics_context import PhysicsContext
PhysicsContext()
GroundPlane(prim_path="/World/groundPlane", size=10, color=np.array([0.5, 0.5, 0.5]))
DynamicCuboid(prim_path="/World/cube",
position=np.array([-.5, -.2, 1.0]),
scale=np.array([.5, .5, .5]),
color=np.array([.2,.3,0.]))
USD API
NVIDIA Omniverse의 기본 형식은 USD이다. 아래 코드는 USD API를 사용하여 지면, 기본 조명 및 물리 및 충돌이 사전 설정되어 있는 직육면체를 설정하는 스크립트이다. (위 예제와 같은 환경을 만드는것이지만 이 코드는 USD API를 사용한것이고 위 코드는 Isaac Sim Core API를 사용하여 만든것임)

from pxr import UsdPhysics, PhysxSchema, Gf, PhysicsSchemaTools, UsdGeom
import omni
stage = omni.usd.get_context().get_stage()
# Setting up Physics Scene
gravity = 9.8
scene = UsdPhysics.Scene.Define(stage, "/World/physics")
scene.CreateGravityDirectionAttr().Set(Gf.Vec3f(0.0, 0.0, -1.0))
scene.CreateGravityMagnitudeAttr().Set(gravity)
PhysxSchema.PhysxSceneAPI.Apply(stage.GetPrimAtPath("/World/physics"))
physxSceneAPI = PhysxSchema.PhysxSceneAPI.Get(stage, "/World/physics")
physxSceneAPI.CreateEnableCCDAttr(True)
physxSceneAPI.CreateEnableStabilizationAttr(True)
physxSceneAPI.CreateEnableGPUDynamicsAttr(False)
physxSceneAPI.CreateBroadphaseTypeAttr("MBP")
physxSceneAPI.CreateSolverTypeAttr("TGS")
# Setting up Ground Plane
PhysicsSchemaTools.addGroundPlane(stage, "/World/groundPlane", "Z", 15, Gf.Vec3f(0,0,0), Gf.Vec3f(0.7))
# Adding a Cube
path = "/World/Cube"
cubeGeom = UsdGeom.Cube.Define(stage, path)
cubePrim = stage.GetPrimAtPath(path)
size = 0.5
offset = Gf.Vec3f(0.5,0.2,1.0)
cubeGeom.CreateSizeAttr(size)
cubeGeom.AddTranslateOp().Set(offset)
# Attach Rigid Body and Collision Preset
rigid_api = UsdPhysics.RigidBodyAPI.Apply(cubePrim)
rigid_api.CreateRigidBodyEnabledAttr(True)
UsdPhysics.CollisionAPI.Apply(cubePrim)
한 눈에봐도 코드가 길고 어려움 초보자는 Isaac Sim Core API를 사용하는게 더 쉬움