# 필수 모듈 가져오기
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")
# 위와 같은 경우임
# --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들과 상호작용하지는 않는다.