NVIDIA Omniverse Isaac Sim 2.6 Interactive Scripting

권호떡의 데싸정복·2024년 7월 27일
post-thumbnail

스크립트 편집기

새로운 파일에서 시작한다.

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.]))

만약 오류가 났다면 대부분 코드를 잘못 쓴거니 다시 한번 확인하거나 복붙을 추천

위 코드 자세하게 이해하기

numpy 라이브러리 import

import numpy as np
  • numpy는 수학적 연산을 위한 파이썬 라이브러리. 이 코드에서는 색상과 위치를 정의하기 위해 numpy 배열을 사용함

Omniverse Isaac Sim 라이브러리 임포트

from omni.isaac.core.objects import DynamicCuboid
from omni.isaac.core.objects.ground_plane import GroundPlane
from omni.isaac.core.physics_context import PhysicsContext
  • DynamicCuboid:동적인 큐브 객체를 생성함. 이를 통해 물리 엔진의 영향을 받을 수 있게된다.
  • GroundPlane:시뮬레이션 환경에서의 지면을 생성함.
  • PhysicsContext:물리 시뮬레이션 환경을 초기화하고 설정하는데 사용됨.

물리 시뮬레이션 조건 초기화

PhysicsContext()
  • 물리 엔진을 초기화한다. 이를 통해 물리 시뮬레이션이 활성화 되고 코드 실행 후 isaac-sim 창의 play버튼을 누르면 cube가 중력에 영향을 받게된다.

시뮬레이션 환경 지면 생성

GroundPlane(prim_path="/World/groundPlane", size=10, color=np.array([0.5, 0.5, 0.5]))
  • GroundPlane:지면 평면을 생성한다.
    • prim_path="/World/groundPlane":지면의 경로를 설정
    • size=10:지면의 크기를 설정
    • color=np.array([0.5,0.5,0.5]):지면의 색상을 RGB로 설정. 여기서는 회색임

동적 큐브 생성

DynamicCuboid(prim_path="/World/cube",
    position=np.array([-.5, -.2, 1.0]),
    scale=np.array([.5, .5, .5]),
    color=np.array([.2,.3,0.]))
  • DynamicCuboid:동적 큐브 객체를 생성
    • prim_path="/World/Cube":큐브의 경로를 설정
    • position=np.array([-.5, -.2, 1.0]):큐브의 초기 위치를 설정. 이 위치는 월드 좌표계를 기준으로 함
    • scale=np.array([.5, .5, .5]):큐브의 크기를 설정
    • color=np.array([.2,.3,0.]):큐브의 색상을 RGB로 설정. 여기서는 노란색임

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를 사용하는게 더 쉬움

profile
데이터사이언스정복

0개의 댓글