
    _zi                     &   S r SSKrSSKrSSKJr  SSKrSSKJs  Jr	  SSK
r
SSKrSSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  \R2                  R5                  S\R2                  R7                  \R2                  R9                  \5      S5      5        \R2                  R5                  S\R2                  R9                  \5      5        SSKJrJ r   SSK!J"r"J#r#J$r$J%r%J&r&  SSK'J(r(  SS	K)J*r*  SS
K+J,r,J-r-J.r.J/r/J0r0  SSK1J2r2   SSK3J4r5  Sr7Sr8\Rr                  " / SQ/ SQ/ SQ/ SQ/ SQ/5      S-  r:Sr;\:\;   r<\Rr                  " / SQ5      r=\Rr                  " / SQ5      r>S r?S r@SS jrA\74S jrBS rC\DS:X  a  \C" 5         gg! \6 a    Sr5 Nf = f)zYLive test trajectory predictions with 3D lifting and IK visualization from camera stream.    N)Path)Rotationz..)N_WINDOWproject_3d_to_2d)TrajectoryHeatmapPredictor
MIN_HEIGHT
MAX_HEIGHTMIN_GRIPPERMAX_GRIPPER)SO100AdhesiveConfig)EXOSKELETON_CONFIGS)get_link_poses_from_robotposition_exoskeleton_meshesrender_from_camera_posedetect_and_set_link_posesestimate_robot_state)Arm)	make_gridi  z1real_dino_tracks/checkpoints/real_tracks/best.pth)     *@{GVg/@)g
ףp=%@gfffffXr   )r   r   g/)g(\1@g=
ףpTr   )g\(6@g=
ףpQr        @@   )g2(g݃c؁gkԅPɒ?)g8:!𗑿gMkg(!u?gB6?c                 t   [         R                  R                  U5      SS2S4   n[         R                  R                  U5      n[         R                  " U S   U S   S/5      nXE-  n[         R                  R                  U5      SS2SS24   nXv-  nU[         R                  R	                  U5      -  nX84$ )aB  Unproject 2D point to camera ray in world coordinates.

Args:
    point_2d: (2,) 2D pixel coordinates
    camera_pose: (4, 4) camera pose matrix (world-to-camera)
    cam_K: (3, 3) camera intrinsics

Returns:
    cam_pos: (3,) camera position in world frame
    ray_direction: (3,) normalized ray direction in world frame
Nr   r            ?)nplinalginvarraynorm)	point_2dcamera_posecam_Kcam_pos_worldK_inv
point_2d_hray_camcam_rot_world	ray_worlds	            .real_dino_tracks/vistest_live_test_model_ik.pyunproject_2d_to_rayr+   6   s     IIMM+.rr1u5M IIMM% E8A;S9:J G IIMM+.rr2A2v6M'IBIINN955I##    c                 ~    [        XU5      u  pE[        US   5      S:  a  gXS   -
  US   -  nUS:  a  gXFU-  -   nU$ )a!  Recover 3D keypoint from 2D projection and height.

Args:
    kp_2d_image: (2,) 2D pixel coordinates
    height: height (z-coordinate in world frame)
    camera_pose: (4, 4) camera pose matrix
    cam_K: (3, 3) camera intrinsics

Returns:
    (3,) 3D keypoint position, or None if invalid
   gư>Nr   )r+   abs)kp_2d_imageheightr"   r#   cam_posray_directiontpoint_3ds           r*   *recover_3d_from_direct_keypoint_and_heightr6   R   s`     15QG =t# 
!*	a 00A1u ]**HOr,   c                 f   SnSn[        U5       GH   n[        R                  " X5        UR                  UR                  5        [
        R                  " SSSSS9n	U	R                  [
        R                  " [        R                  " XC/5      S95        [
        R                  " U SS	9n
U
R                  UR                  5        [
        R                  " X)U
/US
[
        R                  " U S9/S9nUR                  X5        UR                  UR                  SS& [        R                  " X5        GM#     [        R                   " U [        R"                  R$                  S5      nUR&                  U   nX=-
  n[        R(                  R+                  U5      nUR                  R-                  5       U4$ )zRun IK to move virtual gripper keypoint to maintain offset from cube.
Returns:
    optimized_qpos: (nq,) array of optimized joint positions
    final_error: scalar error in meters
{Gz?r   virtual_gripper_keypointbodygMbP?)position_costorientation_cost)wxyz_xyzg-C6?)costdaqp)model)limitsN)rangemujoco
mj_forwardupdateqposmink	FrameTask
set_targetSE3r   concatenatePostureTasksolve_ikConfigurationLimitintegrate_inplaceq
mj_name2idmjtObj
mjOBJ_BODYxposr   r    copy)r@   dataconfiguration
target_postarget_kp_quat_wxyznum_iterationsdtdamping	iterationkp_taskposture_taskvel
kp_body_idcurrent_kp_pos	pos_error
error_norms                   r*   ik_to_cube_graspre   q   s[    
BG >*	%&TYY' ..!;VSVino488R^^=P<]-^_` ''D9		* mmM\+BBX\XoXov{X|W}~''0$		! 	%&' +, ""5&--*B*BD^_JYYz*N+I	*J99>>Z''r,   c                 0   U R                  5       S:  a"  U R                  [        R                  5      S-  n U R                  SS u  p#X!:w  d  X1:w  a%  [
        R                  " XU4[
        R                  S9n [        R                  " U 5      R                  SSS5      R                  5       n[        R                  " / SQ5      R                  S	SS5      n[        R                  " / S
Q5      R                  S	SS5      nXE-
  U-  nU R                  5       nXG4$ )zPreprocess RGB image for model input.

Args:
    rgb: (H, W, 3) RGB image in [0, 255] or [0, 1]
    image_size: Target image size

Returns:
    rgb_tensor: (3, H, W) normalized tensor
    rgb_vis: (H, W, 3) visualization image in [0, 1]
r        o@Nr.   interpolationr   r   )g
ףp=
?gv/?gCl?r   )gZd;O?gy&1?g?)maxastyper   float32shapecv2resizeINTER_LINEARtorch
from_numpypermutefloattensorviewrU   )rgb
image_sizeH_origW_orig
rgb_tensormeanstdrgb_viss           r*   preprocess_imager      s     wwy3jj$u,YYr]NF v3jj:6cFVFVW !!#&..q!Q7==?J<<-.33Aq!<D
,,,
-
2
21a
;C#s*J hhjGr,   c                  j/   [         R                  " SS9n U R                  SSSS9  U R                  S[        [        SS	9  U R                  S
[
        SSS	9  U R                  S[
        SSS	9  U R                  SSSS9  U R                  S[        S[        [        R                  " 5       5      SS9  U R                  SSSS9  U R                  SSSS9  U R                  5       n[        R                  " [        R                  R                  R                  5       (       a  SO&[        R                  R                  5       (       a  SOS5      n[!        SU 35        [!        SUR"                   S35        [%        [&        [(        S S!9n[        R*                  " UR"                  US"9nUR-                  US#   5        UR/                  U5      nUR1                  5         SS KnS$U;   aU  S%U;   aO  US$   Ul        US%   Ul        [!        S&US$   S' S(US%   S' S)35        [!        S*US$   S+-  S, S-US%   S+-  S, S.35        Ob[!        S/5        [!        S0UR4                  S' S1UR6                  S' 35        UR4                  UR6                  :X  a  [!        S25        [!        S35        S4U;   a@  S5U;   a:  US4   Ul        US5   Ul        [!        S6US4   S' S(US5   S' S735        [!        S85        O2[!        S95        [!        S:UR8                  S' S;UR:                  S' 35        [!        S<US=    35        S nS>nS?n[<        R>                  RA                  U5      (       aF  URB                  (       d5  [E        [F        R*                  " [I        US@5      5      5      n[!        SA5        O[!        SBU SC35        S n[J        RL                  " / SDQ5      n	URO                  5       n
URQ                  U	S SE9   URO                  5       n[J        RR                  " [J        RT                  " X-
  5      5      SF:  a  OUn
ME  [!        SG5        [W        5       n[X        RZ                  R]                  UR^                  5      n[X        R`                  " U5      n[b        Rd                  " URf                  5      nURi                  5       (       d  [k        SHURf                   35      eURm                  5       u  nnU(       d  URm                  5       u  nnU(       d  M  [b        Rn                  " U[b        Rp                  5      nURr                  S SI u  nn[!        SJU SKU 35        S n[!        SL5        [!        SM5        [!        SN5        S [t        l;        S>n  [x        Rx                  " 5       nURm                  5       u  nnU(       d  [!        SO5        M=  [b        Rn                  " U[b        Rp                  5      nS nU(       aU  URB                  (       dD  URO                  5       nU=URz                  S S & UR|                  S S & [X        R~                  " X5         [        UXUUSP9u  nnnnnn[        XUU5        U(       dJ  [        XUUSQSR9nUR                  =URz                  S S & UR|                  S S & [X        R~                  " X5         Ub  Uc  [!        SX5        GMG  [        UR                  5       [&        5      u  n"n#[        XU5      SY   n$U$S SZ2S SZ24   n%U$S SZ2SZ4   n&U%[        -  U&-   n'[        U'UU5      n(U(c  [!        S[5        GM  [&        U-  n)[&        U-  n*U([J        RL                  " U)U*/5      -  n+U'SI   n,URO                  5       n[        US\   5      n-SS]KQJRn.  U." U-5      n/[        R                  " 5          U"R                  S5      R/                  U5      n0[        R                  " U+5      R                  5       R/                  U5      n1[        R                  " U,[        R                  S^9R/                  U5      n2[        R                  " U/[        R                  S^9R/                  U5      n3U" U0S S U1U2U3S_9u  n4n5n6S S S 5        / n7/ n8[        [(        5       H  n9W4SU94   n:[        R                  " U:R                  S\5      SS`9R                  U:5      R                  5       R                  5       n;U8R                  U;5        [J        R                  " U;R                  5       U;Rr                  5      u  n<n=[J        RL                  " U=U</[J        R                  S^9n>U7R                  U>5        M     [J        RL                  " U75      n7[J        RL                  " U85      n8W5S   R                  5       R                  5       n5W6S   R                  5       R                  5       n6UR                  5       n?U?S==   U-  ss'   U?ST==   U-  ss'   U?R                  5       n@U@S==   [&        -  ss'   U@ST==   [&        -  ss'   [        [t        Sa5      (       d  [!        Sb5        [!        ScU SKU SdUSe   S, SfUSg   S, ShUSi   S, SjUSk   S, 35        [!        SlU?Se   Sm SfU?Sg   Sm ShU?Si   Sm SjU?Sk   Sm 35        [!        Sn[&         SK[&         SdW@Se   S, SfU@Sg   S, ShU@Si   S, SjU@Sk   S, 35        S>[t        lc        / nA[        [(        5       H  n9U7U9   n>U5U9   nB[        U>UBUW@5      nCUCc  [!        SoU9 Sp35        M/  SqSW/SqSr/SrSs/St.nDUDSK   S   WCS   s=::  a  WDSK   ST   ::  a@  O  O=WDSu   S   WCST   s=::  a  WDSu   ST   ::  a!  O  OWDSv   S   WCSI   s=::  a  WDSv   ST   ::  dF  O  [!        SwU9 SxWC 35        [        WA5      S:  a"  WAS\   R                  5       nC[!        SyUC 35        OM  WAR                  WC5        M     [        WA5      S:X  a  [!        Sz5        GM|  [J        RL                  " WA5      nA[!        S{[        UA5       S|35        U(       a~  URB                  (       dm  URO                  5       nEUES [        UR|                  5       URz                  S [        UR|                  5      & UES [        UR|                  5       UR|                  S S & [X        R~                  " X5        [        R                  " U5      nUR                  URz                  5        / nF/ nGURz                  R                  5       nH[        [        WA5      5       GH3  n9WAU9   nCWHS S  URz                  S S & UHS [        UR|                  5       UR|                  S S & [X        R~                  " X5        UR                  URz                  5        [        UUUUC[        UR                  S}9u  nInJS~nKUJUK:  Ga/  [!        SU9 SWJS+-  S, S35        [        WF5      S:  a  WFS\   R                  5       nIUIS S  URz                  S S & [X        R~                  " X5        [X        R                  " U[X        R                  R                  S5      nLUR                  UL   nM[J        R                  R                  WCUM-
  5      nJOmWHR                  5       nI[J        R                  R                  WCUR                  [X        R                  " U[X        R                  R                  S5         -
  5      nJWFR                  WIR                  5       5        WGR                  WJ5        UIR                  5       nH[!        SU9 SWCS   Sm S(UCST   Sm S(UCSI   Sm SUJS+-  S, S35        GM6     [J        RL                  " WF5      nF[J        RL                  " WG5      nG[!        SUGR                  5       S+-  S, S35        UR                  (       Gd  [b        R                  " U#UU4[b        R                  SV9n!U#R                  5       nNUR                  (       d  WFS\   S S URz                  S S& [X        R~                  " X5        USI-  USI-  /nOU?R                  5       nPUPS==   UOST   -  ss'   UPST==   UOS   -  ss'   [        UUUUPUOS   UOST   S SU9S-  nQ[b        R                  " UQUU4[b        R                  SV9nQU!SW-  UQSW-  -   nROU!nRS nS[        Gb  [        R                  " U85      R                  5       R                  ST5      nT[        [        R                  " [        R                  " UTRr                  S   5      5      5      nU[        UTUUSIS>S>S9nVUVR                  5       R                  5       R                  5       nWUWRr                  S   ST:X  a  [J        R                  " WWSZSS9nW[J        R                  " WWS5      nW[b        R                  " UWUU4[b        R                  SV9nSOU8RS                  SS9nTUTUTR                  5       -
  UTRS                  5       UTR                  5       -
  S-   -  nT[J        R                  " UTS   SZSIS9nX[b        R                  " UXUU4[b        R                  SV9nS[        [t        S5      (       a  [t        R                  Gc  [        R                  " 5         [        R                  " SISISS>S9u  nYnZUZSe   n[UZS   n\UZS   n]UZSg   n^U[R                  WN5      n_U[GR                  / / SSSISS9u  n`[        GR                  GR                  [J        GR                  " SST[(        5      5      naU[GR	                  / / SSKSIS9nbU[GR                  S5        U[GR                  S5        U\R                  WS5      ncU\GR                  S5        U\GR                  S5        [J        GR                  " [(        5      ndU]GR                  UdU5S-  SSSISS9u  neU]GR                  [4        S-  SSSTSS9  U]GR                  [6        S-  SSSTSS9  U]GR                  S5        U]GR                  SSS9  U]GR                  SuSS9  U]GR                  SsS9  U]GR                  5       nfUfGR                  UdU6SSSISS9u  ngUfGR                  [8        SSSTSS9  UfGR                  [:        SSSTSS9  UfGR                  SSS9  UfGR                  SuSS9  U]GR                  S5        U^R                  WR5      nhU^GR                  S5      niU^GR                  S5        UYU[U_U`UbUaU\UcU]UeUfUgU^UhUiS.[t        l}        OG[t        R                  njUjS   nYUjS   n[UjS   n_UjS   n`UjS   nbUjS   naUjS   ncUjS   neUjS   ngUjS   nhUjS   niW_GR                  WN5        W`GR                  U7S S 2S4   U7S S 2ST4   5        WbGR                  U7S S 2S SI24   5        UbGR!                  Wa5        WcGR                  WS5        WeGR#                  U5S-  5        WgGR#                  U65        WhGR                  WR5        WiGR%                  SWGS\   S+-  S S.35        WYGR&                  GR)                  5         UYGR&                  GR+                  5         [!        U65        [x        Rx                  " 5       U-
  nk[S        SSUk-
  5      nlUlS:  a  [x        GR,                  " Wl5        [!        URO                  5       5        U(       d   S nGM\  ! [         a  n[!        SSU 35        S n S nAGM~  S nAff = f! , (       d  f       GN= f! G[4         a    [!        S5         Of = fUGR7                  5         UR                  (       d  [        GR8                  " S5        [!        S5        g ! UGR7                  5         UR                  (       d  [        GR8                  " S5        [!        S5        f = f)Nz;Live test trajectory predictions with IK from camera stream)descriptionz--ask_for_write
store_truez$Ask for user input to write to robot)actionhelpz--checkpointzPath to model checkpoint)typedefaultr   z--camerar   zCamera device ID (default: 0)z--num_ik_iters2   zNumber of IK iterationsz--no_armz,No arm connected, use image-based estimationz--exoso100_adhesivez Exoskeleton configuration to use)r   r   choicesr   z--dont_visualizezXSkip all visualizations (MuJoCo rendering and matplotlib plotting) to speed up inferencez--no_renderzYSkip MuJoCo rendering but keep matplotlib visualizations (faster than full visualization)mpscudacpuzUsing device: z
Loading model from z...F)target_sizen_windowfreeze_backbone)map_locationmodel_state_dict
min_height
max_heightu*   ✓ Loaded height range from checkpoint: [z.6fz, z] mz  (i  z.2fzmm to zmm)u2   ⚠ Checkpoint doesn't have min_height/max_height!z%  Using hardcoded values: MIN_HEIGHT=z, MAX_HEIGHT=uQ     ⚠ WARNING: MIN_HEIGHT == MAX_HEIGHT! All height predictions will be constant!zR  Please recompute from dataset or use a newer checkpoint with height range saved.min_grippermax_gripperu+   ✓ Loaded gripper range from checkpoint: []zS  (Regression: [-0.2, 0.8], values >4.0 mapped to -0.2, values >0.8 clamped to 0.8)u4   ⚠ Checkpoint doesn't have min_gripper/max_gripper!z/  Using default regression values: MIN_GRIPPER=z, MAX_GRIPPER=u   ✓ Loaded model from epoch epochTz-robot_models/arm_offsets/rescrew2_fromimg.pklrbu5   ✓ Connected to robot for direct joint state readingu%   ⚠️ Calibration file not found at z(, falling back to image-based estimation)gm?g1>[@gb]f?gX ;O?g2BO?g`ܙKE?)slowr8   zdone moving to high positionzFailed to open camera device r.   zCamera resolution: xz=
============================================================z*Live inference started. Press 'q' to quit.z<============================================================z Failed to read frame from camera)r#   #   )ik_iterationszError detecting link poses: r   )segmentationrh   g      ?uA   ⚠️ Could not detect camera pose or intrinsics, skipping framefixed_gripperr   u6   ⚠️ Starting keypoint behind camera, skipping frame)process_gripper_value)dtype)gt_target_heatmaptrainingstart_keypoint_2dcurrent_heightcurrent_gripper)dimprinted_intrinsicsz
Debug - Intrinsics scaling:z  Original cam_K (at z): fx=)r   r   z, fy=)r   r   z, cx=)r   r.   z, cy=)r   r.   z  Normalized cam_K_norm: fx=z.4fz  Scaled cam_K_model (at u   ✗ Failed to lift waypoint z to 3Dg      g        g333333?)r   yzr   r   u   ⚠️ Waypoint z 3D target out of workspace: z  Using previous waypoint: u9   ⚠️ Could not lift any waypoints to 3D, skipping frameu!   ✓ Predicted 3D trajectory with z
 waypoints)rZ   g?u     ⚠️ t=z: IK error too large (z& mm), using previous timestep's resultr9   z  t=z: 3D=[z] m, IK err=z mmu(   ✓ Sequential IK complete - Avg error:    rg   )nrowpadding	normalize
scale_each)axis)r   r.   r   g:0yE>).N	vis_state)   
   )figsizeconstrained_layout)r   r   )r   r   -limeg333333?)color	linewidthalpha(   )smarker
linewidthsz'2D predicted trajectory (all timesteps)offz#Heatmaps (make_grid) resized to RGBr   zo-blue   )r   r   
markersizegrayz--g?)r   r   	linestyler   r   TimestepzHeight (mm))r   )r   
labelcolor)r   zs-redgffffff?greenGripperzHeight + Gripper trajectoryzFinal MuJoCo render overlay)figax_trajim_traj	traj_linescatcolorsax_hmim_hmax_linesheight_lineax_ggripper_line	ax_render	im_rendertitle_renderr   r   r   r   r   r   r   r   r   r   r   z$Final MuJoCo render overlay (IK err z.1fg?z#
Live inference interrupted by userallu   
✓ Live inference complete!)argparseArgumentParseradd_argumentstrCHECKPOINT_PATHintlistr   keys
parse_argsrq   devicebackendsr   is_availabler   print
checkpointr   
IMAGE_SIZEr   loadload_state_dicttoevalr@   r   r	   r
   r   ospathexistsno_armr   pickleopenr   r   get_pos	write_posrj   r/   r   rC   MjModelfrom_xml_stringxmlMjDatarn   VideoCapturecameraisOpenedRuntimeErrorreadcvtColorCOLOR_BGR2RGBrm   mainprev_figtimerF   ctrlrD   r   r   r   rP   	Exceptionr   ro   rp   rU   pltimshowshowr   r   kp_localr   rt   rV   r   no_grad	unsqueezerr   ru   rl   rB   Fsoftmaxrv   view_asr   numpyappendunravel_indexargmaxhasattrr   r6   lenrG   ConfigurationrE   re   initial_kp_quat_wxyznum_ik_itersrQ   rR   rS   rT   r   r    r|   dont_visualize	no_rendertv_make_gridmathceilsqrtdetachrepeat	transposeminr   ionsubplotsplotcmviridislinspacescatter	set_titler   arangeaxhline
set_xlabel
set_ylabeltick_paramsgridtwinxset_dataset_offsets	set_color	set_ydataset_textcanvas	draw_idleflush_eventssleepask_for_writeinput	enumerateKeyboardInterruptreleaseclose)qparserargsr   r@   r   model_modulearmuse_robot_state
calib_path	start_poslast_poscurr_posrobot_configmj_modelmj_datacapretframerw   r1   widthr#   first_writeframe_start_timecamera_pose_worldjoint_state
link_posescorners_cachecorners_visobj_img_ptsrW   erendered_img_gtr~   r{   rgb_vis_resizedfixed_gripper_posegripper_rotgripper_poskp_3d_startkp_2d_startscale_xscale_yr   r   current_gripper_rawr   r   	rgb_batchstart_keypoint_tensorcurrent_height_tensorcurrent_gripper_tensorpred_logitspred_heightpred_gripperpred_trajectory_2dpred_heatmapsr4   pred_logits_tpred_probs_tpred_ypred_x	pred_2d_t
cam_K_normcam_K_modelpred_trajectory_3dpred_height_t	pred_3d_tworkspace_boundscurrent_joint_stateik_trajectory_qpos	ik_errorscurrent_qposoptimized_qposik_errormax_ik_errorra   rb   rgb_vis_model
render_resrender_cam_Krendered_img_finaloverlay_finalheatmap_grid_vishmr   r.  grid_nphm3r   axsr   r   r   r   r   r   r   r   r   tsr   r   r   r   r   stelapsed
sleep_timetraj_itarg_pos	pred_gripdeltasq                                                                                                                    r*   r   r      sJ   $$1noF
),B  D
S/6  8

a;  =
(sB5  7

<J  L
c3C#$7$<$<$>?>  @ *<v  x
lw  yD \\5>>#5#5#B#B#D#D%#(::#:#:#<#<%IF	N6(
#$ 
!$//!2#
67&:bghEDOO&AJ	*%789HHVE	JJL z!lj&@",\":",\":::l;STW:XXZ[efr[stwZxx{|}J|,T1#6fZ=UVZ=Z[^<__bcd 	BD5l6M6Mc5RR_`l`w`wx{_|}~""l&=&==egfh
"}
'B#-m#< #-m#< ;J}<UVY;ZZ\]ghu]vwz\{{|}~ceDF?@X@XY\?]]klx  mE  mE  FI  lJ  K  	L	(G)<(=
>? CO@J	ww~~j!!$++&++d:t456EF5j\Aijkhh_`I[[]HMM)M'
66"&&*+,T15  

() '(L~~--l.>.>?HmmH%G 

4;;
'C<<>>:4;;-HII JCXXZ
U c
,,uc//
0CIIbqMMFE	wax
01E	-	
67	&M DMKk0#yy{ JC89,,uc&7&78C !%t{{!kkm4??Q',,q/!!(4
`yLa]
-um[R] ,LGZX&$8LZdtv$wM8EGGLLOgll1o%%h8  !(EMYZ +;388:z*R'J ";<SZ![\k!l,RaR!V4K,RaRU3K%0;>K +;8I5QK"NO !5(G 6)G +bhh7I.J J )^N ++-K"'B"8 334GHO &00366v>	(-(8(89J(K(Q(Q(S(V(VW](^%(-^5==(Y(\(\]c(d%).oU]])[)^)^_e)f&9>&*"&;#8$::6[, ! "$M8_ +AqD 1 yy););B)?QGOOP]^bbdjjl$$\2!#!1!1,2E2E2GI[I[!\HHff%5RZZH	")))4 % "$*<!=HH]3M%a.,,.446K'?..0668L JqMU"MqMV#M %//+KNj(NNj(N 4!56657-eWAfXVE#JsCSSXY^_bYcdgXhhmnstwnxy|m}  ~C  DI  JM  DN  OR  CS  T  U4Z_S4IzZ]_bNcchistwixy|h}  ~C  DN  OR  DS  TW  CX  Y  Z1*Qzl&Q\]`QabePffklwx{l|  ~A  lB  BG  HS  TW  HX  Y\  G]  ]b  cn  or  cs  tw  bx  y  z*.' "$8_.q1	 +AF}.?	 $86BC
 s$  )-a0IaL\DTUXDYZ[D\\(-a0IaL\DTUXDYZ[D\\(-a0IaL\DTUXDYZ[D\\,QC/LYKXY-.2$6r$:$?$?$A	 ;I;GH ")))4= %@ %&!+QR!#*<!=5c:L6M5NjYZ t{{&)kkm#3FGYGLLHY3Z/c',,/0"56Hs7<<7H"IQ h0 !..x8M  . "$I"<<,,.L3123.q1	 #/q/Q"./AGLL0A"BQ!!(4$$W\\2 ,<!(#'#4#4,(  #l*Ks*@$s@SSyz{-.2);B)?)D)D)F*8*;Q))(<%+%6%6xAYAY[u%v
)0j)A#%99>>)n2L#M *6):):)<#%99>>)gll6K\K\]egmgtgtgg  B\  L]  ?^  3^  $_")).*=*=*?@  *  .224QCvil3%7r)A,s9K2iXYl[^M__kltuylyz}k~  B  C  DU 4X "$*<!=+I<Y^^=Md=RSV<WWZ[\ &&&**_ufoUXUeUef / 4 4 6 ~~'9"'=bq'AGLL!$%%h8"(A+uz!:J#-??#4L Oz!}4O Oz!}4O)@ )$"1"1%** *& *-4FPVgjgwgw)x&$+cM4F4L$LM$+M $( +))-8>>@JJ1MBtyy288A;)?@AD'qD]abD"kkm//1779G}}Q'1,"$))GQQ"? ll7I>G'*zz'E6?Z]ZjZj'k$ '***2Brvvx-BFFHrvvx,?$,FGB))ByM11=C'*zz#vVYVfVf'g$ t[11dnn6LGGI"||Aq(W[\HC!$iGIE"4yH #D	I &nn];G!(b"cST\_!`JI VV^^BKK1h,GHF"??2rRPQ?RD%%&OPLL' "LL)9:EOO$IJJJu% 8,B#+==[65I4W]ijwx=#yLK$$zF':&TXdemp$q$$zF':&TXdemp$q''
3''V'D((cf(EMMM,#>>+D$(IIb,E]^klI$mMLLL;etWX`dLeLL;gYZbfLgOOIUO;$$#%$@&&'DE !* 0 0 ?I#,#6#67T#ULNN5)  ##*#*%. $"(!&!&$,'2 $(4%.%.(4&DN$ BU)C mG mG ";If:D\FwKE"$]"3K#%n#5L ";I#%n#5L   /""#5ad#;=OPQSTPT=UV  !3ArrE!:;v& /0 %%kF&:;&&|4 ""=1%%(LYWY][_M_`cLddg&hi 

$$&

'') , iik$44GQg.JA~

:&#++- 1" K} >  4QC89$(!b !f
  6456 	""IIe./ 	""IIe./s   3C A\ 4A1A[ %C6A\ CA[9"y.A\ [
A[6[A[1[*A\ [1A[6[6A\ [9
A\\A\ \A\$\!A], \#A\$\$A], ],AA^2__main__)r   )E__doc__sysr   pathlibr   rq   torch.nn.functionalnn
functionalr  rn   r  r   matplotlib.pyplotpyplotr  r  r   rC   rG   r   r  scipy.spatial.transformr   Rr   insertjoindirname__file__rV   r   r   r@   r   r   r	   r
   r   ExoConfigs.so100_adhesiver   
ExoConfigsr   	exo_utilsr   r   r   r   r   robot_models.so100_controllerr   torchvision.utilsr   r  r  r   r   r   KEYPOINTS_LOCAL_M_ALLKP_INDEXr  cube_to_gripper_offsetr  r+   r6   re   r   r   __name__ r,   r*   <module>r     se   _ 
 	     
         1 277<< 94@ A 277??8, - + ^ ^ 9 *  .;
 
E "79JLb#57I"K LNTU  * "HI xx RS $8>&(R &0 BT0n zF ]  Ls   F FF