in env_humanoid_imitation.py [0:0]
def get_task_error(self, idx, data_prev, data_next, action):
error = {}
sim_agent = self._sim_agent[idx]
char_info = sim_agent._char_info
data = data_next[idx]
sim_root_p, sim_root_Q, sim_root_v, sim_root_w = data['sim_root_pQvw']
sim_link_p, sim_link_Q, sim_link_v, sim_link_w = data['sim_link_pQvw']
sim_joint_p, sim_joint_v = data['sim_joint_pv']
sim_facing_frame = data['sim_facing_frame']
R_sim_f, p_sim_f = conversions.T2Rp(sim_facing_frame)
R_sim_f_inv = R_sim_f.transpose()
sim_com, sim_com_vel = data['sim_com'], data['sim_com_vel']
kin_root_p, kin_root_Q, kin_root_v, kin_root_w = data['kin_root_pQvw']
kin_link_p, kin_link_Q, kin_link_v, kin_link_w = data['kin_link_pQvw']
kin_joint_p, kin_joint_v = data['kin_joint_pv']
kin_facing_frame = data['kin_facing_frame']
R_kin_f, p_kin_f = conversions.T2Rp(kin_facing_frame)
R_kin_f_inv = R_kin_f.transpose()
kin_com, kin_com_vel = data['kin_com'], data['kin_com_vel']
indices = range(len(sim_joint_p))
if 'pose_pos' in self._reward_names[idx]:
error['pose_pos'] = 0.0
for j in indices:
joint_type = sim_agent.get_joint_type(j)
if joint_type == self._pb_client.JOINT_FIXED:
continue
elif joint_type == self._pb_client.JOINT_SPHERICAL:
dQ = self._pb_client.getDifferenceQuaternion(sim_joint_p[j], kin_joint_p[j])
_, diff_pose_pos = self._pb_client.getAxisAngleFromQuaternion(dQ)
else:
diff_pose_pos = sim_joint_p[j] - kin_joint_p[j]
error['pose_pos'] += char_info.joint_weight[j] * np.dot(diff_pose_pos, diff_pose_pos)
if len(indices) > 0:
error['pose_pos'] /= len(indices)
if 'pose_vel' in self._reward_names[idx]:
error['pose_vel'] = 0.0
for j in indices:
joint_type = sim_agent.get_joint_type(j)
if joint_type == self._pb_client.JOINT_FIXED:
continue
else:
diff_pose_vel = sim_joint_v[j] - kin_joint_v[j]
error['pose_vel'] += char_info.joint_weight[j] * np.dot(diff_pose_vel, diff_pose_vel)
if len(indices) > 0:
error['pose_vel'] /= len(indices)
if 'ee' in self._reward_names[idx]:
error['ee'] = 0.0
for j in char_info.end_effector_indices:
sim_ee_local = np.dot(R_sim_f_inv, sim_link_p[j]-p_sim_f)
kin_ee_local = np.dot(R_kin_f_inv, kin_link_p[j]-p_kin_f)
diff_pos = sim_ee_local - kin_ee_local
error['ee'] += np.dot(diff_pos, diff_pos)
if len(char_info.end_effector_indices) > 0:
error['ee'] /= len(char_info.end_effector_indices)
if 'root' in self._reward_names[idx]:
diff_root_p = sim_root_p - kin_root_p
_, diff_root_Q = self._pb_client.getAxisAngleFromQuaternion(
self._pb_client.getDifferenceQuaternion(sim_root_Q, kin_root_Q))
diff_root_v = sim_root_v - kin_root_v
diff_root_w = sim_root_w - kin_root_w
error['root'] = 1.0 * np.dot(diff_root_p, diff_root_p) + \
0.1 * np.dot(diff_root_Q, diff_root_Q) + \
0.01 * np.dot(diff_root_v, diff_root_v) + \
0.001 * np.dot(diff_root_w, diff_root_w)
if 'com' in self._reward_names[idx]:
diff_com = np.dot(R_sim_f_inv, sim_com-p_sim_f) - np.dot(R_kin_f_inv, kin_com-p_kin_f)
diff_com_vel = sim_com_vel - kin_com_vel
error['com'] = 1.0 * np.dot(diff_com, diff_com) + \
0.1 * np.dot(diff_com_vel, diff_com_vel)
return error