
Interactive scene을 사용해보자
- 지금까지의 튜토리얼에서는 object들을 수동으로 생성하고, 상호작용(물리효과 등)하기 위해 인스턴스를 생성했다.
- 하지만 scene이 복잡해지면 이러한 작업을 수동으로 하는것은 쉽지 않다.
- 이번 튜토리얼에서는 scene.InteractiveScene 을 활용해 prim을 생성하여 시뮬레이션 관리에 편리한 인터페이스를 제공한다.
코드
import argparse
from omni.isaac.lab.app import AppLauncher
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)
args_cli = parser.parse_args()
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
from omni.isaac.lab.scene import InteractiveScene, InteractiveSceneCfg
from omni.isaac.lab.sim import SimulationContext
from omni.isaac.lab.utils import configclass
from omni.isaac.lab_assets import CARTPOLE_CFG
@configclass
class CartpoleSceneCfg(InteractiveSceneCfg):
ground = AssetBaseCfg(prim_path="/World/defaultGroundPlane", spawn=sim_utils.GroundPlaneCfg())
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):
robot = scene["cartpole"]
sim_dt = sim.get_physics_dt()
count = 0
while simulation_app.is_running():
if count % 500 == 0:
count = 0
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)
scene.reset()
print("[INFO]: Resetting robot state...")
efforts = torch.randn_like(robot.data.joint_pos) * 5.0
robot.set_joint_effort_target(efforts)
scene.write_data_to_sim()
sim.step()
count += 1
scene.update(sim_dt)
def main():
"""Main function."""
sim_cfg = sim_utils.SimulationCfg(device=args_cli.device)
sim = SimulationContext(sim_cfg)
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)
scene = InteractiveScene(scene_cfg)
sim.reset()
print("[INFO]: Setup complete...")
run_simulator(sim, scene)
if __name__ == "__main__":
main()
simulation_app.close()