
    ij                      L   d Z ddlZej                            dd           ddlZddlZddlZddlmZ ddl	Z	ddl
Z
ddlZddlmZ  e            Z ed          Zd Z ee          Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd ZddZd Zedk    r e e                      dS )aY  YAM bimanual silhouette overlay renderer.

Renders both arms' silhouettes using MuJoCo from a single MJCF (one arm),
re-using the same model by injecting a camera and updating qpos. For the right
arm, the camera is brought into right_arm_base coords via inv(T_left_from_right).

Output: a side-by-side panel (raw | overlay) per requested frame.
    N	MUJOCO_GLegl)Path)get_yam_4310_linear_xml_pathz/home/robot-lab/data/processedc                 t    t          |                                           }t          |           j        }i }|S )zBLoad mesh assets from all directories the combined XML references.)r   	read_textparent)xml_pathxmlxml_dirassetss       9/home/robot-lab/cameron/yam_control/yam_overlay_render.pyload_assetsr      s3    
x..
"
"
$
$C8nn#GF M    c           
          t          | d                   }t          dt          j        t          j        |d|z  z                      z            S )N)   r      )floatnpdegreesarctan)KHfys      r   fovy_from_Kr   +   s@    	qwBRZ	!q2v, 7 7888999r   c                    t          j        g d          }||z  }|dddf         |dddf         }	}d|d         dd|d         dd|d         dd	|d         dd|d         dd|d         dd|	d         dd|	d         dd|	d         dd
|dd}
d| d| d}t          |                                           }|                    d| dd          }|                    dd|
 d          }|S )z\Inject a fixed pinhole camera (OpenCV convention) + offscreen buffer size into the YAM MJCF.)r   r   Nr   r   z<camera name="posed" pos="z.6f r   z
" xyaxes="z" fovy="z.4fz"/>z<visual><global offwidth="z" offheight="z"/></visual>z<asset>z

  <asset>z</worldbody>z  z
  </worldbody>)r   diagr   r   replace)r
   cam_pos
cam_rot_cvfovyWr   opencv_to_mj
cam_rot_mjcam_xcam_ycam_str
visual_strr   s                r   build_xml_with_camerar+   0   s   7;;;''Ll*Jaaad#Z1%55E	WQZY 	 	gajY 	 	wqzY 	 	8@	 	"'(@	 	16q@	 	89	 	(9	 	).q9	 	 	 	 	  NaMMaMMMJ
x..
"
"
$
$C
++iJ!;!;!;Q
?
?C
++n&D7&D&D&D
E
ECJr   c                    |dddf         }|ddddf         }t          ||          }t          t          |||||          }t          j                            |          }	t          j        |	          }
t          dt          |                     }| d|         |
j	        d|<   t          |           dk    rK|	j
        dk    r@t          t          j        | d         dd                    dz  }||
j	        d<   ||
j	        d<   t          j        |	|
           t          j        |	||	          }t          j        |	t          j        j        d
          }|                                 |                    |
|           |                                                                }|                                 t          |                                          }||dz  k                         t          j                  }||fS )zRender a single arm + gripper at world origin from a given camera pose. Returns (mask, depth).

    joints7: (7,) array. First 6 are arm joints; 7th is gripper opening.
    N            g        g      ?gRQ?)heightwidthposed)camerag+?)r   r+   YAM_XMLmujocoMjModelfrom_xml_stringMjDataminlenqposnqr   r   clip
mj_forwardRenderer
mj_name2idmjtObjmjOBJ_CAMERAenable_depth_renderingupdate_scenerendercopyclosemaxastypeuint8)joints7
T_cam2baser   r$   r   r!   cam_rotr#   r   modeldataarm_nslider_mrenderercam_iddepthfarmasks                     r   render_arm_maskrX   B   s   
 !QG!RaR Gq!D
'4A
F
FCN**3//E=D3w<<  EDIfuf 7||qUX]]S#6677&@	!	!
eT"""uQa888Hufm&@'JJF##%%%$v...OO""$$ENN
		

CC%K''11D;r   c                     t          | d d         ||||          \  }}t          j                            |          }||z  }	t          | dd         |	|||          \  }
}||
fS )Nr/      )rX   r   linalginv)joints14T_cam2worldT_left_from_rightr   r$   r   mask_l_T_invT_cam2rbasemask_rs              r   render_bimanualre   g   sl    !k1aCCIFAIMM+,,E+%K2Q1EEIFA6>r   c                    |                                  }|df|dffD ]\  }}||                                dk    r t          j        |t          j        t          j                  \  }}t          j        ||d|d           |                                  }t          j        |||           t          j        |d|dd          }|S )N)r      r   )r   r   rg   r   r   r   g      ?g      ?)	rG   sumcv2findContoursRETR_EXTERNALCHAIN_APPROX_SIMPLEdrawContoursfillPolyaddWeighted)	imgr`   rd   outrW   colorcsra   fills	            r   overlay_contoursru   p   s    
((**C-/DE 8 8e<488::?? s'8#:QRRAb"eQ///xxzzT2u%%%oc4tQ77Jr   c                     t          |           } | D ]"}|                                }d|v rd|vr|c S #| D ]}d|                                vr|c S | r| d         ndS )zCcams: iterable of camera names. Returns the scene cam name or None.scenewristr   N)listlower)camsccls      r   find_scene_camr~   ~   s    ::D  WWYYb==WB..HHH  !''))##HHH $$477$r   c                 X    t          d |                                 D                       S )Nc                 h    g | ]/}|                                 |d z                                   -|0S )lowdim)is_dir).0ds     r   
<listcomp>z!list_episodes.<locals>.<listcomp>   s:    [[[AHHJJ[ALCXCXCZCZ[1[[[r   )sortediterdir)task_dirs    r   list_episodesr      s+    [[h..00[[[\\\r   c                 n    t          | dz                      d                    }t          |          |fS )Nr   z*.pkl)r   globr;   )ep_dirpklss     r   count_framesr      s2    6H$**73344Dt99d?r   c                 f    |d}dD ])}| dz  |z  | | z  }|                                 r|c S *d S )N010d)z.jpgz.pngz.jpegrgb)exists)r   cam	frame_intfstrextcands         r   find_rgb_pathr      sZ    D(  ~#nsnn4;;== 	KKK	4r   c           
         t           | z  }||z  }t          |          \  }}	|dk    rd d| fS ||dz  }|d}
|dz  |
 dz  }t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   |'t          |d                                                   }t          |||          }|d d	| fS t          j	        |d
                   }t          j	        |d                   }|d         
                    |          }|d         
                    |          }||d d| fS t          j	        |          }t          j	        |          }t          j        t          |                    }|j        d d         \  }}t          ||||||          \  }}t!          |||          }t          j        ||gd          }t          j        ||df||fdd           |p|  d| d| d| d| 	}t          j        ||dt          j        dddt          j                   |rKt-          |          j                            dd           t          j        t          |          |           ||fS )Nr   zno frames in r   r   r   z.pklrb
intrinsicszmissing rgb for cam jointsr_   
extrinsicszno extr/intr for cam r   )axis)(   r   r   /z cam=z f=)
      gffffff?)rg   rg   rg   T)parentsexist_ok)	DATA_ROOTr   openpickleloadr~   keysr   r   arraygetri   imreadstrshapere   ru   concatenatelineputTextFONT_HERSHEY_SIMPLEXLINE_AAr   r	   mkdirimwrite)taskepr   frameout_pathlabelr   r   n_framesr   r   pkl_pathffdrgb_pathr   T_lfrextrintrr   r^   rp   r   r$   r`   rd   overlaypanellbls                                r   
render_oner      s   4H]F!&))NHd1}}-V----}A??D d===0H	h		 [^^              
{ R-224455VS%00H1C1111Xbl##FHR+,--El$$Dl$$D|t|2S2222
A(4..K
*S]]
#
#C9RaR=DAq$V[%AqIINFFsFF33GNC>222EHUQFQFL!444

@d@@R@@c@@e@@h@@CKsHc&>_VWY\Ydeee *X##D4#@@@CMM5)))#:s   A66A:=A:c                  
   t          j                    } |                     dd           |                     dd           |                     dd d	           |                     d
t          d d           |                     dd           |                                 }t          |j        |j        |j        |j	        |j
                  \  }}|t          d|            dS t          d|j
         d| d           dS )Nz--taskT)requiredz--ep0000)defaultz--camz#defaults to scene cam from metadata)r   helpz--framezdefaults to middle frame)typer   r   z--outzFAIL: r   z
OK: saved z  ()r   )argparseArgumentParseradd_argumentint
parse_argsr   r   r   r   r   rq   print)pargsr   r   s       r   mainr      s    !!ANN8dN+++NN66N***NN7D/TNUUUNN93;UNVVVNN7TN***<<>>Ddi$(DJQQLE5}uq	
,tx
,
,E
,
,
,---1r   __main__)NNNN) __doc__osenviron
setdefaultr   jsonr   pathlibr   ri   r6   numpyr   raiden._xml_pathsr   r5   r   r   
YAM_ASSETSr   r+   rX   re   ru   r~   r   r   r   r   r   __name__
SystemExit r   r   <module>r      s    
			 
  k5 ) ) )          



      ; : : : : :
&
&
(
(D122	   [!!
: : :
  $" " "J    % % %] ] ]  
  ' ' ' 'T    z
*TTVV

 r   