in env_humanoid_base.py [0:0]
def compute_target_pose(self, idx, action):
agent = self._sim_agent[idx]
char_info = agent._char_info
''' the current posture should be deepcopied because action will modify it '''
if self._action_type == Env.ActionMode.Relative:
ref_pose = copy.deepcopy(self.get_current_pose_from_motion(idx))
else:
ref_pose = copy.deepcopy(self._base_motion[idx].get_pose_by_frame(0))
a_real = self._action_space[idx].norm_to_real(action)
dof_cnt = 0
for j in agent._joint_indices:
joint_type = agent.get_joint_type(j)
''' Fixed joint will not be affected '''
if joint_type == self._pb_client.JOINT_FIXED:
continue
''' If the joint do not have correspondance, use the reference posture itself'''
if char_info.bvh_map[j] == None:
continue
if self._action_type == Env.ActionMode.Relative:
T = ref_pose.get_transform(char_info.bvh_map[j], local=True)
elif self._action_type == Env.ActionMode.Absolute:
T = ref_pose.skel.get_joint(char_info.bvh_map[j]).xform_from_parent_joint
else:
raise NotImplementedError
R, p = conversions.T2Rp(T)
if joint_type == self._pb_client.JOINT_SPHERICAL:
dR = conversions.A2R(a_real[dof_cnt:dof_cnt+3])
dof_cnt += 3
elif joint_type == self._pb_client.JOINT_REVOLUTE:
axis = agent.get_joint_axis(j)
angle = a_real[dof_cnt:dof_cnt+1]
dR = conversions.A2R(axis*angle)
dof_cnt += 1
else:
raise NotImplementedError
T_new = conversions.Rp2T(np.dot(R, dR), p)
ref_pose.set_transform(char_info.bvh_map[j], T_new, do_ortho_norm=False, local=True)
return ref_pose