
    *iB                        d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	Z	ddl
Zd!dej        dedej        fd	Zdej        d
ededededej        dej        fdZd"dedeeef         fdZ	 	 	 	 	 	 d#dedededededededdfd ZdS )$z;Visualize a converted UnifiedDataset recording using Rerun.    N)Path)Tuple_   depth_m
percentilereturnc           	         t          j        | dk    dt          j        | dd          z  d          }||dk             }t          |          dk    r"t	          t          j        ||                    nd}||dz   z                      dd          }t          j        |dz                      t           j	                  t          j
                  }t          j        |t          j                  }d||dk    <   |S )uA  Plasma-colorize a depth map using inverse-depth mapping.

    Mirrors ``viz_depth`` / ``viz_inv_depth`` from AnyData:
    - compute inverse depth (1 / depth), masking zeros
    - normalize by the *percentile*-th value of valid pixels
    - apply plasma colormap; invalid pixels stay black

    Returns uint8 H×W×3.
    r         ?g:0yE>Ng        ư>   )npwherecliplenfloatr   cv2applyColorMapastypeuint8COLORMAP_PLASMAcvtColorCOLOR_BGR2RGB)r   r   invvalid
normalizerinv_normcolored_bgrcolored_rgbs           //home/robot-lab/raiden_cmu/raiden/visualizer.py
_viz_depthr       s     (7Q;bggtT&B&B BC
H
HCaLE<?JJNNr}UJ77888PSJzD()//S99H#	C))3+> K ,{C,=>>KKq    fxfycxcyT_cam2worldc                    | j         \  }}t          j        t          j        |t          j                  t          j        |t          j                            \  }}	|                     d          }
t          j        |                    d          |z
  |
z  |z  |	                    d          |z
  |
z  |z  |
t          j        |
          gd          }||j        z  j        ddddf         }|S )zUnproject every pixel into world space.

    Returns all (H*W, 3) world-space points (including invalid ones so the
    caller can apply a uniform validity mask that aligns with flattened images).
    dtype   axisN   )	shaper   meshgridarangefloat32reshapestack	ones_likeT)r   r"   r#   r$   r%   r&   HWuuvvdpts_cam	pts_worlds                r   _reconstruct_pointsr>   )   s     =DAq[1BJ7771BJ9W9W9WXXFBAhZZ^^b A%*ZZ^^b A%*LOO		
   G wy(+AAArrE2Ir!   data/processeddata_dirc                    t          |           }t          d |                                D                       }|st          d|           ddlm} d |D             } |t          |          d          d         }||         }t          d |                                D                       }|st          d	|           i }|D ]}	|	j        }
t          |	d
z            5 }t          j
        |          }ddd           n# 1 swxY w Y   |                    di                               dd          }|r|	j         d| d}
|	||
<    |t          |          d          d         }t          |          ||         j        fS )zTUse fzf to select a task then an episode. Returns ``(task_dir_path, episode_name)``.c              3      K   | ]E}|                                 t          d  |                                D                       A|V  FdS )c              3   l   K   | ]/}|                                 |d z                                  V  0dS metadata.jsonNis_direxists).0eps     r   	<genexpr>z4select_task_and_episode.<locals>.<genexpr>.<genexpr>R   s@      UUBUo%--//UUUUUUr!   N)rG   anyiterdirrI   r;   s     r   rK   z*select_task_and_episode.<locals>.<genexpr>N   sm        88:: UU!))++UUUUU		     r!   zNo converted tasks found in r   )
fzf_selectc                     i | ]
}|j         |S  )namerN   s     r   
<dictcomp>z+select_task_and_episode.<locals>.<dictcomp>Y   s    000161000r!   zVisualize task> )promptc              3   p   K   | ]1}|                                 |d z                                  -|V  2dS rD   rF   rN   s     r   rK   z*select_task_and_episode.<locals>.<genexpr>]   s\        9:_9L8T8T8V8V	     r!   zNo episodes found in rE   Ninforaw_id z  ()zSelect episode> )r   sortedrM   FileNotFoundErrorraiden.utilsrO   listrR   openjsonloadgetstr)r@   base	task_dirsrO   task_labelschosen_tasktask_direpisode_dirsepisode_labelsrJ   labelfep_metarW   	chosen_eps                  r   select_task_and_episodern   K   s$   >>D      I  G Et E EFFF''''''00i000K*T+..7IJJJ1MK;'H  ##%%    L  D B B BCCCN # #"&'' 	#1illG	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#VR((,,Xr:: 	-w,,6,,,E "u
4//8JKKKANIx==.3888s   'DD	D	0000r+         ?皙?F#  recording_direpisodestrideimage_scalefrustum_scalewebweb_portc                   O ddl }t          t          t          j                  j                  }|t          j                            dd          vr=|t          j	        z   t          j                            dd          z   t          j        d<   t          |           }	|	|z  }
|

                                st          d|
           t          |
dz            5 }t          j        |          }ddd           n# 1 swxY w Y   |                    dg           }|                    di                               d	d
          }|                    di                               ddg          }|r|d         nd}|
dz  OOfd|D             }|st          dO           t!          |          }t#          d|	j                    t#          d|            t#          d|            t#          d|            t#          d|            t'          j        dt&          j                  }|
dz  dz  }|
                                rst          |d          5 }t-          j        |          }ddd           n# 1 swxY w Y   |                    d          }| t'          j        |t&          j                  }|rddlm} |                    d           |dz   }|                    |          }|                    |d            d!| d" ||d#           }t#          d$|            t#          d%| d&| d'| d&| d(	           t#                       n|                    dd)*           |                    d|                    d+                    d|	j         d| d| dd,                    |           d| g          |j         j!        -          d).           tE          tG          d||                    }t#          d/tI          |           d0| d1           |}g g }}tG          |          D ]} |
dz  | d2d3z  }!|!
                                rt          |!d          5 }t-          j        |          }"ddd           n# 1 swxY w Y   d4|"v r|"d4         }#|%                    |#dd5                    t'          j        |#d6d7         t&          j                  }$|t'          j%        |$d8          z  dd5         }%|%                    |%&                    t&          j'                             |rP|                    d9|(                    t'          j        |t&          j'                  gg d:gd;<          d).           |rP|                    d=|(                    t'          j        |t&          j'                  gg d>gd;<          d).           tS          |          D ]\  }&}'|*                    d?|'@           |'d2}(d})|D ]}*dA|* }+|
dz  |( d3z  },|,
                                s(t          |,d          5 }t-          j        |          }-ddd           n# 1 swxY w Y   |-dB                             |*          }.|-dC                             |*          }/|.|/|.&                    t&          j                  }.|/&                    t&          j                  }/|.dD         |z  }0|.dE         |z  }1|.dF         |z  }2|.dG         |z  }3|                    |+|+                    |/dd5d5f         |/dd5dd5f         H                     d}4|
dz  |*z  |( dIz  }5|5
                                rktY          j-        t          |5                    }6|6G|6j.        ddJ         \  }7}8t_          dta          |7|z                      }9t_          dta          |8|z                      }:|d8k    r#tY          j1        |6|:|9ftX          j2        K          }6tY          j3        |6tX          j4                  }4t'          j        |0d|2gd|1|3gg dLgt&          j'                  }.|                    |+|5                    |.|:|9|M                     |                    |+|6                    |4                     |                    |+ dN|6                    |4                     |
dOz  |*z  |( dPz  };|;
                                rt'          j        |;          dO         }<|<&                    t&          j'                  dQz  }=|4$tY          j1        |=|:|9ftX          j7        K          }=no|d8k    ri|=j.        \  }>}?tY          j1        |=t_          dta          |?|z                      t_          dta          |>|z                      ftX          j7        K          }=|                    |+ dR|6                    tq          |=                               ts          |=|0|1|2|3|/          }@t'          j:        |@          ;                    dS          t'          j<        |@          =                    dS          dTk    z  }A|@|A         }BtI          |B          dk    rHi }C|4|4>                    dUd5          |A         |CdV<   |                    dW|*  |j?        |Bfi |C           |)sd4|-v r|-d4         }D|Ddd5         }E|Dd5dX         >                    d5d5          }Ft          |DdX                   }Gt'          j        |Dd6d7         t&          j                  }H|t'          j%        |Hd8          z  dd5         &                    t&          j'                  }I|dd5dd5f         |Dd7dY         >                    d5d5          z  &                    t&          j'                  }Jt          |DdY                   }KtS          g dZ          D ]\  }L}M|                    d[|M |A                    t          |I|L                                        |                    d\|M |A                    t          |E|L                                        |                    d]|A                    |K                     |                    d^|A                    |G                     |                    d_|+                    |I|JH                     |                    d`|+                    |E|FH                     |                    da|?                    |Igg d:gdb<                     |                    dc|?                    |Egg d>gdb<                     d)})|&dz   ddz  dk    s|&tI          |          dz
  k    r*t#          de|&dz   dfdgtI          |           dh|' di           |rKt#          dj           	 ddlB}N	 |NC                    d           # t          $ r t#          dk           Y dS w xY wt#          dl           dS )ma  Visualize a converted recording directory using Rerun.

    Mirrors RerunDisplay from AnyData: logs camera frustums (Transform3D +
    Pinhole), RGB images (at entity path for frustum texture and at
    ``{entity}/rgb`` for the 2-D view), plasma-colorized depth maps, and
    colored world-space point clouds.

    Parameters
    ----------
    recording_dir:
        Path to the converted task directory (e.g. ``data/processed/pick_purrito``).
    episode:
        Episode subdirectory name (default: ``"0000"``).
    stride:
        Log every *stride*-th frame (default: ``1``).
    image_scale:
        Uniform downsample factor for images and point clouds (default: ``0.25``).
    frustum_scale:
        ``image_plane_distance`` passed to ``rr.Pinhole``; controls the rendered
        frustum size in the 3-D view (default: ``0.1``).
    web:
        Serve the viewer over HTTP instead of spawning the native desktop app.
        Use this when connecting via SSH tunnel.
    web_port:
        HTTP port for the web viewer (default: ``9090``).
    r   NPATHrX   zEpisode directory not found: rE   camerasrV   rR   unknownlanguagerT   rgbc           	          g | ]K}|z                                   t          t          |z                      d                               LS )z*.png)rH   r   rZ   glob)rI   camrgb_dirs     r   
<listcomp>z'visualize_recording.<locals>.<listcomp>   sa       cM!!##FGcM''001122  r!   zNo RGB frames found under zRecording : zTask      : zPrompt    : zCameras   : zFrames    :    r(   lowdimz0000000000.pklrbT_left_from_right)quoteraidenr+   )	grpc_portF)ry   open_browserzhttp://localhost:z?url=)safez
Open in browser: zSSH tunnel:      ssh -L z:localhost:z -L z <host>T)spawn
z, )
media_type)staticzLogging z frames (stride=z) ...010dz.pklactionr.         r
   ztrajectory/right)   P   <   g~jth?)colorsradiiztrajectory/left)r   x   r   frame)sequencezworld/cameras/
intrinsics
extrinsics)r   r   )r+   r+   )r      )r+   r   )translationmat3x3z.pngr   )interpolation)r   r   r+   )image_from_camerawidthheightimage_plane_distancez/rgbdepthz.npzg     @@z/depthr,   r   r*   r   zworld/points/      )xyzzaction/right/zaction/left/zaction/right/gripperzaction/left/gripperzworld/ee/rightzworld/ee/leftztrajectory/right/currentg{Gz?ztrajectory/left/current   z  z>4d/z	  (frame rY   u/   Done logging. Serving — press Ctrl-C to stop.z	
Stopped.z&Done. Rerun viewer should now be open.)Ererunrb   r   sys
executableparentosenvironra   pathseprH   r[   r^   r_   r`   RuntimeErrorminprintrR   r   eyefloat64picklearrayurllib.parser   init
serve_grpcserve_web_viewerlogTextDocumentjoin	MediaTypeTEXTr]   ranger   appendr   r2   LineStrips3D	enumerateset_timeTransform3Dr   imreadr/   maxintresize
INTER_AREAr   r   PinholeImageINTER_NEARESTr    r>   isfiniteallabssumr3   Points3Dr   ScalarstimesleepKeyboardInterrupt)Prs   rt   ru   rv   rw   rx   ry   rr	_venv_binrec_direp_dirrk   meta	cam_names	task_namepromptsrT   countsn_framesr   _first_lowdim_f_ld0_tr   r   
server_uri
viewer_url
frame_listsleft_pos_listright_pos_listfipaactr_pos_rbr_pos_lblog_idx	frame_idx
frame_nameaction_loggedcam_nameentitylowdim_pathldKT_c2wfx_sfy_scx_scy_simg_rgbrgb_pathimg_bgrH0W0H_dW_d
depth_pathdepth_mmr   HdWdptsr   	pts_validkwargsr   l_posl_rotl_grip	_r_pos_rbr_posr_rotr_gripjlblr   r   sP                                                                                  @r   visualize_recordingr  v   s    F  D((/00I
vr2222&3bjnnVR6P6PP
6=!!GwF==?? J H H HIII	f&	'	' 1y||               hhy"--IXXfb))--fi@@Ihhz2&&**8bT::G '/'!**RFunG     F
  CAAABBB6{{H	
'
'
'(((	
$
$
$%%%	
!
!
!"""	
$
$
$%%%	
#
#
#$$$ %'F1BJ$?$?$?X%(88M ?-&& 	#";r??D	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#XX)**> "2: > > >
 &&&&&&&
qL	]]Y]77

XEBBBTTTjr8R8R8RTT
0J00111rxrrHrr)rr`irrr	
 	
 	
 	
%%%FF
II17<11.9..+6++9499Y#7#799-8--  |( 	 	
 	
     " eAx0011J	
CS__
C
Cf
C
C
CDDDA %'>MHoo 
C 
CX2 0 0 0 0088:: 	Ca $"KOO$ $ $ $ $ $ $ $ $ $ $ $ $ $ $1}}k$$S1X...8C2JbjAAA-	(C0H0HH"1"M%%hoobj&A&ABBB 	

OO.
;;;<%   
  	 	
 	
 	
  	

OO-rz:::;&'   
  	 	
 	
 	
 (
33 RQ RQ
Gi000!((
! J	% J	%H0h00F
 !8+.A.A.AAK%%'' k4(( %B[__% % % % % % % % % % % % % % %< $$X..A|$((22EyEM$$ALL,,E T7Q;DT7Q;DT7Q;DT7Q;D
 FF5!Q<bqb"1"fNN   G~0j3F3F3FFH   ?*S]]33&$]2A2.FBaR!V--CaR!V--CCxx"%*#c3Zs~# # # "l7C4EFFG41dD/999ERZ  A FF

./"%#&1>	 #     FF6288G#4#4555FFf???BHHW,=,=>>>
  ')H4*7J7J7JJJ  "" Y7:..w7"//"*55>&!j#s3;L  GG #XX$]FB!jQBF,,c!Sa[[.A.AB&)&7  G
 &((("((:g3F3F*G*GHHH *'4tT5QQC((,,!,44sQ8O8ORV8VWJ	y>>A%%#%F*+2??2q+A+A%+Hx(FF5855{r{97W7WPV7W7WXXX ! %%X^^%'\qsqt,,Q22vbz**HVBrE]"*EEE	*RYy#-F-FFKRRJ  &bqb"1"f-r"u0E0Ea0K0KK&$$  vbz** (88 N NFAsFF0300"**U58__2M2MNNNFF/#//E%(OO1L1LMMMM-rzz&/A/ABBB,bjj.@.@AAA $bnnun&U&U   5QV(W(WXXX .KKtKLL   -KK0@KMM   !%aK2""gZ11D&D&DOw{OOOZOO9OOOPPP
 
8?@@@	 KKK

1  	  	  	 ,	  	677777sZ   C==DD JJJ8RR	 R	Y::Y>Y>x! !x>=x>)r   )r?   )ro   r+   rp   rq   Frr   )__doc__r_   r   r   r   pathlibr   typingr   r   numpyr   ndarrayr   r    r   r>   rb   rn   boolr  rQ   r!   r   <module>r$     s   A A  				  



             



     
  RZ    .Z 	 		
 	  Z   D#9 #9c #9sCx #9 #9 #9 #9Z A8 A8A8A8 A8 	A8
 A8 
A8 A8 
A8 A8 A8 A8 A8 A8r!   