Isaac Lab Tutorial - Deep-dive into AppLauncher

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

AppLauncher에 대해 자세히 알아보자


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

# argparse 만들기
# ArgumentParser() : 명령줄 인수를 처리할 parser 객체를 생성함. description을 통해 짧게 해당 작업을 요약하는 설명을 적어줌
parser = argparse.ArgumentParser(description="Tutorial on running IsaacSim via the AppLauncher.")
parser.add_argument("--size", type=float, default=1.0, help="Side-length of cuboid")

parser.add_argument("--size", type=float, default=1.0, help="Side-length of cuboid")

  • argpars 라이브러리를 사용하여새 명령줄 인수 '--size'를 스크립트에 추가
  1. 인수 이름
    • --size
    • '--' 이중 하이폰은 파이썬에서 선택적 인수를 의미함 (추가 정보 전달)
    • python script.py --size 2.5 를 실행하면 2.5길이의 직육면체가 생성됨
  2. type=float
    • --size 가 1.0, 0.5 등의 float값을 받을 수 있다는 뜻
    • python script.py --size hello 를 실행하면 float값이 아닌 문자열이니 오류가 뜸
  3. default = 1.0
    • --size에 대한 기본값을 의미. 설정안하면 1.0크기의 직육면체 생성
  4. help='side-length of cuboid
    • --size 인수에 대한 설명을 말해줌
    • python script.py --help로 치면 설명이 나옴

이어서...

# 위와 같은 경우임
# --width : 창의 너비를 설정하며 type은 int이고 기본값은 1280 픽셀
# --height : 창의 높이를 설정하며 type은 int이고 기본값은 720 픽셀
parser.add_argument(
    "--width", type=int, default=1280, help="Width of the viewport and generated images. Defaults to 1280"
)
parser.add_argument(
    "--height", type=int, default=720, help="Height of the viewport and generated images. Defaults to 720"
)

# 위에서 설정한 추가 명령줄 인수를 AppLauncher에 추가한다.
AppLauncher.add_app_launcher_args(parser)

# parser.parse_args() : 스크립트가 실행될 때 제공되는 모든 명령줄 인수를 처리하고 이를 'args_cli에 저장함
# python script.py --size 2.0 --width 1920 --height 1080 를 실행했다면 직육면체 사이즈는 2.0, 창 사이즈는 1920 * 1080인 시뮬레이션을 실행한다.
args_cli = parser.parse_args()

# 명령줄 인수 'args_cli'를 사용하여 AppLauncher 클래스의 인스턴스 생성
app_launcher = AppLauncher(args_cli)

# 실행중인 시뮬레이션 애플리케이션을 'simulation_app에 저장. 이 개체는 나중에 앱 시작 또는 중지와 같은 시뮬레이션과 상호 작용하고 제어하는 데 사용됨
simulation_app = app_launcher.app

# sim_utils : 객체 생성, 조명, 카메라 등과 같은 시뮬레이션을 관리하는데 유용한 함수와 클래스를 제공
import omni.isaac.lab.sim as sim_utils


def design_scene():
    # USD 파일을 이용해 scene을 design한다.
    # GroundPlaneCfg(): object와 상호작용하는 지면을 생성
    cfg_ground = sim_utils.GroundPlaneCfg()
    
    # "/World/defaultGroundPlane"경로 아래에 cfg_ground라는 이름을 가지는 지면을 생성함
    cfg_ground.func("/World/defaultGroundPlane", cfg_ground)

    # DistantLightCfg() : scene의 광원을 만듦. 
    cfg_light_distant = sim_utils.DistantLightCfg(
        intensity=3000.0,
        color=(0.75, 0.75, 0.75),
    )
    
    # translation=(1, 0, 10)은 z값이 10이니 광원이 높이 있음을 의미
    cfg_light_distant.func("/World/lightDistant", cfg_light_distant, translation=(1, 0, 10))

    # CuboidCfg() : 직육면체를 생성
    #  size=[args_cli.size] * 3 : 명령줄 인수 '--size'에서 받아온 값을 이용해서 직육면체를 만듦. * 3 의 의미는 세 축 모두 동일한 크기 즉 정육면체라는 의미
    # PreviewSurfaceCfg(diffuse_color=(1.0, 1.0, 1.0) : 직육면체 색깔을 의미. 현재는 흰색
    cfg_cuboid = sim_utils.CuboidCfg(
        size=[args_cli.size] * 3,
        visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(1.0, 1.0, 1.0)),
    )
    # translation=(0.0, 0.0, args_cli.size / 2) 위치에 직육면체를 생성. 직육면체의 중앙 크기(높이)의 절반으로 설정하면 직육면체의 바닥면이 지면과 완벽히 정렬됨. 중심점을 기준으로 높이가 설정되기 때문임
    cfg_cuboid.func("/World/Object", cfg_cuboid, translation=(0.0, 0.0, args_cli.size / 2))



def main():
    """Main function."""

    # 시뮬레이션은 0.01초 프레임으로 실행됨
    sim_cfg = sim_utils.SimulationCfg(dt=0.01, device=args_cli.device)
    
    # 시뮬레이션을 초기화
    sim = sim_utils.SimulationContext(sim_cfg)
    
    # 카메라 설정. [2.0, 0.0, 2.5] 좌표에 배치되고, [-0.5, 0.0, 0.5] 지점을 바라봄
    sim.set_camera_view([2.0, 0.0, 2.5], [-0.5, 0.0, 0.5])

    # 함수 콜
    design_scene()

    # 시뮬레이션을 초기 상태로 재설정하여 첫 실행을 위한 모든 것을 설정
    sim.reset()
    # 준비가 되었다는 트리거 출력
    print("[INFO]: Setup complete...")

    # 시뮬레이션이 실행될때 동안
    while simulation_app.is_running():
        # perform step
        sim.step()


if __name__ == "__main__":
    # run the main function
    main()
    # close sim app
    simulation_app.close()

비고

물리 법칙을 적용하지 않아 직육면체가 다른 object들과 상호작용하지는 않는다.

profile
데이터사이언스정복

0개의 댓글