
$ python source/standalone/tutorials/01_assets/run_articulation.py
import argparse
from omni.isaac.lab.app import AppLauncher
parser = argparse.ArgumentParser(description="Tutorial on spawning and interacting with an articulation.")
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.core.utils.prims as prim_utils
import omni.isaac.lab.sim as sim_utils
from omni.isaac.lab.assets import Articulation
from omni.isaac.lab.sim import SimulationContext
from omni.isaac.lab_assets import CARTPOLE_CFG
def design_scene() -> tuple[dict, list[list[float]]]:
cfg = sim_utils.GroundPlaneCfg()
cfg.func("/World/defaultGroundPlane", cfg)
cfg = sim_utils.DomeLightCfg(intensity=3000.0, color=(0.75, 0.75, 0.75))
cfg.func("/World/Light", cfg)
'''
로봇 그룹 생성 "Origin1", "Origin2"
각 origin (x,y,z)는 관절 구조를 배치할 위치를 의미
'''
origins = [[0.0, 0.0, 0.0], [-1.0, 0.0, 0.0]]
prim_utils.create_prim("/World/Origin1", "Xform", translation=origins[0])
prim_utils.create_prim("/World/Origin2", "Xform", translation=origins[1])
cartpole_cfg = CARTPOLE_CFG.copy()
cartpole_cfg.prim_path = "/World/Origin.*/Robot"
cartpole = Articulation(cfg=cartpole_cfg)
scene_entities = {"cartpole": cartpole}
return scene_entities, origins
run_simulator 인자
- sim: sim_utils.SimulationContext
- 물리 엔진, 시간 흐름, 객체 상태 업데이트 등을 제어하며 시뮬레이션 실행 상태 추적
- entities: dict[str, Articulation]
- scene내에 존재하는 여러 객체들을 저장한 딕셔너리값임
- 이 딕셔너리를 통해 시뮬레이션에서 각 객체에 힘, 속도 등을 적용하거나 위치, 속도를 업데이트 가능
- origins: torch.Tensor
- 다수의 객체를 시뮬레이션 내에 효율적으로 배치 가능
- 월드 좌표계에서 정확한 위치에 놓일 수 있도록함
def run_simulator(sim: sim_utils.SimulationContext, entities: dict[str, Articulation], origins: torch.Tensor):
robot = entities["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] += origins
robot.write_root_state_to_sim(root_state)
'''
robot.data.default_joint_pos() : cartpole의 관절 위치를 가져옴
robot.data.default_joint_vel.clone() : cartpole의 관절 속도 가져옴
joint_pos가 관절 위치, joint_vel이 관절 속도
'''
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)
robot.reset()
print("[INFO]: Resetting robot state...")
efforts = torch.randn_like(robot.data.joint_pos) * 5.0
robot.set_joint_effort_target(efforts)
robot.write_data_to_sim()
sim.step()
count += 1
robot.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])
scene_entities, scene_origins = design_scene()
scene_origins = torch.tensor(scene_origins, device=sim.device)
sim.reset()
print("[INFO]: Setup complete...")
run_simulator(sim, scene_entities, scene_origins)
if __name__ == "__main__":
main()
simulation_app.close()