+
    PUj+              
       :   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt]P                  P                  ^ ]P                  P                  ]P                  P                  ]P                  P                  ]4      4      4      4       ^ RIHtHt ^ RIHt ^ RIHtHtHt ^ RIHt ^ RIHt ^ RIHtHt ]P                  P                  ]P                  P                  ]4      4      t]P                  P?                  ]R4      t R	 t!R
 t"R t#]$R8X  d
   ]#! 4        R# R# )az  Record a localization dataset from the scene + wrist cameras.

World frame = the calib board's ArUco (GridBoard) frame. Everything is solved by PnP on
the boards in the scene image (no MuJoCo needed):

  intrinsics   : scene-camera K, solved once from the first --calib-frames views (saved in meta).
  scene_cam_pose : the scene camera's pose in the world frame, per frame (OpenCV convention,
                   z-forward). If the calib board isn't visible, the last known pose is reused.
  umi_pose     : the UMI gripper's ArUco pose (UMI_V2 board) in the world frame, per frame
                   (reuses last known when not visible; a visibility flag is stored).
  wrist rgb    : the wrist camera frame (downscaled, aspect preserved).
  gripper      : the jaw servo tick + calibrated radians.

Images are saved downscaled (default 500px wide) at --fps (default 4). Layout:
  datasets/<task>/ { meta.json, scene/NNNNNN.jpg, wrist/NNNNNN.jpg, state/NNNNNN.npz }

Usage:
  python record_dataset.py <task> [--scene-index 1] [--wrist-index 0] [--fps 4]
        [--scene-width 500] [--wrist-width 500] [--calib-frames 10] [--overwrite] [--port ...]
N)Busticks_to_rad)
calib_path)detect_boardsestimate_focal
solve_pose)CALIB_BOARD)UMI_V2)
open_namedload_intrinsicsdatasetsc                     \        \        V P                  ^ ,          V,          V P                  ^,          ,          4      4      p\        P                  ! WV34      # )    )introundshapecv2resize)framewidthhs   && ar_view/record_dataset.py	downscaler   *   s>    E%++a.5(5;;q>9:;A::eQZ((    c           
          \         P                  ! V \        \        V P                  ^,          V,          V P                  ^ ,          ,          4      4      V34      # )   )r   r   r   r   r   )r   r   s   &&r   	to_heightr   /   s<    ::ec%A(:U[[^(K"LMqQRRr   c                  X  aB \         P                  ! 4       p V P                  R 4       V P                  R\        ^R7       V P                  R\        ^ R7       V P                  R\        RR7       V P                  R\        RR7       V P                  R\        RR7       V P                  R	\        ^
R7       V P                  R
RR7       V P                  RRR7       V P                  RRR7       V P                  4       p \        P                  ! \        \        R4      4      4      p\        R XP                  4        4       R4      pVf   \        P                  ! R4       Vw  rE\        P                   P#                  \$        VP&                  4      oBVB3R lR_ 4       w  rgp\        P                   P)                  V4      '       dS   \        P*                  ! V4      '       d7   VP,                  '       g%   \        P                  ! RVP&                   R24       WgV3 Fk  p	\        P.                  ! V	RR7       \        P*                  ! V	4       F6  p
\        P0                  ! \        P                   P#                  W4      4       K8  	  Km  	  \3        RVP4                  4      w  rp\3        RVP6                  4      w  rpVe   Vf   \        P                  ! R4       Vf   \        P                  ! R4       VP8                  ^,          VP8                  ^ ,          pp\;        RV RV R V R!V 24       \;        R"VP<                   R#24       . p\?        V4      VP<                  8  Ed   VPA                  4       w  ppV'       d   Vf   K<  \C        \D        PF                  ! V\D        PH                  4      \J        .4      p	R$V	9   d   VPM                  V	R$,          4       VPN                  '       d   K  \D        PP                  ! VR%\?        V4       R&VP<                   2R`\D        PR                  R'Ra^4       \D        PT                  ! R(\W        VR)4      4       \D        PX                  ! ^4       EK   \[        VVV3R'\]        VV4      ,          R*7      w  pppVP^                  \	        V4      ,          pVPa                  4       pV^ ;;,          V,          uu&   V^;;,          V,          uu&   \;        R+VRb,          R, R-V R V R.VR/ R02	4       VP8                  ^,          VP8                  ^ ,          pp\c        R4      pVe   V\	        VR1,          4      ,          pVR2,          Pa                  4       pV^ ;;,          V,          uu&   V^;;,          V,          uu&   VPd                  \	        V4      ,          p VPa                  4       p!V!^ ;;,          V ,          uu&   V!^;;,          V ,          uu&   \;        R3VRb,          R, R-V R V 24       MR;pp!\;        R44       VPf                  '       d   \i        VPf                  4      M	\i        4       p"V"Pk                  V4      '       g   \        P                  ! R5V R624       V"Pm                  VR74       R8 p#\o        VP&                  VPp                  YER9R:R;\o        V#! \J        4      V#! \r        4      R<7      \o        VV.VP^                  VPu                  4       VPu                  4       \	        V4      R=R>7      \o        VV.VPd                  Ve   VPu                  4       MRV!e   V!Pu                  4       MRVe   R?MRR@7      \v        Px                  ! RA4      RB7      p$\        Pz                  ! V$\        \        P                   P#                  SBRC4      RD4      ^RE7       \;        RFVP&                   RGVPp                   RHSB RI24       \|        P~                  ! ^4      p%\|        P~                  ! ^4      p&\|        P~                  ! ^4      p'RJVPp                  ,          p(^ p)\D        P                  ^_.p*  \v        P                  ! 4       p+VPA                  4       w  p,p-VPA                  4       w  p.p/V,'       d   V-f   EM\C        \D        PF                  ! V-\D        PH                  4      \J        \r        .4      p0R$V09   p1V1'       d8   \        . V0R$,          OVN5!  w  p2p\|        P                  P                  V24      p%T%p3RKV09   p4V4'       d"   \        . V0RK,          OVN5!  w  p5pV3V5,          p&T&p6R7p7V.'       d}   V/ey   Veu   \C        \D        PF                  ! V/\D        PH                  4      \J        .4      p8R$V89   d:   \        . V8R$,          OVN5!  w  p9p\|        P                  P                  V94      p'Rp7T'p:V"P                  V4      p;V;e   \        V;V4      M
\	        RL4      p<V)RM p=\D        P                  ! \        P                   P#                  VV= RN24      \W        V-VP^                  4      V*4       V.'       dR   V/eN   \D        P                  ! \        P                   P#                  VV= RN24      \W        V/VPd                  4      V*4       \|        P                  ! \        P                   P#                  VV= RO24      T3T6T:T1T4T7V;e   T;MRcV<\v        Pv                  ! 4       RP7
       V)^,          p)VPN                  '       Eg   \        V-RQ4      p>\D        PP                  ! T>RRT) RSV1'       d   RTMRU RVV4'       d   RTMRU RWV; 2Rd\D        PR                  RXRe^4       V.'       da   V/e]   \        V/RQ4      p?\D        PP                  ! T?RYV7'       d   RTMRU 2Rd\D        PR                  RXRe^4       \|        P                  ! V>V?.4      p@MT>p@\D        PT                  ! R(X@4       \D        PX                  ! ^4      ^,          \        RZ4      8X  d   MF\v        P                  ! 4       V+,
          pAVAV(8  g   EK  \v        P                  ! V(XA,
          4       EK  V$P                  V)\v        Px                  ! RA4      R\7       \        Pz                  ! V$\        \        P                   P#                  SBRC4      RD4      ^RE7       VP                  4        VP                  4        \D        P                  ! 4        V"P                  4        \;        R]V) R^SB 24       R#   \         d    \        P                  ! R4        ELi ; i  \         d    \;        R[4        ELi ; i  T$P                  T)\v        Px                  ! RA4      R\7       \        Pz                  ! T$\        \        P                   P#                  SBRC4      RD4      ^RE7       TP                  4        TP                  4        \D        P                  ! 4        T"P                  4        \;        R]T) R^SB 24       i ; i)ftaskz--scene-index)typedefaultz--wrist-indexz--fpsg      @z--scene-widthi  z--wrist-widthz--calib-framesz--overwrite
store_true)actionz--no-previewz--portN)r    gripperz9No calib/gripper.json. Calibrate the gripper servo first.c              3      "   T F4  w  rVR ,          R9   g   K  \        V4      \        VR,          4      3x  K6  	  R# 5i)jointsignN)jawgripper_jaw)r   ).0sidcs   &  r   	<genexpr>main.<locals>.<genexpr>F   s7      9vsW:!77 +S3qy>*s   >%>z/No jaw/gripper_jaw servo in calib/gripper.json.c              3   d   <"   T F%  p\         P                  P                  SV4      x  K'  	  R # 5i)N)ospathjoin)r)   dddirs   & r   r,   r-   N   s%     T8S1dA..8Ss   -0scenewristz	Dataset 'z(' exists. Use --overwrite or a new name.T)exist_okz%Scene camera didn't open / no frames.zWrist camera didn't open.zscene cam idx z @ xz   wrist cam idx zRecording the first z: frames for scene intrinsics (point at the calib board)...calibzscene intrinsics /g?record_dataseti  )f_guessz
  scene f=z.0fzpx @ z	, reproj z.2fpxr   Kz  wrist intrinsics loaded: f=u`     wrist intrinsics NOT found (run calibrate_camera.py wrist) — wrist pose off, RGB still savedzGripper servo z not responding.Fc                     \        \        V R ,          ^ ,          4      \        V R ,          R,          4      .\        V R,          4      V R,          V R,          R7      # )idsr   marker_msep_m)r?   r   r@   rA   )dictr   list)specs   &r   
board_metamain.<locals>.board_meta   sN    T%[^,c$u+b/.BC4PTU\P]K^!*-T']D 	Dr   opencv_z_forwardzzero (pinhole)z)calib board GridBoard frame (ids 109-132))r8   umizlive (this run))	native_wh
save_widthK_nativeK_saveintrinsics_reproj_pxintrinsics_sourcezsaved intrinsics/wrist.json)rJ   rK   rL   rM   rO   z%Y-%m-%d %H:%M:%S)r   fpsjaw_servo_idjaw_signcamera_convention
distortionworld_frameboardsr4   r5   startedz	meta.jsonw)indentz
Recording 'z' at z fps -> z+
  'q' in the preview (or Ctrl-C) to stop.
g      ?umi_v2nan06dz.jpgz.npz)	scene_cam_poseumi_posewrist_cam_posescene_visibleumi_visiblewrist_visiblegripper_tickgripper_radti  zREC #z  scene:Ynz  umi:z  grip:gffffff?zwrist  board:qz
  stopped (Ctrl-C).)
num_framesendedz
Saved z frames to )r4   r5   state)
      )r         )r   r   rB   )rl      )r   ro   r   )RargparseArgumentParseradd_argumentr   float
parse_argsjsonloadopenr   FileNotFoundErrorsysexitnextitemsr/   r0   r1   DATASETSr   isdirlistdir	overwritemakedirsremover
   scene_indexwrist_indexr   printcalib_frameslenreadr   r   cvtColorCOLOR_BGR2GRAYr   append
no_previewputTextFONT_HERSHEY_SIMPLEXimshowr   waitKeyr   maxscene_widthcopyr   wrist_widthportr   pingtorquerC   rP   r	   tolisttimestrftimedumpnpeyeIMWRITE_JPEG_QUALITYperf_counterr   linalginvread_posr   imwritesavezr   hstackordsleepKeyboardInterruptupdatereleasedestroyAllWindowsclose)Capagcalr'   jaw_idrR   sdirwdirstdirr2   fscapsidxsfrwcapwidxwfrnatWnatHviewsokr   r=   _rmssrM   natWwnatHwwintrswK_wristswsK_wrist_savebusrF   meta
last_scenelast_umi
last_wristperiodijpgt0okssframeokwwframedets	scene_visTcb_cam
scene_poseumi_visTumi_camr^   	wrist_viswdTcb_wcam
wrist_posetickradnamedsdwdispdtr3   sC                                                                     @r   mainr   3   s
   		 	 	"BOOFOOO#qO9OOO#qO9OOG%O5OOO#sO;OOO#sO;OO$3O;OOM,O7OON<O8OOHdO+
ANyyj345  9 9:>@C
{BCF 77<<!&&)DT8STD	ww}}Trzz$//9QVVH$LMN% 
A%AAIIbggll1()  ! !!--8OD !--8OD|s{89|,-1syy|$D	N4&D64&0A$
HI 
  00j
klE
e*q~~
%IIK	EU]#,,uc.@.@AK=Qa<LL7$|||KK!23u:,a?OPRZ00#}aIJJ'5#)>?KKNutTlC#dD/<QRIAq#	d#AVVXFvayA~yvayA~y	Jqvcl%vQtfIc#Yb
IJ 99Q<15EG$EU5>***//#WQZ2%5ZwqzR7GzmmeEl*||~|A#'=|ARU?U-gcl3-?uUG1UGTU!%%,pq #aff+SUC88F>&)9:;JJvuD QVVV"4AQG*["9z&?QRdD\amm$%HHJv}}05c
N_a eU^9@9LW^^%5RV<H<T<#6#6#8Z^OVOb.Khlo &9:<D 	IIdDdK8#>qI	M!&&quugXdV;h
ijJvvayHJ155[F	A##R
(CE/""$B))+KC))+KC&. fc6H6H!IKY_K`aD4I':g::
YY]]73
#J$&G(<$x.<!<!%0H Iv)g.A"3<<8J8J#Kk][b=","Cbk"C7"CKHa!#x!8J $I#J<<'D262B,tX.eCWDKKTdV4=99VQ]];[]`av)BGGLL$t}=yQRQ^Q^?_adeHHRWW\\%D67$.R\#,'QZ*.*:$PSW[W`W`Wbd FA<<<vs+B%s()32MV[bTWhkSl%dV!-.68P8PRUWbdeg6-"63/BKKm9C#3N$OQY # 8 8#{AO99b"X.DD

+T2;;q>D(CH4""$r)BF{

6B;' 	q6I(JK		$RWW\\$<cB1M		;tf-.C  NLMNr  '%&' 	q6I(JK		$RWW\\$<cB1M		;tf-.sw   (t$ Au u u) Bu $,u G	u 5u Cu u)  u  u $!u	u	u&"u) %u&&u) )C x)__main__)%__doc__rq   rv   r/   rz   r   numpyr   r   r0   insertdirnameabspath__file__feetech_busr   r   configsr   calib_utilsr   r   r   calib_boardr   aruco_boardsr	   camerasr
   r   HEREr1   r~   r   r   r   __name__ r   r   <module>r      s   (   	 
   
 277??277??277??83L#MN O )  A A #  /	wwrwwx0177<<j))
Sr/j zF r   