ASE | projectile.py | |
---|---|---|
Simulation | GPU | CPU |
envs 구성 | 같은 env 내에 humanoid와 projectile 추가 | projectile을 위한 env 따로 구성 |
발사 조건 | 발사 시간 지정 가능(_calc_perturb_times 함수) | keyboard input(space), mouse input |
발사체 구성 | small/large cube (총 2개) | cube with different colors (총 5개) |
키보드의 입력에 따라 물체를 발사
하고 싶었기에 일단 projectiles.py를 통합
해 보았다.
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()
self.apply_actions(actions)
: Policy에서 예측한 action (다음 포즈를 구성하는 dof_pd_target)을 아바타의 dof_state_tensor에 넣어준다.
self.do_simulation()
: 시뮬레이션 진행
self.refresh_tensors()
: 시뮬레이션 진행한 후 아바타의 state 버퍼를 모두 갱신해준다. (root, link 등)
즉, 다음 시뮬레이션을 할 때, root, link의 버퍼가 가지고 있는 값이 NaN이기에 에러가 났던 것이다.
GPU
에서 연산을 하고, simulation 및 visualization은 CPU
에서 하는 중이었다.GPU
에서 계산된 텐서값들을 `CPU
로 옮겨서 처리하고 그 사이 과정에서 여러 연산들이 섞이면서 버퍼를 update하는 과정에 에러가 난 것으로 추정하였다.GPU
에서 처리해보기로 결정했다.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]
#######################################
좋은 자료 감사합니다!