122 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import argparse | ||
|  | import pickle | ||
|  | 
 | ||
|  | import matplotlib.pyplot as plt | ||
|  | import numpy as np | ||
|  | from scipy.spatial.transform import Rotation as R | ||
|  | 
 | ||
|  | parser = argparse.ArgumentParser() | ||
|  | parser.add_argument("--mujoco_obs", type=str, required=True) | ||
|  | parser.add_argument("--robot_obs", type=str, required=True) | ||
|  | args = parser.parse_args() | ||
|  | 
 | ||
|  | mujoco_obs = pickle.load(open(args.mujoco_obs, "rb")) | ||
|  | robot_obs = pickle.load(open(args.robot_obs, "rb")) | ||
|  | 
 | ||
|  | 
 | ||
|  | mujoco_channels = [] | ||
|  | robot_channels = [] | ||
|  | 
 | ||
|  | # # convert quat to euler for easier reading by a simple human | ||
|  | # for i in range(min(len(mujoco_obs), len(robot_obs))): | ||
|  | #     mujoco_quat = mujoco_obs[i][:4] | ||
|  | #     mujoco_euler = R.from_quat(mujoco_quat).as_euler("xyz") | ||
|  | 
 | ||
|  | #     robot_quat = robot_obs[i][:4] | ||
|  | #     robot_euler = R.from_quat(robot_quat).as_euler("xyz") | ||
|  | 
 | ||
|  | #     mujoco_obs[i] = mujoco_obs[i][1:] | ||
|  | #     robot_obs[i] = robot_obs[i][1:] | ||
|  | 
 | ||
|  | #     mujoco_obs[i][:3] = mujoco_euler | ||
|  | #     robot_obs[i][:3] = robot_euler | ||
|  | 
 | ||
|  | nb_channels = len(mujoco_obs[0]) | ||
|  | 
 | ||
|  | for i in range(nb_channels): | ||
|  |     mujoco_channels.append([obs[i] for obs in mujoco_obs]) | ||
|  |     robot_channels.append([obs[i] for obs in robot_obs]) | ||
|  | 
 | ||
|  | channels = [ | ||
|  |     "base_roll", | ||
|  |     "base_pitch", | ||
|  |     "base_yaw", | ||
|  |     "base_quat[0]", | ||
|  |     "base_quat[1]", | ||
|  |     "base_quat[2]", | ||
|  |     "base_quat[3]", | ||
|  |     "base_ang_vel[0]", | ||
|  |     "base_ang_vel[1]", | ||
|  |     "base_ang_vel[2]", | ||
|  |     "dof_pos[0]", | ||
|  |     "dof_pos[1]", | ||
|  |     "dof_pos[2]", | ||
|  |     "dof_pos[3]", | ||
|  |     "dof_pos[4]", | ||
|  |     "dof_pos[5]", | ||
|  |     "dof_pos[6]", | ||
|  |     "dof_pos[7]", | ||
|  |     "dof_pos[8]", | ||
|  |     "dof_pos[9]", | ||
|  |     "dof_pos[10]", | ||
|  |     "dof_pos[11]", | ||
|  |     "dof_pos[12]", | ||
|  |     "dof_pos[13]", | ||
|  |     "dof_pos[14]", | ||
|  |     "dof_vel[0]", | ||
|  |     "dof_vel[1]", | ||
|  |     "dof_vel[2]", | ||
|  |     "dof_vel[3]", | ||
|  |     "dof_vel[4]", | ||
|  |     "dof_vel[5]", | ||
|  |     "dof_vel[6]", | ||
|  |     "dof_vel[7]", | ||
|  |     "dof_vel[8]", | ||
|  |     "dof_vel[9]", | ||
|  |     "dof_vel[10]", | ||
|  |     "dof_vel[11]", | ||
|  |     "dof_vel[12]", | ||
|  |     "dof_vel[13]", | ||
|  |     "dof_vel[14]", | ||
|  |     "prev_action[0]", | ||
|  |     "prev_action[1]", | ||
|  |     "prev_action[2]", | ||
|  |     "prev_action[3]", | ||
|  |     "prev_action[4]", | ||
|  |     "prev_action[5]", | ||
|  |     "prev_action[6]", | ||
|  |     "prev_action[7]", | ||
|  |     "prev_action[8]", | ||
|  |     "prev_action[9]", | ||
|  |     "prev_action[10]", | ||
|  |     "prev_action[11]", | ||
|  |     "prev_action[12]", | ||
|  |     "prev_action[13]", | ||
|  |     "prev_action[14]", | ||
|  |     "commands[0]", | ||
|  |     "commands[1]", | ||
|  |     "commands[2]", | ||
|  | ] | ||
|  | 
 | ||
|  | # one sub plot per channel, robot vs mujoco | ||
|  | # arrange as an array of sqrt(nb_channels) x sqrt(nb_channels) | ||
|  | 
 | ||
|  | nb_rows = int(np.sqrt(nb_channels)) | ||
|  | nb_cols = int(np.ceil(nb_channels / nb_rows)) | ||
|  | 
 | ||
|  | fig, axs = plt.subplots(nb_rows, nb_cols, sharex=True, sharey=True) | ||
|  | for i in range(nb_rows): | ||
|  |     for j in range(nb_cols): | ||
|  |         if i * nb_cols + j >= nb_channels: | ||
|  |             break | ||
|  |         axs[i, j].plot(mujoco_channels[i * nb_cols + j], label="mujoco") | ||
|  |         axs[i, j].plot(robot_channels[i * nb_cols + j], label="robot") | ||
|  |         axs[i, j].legend() | ||
|  |         axs[i, j].set_title(f"{channels[i * nb_cols + j]}") | ||
|  | 
 | ||
|  | 
 | ||
|  | fig.suptitle("Mujoco vs Robot") | ||
|  | # tight layout | ||
|  | # plt.tight_layout() | ||
|  | plt.show() |