Isaac Lab Tutorial - Using the Interactive Scene

권호떡의 데싸정복·2024년 10월 9일
0

Nvidia Omniverse Isaac Lab

목록 보기
11/14

Interactive scene을 사용해보자

  • 지금까지의 튜토리얼에서는 object들을 수동으로 생성하고, 상호작용(물리효과 등)하기 위해 인스턴스를 생성했다.
  • 하지만 scene이 복잡해지면 이러한 작업을 수동으로 하는것은 쉽지 않다.
  • 이번 튜토리얼에서는 scene.InteractiveScene 을 활용해 prim을 생성하여 시뮬레이션 관리에 편리한 인터페이스를 제공한다.

코드

# 필수 모듈 불러오기
import argparse
from omni.isaac.lab.app import AppLauncher

# 파서를 생성하고 script에 대한 짧은 설명 추가 
parser = argparse.ArgumentParser(description="Tutorial on using the interactive scene interface.")

'''
인자를 추가
--num_envs 는 사용자가 실행 시 생성할 환경 개수를 설정하는 명령줄 인자
type=int 는 num_envs로 정수값만 받는다는 소리
default=2 는 환경의 기본 개수를 2로 설정
help 는 명령줄 인자에 대한 설명
'''
parser.add_argument("--num_envs", type=int, default=2, help="Number of environments to spawn.")

# 어플리케이션에 인자를 추가
AppLauncher.add_app_launcher_args(parser)

# parse the arguments
args_cli = parser.parse_args()

# launch omniverse app
app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app

import torch # 텐서 연산

# 시뮬레이션 관련 작업을 처리하는 유틸 함수
import omni.isaac.lab.sim as sim_utils

# 로봇의 관절 구조를 정의하는데 사용
from omni.isaac.lab.assets import ArticulationCfg, AssetBaseCfg

# InteractiveScene 은 isaac sim에서 interative scene을 생성하고 관리하는 객체. 이 객체는 여러 개의 환경을 한번에 관리할 수 있으며 각 환경에서 독립적으로 시뮬레이션 실행
# InteractiveSceneCfg 은 interative scene 구성을 정의하는데 사용. 여기서는 scene의 기본적인 요소인 지면, 조명, 물체 등을 설정
from omni.isaac.lab.scene import InteractiveScene, InteractiveSceneCfg

# 시뮬레이션을 실행하고 제어하는데 사용
from omni.isaac.lab.sim import SimulationContext

# isaac sim에서 특정 설정을 정의하는데 사용되는 데코레이터
from omni.isaac.lab.utils import configclass

### 정의된 cartpole을 가져옴
from omni.isaac.lab_assets import CARTPOLE_CFG  # isort:skip

# @configclass 데코레이터는 특정 구성 설정 클래스를 의미
@configclass

# CartpoleSceneCfg() 는 InteractiveSceneCfg를 상속받아 필요한 기본적인 지면, 조명, 관절 구조등을 정의
class CartpoleSceneCfg(InteractiveSceneCfg):
    
    # ground plane
    ground = AssetBaseCfg(prim_path="/World/defaultGroundPlane", spawn=sim_utils.GroundPlaneCfg())
    
    # lights
    dome_light = AssetBaseCfg(
        prim_path="/World/Light", 
        spawn=sim_utils.DomeLightCfg(intensity=3000.0, color=(0.75, 0.75, 0.75))
    )

    # 관절은 제공된 사전 정의된 설정을 사용
    cartpole: ArticulationCfg = CARTPOLE_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")
    
    
def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene):

    # scene dict를 활용해 carpole 객체 추출
    # CARTPOLE_CFG 를 기반으로 scene을 가져옴
    robot = scene["cartpole"]
	
    # Define simulation stepping
    sim_dt = sim.get_physics_dt()
    count = 0

    
    while simulation_app.is_running():
        # 500스텝마다 시뮬레이션 초기화
        if count % 500 == 0:
            # reset counter
            count = 0

            # cartpole의 기본 상태(위치, 회전 등)을 나타냄
            root_state = robot.data.default_root_state.clone()
            
            # 기본 상태에서 원점에 맞게 조정하여 올바른 위치에 배치함
            root_state[:, :3] += scene.env_origins
            
            # 시뮬레이션에 적용
            robot.write_root_state_to_sim(root_state)

            # 관절 상태 추가
            joint_pos, joint_vel = robot.data.default_joint_pos.clone(), robot.data.default_joint_vel.clone()
            
            # 랜덤 노이즈를 더해 약간의 불확실성을 추가하여 더 다양한 행동을 관찰 가능
            joint_pos += torch.rand_like(joint_pos) * 0.1
            
            # 새롭게 설정된 관절 위치와 속도를 시뮬레이션에 적용
            robot.write_joint_state_to_sim(joint_pos, joint_vel)

            # clear internal buffers
            scene.reset()
            print("[INFO]: Resetting robot state...")

        # 랜덤한 힘 적용
        efforts = torch.randn_like(robot.data.joint_pos) * 5.0
        
        # 관절에 가해질 힘을 정의
        robot.set_joint_effort_target(efforts)

        # object의 데이터를 시뮬레이션에 기록
        scene.write_data_to_sim()

        # Perform step
        sim.step()

        # Increment counter
        count += 1

        # Update buffers
        scene.update(sim_dt)
        
        
def main():
    """Main function."""
    # GPU 사용
    sim_cfg = sim_utils.SimulationCfg(device=args_cli.device)
    sim = SimulationContext(sim_cfg)

    # Set main camera
    sim.set_camera_view([2.5, 0.0, 4.0], [0.0, 0.0, 2.0])

    ''' 
    cartpole scene을 구성하는 함수
     num_envs=args_cli.num_envs : 환경 개수를 설정
     env_spacing=2.0 : 각 환경 사이의 간격을 나타냄. 환경이 여러개 일때, 서로의 간섭을 피하도록 일정한 간격을 줌
    '''
    scene_cfg = CartpoleSceneCfg(num_envs=args_cli.num_envs, env_spacing=2.0)
    
    # InteractiveScene() 위 구성을 바탕으로 interactive scene을 생성
    scene = InteractiveScene(scene_cfg)

    # Play the simulator
    sim.reset()

    # Now we are ready!
    print("[INFO]: Setup complete...")

    # Run the simulator
    run_simulator(sim, scene)
    
if __name__ == "__main__":
    # run the main function
    main()
    
    # close sim app
    simulation_app.close()

profile
데이터사이언스정복

0개의 댓글