Throw projectiles in IsaacGym

Yerim Shin·2023년 11월 19일
0

★ IsaacGym

목록 보기
1/2

목적

  • 3D 아바타와 가상 환경의 물체와 상호작용 구현
  • 특히, 아바타가 blocking 동작을 하여 투사체가 아바타를 향해 발사될 때 팔로 막는 상호작용을 구현

참고 자료 (References)

  1. ASE: Large-Scale Reusable Adversarial Skill Embeddings for Physically Simulated Characters [Peng et al. SIGGRAPH 2022] 공식 Github
  2. isaacgym_preview4 examples code 중 projectiles.py
    • 공식 홈페이지에서 다운로드 받으면 됩니다.
    • 키보드 인풋나 마우스 인풋에 따라 해당 좌표에 projectile 던지는 예제

참고 자료 코드 분석 (Code Analysis)

  • ASE와 Projectile를 분석한 결과 조금씩 다른 구성을 가지고 있었다. 아래는 중요한 부분에 대해 표로 정리한 것이다.
ASEprojectile.py
SimulationGPUCPU
envs 구성같은 env 내에 humanoid와 projectile 추가projectile을 위한 env 따로 구성
발사 조건발사 시간 지정 가능(_calc_perturb_times 함수)keyboard input(space), mouse input
발사체 구성small/large cube (총 2개)cube with different colors (총 5개)

(시도 1) 현재 코드에서 projectile.py 통합

  • 키보드의 입력에 따라 물체를 발사하고 싶었기에 일단 projectiles.py를 통합해 보았다.

Trouble shooting

  • Network가 예측하는 action 값들이 계속 변칙적으로 NaN 값을 return을 하였다.

What caused the problem?

  • 최종적으로 action이 뽑히는 모든 값들 확인해보니, 관측하는 3D 아바타의 root, link와 관련된 state값들이 변칙적으로 NaN 값을 return하여서 계속 문제가 생겼다.


Where is the problem happening?

  • simulation의 state tensor값들을 refresh 해줄 때 에러가 났다.

  • 문제가 된 함수

    def refresh_tensors(self):
        self.gym.refresh_dof_state_tensor(self.sim)
        self.gym.refresh_actor_root_state_tensor(self.sim)
        self.gym.refresh_rigid_body_state_tensor(self.sim)
        self.gym.refresh_net_contact_force_tensor(self.sim)
  • 시뮬레이션되는 코드의 순서는 아래와 같다.
            self.apply_actions(actions)
            self.do_simulation()
            self.refresh_tensors()
  1. self.apply_actions(actions): Policy에서 예측한 action (다음 포즈를 구성하는 dof_pd_target)을 아바타의 dof_state_tensor에 넣어준다.

  2. self.do_simulation(): 시뮬레이션 진행

  3. self.refresh_tensors(): 시뮬레이션 진행한 후 아바타의 state 버퍼를 모두 갱신해준다. (root, link 등)

즉, 다음 시뮬레이션을 할 때, root, link의 버퍼가 가지고 있는 값이 NaN이기에 에러가 났던 것이다.


What's the solution then?

  • (나의 추측) action을 뽑는 policy 및 다른 모델들은 GPU에서 연산을 하고, simulation 및 visualization은 CPU에서 하는 중이었다.
  • GPU에서 계산된 텐서값들을 `CPU로 옮겨서 처리하고 그 사이 과정에서 여러 연산들이 섞이면서 버퍼를 update하는 과정에 에러가 난 것으로 추정하였다.
  • 시간 효율을 위해 ASE를 참고하여 일단 모든 모델 연산과 Simulation을 GPU에서 처리해보기로 결정했다.



(시도 2) 현재 코드에서 humanoid_perturb.py 통합

  • Simulation 및 모델 계산 등 모든 처리를 GPU에서 할 수 있도록 humanoid_perturb.py를 통합해 보았다.

주의점

  • index 처리 조심: 같은 env에 3D avatar와 projectiles가 같이 들어가기 때문에 env에 존재하는 actor들의 root, link state_tensor들을 반환할 때 index 처리 조심

해결책

  • indexing을 통해 각 actor에 따른 다른 변수 선언: 3D 아바타의 state_tensor들 저장하는 tensor와 projectiles의 state_tensor를 저장하는 tensor에 대한 다른 변수를 선언하여 헷갈리지 않게 함.
		############# 1. Root Tensor #############  
  		# 모든 actor들에 대한 root_tensor 값 저장하는 변수
        self._all_root_tensor = self.gym.acquire_actor_root_state_tensor(self.sim)
        self._all_root_tensor = gymtorch.wrap_tensor(self._all_root_tensor)
        
        # indexing을 통해 3D 아바타의 root 값에 대한 변수 선언
        self.root_tensor = self._all_root_tensor.view(len(self.envs), -1, 13)[..., 0, :].unsqueeze(1)       				 # [num_envs, 1, 13]
        
        # indexing을 통해 projectiles의 root 값에 대한 변수 선언
        self._proj_states = self._all_root_tensor.view(self.num_envs, num_actors, 13)[..., (num_actors - num_objs):, :]      # [n_envs, num_objs, 13]
		#######################################

		############# 2. Link Tensor #############  
  		# 모든 actor들에 대한 link_tensor 값 저장하는 변수
        num_links = self.gym.get_env_rigid_body_count(self.envs[0])
        self._all_link_tensor = self.gym.acquire_rigid_body_state_tensor(self.sim)
        self._all_link_tensor = gymtorch.wrap_tensor(self._all_link_tensor)
        
        #! indexing을 통해 3D 아바타의 link_tensors 값에 대한 변수 선언
        # self.num_bodies가 3D 아바타의 총 link 수
        self.link_tensor = self._all_link_tensor.view(len(self.envs), num_links, -1)[..., :self.num_bodies, :]  # [num_envs, n_links, 13]
		#######################################
		
        

Visualization Result

  • 일정 시간에 따라 Box가 humanoid에게 던져지도록 성공!



Next step to do

input에 따른 물체 발사

  • 키보드 input에 따라서 box가 던져지도록 만들어보자!
  • projectiles.py를 참고하면 될 것 같다.
  • 이건 다음 포스팅에서 다루도록 하겠다.

1개의 댓글

comment-user-thumbnail
2024년 1월 18일

좋은 자료 감사합니다!

답글 달기

관련 채용 정보