
    qi                         U d Z ddlmZ ddlZddlZddlmZ dZdddd	Z	e
eef         ed
<   dej        dej        dej        fdZdej        dej        fdZ G d de          Zd Zedk    r e             dS dS )uN  OpenPI Pi0.5 bridge for YAM robot deployment.

Implements the ``ModelBridge`` interface from raiden. Connects to a running
OpenPI policy server (``serve_policy.py``) via websocket and translates
between raiden observations and the OpenPI observation format.

The OpenPI server handles all model inference, normalization, and
delta→absolute action conversion. This bridge is purely an observation
reformatter and action reorderer.

Usage (server + bridge)::

    # Terminal 1: start the OpenPI policy server
    python scripts/serve_policy.py \
        --policy.config pi05_yam \
        --policy.dir /path/to/checkpoint \
        --port 8000

    # Terminal 2: run raiden inference
    rd infer \
        --bridge deployment.openpi_bridge:OpenPiBridge \
        --ckpt_path unused \
        --action_hz 50.0 \
        --host localhost --port 8000 \
        --action_horizon 10 \
        --prompt "pick up the lock and put it into the box"

OpenPI 14D layout: [left_joint(6), left_grip(1), right_joint(6), right_grip(1)]
Raiden 14D layout: [right_joint(6), right_grip(1), left_joint(6), left_grip(1)]
    )OptionalN)ModelBridge   zobservation/image_headzobservation/image_left_wristzobservation/image_right_wrist)head
left_wristright_wrist_CAM_MAPr_joint_posl_joint_posreturnc                     t          j        |dd         |dd         | dd         | dd         g                              t           j                  S )zConvert raiden proprio (7,) pairs to OpenPI 14D state.

    Raiden: r_joint_pos = [r_joints(6), r_grip(1)]
            l_joint_pos = [l_joints(6), l_grip(1)]
    OpenPI: [l_joints(6), l_grip(1), r_joints(6), r_grip(1)]
    N      npconcatenateastypefloat32)r
   r   s     5/home/robot-lab/Pi0.5_yam/deployment/openpi_bridge.py_raiden_to_openpi_stater   1   s\     >BQBAaCBQBAaC	  
 vbj    
action_14dc                     t          j        | dd         | dd         g                              t           j                  S )zConvert OpenPI 14D action to raiden 14D motor command.

    OpenPI: [l_joints(6), l_grip(1), r_joints(6), r_grip(1)]
    Raiden: [r_joints(6), r_grip(1), l_joints(6), l_grip(1)]
    r      r   r   )r   s    r   _openpi_action_to_raidenr   C   sE     >1R41Q3   vbjr   c                   Z    e Zd ZdZddefdZdeddfdZdd	Zde	j
        fd
ZdefdZdS )OpenPiBridgezModelBridge implementation for OpenPI Pi0.5 on YAM.

    Connects to a running OpenPI websocket server and translates between
    raiden observations and OpenPI's expected input format.
    
   action_horizonc                 Z    d | _         || _        d| _        d| _        d| _        d| _        d S )N r           )_broker_action_horizon_prompt_step_n_infer_t_infer_sum)selfr   s     r   __init__zOpenPiBridge.__init__V   s4    -
r   	ckpt_pathr   Nc                    ddl m} ddl m} |                    dd          }t	          |                    dd                    }t	          |                    d| j                            }|                    d	d
          | _        t          d| d|            |                    ||          }|	                                }	t          d|	            |
                    ||          | _        t          d| d           dS )a  Connect to the OpenPI policy server.

        The ckpt_path is unused (the server loads the model). Connection
        parameters are passed via kwargs.

        Keyword args:
            host: Server host (default: "localhost").
            port: Server port (default: 8000).
            action_horizon: Number of actions to execute per inference call.
            prompt: Language instruction for the task.
        r   )action_chunk_broker)websocket_client_policyhost	localhostport@  r   promptr!   z([openpi_bridge] Connecting to server at :)r/   r1   z![openpi_bridge] Server metadata: )policyr   z&[openpi_bridge] Ready (action_horizon=)N)openpi_clientr-   r.   getintr$   r%   printWebsocketClientPolicyget_server_metadataActionChunkBrokerr#   )
r)   r+   kwargsr-   _wsr/   r1   r   	ws_policymetadatas
             r   loadzOpenPiBridge.load^   s-    	655555@@@@@@zz&+..6::fd++,,VZZ(8$:NOOPPzz(B//FFFFFGGG--4d-CC	0022<(<<===*<<) = 
 
 	H~HHHIIIIIr   c                 p    | j         | j                                          d| _        d| _        d| _        dS )zReset action chunk buffer.Nr   r"   )r#   resetr&   r'   r(   )r)   s    r   rD   zOpenPiBridge.reset~   s:    <#L   
r   c           	         ddl }|                                }|                     |          }| j                            |          }|                                |z
  dz  }| xj        |z  c_        | xj        dz  c_        | j        dz  dk    r.t          d| j        dd|d	d
| j        | j        z  d	d           |d         }t          |          S )u   Convert raiden observation → OpenPI input → inference → 14D action.

        Returns (14,) float32 motor command in raiden order:
        [r_joints(6), r_grip(1), l_joints(6), l_grip(1)]
        r   Ng     @@   2   z[openpi_bridge] step=4dz  infer=z.1fzms  avg=msactions)	timeperf_counter_preprocessr#   inferr(   r&   r:   r   )r)   obsrK   t0obs_dictresultinfer_msrJ   s           r   predictzOpenPiBridge.predict   s    	  ##C((##H--%%''",3X%

a

:?a>
9 > >!+> >(4:5=> > >   #'000r   c                 "   i }|j         D ]n}t                              |j                  }|$t	          j        |j        t          j                  }t	          j        |t          t          f          }|||<   o|j
                            dt          j        dt          j                            }|j
                            dt          j        dt          j                            }t          ||          |d<   | j        r
| j        |d<   |S )z6Convert raiden Observation to OpenPI observation dict.Nfollower_r_joint_posr   )dtypefollower_l_joint_poszobservation/stater3   )camerasr	   r8   namecv2cvtColorimageCOLOR_BGR2RGBresizeMODEL_IMG_SIZEpropriosr   zerosr   r   r%   )r)   rO   rQ   camobs_keyrgbr_posl_poss           r   rM   zOpenPiBridge._preprocess   s    ; 	$ 	$Cll38,,G,sy#*;<<C*S>>"BCCC #HW   "BHQbj$A$A$A
 
   "BHQbj$A$A$A
 
 )@u(M(M$% < 	.!%HXr   )r   )r   N)__name__
__module____qualname____doc__r9   r*   strrB   rD   r   ndarrayrT   dictrM    r   r   r   r   O   s            s        Jc J J J J J@       1bj 1 1 1 14$      r   r   c            
      T   dd l } |                     d          }|                    ddd           |                    dd	d
           |                    dt          dd           |                    dt          dd           |                    dt          d           |                    ddd           |                    dd           |                    dd           |                    ddddg            |                    d!d"           |                                }dd#lm} t          |j	        $          } |||j
        |j        |j        |j        |j	        |j        d%|j        |j        |j        |j        &          }|                                 d S )'Nr   z'Deploy OpenPI Pi0.5 policy on YAM robot)descriptionz--ckpt_pathunusedzUnused (server loads model))defaulthelpz--hostr0   zOpenPI server hostz--portr2   zOpenPI server port)typers   rt   z--action_horizonr   zActions per inferencez--action_hzg      I@)ru   rs   z--promptr!   zLanguage instructionz--camera_config_filez./config/camera_config.json)rs   z--calibration_filez!./config/calibration_results.jsonz--stereo_methodzedffs)rs   choicesz--depth_modeNEURAL_LIGHT)RaidenInferenceLoop)r   )r/   r1   r   r3   )bridger+   	action_hzbridge_kwargscamera_config_filecalibration_filestereo_method
depth_mode)argparseArgumentParseradd_argumentr9   float
parse_argsraiden.inferencerz   r   r   r+   r|   r/   r1   r3   r~   r   r   r   run)r   parserargsrz   r{   loops         r   mainr      s   OOO$$= %  F x>[\\\
+<PQQQ
sD?STTT
*bG^___
E4@@@

B5KLLL
.8UVVV
,6YZZZ
)55%.QQQ
???D444444)<===F..II"1k	
 
  2.(?  D 	HHJJJJJr   __main__)rk   typingr   r[   numpyr   r   r   r`   r	   rn   rl   __annotations__rm   r   r   r   r   rh   ro   r   r   <module>r      sE    >       



     ( ( ( ( ( ( %02 $sCx.    Z   $	 	
 	 	 	 	k k k k k; k k kf& & &R zDFFFFF r   